@whereby.com/browser-sdk 3.26.7 → 3.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdn/v3-react.js +1 -1
- package/dist/react/index.cjs +6 -6
- package/dist/react/index.d.ts +4 -1
- package/dist/react/index.esm.js +6 -6
- package/package.json +2 -2
package/dist/cdn/v3-react.js
CHANGED
|
@@ -131,4 +131,4 @@ this.whereby=this.whereby||{},this.whereby.react=function(e,t,i){"use strict";va
|
|
|
131
131
|
float personMask = texture(u_personMask, v_texCoord).a;
|
|
132
132
|
personMask = smoothstep(u_coverage.x, u_coverage.y, personMask);
|
|
133
133
|
outColor = vec4(frameColor * personMask + backgroundColor * (1.0 - personMask), 1.0);
|
|
134
|
-
}`,d=s/o,I=mV(e,e.VERTEX_SHADER,c),C=mV(e,e.FRAGMENT_SHADER,g),l=hV(e,I,C,t,i),A=e.getUniformLocation(l,"u_backgroundScale"),u=e.getUniformLocation(l,"u_backgroundOffset"),p=e.getUniformLocation(l,"u_inputFrame"),h=e.getUniformLocation(l,"u_personMask"),m=e.getUniformLocation(l,"u_background"),f=e.getUniformLocation(l,"u_coverage");e.useProgram(l),e.uniform2f(A,1,1),e.uniform2f(u,0,0),e.uniform1i(p,0),e.uniform1i(h,1);let b=null;function v(t){const i=t.naturalWidth||t.videoWidth||t.width,n=t.naturalHeight||t.videoHeight||t.height;b=fV(e,e.RGBA8,i,n,e.LINEAR,e.LINEAR),e.texSubImage2D(e.TEXTURE_2D,0,0,0,i,n,e.RGBA,e.UNSIGNED_BYTE,t);let r=0,s=0,o=i,a=n;o/a<d?(a=o/d,s=(n-a)/2):(o=a*d,r=(i-o)/2);const c=o/i,g=a/n;r/=i,s/=n,e.uniform2f(A,c,g),e.uniform2f(u,r,s)}function y(t){e.useProgram(l);const i=t.coverage||[0,1];e.uniform2f(f,i[0],i[1])}return y(a),r&&v(r),{render:function(){e.viewport(0,0,s,o),e.useProgram(l),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,n),null!==b&&(e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,b),e.uniform1i(m,2)),e.bindFramebuffer(e.FRAMEBUFFER,null),e.drawArrays(e.TRIANGLE_STRIP,0,4)},updateParams:y,cleanUp:function(){e.deleteTexture(b),e.deleteProgram(l),e.deleteShader(C),e.deleteShader(I)},updateBackgroundImage:function(t,i){i&&(b=null),t?b?(e.bindTexture(e.TEXTURE_2D,b),e.texSubImage2D(e.TEXTURE_2D,0,0,0,t.naturalWidth||t.videoWidth||t.width,t.naturalHeight||t.videoHeight||t.height,e.RGBA,e.UNSIGNED_BYTE,t)):v(t):b&&(b=null)}}}(A,h,m,w,s,e,t,C);return{effectCtx:A,updateBackgroundFrame(e,t,i){V.updateBackgroundImage(e,i)},updateParams(e){C=yV(r=e),k.updateParams(C),V.updateParams(C)},processFrame(e){A.clearColor(0,0,0,0),A.clear(A.COLOR_BUFFER_BIT),A.activeTexture(A.TEXTURE0),A.bindTexture(A.TEXTURE_2D,f),A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,e),A.bindVertexArray(p),S.render(),o._runInference(),Z.render(),R.render(),r.backgroundUrl?V.render():k.render()},dispose(){V.cleanUp(),k.cleanUp(),R.cleanUp(),Z.cleanUp(),S.cleanUp(),A.deleteTexture(w),A.deleteTexture(b),A.deleteTexture(f),A.deleteBuffer(m),A.deleteBuffer(h),A.deleteVertexArray(p),A.deleteShader(u)}}})}function SV(e,t,i){var n=function(e){return atob(e)}(e),r=n.indexOf("\n",10)+1,s=n.substring(r)+"",o=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(o)}function ZV(e,t,i){var n;return function(t){return n=n||SV(e),new Worker(n,t)}}var RV=ZV("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCB0aW1lciA9IG51bGw7CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIGNvbnN0IHRpbWUgPSByZXF1ZXN0LmRhdGE7CiAgICAgICAgaWYgKHRpbWUgPj0gMCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHBvc3RNZXNzYWdlKCIiKSwgdGltZSk7CiAgICAgICAgZWxzZSBpZiAodGltZXIpCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXIud29ya2VyLmpzLm1hcAoK");class kV extends eV.EventEmitter{constructor({setup:e,params:t,videoWidth:i,videoHeight:n,emit:r}){super(),this.setup=e,this.params=t,this.videoWidth=i,this.videoHeight=n,this.status="new",r&&(this.emit=r)}setupEngine(e,t,i,n){return Pk(this,void 0,void 0,function*(){this.videoWidth=e,this.videoHeight=t,this.videoAspectRatio=this.videoWidth/this.videoHeight,this.effectCanvas=i||nV(this.videoWidth,this.videoHeight);const r=this.setup.useWebGL?wV:uV;this.engine=yield r(this.videoWidth,this.videoHeight,this.setup,this.effectCanvas,this.params,n),this.effectCtx=this.engine.effectCtx,n&&this.updateBackgroundFrame({frame:n})})}updateVideoSize(e){return Pk(this,arguments,void 0,function*({videoWidth:e,videoHeight:t}){const i=this.currentBackgroundFrame;this.currentBackgroundFrame=null;const n=this.engine;if("new"===this.status)return console.warn("Video size updated before engine was initialized."),this.videoWidth=e,void(this.videoHeight=t);"init"===this.status&&console.warn("Video size updated while engine was initializating."),yield this.setupEngine(e,t,this.effectCanvas,i),n.dispose()})}init(e){return Pk(this,arguments,void 0,function*({initialBackgroundFrame:e,useInsertableStreams:t,effectCanvas:i}){if(this.status="init",yield this.setupEngine(this.videoWidth,this.videoHeight,i,e),t){let e=5,t=0,i=0,n=!1;this.transformer=new TransformStream({transform:(r,s)=>Pk(this,void 0,void 0,function*(){this.transformController=s;const o=r.timestamp,a=performance.now();t||(t=a,i=o/1e3);e>0||a-t<o/1e3-i+200?(this.processAndRenderFrame(r),r.close(),this.hasVideoBackground&&"canvas"!==this.setup.transferType&&this.emit("getbackgroundframe"),e>0&&(e--,t=a,i=o/1e3),s.enqueue(new VideoFrame(this.effectCanvas,{timestamp:o})),n||(n=!0,this.emit("firstframerendered"))):r.close()})})}else this.setup.useBackgroundWorker||(this.timerWorker=new RV,this.timerWorker.addEventListener("message",()=>{this.emit("output",{frame:this.currentOutputFrame},[this.currentOutputFrame])}));this.status="ready",this.emit("ready")})}updateParams({params:e,initialBackgroundFrame:t}){!this._terminated&&this.engine&&(this.params=e,this.currentBackgroundFrame=null,this.currentBackgroundFrameCtx=null,t?this.updateBackgroundFrame({frame:t,reInit:!0}):this.engine.updateBackgroundFrame(null),this.engine.updateParams(e))}updateBackgroundFrame({frame:e,reInit:t}){let i;switch(this.currentBackgroundFrame||(this.hasVideoBackground=this.params.backgroundUrl&&"video"===this.params.backgroundType,i={x:0,y:0,width:this.videoWidth,height:this.videoHeight}),this.setup.transferType){case"imagebitmap":this.currentBackgroundFrame=e;break;case"imagedata":this.currentBackgroundFrame||(this.currentBackgroundFrame=nV(this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx=this.currentBackgroundFrame.getContext("2d")),e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx.putImageData(e,0,0);break;case"canvas":if(!this.currentBackgroundFrame){i.width=e.videoWidth||e.naturalWidth||e.width,i.height=e.videoHeight||e.naturalHeight||e.height;const t=i.width/i.height;if(t>this.videoAspectRatio){const e=i.width-i.height*this.videoAspectRatio;i.width-=e,i.x=Math.floor(e/2)}else if(t<this.videoAspectRatio){const e=i.height-i.width/this.videoAspectRatio;i.height-=e,i.y=Math.floor(e/2)}}this.currentBackgroundFrame=e}this.engine.updateBackgroundFrame(this.currentBackgroundFrame,i,t)}terminate(){this.transformController&&this.transformController.terminate(),this.timerWorker&&this.timerWorker.terminate(),this.engine&&(this.engine.dispose(),this.engine=null),this._terminated=!0,this.emit("terminated")}start({inputStream:e,outputStream:t}){e&&e.pipeThrough(this.transformer).pipeTo(t),this.frameCounter=0,this.frameCounterTime=performance.now()}input(e){return Pk(this,arguments,void 0,function*({videoFrame:e,backgroundFrame:t,requestTime:i,lastRenderTime:n,delay:r}){var s;if(this._terminated)return;const o=n+r-2*(Date.now()-i);let a;switch(t&&this.updateBackgroundFrame({frame:t}),this.setup.transferType){case"imagebitmap":null===(s=this.prevVideoFrame)||void 0===s||s.close(),this.prevVideoFrame=e,this.processAndRenderFrame(e),a=yield createImageBitmap(this.effectCanvas);break;case"imagedata":e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.inputCanvas||(this.inputCanvas=nV(this.videoWidth,this.videoHeight),this.inputCanvasCtx=this.inputCanvas.getContext("2d")),this.inputCanvasCtx.putImageData(e,0,0),this.processAndRenderFrame(this.inputCanvas),a=this.effectCtx.getImageData(0,0,this.videoWidth,this.videoHeight).data.buffer;break;case"canvas":this.processAndRenderFrame(e),a=this.effectCanvas}const c=Math.max(0,o-Date.now());this.timerWorker?(this.currentOutputFrame=a,this.timerWorker.postMessage(c)):setTimeout(()=>{this.emit("output",{frame:a},[a])},c)})}processAndRenderFrame(e){if(this.engine.processFrame(e),this.setup.logToConsole){this.frameCounter++;const e=performance.now();e-this.frameCounterTime>1e3&&(console.log(`Running camera effects, ${Math.round(1e3*this.frameCounter/(e-this.frameCounterTime))} fps`),this.frameCounter=0,this.frameCounterTime=e)}}}let VV=0;class _V extends eV.EventEmitter{constructor(e,t){super();const i=VV++,n=(t,n)=>{this[t]=r=>{e.postMessage(Object.assign({type:t,processorId:i},r),n&&n(r).filter(e=>e))}};n("init",e=>[e.initialBackgroundFrame]),n("start",e=>[e.inputStream,e.outputStream]),n("input",e=>[e.videoFrame,e.backgroundFrame]),n("updateBackgroundFrame",e=>[e.frame]),n("updateParams",e=>[e.initialBackgroundFrame]),n("updateVideoSize"),n("terminate");const r=t=>Pk(this,void 0,void 0,function*(){if(t.data.processorId!==i)return;const n=t.data,{type:s}=n,o=function(e,t){var i={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(i[n[r]]=e[n[r]])}return i}(n,["type"]);this.emit(s,o),"terminated"===s&&e.removeEventListener("message",r)});e.postMessage(Object.assign({type:"create",processorId:i},t)),e.addEventListener("message",r)}}var TV=ZV("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMS0zIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlUHJvbWlzZSA9IG51bGw7CiAgICBjb25zdCBsb2FkVEZMaXRlID0gKCkgPT4gewogICAgICAgIGlmIChfdGZsaXRlUHJvbWlzZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGVQcm9taXNlOwogICAgICAgIF90ZmxpdGVQcm9taXNlID0gKCgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0geWllbGQgbG9hZFRmbGl0ZU1vZHVsZShzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgICAgICAgICAgY29uc3Qgd2FzbVVybCA9IHlpZWxkIGdldFdhc21Vcmwoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICAgICAgICAgIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLndhc20iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgX3RmbGl0ZVByb21pc2UgPSBudWxsOwogICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICB9CiAgICAgICAgfSkpKCk7CiAgICAgICAgcmV0dXJuIF90ZmxpdGVQcm9taXNlOwogICAgfTsKICAgIGxldCBfbW9kZWxQcm9taXNlID0gbnVsbDsKICAgIGxldCBfbW9kZWxQcm9taXNlVXJsID0gbnVsbDsKICAgIGNvbnN0IGxvYWRTZWdtZW50YXRpb25Nb2RlbCA9IChzZWdtZW50YXRpb25Nb2RlbElkKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBjb25zdCBtb2RlbCA9IG1vZGVsc1tzZWdtZW50YXRpb25Nb2RlbElkXTsKICAgICAgICBjb25zdCBtb2RlbFVybCA9IHJlc29sdmVBc3NldFVybCh5aWVsZCBnZXRNb2RlbFVybChtb2RlbC5pZCkpOwogICAgICAgIGlmIChfbW9kZWxQcm9taXNlVXJsID09PSBtb2RlbFVybCAmJiBfbW9kZWxQcm9taXNlKQogICAgICAgICAgICByZXR1cm4gX21vZGVsUHJvbWlzZTsKICAgICAgICBfbW9kZWxQcm9taXNlVXJsID0gbW9kZWxVcmw7CiAgICAgICAgX21vZGVsUHJvbWlzZSA9ICgoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHRmbGl0ZSA9IHlpZWxkIGxvYWRURkxpdGUoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsUmVzcG9uc2UgPSB5aWVsZCBmZXRjaChtb2RlbFVybCk7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEJ1ZmZlciA9IHlpZWxkIG1vZGVsUmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgICAgICAgICAgdGZsaXRlLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkobW9kZWxCdWZmZXIpLCBtb2RlbEJ1ZmZlck9mZnNldCk7CiAgICAgICAgICAgICAgICB0ZmxpdGUuX2xvYWRNb2RlbChtb2RlbEJ1ZmZlci5ieXRlTGVuZ3RoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgICAgICAgICAgY29uc3QgaW5wdXRXaWR0aCA9IHRmbGl0ZS5fZ2V0SW5wdXRXaWR0aCgpOwogICAgICAgICAgICAgICAgY29uc3QgaW5wdXRNZW1vcnlPZmZzZXQgPSB0ZmxpdGUuX2dldElucHV0TWVtb3J5T2Zmc2V0KCkgLyA0OwogICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25QaXhlbENvdW50ID0gaW5wdXRXaWR0aCAqIGlucHV0SGVpZ2h0OwogICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLAogICAgICAgICAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICAgICAgICAgIHVybDogbW9kZWxVcmwsCiAgICAgICAgICAgICAgICAgICAgaW5wdXRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgICAgICAgICBpbnB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgaWYgKF9tb2RlbFByb21pc2VVcmwgPT09IG1vZGVsVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgX21vZGVsUHJvbWlzZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgX21vZGVsUHJvbWlzZVVybCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgIH0KICAgICAgICB9KSkoKTsKICAgICAgICByZXR1cm4gX21vZGVsUHJvbWlzZTsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJuZXciOwogICAgICAgICAgICBpZiAoZW1pdCkKICAgICAgICAgICAgICAgIHRoaXMuZW1pdCA9IGVtaXQ7CiAgICAgICAgfQogICAgICAgIHNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlZmZlY3RDYW52YXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDYW52YXMgPSBlZmZlY3RDYW52YXMgfHwgY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFbmdpbmUgPSB0aGlzLnNldHVwLnVzZVdlYkdMID8gY3JlYXRlV2ViR0xFbmdpbmUgOiBjcmVhdGVDYW52YXNFbmdpbmU7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHlpZWxkIGNyZWF0ZUVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIHRoaXMuc2V0dXAsIHRoaXMuZWZmZWN0Q2FudmFzLCB0aGlzLnBhcmFtcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdEN0eCA9IHRoaXMuZW5naW5lLmVmZmVjdEN0eDsKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogaW5pdGlhbEJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2xkQmFja2dyb3VuZEZyYW1lID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAibmV3IikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVmlkZW8gc2l6ZSB1cGRhdGVkIGJlZm9yZSBlbmdpbmUgd2FzIGluaXRpYWxpemVkLiIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gImluaXQiKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJWaWRlbyBzaXplIHVwZGF0ZWQgd2hpbGUgZW5naW5lIHdhcyBpbml0aWFsaXphdGluZy4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBFbmdpbmUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHRoaXMuZWZmZWN0Q2FudmFzLCBvbGRCYWNrZ3JvdW5kRnJhbWUpOwogICAgICAgICAgICAgICAgb2xkRW5naW5lLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGluaXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHVzZUluc2VydGFibGVTdHJlYW1zLCBlZmZlY3RDYW52YXMgfSkgewogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAiaW5pdCI7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAicmVhZHkiOwogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQgfHwgIXRoaXMuZW5naW5lKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lQ3R4ID0gbnVsbDsKICAgICAgICAgICAgaWYgKGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHJlSW5pdDogdHJ1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUJhY2tncm91bmRGcmFtZShudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWUsIHJlSW5pdCB9KSB7CiAgICAgICAgICAgIGxldCB1cGRhdGVkRGltZW5zaW9uczsKICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuaGFzVmlkZW9CYWNrZ3JvdW5kID0gdGhpcy5wYXJhbXMuYmFja2dyb3VuZFVybCAmJiB0aGlzLnBhcmFtcy5iYWNrZ3JvdW5kVHlwZSA9PT0gInZpZGVvIjsKICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogdGhpcy52aWRlb1dpZHRoLCBoZWlnaHQ6IHRoaXMudmlkZW9IZWlnaHQgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2V0dXAudHJhbnNmZXJUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImltYWdlZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lQ3R4ID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoZnJhbWUpLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eC5wdXRJbWFnZURhdGEoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAiY2FudmFzIjogewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoID0gZnJhbWUudmlkZW9XaWR0aCB8fCBmcmFtZS5uYXR1cmFsV2lkdGggfHwgZnJhbWUud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCA9IGZyYW1lLnZpZGVvSGVpZ2h0IHx8IGZyYW1lLm5hdHVyYWxIZWlnaHQgfHwgZnJhbWUuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPSB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAvIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRBc3BlY3RSYXRpbyA+IHRoaXMudmlkZW9Bc3BlY3RSYXRpbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZVggPSB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAqIHRoaXMudmlkZW9Bc3BlY3RSYXRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC09IG91dHNpZGVYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueCA9IE1hdGguZmxvb3Iob3V0c2lkZVggLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPCB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVZID0gdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgLT0gb3V0c2lkZVk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy55ID0gTWF0aC5mbG9vcihvdXRzaWRlWSAvIDIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IGZyYW1lOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIHVwZGF0ZWREaW1lbnNpb25zLCByZUluaXQpOwogICAgICAgIH0KICAgICAgICB0ZXJtaW5hdGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybUNvbnRyb2xsZXIpCiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2xsZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyV29ya2VyKQogICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZW5naW5lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZW1pdCgidGVybWluYXRlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydCh7IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0gfSkgewogICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0pCiAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5waXBlVGhyb3VnaCh0aGlzLnRyYW5zZm9ybWVyKS5waXBlVG8ob3V0cHV0U3RyZWFtKTsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICB0aGlzLmZyYW1lQ291bnRlclRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICB9CiAgICAgICAgaW5wdXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IHZpZGVvRnJhbWUsIGJhY2tncm91bmRGcmFtZSwgcmVxdWVzdFRpbWUsIGxhc3RSZW5kZXJUaW1lLCBkZWxheSB9KSB7CiAgICAgICAgICAgICAgICB2YXIgX2I7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYXRlZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zdCBydHQgPSAoRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lKSAqIDI7CiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5UaW1lID0gbGFzdFJlbmRlclRpbWUgKyBkZWxheSAtIHJ0dDsKICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kRnJhbWUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogYmFja2dyb3VuZEZyYW1lIH0pOwogICAgICAgICAgICAgICAgbGV0IGZyYW1lOwogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlYml0bWFwIjogewogICAgICAgICAgICAgICAgICAgICAgICAoX2IgPSB0aGlzLnByZXZWaWRlb0ZyYW1lKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2VmlkZW9GcmFtZSA9IHZpZGVvRnJhbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKHZpZGVvRnJhbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIGNyZWF0ZUltYWdlQml0bWFwKHRoaXMuZWZmZWN0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHZpZGVvRnJhbWUpLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRDYW52YXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXMgPSBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHggPSB0aGlzLmlucHV0Q2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dENhbnZhc0N0eC5wdXRJbWFnZURhdGEodmlkZW9GcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKHRoaXMuaW5wdXRDYW52YXMpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHRoaXMuZWZmZWN0Q3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpLmRhdGEuYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2FudmFzIjogewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdENhbnZhczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5EZWxheSA9IE1hdGgubWF4KDAsIHJldHVyblRpbWUgLSBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50T3V0cHV0RnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyV29ya2VyLnBvc3RNZXNzYWdlKHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWUgfSwgW2ZyYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgcmV0dXJuRGVsYXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKSB7CiAgICAgICAgICAgIHRoaXMuZW5naW5lLnByb2Nlc3NGcmFtZShmcmFtZSk7CiAgICAgICAgICAgIGlmICh0aGlzLnNldHVwLmxvZ1RvQ29uc29sZSkgewogICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgaWYgKG5vdyAtIHRoaXMuZnJhbWVDb3VudGVyVGltZSA+IDEwMDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUnVubmluZyBjYW1lcmEgZWZmZWN0cywgJHtNYXRoLnJvdW5kKCh0aGlzLmZyYW1lQ291bnRlciAqIDEwMDApIC8gKG5vdyAtIHRoaXMuZnJhbWVDb3VudGVyVGltZSkpfSBmcHNgKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gbm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IHByb2Nlc3NvcnMgPSB7fTsKICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIGNvbnN0IHByb2Nlc3NvcklkID0gcmVxdWVzdC5kYXRhLnByb2Nlc3NvcklkOwogICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gImNyZWF0ZSIpIHsKICAgICAgICAgICAgY29uc3QgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NvcihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuZGF0YSksIHsgZW1pdDogKHR5cGUsIGRhdGEsIHRyYW5zZmVyKSA9PiBwb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgcHJvY2Vzc29ySWQsIHR5cGUgfSwgZGF0YSksIHRyYW5zZmVyKSB9KSk7CiAgICAgICAgICAgIHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdID0gcHJvY2Vzc29yOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKF9hID0gcHJvY2Vzc29yc1twcm9jZXNzb3JJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtyZXF1ZXN0LmRhdGEudHlwZV0ocmVxdWVzdC5kYXRhKTsKICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS50eXBlID09PSAidGVybWluYXRlIikgewogICAgICAgICAgICAgICAgZGVsZXRlIHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBjb25zdCBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVTSU1ETW9kdWxlKSB7CiAgICAgICAgICAgIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgPSBjcmVhdGVURkxpdGVTSU1ETW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgIT09ICJ1bmRlZmluZWQiID8gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA6IHt9OwogICAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgICBNb2R1bGVbInJlYWR5Il0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gTW9kdWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVPdmVycmlkZXNba2V5XSA9IE1vZHVsZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIHZhciBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgICAgIHRocm93IHRvVGhyb3c7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICJzdHJpbmciOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgICAgdmFyIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlYWRfLCByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICAgIHZhciBub2RlUGF0aDsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSByZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19kaXJuYW1lICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLCBiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVGUykKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZTID0gcmVxdWlyZSgiZnMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHJlYWRfKGZpbGVuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5idWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NbImFyZ3YiXS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1Byb2dyYW0gPSBwcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NbImV4aXQiXShzdGF0dXMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiaW5zcGVjdCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVhZChmLCAiYmluYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSAib2JqZWN0Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHRBcmdzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0QXJnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBxdWl0KHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nID0gcHJpbnQ7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuID0gY29uc29sZS5lcnJvciA9IHR5cGVvZiBwcmludEVyciAhPT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgKHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgICAgICAgICAgdmFyIGVyciA9IE1vZHVsZVsicHJpbnRFcnIiXSB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVba2V5XSA9IG1vZHVsZU92ZXJyaWRlc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICAgIGlmIChNb2R1bGVbImFyZ3VtZW50cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJhcmd1bWVudHMiXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgICAgICAgICAgICBxdWl0XyA9IE1vZHVsZVsicXVpdCJdOwogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKQogICAgICAgICAgICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgICAgICAgICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgYWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbU1lbW9yeTsKICAgICAgICAgICAgdmFyIEFCT1JUID0gZmFsc2U7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHsKICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgICAgICAgICAgIHZhciBlbmRQdHIgPSBpZHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpCiAgICAgICAgICAgICAgICAgICAgKytlbmRQdHI7CiAgICAgICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUwID0gaGVhcFtpZHgrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUyID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBbaWR4KytdICYgNjMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDY1NTM2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCAoY2ggPj4gMTApLCA1NjMyMCB8IChjaCAmIDEwMjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0ciwgYnVmZmVyLCBkb250QWRkTnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhbGlnblVwKHgsIG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWZmZXIsIEhFQVA4LCBIRUFQVTgsIEhFQVAzMjsKICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBuZXcgSW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVOCJdID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gbmV3IFVpbnQxNkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMzIiXSA9IG5ldyBVaW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbIklOSVRJQUxfTUVNT1JZIl0gfHwgMTY3NzcyMTY7CiAgICAgICAgICAgIHZhciB3YXNtVGFibGU7CiAgICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRJTklUX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgICAgX19BVElOSVRfXy5wdXNoKHsKICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfX193YXNtX2NhbGxfY3RvcnMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICAgICAgICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdID0ge307CiAgICAgICAgICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl0gPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25BYm9ydCJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvbkFib3J0Il0od2hhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICAgICAgZXJyKHdoYXQpOwogICAgICAgICAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hhdCA9ICJhYm9ydCgiICsgd2hhdCArICIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA/IHN0ci5zdGFydHNXaXRoKHByZWZpeCkgOiBzdHIuaW5kZXhPZihwcmVmaXgpID09PSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGRhdGFVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgICBmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3YXNtQmluYXJ5RmlsZSA9ICJ0ZmxpdGUtc2ltZC53YXNtIjsKICAgICAgICAgICAgaWYgKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICB3YXNtQmluYXJ5RmlsZSA9IGxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeShmaWxlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IHdhc21CaW5hcnlGaWxlICYmIHdhc21CaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEJpbmFyeShmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpIHsKICAgICAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iICYmICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlWyJvayJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIgKyB3YXNtQmluYXJ5RmlsZSArICInIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQXN5bmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jKHdhc21CaW5hcnlGaWxlLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHsgYTogYXNtTGlicmFyeUFyZyB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLCBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJhc20iXSA9IGV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeSA9IE1vZHVsZVsiYXNtIl1bInEiXTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlID0gTW9kdWxlWyJhc20iXVsiRCJdOwogICAgICAgICAgICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFkZFJ1bkRlcGVuZGVuY3koKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeVByb21pc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGluZm8pOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlY2VpdmVyLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbywgcmVjZWl2ZUluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIiArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3Muc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2suZnVuYzsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9hYm9ydCgpIHsKICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3c7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcHJvY2Vzc1siaHJ0aW1lIl0oKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFswXSAqIDFlMyArIHRbMV0gLyAxZTY7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkYXRlTm93ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGRhdGVOb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMgPSB0cnVlOwogICAgICAgICAgICBmdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSkgewogICAgICAgICAgICAgICAgSEVBUDMyW19fX2Vycm5vX2xvY2F0aW9uKCkgPj4gMl0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfY2xvY2tfZ2V0dGltZShjbGtfaWQsIHRwKSB7CiAgICAgICAgICAgICAgICB2YXIgbm93OwogICAgICAgICAgICAgICAgaWYgKGNsa19pZCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgoY2xrX2lkID09PSAxIHx8IGNsa19pZCA9PT0gNCkgJiYgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMpIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3RwID4+IDJdID0gKG5vdyAvIDFlMykgfCAwOwogICAgICAgICAgICAgICAgSEVBUDMyWyh0cCArIDQpID4+IDJdID0gKChub3cgJSAxZTMpICogMWUzICogMWUzKSB8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxvcGVuKGZpbGVuYW1lLCBmbGFnKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsc3ltKGhhbmRsZSwgc3ltYm9sKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LCBzcmMsIG51bSkgewogICAgICAgICAgICAgICAgSEVBUFU4LmNvcHlXaXRoaW4oZGVzdCwgc3JjLCBzcmMgKyBudW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4Lmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeS5ncm93KChzaXplIC0gYnVmZmVyLmJ5dGVMZW5ndGggKyA2NTUzNSkgPj4+IDE2KTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIG9sZFNpemUgPSBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCk7CiAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFNpemUgPiBtYXhIZWFwU2l6ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGN1dERvd24gPSAxOyBjdXREb3duIDw9IDQ7IGN1dERvd24gKj0gMikgewogICAgICAgICAgICAgICAgICAgIHZhciBvdmVyR3Jvd25IZWFwU2l6ZSA9IG9sZFNpemUgKiAoMSArIDAuMiAvIGN1dERvd24pOwogICAgICAgICAgICAgICAgICAgIG92ZXJHcm93bkhlYXBTaXplID0gTWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUsIHJlcXVlc3RlZFNpemUgKyAxMDA2NjMyOTYpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdTaXplID0gTWF0aC5taW4obWF4SGVhcFNpemUsIGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSwgb3Zlckdyb3duSGVhcFNpemUpLCA2NTUzNikpOwogICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIobmV3U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAobXNlY3MpIHsKICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIHdoaWxlIChfZW1zY3JpcHRlbl9nZXRfbm93KCkgLSBzdGFydCA8IG1zZWNzKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgRU5WID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGVOYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNQcm9ncmFtIHx8ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW52U3RyaW5ncygpIHsKICAgICAgICAgICAgICAgIGlmICghZ2V0RW52U3RyaW5ncy5zdHJpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJvYmplY3QiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgIkMiKS5yZXBsYWNlKCItIiwgIl8iKSArICIuVVRGLTgiOwogICAgICAgICAgICAgICAgICAgIHZhciBlbnYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVTRVI6ICJ3ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBBVEg6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgUFdEOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIExBTkc6IGxhbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIF86IGdldEV4ZWN1dGFibGVOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIEVOVikgewogICAgICAgICAgICAgICAgICAgICAgICBlbnZbeF0gPSBFTlZbeF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBlbnYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5wdXNoKHggKyAiPSIgKyBlbnZbeF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGdldEVudlN0cmluZ3Muc3RyaW5nczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgU1lTQ0FMTFMgPSB7CiAgICAgICAgICAgICAgICBtYXBwaW5nczoge30sCiAgICAgICAgICAgICAgICBidWZmZXJzOiBbbnVsbCwgW10sIFtdXSwKICAgICAgICAgICAgICAgIHByaW50Q2hhcjogZnVuY3Rpb24gKHN0cmVhbSwgY3VycikgewogICAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBTWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PT0gMSA/IG91dCA6IGVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goY3Vycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZhcmFyZ3M6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIFNZU0NBTExTLnZhcmFyZ3MgKz0gNDsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gSEVBUDMyWyhTWVNDQUxMUy52YXJhcmdzIC0gNCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXRTdHI6IGZ1bmN0aW9uIChwdHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gVVRGOFRvU3RyaW5nKHB0cik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQ2NDogZnVuY3Rpb24gKGxvdywgaGlnaCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb3c7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBfZW52aXJvbl9nZXQoX19lbnZpcm9uLCBlbnZpcm9uX2J1ZikgewogICAgICAgICAgICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncygpLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZywgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBlbnZpcm9uX2J1ZiArIGJ1ZlNpemU7CiAgICAgICAgICAgICAgICAgICAgSEVBUDMyWyhfX2Vudmlyb24gKyBpICogNCkgPj4gMl0gPSBwdHI7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVBc2NpaVRvTWVtb3J5KHN0cmluZywgcHRyKTsKICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW52aXJvbl9zaXplc19nZXQocGVudmlyb25fY291bnQsIHBlbnZpcm9uX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICAgICAgICAgICAgc3RyaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2V4aXQoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBleGl0KHN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfc2VlayhmZCwgb2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gsIHdoZW5jZSwgbmV3T2Zmc2V0KSB7IH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLCBpb3YsIGlvdmNudCwgcG51bSkgewogICAgICAgICAgICAgICAgdmFyIG51bSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IEhFQVAzMlsoaW92ICsgaSAqIDgpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBIRUFQMzJbKGlvdiArIChpICogOCArIDQpKSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NBTExTLnByaW50Q2hhcihmZCwgSEVBUFU4W3B0ciArIGpdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbnVtICs9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMltwbnVtID4+IDJdID0gbnVtOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3B0aHJlYWRfY3JlYXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3B0aHJlYWRfam9pbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAyODsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfc3lzY29uZihuYW1lKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NToKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heEhlYXBTaXplIC8gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDA4MDk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTczOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDk0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAyNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjE0NzQ4MzY0NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3ODM5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwNDg7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA5NzE1MjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njg7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMWUzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU1OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJvYmplY3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvclsiaGFyZHdhcmVDb25jdXJyZW5jeSJdIHx8IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYXNtTGlicmFyeUFyZyA9IHsKICAgICAgICAgICAgICAgIGE6IF9hYm9ydCwKICAgICAgICAgICAgICAgIG46IF9jbG9ja19nZXR0aW1lLAogICAgICAgICAgICAgICAgaTogX2Rsb3BlbiwKICAgICAgICAgICAgICAgIGU6IF9kbHN5bSwKICAgICAgICAgICAgICAgIGw6IF9lbXNjcmlwdGVuX21lbWNweV9iaWcsCiAgICAgICAgICAgICAgICBtOiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCwKICAgICAgICAgICAgICAgIG86IF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcCwKICAgICAgICAgICAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgICAgICAgICAgIGc6IF9lbnZpcm9uX3NpemVzX2dldCwKICAgICAgICAgICAgICAgIGo6IF9leGl0LAogICAgICAgICAgICAgICAgaDogX2ZkX2Nsb3NlLAogICAgICAgICAgICAgICAgazogX2ZkX3NlZWssCiAgICAgICAgICAgICAgICBjOiBfZmRfd3JpdGUsCiAgICAgICAgICAgICAgICBkOiBfcHRocmVhZF9jcmVhdGUsCiAgICAgICAgICAgICAgICBmOiBfcHRocmVhZF9qb2luLAogICAgICAgICAgICAgICAgYjogX3N5c2NvbmYsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNyZWF0ZVdhc20oKTsKICAgICAgICAgICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IChNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX193YXNtX2NhbGxfY3RvcnMgPSBNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gTW9kdWxlWyJhc20iXVsiciJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJzIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInQiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dEhlaWdodCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsidSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gTW9kdWxlWyJhc20iXVsidiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJ3Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsieCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInkiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRXaWR0aCJdID0gTW9kdWxlWyJhc20iXVsieiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bIkEiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBNb2R1bGVbImFzbSJdWyJCIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gTW9kdWxlWyJhc20iXVsiQyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIF9fX2Vycm5vX2xvY2F0aW9uID0gKE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fZXJybm9fbG9jYXRpb24gPSBNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBNb2R1bGVbImFzbSJdWyJFIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgY2FsbGVkUnVuOwogICAgICAgICAgICBmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cykgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gIkV4aXRTdGF0dXMiOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIiArIHN0YXR1cyArICIpIjsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IGZ1bmN0aW9uIHJ1bkNhbGxlcigpIHsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBydW4oYXJncykgewogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmVSdW4oKTsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNhbGxlZFJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFCT1JUKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBwcmVNYWluKCk7CiAgICAgICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSgpOwogICAgICAgICAgICAgICAgICAgIHBvc3RSdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInNldFN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiUnVubmluZy4uLiIpOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJydW4iXSA9IHJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gZXhpdChzdGF0dXMsIGltcGxpY2l0KSB7CiAgICAgICAgICAgICAgICBxdWl0XyhzdGF0dXMsIG5ldyBFeGl0U3RhdHVzKHN0YXR1cykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChNb2R1bGVbInByZUluaXQiXSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdID0gW01vZHVsZVsicHJlSW5pdCJdXTsKICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZUluaXQiXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUucmVhZHk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgdmFyIHRmbGl0ZVNpbWQgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUKICAgIH0pOwoKICAgIHZhciBjcmVhdGVURkxpdGVNb2R1bGUgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7CiAgICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVRGTGl0ZU1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVNb2R1bGUgPSBjcmVhdGVURkxpdGVNb2R1bGUgfHwge307CiAgICAgICAgICAgIHZhciBNb2R1bGUgPSB0eXBlb2YgY3JlYXRlVEZMaXRlTW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZU1vZHVsZSA6IHt9OwogICAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgICBNb2R1bGVbInJlYWR5Il0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gTW9kdWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVPdmVycmlkZXNba2V5XSA9IE1vZHVsZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIHZhciBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgICAgIHRocm93IHRvVGhyb3c7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICJzdHJpbmciOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgICAgdmFyIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlYWRfLCByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICAgIHZhciBub2RlUGF0aDsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSByZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19kaXJuYW1lICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLCBiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVGUykKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZTID0gcmVxdWlyZSgiZnMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHJlYWRfKGZpbGVuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5idWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NbImFyZ3YiXS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1Byb2dyYW0gPSBwcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NbImV4aXQiXShzdGF0dXMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiaW5zcGVjdCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVhZChmLCAiYmluYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSAib2JqZWN0Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHRBcmdzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0QXJnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBxdWl0KHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nID0gcHJpbnQ7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuID0gY29uc29sZS5lcnJvciA9IHR5cGVvZiBwcmludEVyciAhPT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgKHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgICAgICAgICAgdmFyIGVyciA9IE1vZHVsZVsicHJpbnRFcnIiXSB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVba2V5XSA9IG1vZHVsZU92ZXJyaWRlc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICAgIGlmIChNb2R1bGVbImFyZ3VtZW50cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJhcmd1bWVudHMiXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgICAgICAgICAgICBxdWl0XyA9IE1vZHVsZVsicXVpdCJdOwogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKQogICAgICAgICAgICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgICAgICAgICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgYWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbU1lbW9yeTsKICAgICAgICAgICAgdmFyIEFCT1JUID0gZmFsc2U7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHsKICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgICAgICAgICAgIHZhciBlbmRQdHIgPSBpZHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpCiAgICAgICAgICAgICAgICAgICAgKytlbmRQdHI7CiAgICAgICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUwID0gaGVhcFtpZHgrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUyID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBbaWR4KytdICYgNjMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDY1NTM2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCAoY2ggPj4gMTApLCA1NjMyMCB8IChjaCAmIDEwMjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0ciwgYnVmZmVyLCBkb250QWRkTnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhbGlnblVwKHgsIG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWZmZXIsIEhFQVA4LCBIRUFQVTgsIEhFQVAzMjsKICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBuZXcgSW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVOCJdID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gbmV3IFVpbnQxNkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMzIiXSA9IG5ldyBVaW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbIklOSVRJQUxfTUVNT1JZIl0gfHwgMTY3NzcyMTY7CiAgICAgICAgICAgIHZhciB3YXNtVGFibGU7CiAgICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRJTklUX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgICAgX19BVElOSVRfXy5wdXNoKHsKICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfX193YXNtX2NhbGxfY3RvcnMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICAgICAgICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdID0ge307CiAgICAgICAgICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl0gPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25BYm9ydCJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvbkFib3J0Il0od2hhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICAgICAgZXJyKHdoYXQpOwogICAgICAgICAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hhdCA9ICJhYm9ydCgiICsgd2hhdCArICIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA/IHN0ci5zdGFydHNXaXRoKHByZWZpeCkgOiBzdHIuaW5kZXhPZihwcmVmaXgpID09PSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGRhdGFVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgICBmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3YXNtQmluYXJ5RmlsZSA9ICJ0ZmxpdGUud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVNb2R1bGUucmVhZHk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgdmFyIHRmbGl0ZSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgZGVmYXVsdDogY3JlYXRlVEZMaXRlTW9kdWxlCiAgICB9KTsKCn0pKHdhc21GZWF0dXJlRGV0ZWN0KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvY2Vzc29yUHJveHkud29ya2VyLmpzLm1hcAoK");let WV;const GV=new Image(1,1);function BV(e,t){return Pk(this,void 0,void 0,function*(){try{return yield createImageBitmap(e,t)}catch(e){return yield createImageBitmap(GV,t)}})}GV.src="data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";var EV=Object.freeze({__proto__:null,createEffectStream:(e,t,i)=>Pk(void 0,void 0,void 0,function*(){yield tV(i);const n=[],r=e.getVideoTracks()[0],s=e.getAudioTracks()[0];let{width:o,height:a}=r.getSettings();const c=(g=t.useBackgroundWorker,d={setup:t,params:i,videoWidth:o,videoHeight:a},g?(WV||(WV=new TV),new _V(WV,d)):new kV(d));var g,d;let I;const C=e=>Pk(void 0,void 0,void 0,function*(){const i=yield iV(e.backgroundUrl,e.backgroundType);return I=i&&i.play&&(()=>{i.paused&&i.play()}),function(e,t,i,n){return Pk(this,void 0,void 0,function*(){if(!e)return()=>Pk(this,void 0,void 0,function*(){});const r=e.videoWidth||e.naturalWidth||e.width,s=e.videoHeight||e.naturalHeight||e.height,o=r/s,a=t/i;if("imagedata"===n){const n=document.createElement("canvas");n.width=t,n.height=i;const c=n.getContext("2d");let[g,d,I,C]=[0,0,t,i];if(o>a){const e=i*o-t;g-=Math.round(e/2),I+=Math.round(e)}else if(o<a){const e=t/o-i;d-=Math.round(e/2),C+=Math.round(e)}return()=>Pk(this,void 0,void 0,function*(){return c.drawImage(e,0,0,r,s,g,d,I,C),c.getImageData(0,0,t,i).data.buffer})}if("imagebitmap"===n){let[n,c,g,d]=[0,0,r,s];if(o>a){const e=r-s*a;n+=Math.round(e/2),g-=Math.round(e)}else if(o<a){const e=s-r/a;c+=Math.round(e/2),d-=Math.round(e)}return()=>Pk(this,void 0,void 0,function*(){return yield createImageBitmap(e,n,c,g,d,{resizeWidth:t,resizeHeight:i})})}return"canvas"===n?()=>Pk(this,void 0,void 0,function*(){return e}):void 0})}(i,o,a,t.transferType)});let l=yield C(i),A=null;const u=new Promise(e=>A=e);let p,h;if(t.useInsertableStreams){const e=new window.MediaStreamTrackProcessor({track:r,maxBufferSize:2}),t=new window.MediaStreamTrackGenerator({kind:"video",signalTarget:r});h=t,c.on("ready",()=>{c.start({inputStream:null==e?void 0:e.readable,outputStream:null==t?void 0:t.writable})}),c.on("firstframerendered",()=>A()),c.on("getbackgroundframe",()=>Pk(void 0,void 0,void 0,function*(){I&&(I(),c.updateBackgroundFrame({frame:yield l()}))}))}else{const e=document.createElement("video"),s=()=>Pk(void 0,void 0,void 0,function*(){const{width:e,height:t}=r.getSettings();o===e&&a===t||(o=e,a=t,"object"==typeof p&&(p.width=o,p.height=a),yield c.updateVideoSize({videoWidth:o,videoHeight:a}),yield C(i))});e.addEventListener("resize",s),n.push(()=>{e.removeEventListener("resize",s)}),t.keepVideoElementInDom&&(e.playsInline=!0,e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="1px",e.style.opacity=0,document.body.appendChild(e),n.push(()=>{try{document.body.removeChild(e)}catch(e){console.warn("video element already removed from DOM")}e.srcObject=null})),yield new Promise(t=>{e.addEventListener("loadedmetadata",t),e.srcObject=new MediaStream([r]),e.play()});const g=()=>{"visible"!==document.visibilityState&&e.play()};let d,u,m;if(document.addEventListener("visibilitychange",g),n.push(()=>{document.removeEventListener("visibilitychange",g)}),p=nV(o,a),"imagebitmap"===t.transferType)d=p.getContext("bitmaprenderer"),u=()=>BV(e),m=e=>{d.transferFromImageBitmap(e),e.close()};else if("imagedata"===t.transferType){d=p.getContext("2d");const t=nV(o,a).getContext("2d");u=()=>(t.drawImage(e,0,0),t.getImageData(0,0,o,a).data.buffer),m=e=>{e=new ImageData(new Uint8ClampedArray(e),o,a),d.putImageData(e,0,0)}}else"canvas"===t.transferType&&(d=p.getContext(t.useWebGL?"webgl2":"2d",t.useWebGL?t.webglContextSettings:void 0),u=()=>e,t.useWebGL&&t.canvasMemoryLeakWorkaround&&(u=()=>BV(e)),m=()=>{});h=p.captureStream().getVideoTracks()[0];let f=Date.now();const b=()=>Pk(void 0,void 0,void 0,function*(){null==I||I();const[e,i]=yield Promise.all([u(),I&&l()]);c.input({videoFrame:e,backgroundFrame:i,lastRenderTime:f,requestTime:Date.now(),delay:t.framerate?1e3/t.framerate:0})}),v=()=>{b()};c.on("ready",()=>{v(),c.start({})}),c.on("output",({frame:e})=>{f=Date.now(),m(e),v(),A&&(A(),A=null)})}c.on("terminated",()=>{n.forEach(e=>e())}),c.init({useInsertableStreams:t.useInsertableStreams,initialBackgroundFrame:yield l(),effectCanvas:"canvas"===t.transferType?p:void 0});yield u,Object.defineProperty(h,"label",{get:()=>r.label}),Object.defineProperty(h,"readyState",{get:()=>r.readyState}),Object.defineProperty(h,"enabled",{get:()=>r.enabled,set:e=>{r.enabled=e}}),Object.defineProperty(h,"getSettings",{get:()=>()=>r.getSettings()});return{stream:new MediaStream([h,s].filter(e=>e)),stop:()=>{c.terminate()},updateParams:e=>Pk(void 0,void 0,void 0,function*(){return yield tV(e),l=yield C(e),c.updateParams({params:e,initialBackgroundFrame:yield l()}),!0})}})});const XV=e=>Pk(void 0,void 0,void 0,function*(){return{default:sV.backgrounds[e]}}),NV=!!document.createElement("canvas").getContext("webgl2"),PV={tfliteSegmentCanvasEffects:{module:EV,getDefaultSetup:()=>{const e={useWebGL:NV,segmentationModelId:"meetlite",logToConsole:!1,framerate:30,useInsertableStreams:!1,canvasMemoryLeakWorkaround:!0,transferType:"canvas",useBackgroundWorker:!1};return"chrome"===we.browserDetails.browser?Object.assign(Object.assign({},e),{useWebGL:!1}):"firefox"===we.browserDetails.browser?Object.assign(Object.assign({},e),{transferType:NV?"imagebitmap":"canvas"}):"safari"===we.browserDetails.browser?Object.assign(Object.assign({},e),{canvasMemoryLeakWorkaround:!1,keepVideoElementInDom:!0}):Object.assign({},e)},canUse:(e={})=>{var t,i,n;return"safari"===we.browserDetails.browser&&NV&&e.allowSafari||"chrome"===we.browserDetails.browser&&(null!==(t=we.browserDetails.version)&&void 0!==t?t:0)>=90||"firefox"===we.browserDetails.browser&&(null!==(n=null===(i=we.browserDetails)||void 0===i?void 0:i.version)&&void 0!==n?n:0)>=89}}},xV=[{id:"slight-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"slight"}}}}},{id:"blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"normal"}}}}},{id:"heavy-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"heavy"}}}}}];xV.push(...[{id:"clay",backgroundName:"clay"},{id:"haven",backgroundName:"haven"},{id:"focus",backgroundName:"focus"},{id:"studio",backgroundName:"studio"},{id:"glow",backgroundName:"glow"},{id:"pulse",backgroundName:"pulse"},{id:"cabin",backgroundName:"cabin"},{id:"concrete",backgroundName:"concrete"},{id:"brick",backgroundName:"brick"},{id:"sunrise",backgroundName:"sunrise"},{id:"day",backgroundName:"day"},{id:"night",backgroundName:"night"},{id:"custom"}].map(({id:e,backgroundName:t})=>({id:`image-${e}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundUrl:t?XV(t):void 0}}}}))),xV.push(...[{name:"neon",index:1},{name:"bubbles",index:2}].map(({name:e,index:t})=>({id:`video-${t}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundType:"video",backgroundUrl:XV(e)}}}})));const FV=(e,t,i)=>{var n,r,s;const o=xV.find(t=>t.id===e);if(!o)return;let a=Object.keys(null!==(n=o.pipelineConfigs)&&void 0!==n?n:[]).find(e=>PV[e].canUse());if(a||(a=Object.keys(null!==(r=o.pipelineConfigs)&&void 0!==r?r:[])[0]),!a)return;const c=null===(s=o.pipelineConfigs)||void 0===s?void 0:s[a],g=PV[a],d=Object.assign(Object.assign(Object.assign({},g.getDefaultSetup()),null==c?void 0:c.setup),t);d.useWebGL=d.useWebGL&&NV;return{pipeline:g,mergedSetup:d,mergedParams:Object.assign(Object.assign({},null==c?void 0:c.params),i)}},OV=({filter:e,options:t}={filter:(e,t)=>e.canUse(t),options:{}})=>xV.filter(e=>"image-custom"!==e.id).filter(i=>{var n;return Object.keys(null!==(n=i.pipelineConfigs)&&void 0!==n?n:[]).find(i=>null==e?void 0:e(PV[i],null!=t?t:{}))}).map(e=>e.id),HV=function(){let e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0;return"undefined"!=typeof __filename&&(e=e||__filename),function(t){var i,n,r=void 0!==(t=t||{})?t:{};r.ready=new Promise(function(e,t){i=e,n=t});var s,o={};for(s in r)r.hasOwnProperty(s)&&(o[s]=r[s]);var a,c,g,d,I="./this.program",C=function(e,t){throw t};a="object"==typeof window,c="function"==typeof importScripts,g="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,d=!a&&!g&&!c;var l,A,u,p,h,m="";g?(m=c?require("path").dirname(m)+"/":__dirname+"/",l=function(e,t){return p||(p=require("fs")),h||(h=require("path")),e=h.normalize(e),p.readFileSync(e,t?null:"utf8")},u=function(e){var t=l(e,!0);return t.buffer||(t=new Uint8Array(t)),S(t.buffer),t},process.argv.length>1&&(I=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof oe))throw e}),process.on("unhandledRejection",M),C=function(e){process.exit(e)},r.inspect=function(){return"[Emscripten Module object]"}):d?("undefined"!=typeof read&&(l=function(e){return read(e)}),u=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(S("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(C=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(a||c)&&(c?m=self.location.href:"undefined"!=typeof document&&document.currentScript&&(m=document.currentScript.src),e&&(m=e),m=0!==m.indexOf("blob:")?m.substr(0,m.lastIndexOf("/")+1):"",l=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},c&&(u=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),A=function(e,t,i){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?t(n.response):i()},n.onerror=i,n.send(null)});var f,b,v=r.print||console.log.bind(console),y=r.printErr||console.warn.bind(console);for(s in o)o.hasOwnProperty(s)&&(r[s]=o[s]);o=null,r.arguments&&r.arguments,r.thisProgram&&(I=r.thisProgram),r.quit&&(C=r.quit),r.wasmBinary&&(f=r.wasmBinary),r.noExitRuntime,"object"!=typeof WebAssembly&&M("no native wasm support detected");var w=!1;function S(e,t){e||M("Assertion failed: "+t)}var Z,R,k,V,_,T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function W(e,t,i){for(var n=t+i,r=t;e[r]&&!(r>=n);)++r;if(r-t>16&&e.subarray&&T)return T.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function G(e,t){return e%t>0&&(e+=t-e%t),e}function B(e){Z=e,r.HEAP8=R=new Int8Array(e),r.HEAP16=new Int16Array(e),r.HEAP32=V=new Int32Array(e),r.HEAPU8=k=new Uint8Array(e),r.HEAPU16=new Uint16Array(e),r.HEAPU32=new Uint32Array(e),r.HEAPF32=new Float32Array(e),r.HEAPF64=new Float64Array(e)}r.INITIAL_MEMORY;var E=[],X=[],N=[],P=[];function x(e){E.unshift(e)}function F(e){P.unshift(e)}X.push({func:function(){ne()}});var O=0,H=null;function M(e){r.onAbort&&r.onAbort(e),y(e+=""),w=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw n(t),t}function D(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}r.preloadedImages={},r.preloadedAudios={};function K(e){return D(e,"data:application/octet-stream;base64,")}function Y(e){return D(e,"file://")}var j,J,L="tflite-simd.wasm";function U(e){try{if(e==L&&f)return new Uint8Array(f);if(u)return u(e);throw"both async and sync fetching of the wasm failed"}catch(e){M(e)}}function z(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var i=t.func;"number"==typeof i?void 0===t.arg?_.get(i)():_.get(i)(t.arg):i(void 0===t.arg?null:t.arg)}else t(r)}}K(L)||(j=L,L=r.locateFile?r.locateFile(j,m):m+j),J=g?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};function Q(e){return V[se()>>2]=e,e}function $(e){try{return b.grow(e-Z.byteLength+65535>>>16),B(b.buffer),1}catch(e){}}var q={};function ee(){if(!ee.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:I||"./this.program"};for(var t in q)e[t]=q[t];var i=[];for(var t in e)i.push(t+"="+e[t]);ee.strings=i}return ee.strings}var te={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var i=te.buffers[e];0===t||10===t?((1===e?v:y)(W(i,0)),i.length=0):i.push(t)},varargs:void 0,get:function(){return te.varargs+=4,V[te.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?W(k,e,t):""}(e);return t},get64:function(e,t){return e}};var ie={a:function(){M()},n:function(e,t){var i;if(0===e)i=Date.now();else{if(1!==e&&4!==e)return Q(28),-1;i=J()}return V[t>>2]=i/1e3|0,V[t+4>>2]=i%1e3*1e3*1e3|0,0},i:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,i){k.copyWithin(e,t,t+i)},m:function(e){var t=k.length,i=2147483648;if(e>i)return!1;for(var n=1;n<=4;n*=2){var r=t*(1+.2/n);if(r=Math.min(r,e+100663296),$(Math.min(i,G(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=J();J()-t<e;);},p:function(e,t){var i=0;return ee().forEach(function(n,r){var s=t+i;V[e+4*r>>2]=s,function(e,t){for(var i=0;i<e.length;++i)R[0|t++]=e.charCodeAt(i);R[0|t]=0}(n,s),i+=n.length+1}),0},g:function(e,t){var i=ee();V[e>>2]=i.length;var n=0;return i.forEach(function(e){n+=e.length+1}),V[t>>2]=n,0},j:function(e){!function(e){C(e,new oe(e))}(e)},h:function(e){return 0},k:function(e,t,i,n,r){},c:function(e,t,i,n){for(var r=0,s=0;s<i;s++){for(var o=V[t+8*s>>2],a=V[t+(8*s+4)>>2],c=0;c<a;c++)te.printChar(e,k[o+c]);r+=a}return V[n>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Q(28),-1}};!function(){var e={a:ie};function t(e,t){var i=e.exports;r.asm=i,B((b=r.asm.q).buffer),_=r.asm.D,function(){if(O--,r.monitorRunDependencies&&r.monitorRunDependencies(O),0==O&&H){var e=H;H=null,e()}}()}function i(e){t(e.instance)}function s(t){return function(){if(!f&&(a||c)){if("function"==typeof fetch&&!Y(L))return fetch(L,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+L+"'";return e.arrayBuffer()}).catch(function(){return U(L)});if(A)return new Promise(function(e,t){A(L,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return U(L)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){y("failed to asynchronously prepare wasm: "+e),M(e)})}if(O++,r.monitorRunDependencies&&r.monitorRunDependencies(O),r.instantiateWasm)try{return r.instantiateWasm(e,t)}catch(e){return y("Module.instantiateWasm callback failed with error: "+e),!1}(f||"function"!=typeof WebAssembly.instantiateStreaming||K(L)||Y(L)||"function"!=typeof fetch?s(i):fetch(L,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(i,function(e){return y("wasm streaming compile failed: "+e),y("falling back to ArrayBuffer instantiation"),s(i)})})).catch(n)}();var ne=r.___wasm_call_ctors=function(){return(ne=r.___wasm_call_ctors=r.asm.r).apply(null,arguments)};r._getModelBufferMemoryOffset=function(){return(r._getModelBufferMemoryOffset=r.asm.s).apply(null,arguments)},r._getInputMemoryOffset=function(){return(r._getInputMemoryOffset=r.asm.t).apply(null,arguments)},r._getInputHeight=function(){return(r._getInputHeight=r.asm.u).apply(null,arguments)},r._getInputWidth=function(){return(r._getInputWidth=r.asm.v).apply(null,arguments)},r._getInputChannelCount=function(){return(r._getInputChannelCount=r.asm.w).apply(null,arguments)},r._getOutputMemoryOffset=function(){return(r._getOutputMemoryOffset=r.asm.x).apply(null,arguments)},r._getOutputHeight=function(){return(r._getOutputHeight=r.asm.y).apply(null,arguments)},r._getOutputWidth=function(){return(r._getOutputWidth=r.asm.z).apply(null,arguments)},r._getOutputChannelCount=function(){return(r._getOutputChannelCount=r.asm.A).apply(null,arguments)},r._loadModel=function(){return(r._loadModel=r.asm.B).apply(null,arguments)},r._runInference=function(){return(r._runInference=r.asm.C).apply(null,arguments)};var re,se=r.___errno_location=function(){return(se=r.___errno_location=r.asm.E).apply(null,arguments)};function oe(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function ae(e){function t(){re||(re=!0,r.calledRun=!0,w||(z(X),z(N),i(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),function(){if(r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;)F(r.postRun.shift());z(P)}()))}O>0||(!function(){if(r.preRun)for("function"==typeof r.preRun&&(r.preRun=[r.preRun]);r.preRun.length;)x(r.preRun.shift());z(E)}(),O>0||(r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),t()},1)):t()))}if(H=function e(){re||ae(),re||(H=e)},r.run=ae,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return ae(),t.ready}}();var MV,DV=Object.freeze({__proto__:null,default:HV}),KV=(MV="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,"undefined"!=typeof __filename&&(MV=MV||__filename),function(e){var t,i,n=void 0!==(e=e||{})?e:{};n.ready=new Promise(function(e,n){t=e,i=n});var r,s={};for(r in n)n.hasOwnProperty(r)&&(s[r]=n[r]);var o,a,c,g,d="./this.program",I=function(e,t){throw t};o="object"==typeof window,a="function"==typeof importScripts,c="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,g=!o&&!c&&!a;var C,l,A,u,p,h="";c?(h=a?require("path").dirname(h)+"/":__dirname+"/",C=function(e,t){return u||(u=require("fs")),p||(p=require("path")),e=p.normalize(e),u.readFileSync(e,t?null:"utf8")},A=function(e){var t=C(e,!0);return t.buffer||(t=new Uint8Array(t)),w(t.buffer),t},process.argv.length>1&&(d=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof se))throw e}),process.on("unhandledRejection",H),I=function(e){process.exit(e)},n.inspect=function(){return"[Emscripten Module object]"}):g?("undefined"!=typeof read&&(C=function(e){return read(e)}),A=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(w("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(I=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(o||a)&&(a?h=self.location.href:"undefined"!=typeof document&&document.currentScript&&(h=document.currentScript.src),MV&&(h=MV),h=0!==h.indexOf("blob:")?h.substr(0,h.lastIndexOf("/")+1):"",C=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},a&&(A=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),l=function(e,t,i){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?t(n.response):i()},n.onerror=i,n.send(null)});var m,f,b=n.print||console.log.bind(console),v=n.printErr||console.warn.bind(console);for(r in s)s.hasOwnProperty(r)&&(n[r]=s[r]);s=null,n.arguments&&n.arguments,n.thisProgram&&(d=n.thisProgram),n.quit&&(I=n.quit),n.wasmBinary&&(m=n.wasmBinary),n.noExitRuntime,"object"!=typeof WebAssembly&&H("no native wasm support detected");var y=!1;function w(e,t){e||H("Assertion failed: "+t)}var S,Z,R,k,V,_="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function T(e,t,i){for(var n=t+i,r=t;e[r]&&!(r>=n);)++r;if(r-t>16&&e.subarray&&_)return _.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function W(e,t){return e%t>0&&(e+=t-e%t),e}function G(e){S=e,n.HEAP8=Z=new Int8Array(e),n.HEAP16=new Int16Array(e),n.HEAP32=k=new Int32Array(e),n.HEAPU8=R=new Uint8Array(e),n.HEAPU16=new Uint16Array(e),n.HEAPU32=new Uint32Array(e),n.HEAPF32=new Float32Array(e),n.HEAPF64=new Float64Array(e)}n.INITIAL_MEMORY;var B=[],E=[],X=[],N=[];function P(e){B.unshift(e)}function x(e){N.unshift(e)}E.push({func:function(){ie()}});var F=0,O=null;function H(e){n.onAbort&&n.onAbort(e),v(e+=""),y=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function M(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}function D(e){return M(e,"data:application/octet-stream;base64,")}function K(e){return M(e,"file://")}n.preloadedImages={},n.preloadedAudios={};var Y,j,J="tflite.wasm";function L(e){try{if(e==J&&m)return new Uint8Array(m);if(A)return A(e);throw"both async and sync fetching of the wasm failed"}catch(e){H(e)}}function U(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var i=t.func;"number"==typeof i?void 0===t.arg?V.get(i)():V.get(i)(t.arg):i(void 0===t.arg?null:t.arg)}else t(n)}}function z(e){return k[re()>>2]=e,e}function Q(e){try{return f.grow(e-S.byteLength+65535>>>16),G(f.buffer),1}catch(e){}}D(J)||(Y=J,J=n.locateFile?n.locateFile(Y,h):h+Y),j=c?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};var $={};function q(){if(!q.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:d||"./this.program"};for(var t in $)e[t]=$[t];var i=[];for(var t in e)i.push(t+"="+e[t]);q.strings=i}return q.strings}var ee={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var i=ee.buffers[e];0===t||10===t?((1===e?b:v)(T(i,0)),i.length=0):i.push(t)},varargs:void 0,get:function(){return ee.varargs+=4,k[ee.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?T(R,e,t):""}(e);return t},get64:function(e,t){return e}},te={a:function(){H()},n:function(e,t){var i;if(0===e)i=Date.now();else{if(1!==e&&4!==e)return z(28),-1;i=j()}return k[t>>2]=i/1e3|0,k[t+4>>2]=i%1e3*1e3*1e3|0,0},i:function(e,t){H("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){H("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,i){R.copyWithin(e,t,t+i)},m:function(e){var t=R.length,i=2147483648;if(e>i)return!1;for(var n=1;n<=4;n*=2){var r=t*(1+.2/n);if(r=Math.min(r,e+100663296),Q(Math.min(i,W(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=j();j()-t<e;);},p:function(e,t){var i=0;return q().forEach(function(n,r){var s=t+i;k[e+4*r>>2]=s,function(e,t){for(var i=0;i<e.length;++i)Z[0|t++]=e.charCodeAt(i);Z[0|t]=0}(n,s),i+=n.length+1}),0},g:function(e,t){var i=q();k[e>>2]=i.length;var n=0;return i.forEach(function(e){n+=e.length+1}),k[t>>2]=n,0},j:function(e){!function(e){I(e,new se(e))}(e)},h:function(e){return 0},k:function(e,t,i,n,r){},c:function(e,t,i,n){for(var r=0,s=0;s<i;s++){for(var o=k[t+8*s>>2],a=k[t+(8*s+4)>>2],c=0;c<a;c++)ee.printChar(e,R[o+c]);r+=a}return k[n>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return z(28),-1}};!function(){var e={a:te};function t(e,t){var i=e.exports;n.asm=i,G((f=n.asm.q).buffer),V=n.asm.D,function(){if(F--,n.monitorRunDependencies&&n.monitorRunDependencies(F),0==F&&O){var e=O;O=null,e()}}()}function r(e){t(e.instance)}function s(t){return function(){if(!m&&(o||a)){if("function"==typeof fetch&&!K(J))return fetch(J,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+J+"'";return e.arrayBuffer()}).catch(function(){return L(J)});if(l)return new Promise(function(e,t){l(J,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return L(J)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){v("failed to asynchronously prepare wasm: "+e),H(e)})}if(F++,n.monitorRunDependencies&&n.monitorRunDependencies(F),n.instantiateWasm)try{return n.instantiateWasm(e,t)}catch(e){return v("Module.instantiateWasm callback failed with error: "+e),!1}(m||"function"!=typeof WebAssembly.instantiateStreaming||D(J)||K(J)||"function"!=typeof fetch?s(r):fetch(J,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(r,function(e){return v("wasm streaming compile failed: "+e),v("falling back to ArrayBuffer instantiation"),s(r)})})).catch(i)}();var ie=n.___wasm_call_ctors=function(){return(ie=n.___wasm_call_ctors=n.asm.r).apply(null,arguments)};n._getModelBufferMemoryOffset=function(){return(n._getModelBufferMemoryOffset=n.asm.s).apply(null,arguments)},n._getInputMemoryOffset=function(){return(n._getInputMemoryOffset=n.asm.t).apply(null,arguments)},n._getInputHeight=function(){return(n._getInputHeight=n.asm.u).apply(null,arguments)},n._getInputWidth=function(){return(n._getInputWidth=n.asm.v).apply(null,arguments)},n._getInputChannelCount=function(){return(n._getInputChannelCount=n.asm.w).apply(null,arguments)},n._getOutputMemoryOffset=function(){return(n._getOutputMemoryOffset=n.asm.x).apply(null,arguments)},n._getOutputHeight=function(){return(n._getOutputHeight=n.asm.y).apply(null,arguments)},n._getOutputWidth=function(){return(n._getOutputWidth=n.asm.z).apply(null,arguments)},n._getOutputChannelCount=function(){return(n._getOutputChannelCount=n.asm.A).apply(null,arguments)},n._loadModel=function(){return(n._loadModel=n.asm.B).apply(null,arguments)},n._runInference=function(){return(n._runInference=n.asm.C).apply(null,arguments)};var ne,re=n.___errno_location=function(){return(re=n.___errno_location=n.asm.E).apply(null,arguments)};function se(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function oe(e){function i(){ne||(ne=!0,n.calledRun=!0,y||(U(E),U(X),t(n),n.onRuntimeInitialized&&n.onRuntimeInitialized(),function(){if(n.postRun)for("function"==typeof n.postRun&&(n.postRun=[n.postRun]);n.postRun.length;)x(n.postRun.shift());U(N)}()))}F>0||(function(){if(n.preRun)for("function"==typeof n.preRun&&(n.preRun=[n.preRun]);n.preRun.length;)P(n.preRun.shift());U(B)}(),F>0||(n.setStatus?(n.setStatus("Running..."),setTimeout(function(){setTimeout(function(){n.setStatus("")},1),i()},1)):i()))}if(O=function e(){ne||oe(),ne||(O=e)},n.run=oe,n.preInit)for("function"==typeof n.preInit&&(n.preInit=[n.preInit]);n.preInit.length>0;)n.preInit.pop()();return oe(),e.ready}),YV=Object.freeze({__proto__:null,default:KV}),jV=Object.freeze({__proto__:null,createEffectStream:(e,t,i,n)=>Pk(void 0,void 0,void 0,function*(){const{pipeline:r,mergedSetup:s,mergedParams:o}=FV(t,i,n);s.logToConsole&&console.log(`Setting effect preset ${t}`,{setup:s,params:o});const{stream:a,stop:c,updateParams:g}=yield r.module.createEffectStream(e,s,o),d="safari"===we.browserDetails.browser?(()=>{let e=!1;const t=()=>requestAnimationFrame(()=>{e||t()});return t(),()=>e=!0})():()=>{};return{stream:a,stop:()=>{s.logToConsole&&console.log("Stopping effects"),d(),c()},tryUpdate:(e,t,i)=>Pk(void 0,void 0,void 0,function*(){const{pipeline:n,mergedSetup:o,mergedParams:a}=FV(e,t,i);return g&&n===r&&JSON.stringify(o)===JSON.stringify(s)?(s.logToConsole&&console.log(`Updating to effect preset ${e}`,{params:a}),yield g(a)):(s.logToConsole&&console.log("Cannot update effect, needs to create new pipeline"),!1)})}}),getPresets:e=>xV.map(t=>{var i;const n=!!Object.keys(null!==(i=t.pipelineConfigs)&&void 0!==i?i:[]).find(t=>PV[t].canUse(null!=e?e:{}));return{id:t.id,kind:(r=t.id,r.startsWith("image-")?"image":r.startsWith("video-")?"video":"blur"),supported:n};var r}),getUsablePresets:OV,setDefaultSetup:(e,t)=>{const i=PV[e].getDefaultSetup(),n=Object.assign(Object.assign({},i),t);PV[e].getDefaultSetup=()=>n},warmup:(e,...t)=>Pk(void 0,[e,...t],void 0,function*(e,t=()=>({}),i={}){var n;const r=e||OV({filter:e=>e.canUse({}),options:{}}).at(0)||(null===(n=xV.at(0))||void 0===n?void 0:n.id);if(!r)return;const s=FV(r,t,i);if(!s)return;const{mergedSetup:o,mergedParams:a}=s;if(yield CV(o.segmentationModelId),null==a?void 0:a.backgroundUrl){yield tV(a);try{yield iV(a.backgroundUrl,a.backgroundType)}catch(e){}}})});function JV(e,t,i,n){return new(i||(i=Promise))(function(r,s){function o(e){try{c(n.next(e))}catch(e){s(e)}}function a(e){try{c(n.throw(e))}catch(e){s(e)}}function c(e){e.done?r(e.value):function(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(o,a)}c((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;const LV=e=>`https://cdn.srv.whereby.com/audio-denoiser/v1-0-6/${e}`,UV={denoiser:{wasm:LV("assets/denoiser/model.ext.wasm"),processor:LV("assets/denoiser/processor.ext.js")}},zV=new Map,QV="undefined"!=typeof AudioContext?AudioContext:globalThis.webkitAudioContext;let $V=null;const qV=e=>JV(void 0,void 0,void 0,function*(){return $V||($V=JV(void 0,void 0,void 0,function*(){const t=yield JV(void 0,void 0,void 0,function*(){return UV.denoiser.wasm}),i=yield fetch(t);if(!i.ok){const t=new Error(`Failed to fetch denoiser model: ${i.status} ${i.statusText}`);throw null==e||e(t,{tags:{from:"audioDenoiser.loadWasmBuffer"}}),$V=null,t}return i.arrayBuffer()})),$V});let e_=null;const t_=e=>JV(void 0,void 0,void 0,function*(){if(e_||(e_=new WeakSet),e_.has(e))return;const t=yield JV(void 0,void 0,void 0,function*(){return UV.denoiser.processor});yield e.audioWorklet.addModule(t),e_.add(e)});class i_ extends AudioWorkletNode{constructor(e,t){super(e,"denoiser",{channelCountMode:"explicit",channelCount:1,channelInterpretation:"speakers",numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1],processorOptions:{wasmBuffer:t}})}}var n_=Object.freeze({__proto__:null,applyAudioDenoiser:e=>JV(void 0,[e],void 0,function*({inputStream:e,doCaptureException:t}){const i=e.getAudioTracks()[0],n=null==i?void 0:i.getSettings().sampleRate,r=function(e,t){var i;if(!QV)throw new Error("AudioContext is not supported in this environment");const n=`${e}:${null!==(i=null==t?void 0:t.sampleRate)&&void 0!==i?i:"default"}`;let r=zV.get(n);return r||(r=new QV(t),zV.set(n,r)),r}("audiodenoiser",n?{sampleRate:n}:void 0),s=r.createMediaStreamDestination(),[o]=yield Promise.all([qV(t),t_(r)]),a=r.createMediaStreamSource(e),c=new i_(r,o);c.port.onmessage=e=>{var i;(null===(i=e.data)||void 0===i?void 0:i.error)&&(null==t||t(new Error(e.data.error),{tags:{from:"audioDenoiser.onmessage"},extra:{sampleRate:n}}))},c.onprocessorerror=e=>{const i=e,r=new Error(`Denoiser processor error: ${i.error} - ${i.message}`);null==t||t(r,{tags:{from:"audioDenoiser.onprocessorerror"},extra:{sampleRate:n}})},c.connect(s),a.connect(c);const g=s.stream.getAudioTracks()[0];g&&i&&Object.defineProperty(g,"enabled",{get:()=>i.enabled,set(e){i.enabled=e}}),g&&(Xa(g).isEffectTrack=!0);let d=!1;return{outputStream:s.stream,audioContext:r,denoiserNode:c,stop:()=>{if(!d){d=!0;try{c.port.postMessage(!1),a.disconnect(),c.disconnect()}catch(e){console.error("Error stopping audio denoiser",e)}}}}}),canUse:()=>"undefined"!=typeof AudioWorkletNode&&"undefined"!=typeof AudioContext,warmup:()=>JV(void 0,void 0,void 0,function*(){yield qV()})});return e.ACCEPTED_FILE_TYPES=tb,e.GridCell=Ek,e.GridVideoView=Xk,e.MAX_FILES_PER_UPLOAD=10,e.MAX_FILE_SIZE=eb,e.ParticipantMenu=Sk,e.ParticipantMenuContent=Zk,e.ParticipantMenuItem=kk,e.ParticipantMenuTrigger=Rk,e.VideoGrid=function({renderParticipant:e,renderFloatingParticipant:t,stageParticipantLimit:i,gridGap:n,videoGridGap:r,enableSubgrid:s,enableParticipantMenu:a,enableConstrainedGrid:c}){const g=o.useRef(null),{containerFrame:d,cellViewsFloating:I,cellViewsVideoGrid:C,cellViewsInPresentationGrid:l,cellViewsInSubgrid:A,clientAspectRatios:u,videoStage:p,setContainerBounds:h,setClientAspectRatios:m,maximizedParticipant:f,setMaximizedParticipant:b,isConstrained:v,floatingParticipant:y,setFloatingParticipant:w}=function({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:i=12,gridGap:n=8,videoGridGap:r=8,enableSubgrid:s=!0,enableConstrainedGrid:a=!0}={}){const[c,g]=o.useState({width:0,height:0}),[d,I]=o.useState(!1),[C,l]=o.useState({}),[A,u]=o.useState(null),[p,h]=o.useState(null),{clientViewsInGrid:m,clientViewsInPresentationGrid:f,clientViewsInSubgrid:b,floatingClientView:v}=Gy({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:i,enableSubgrid:s,maximizedParticipant:A,floatingParticipant:p,isConstrained:!!a&&!!d}),y=o.useMemo(()=>v?[Wy({client:v,aspectRatio:C[v.id],avatarSize:0,cellPaddings:{top:0,right:0}})]:[],[v,C]),w=o.useMemo(()=>m.map(e=>Wy({client:e,aspectRatio:C[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[m,C]),S=o.useMemo(()=>f.map(e=>Wy({client:e,aspectRatio:C[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[f,C]),Z=o.useMemo(()=>b.map(e=>Wy({client:e,aspectRatio:C[e.id],avatarSize:0,cellPaddings:{top:0,right:0},isSubgrid:!0})),[b,C]),R=o.useMemo(()=>zv(c),[c]);o.useEffect(()=>{a&&I(c.width<500||c.height<500)},[c,a]);const k=o.useMemo(()=>Ty({floatingVideo:y[0],frame:R,gridGap:n,isConstrained:d,roomBounds:R.bounds,videos:w,videoGridGap:r,presentationVideos:S,subgridVideos:Z}),[R,y,w,S,Z,n,r]);return{containerFrame:R,cellViewsFloating:y,cellViewsVideoGrid:w,cellViewsInPresentationGrid:S,cellViewsInSubgrid:Z,clientAspectRatios:C,videoStage:k,setContainerBounds:g,setClientAspectRatios:l,maximizedParticipant:A,setMaximizedParticipant:u,floatingParticipant:p,setFloatingParticipant:h,isConstrained:d}}({activeVideosSubgridTrigger:12,stageParticipantLimit:i,gridGap:n,videoGridGap:r,enableSubgrid:s,enableConstrainedGrid:c}),S=o.useCallback(({aspectRatio:e,clientId:t})=>{m(i=>Object.assign(Object.assign({},i),{[t]:e}))},[m]),Z=o.useMemo(()=>Nk(Object.assign({cellView:I[0],enableParticipantMenu:a},t?{render:({participant:e})=>t({participant:e})}:{})),[I]),R=o.useMemo(()=>l.map(t=>Nk(Object.assign({cellView:t,enableParticipantMenu:a},e?{render:({participant:t})=>e({participant:t})}:{}))),[l]),k=o.useMemo(()=>C.map(t=>Nk(Object.assign({cellView:t,enableParticipantMenu:a},e?{render:({participant:t})=>e({participant:t})}:{}))),[C]),V=o.useMemo(()=>A.map(e=>Nk({cellView:e,enableParticipantMenu:a})),[A]);return o.useEffect(()=>{if(!g.current)return;const e=new ResizeObserver(pp(()=>{var e,t,i,n;h({width:null!==(t=null===(e=g.current)||void 0===e?void 0:e.clientWidth)&&void 0!==t?t:640,height:null!==(n=null===(i=g.current)||void 0===i?void 0:i.clientHeight)&&void 0!==n?n:480})},{delay:60,edges:!1}));return e.observe(g.current),()=>{e.disconnect()}},[]),o.createElement(bk.Provider,{value:{onSetClientAspectRatio:S,cellViewsVideoGrid:C,cellViewsInPresentationGrid:l,cellViewsInSubgrid:A,clientAspectRatios:u,maximizedParticipant:f,setMaximizedParticipant:b,floatingParticipant:y,setFloatingParticipant:w,isConstrained:v}},o.createElement("div",{ref:g,style:{width:"100%",height:"100%",position:"relative"}},o.createElement(sy,{containerFrame:d,floatingContent:Z,layoutVideoStage:p,presentationGridContent:R,gridContent:k,subgridContent:V})))},e.VideoView=Dv,e.WherebyProvider=function({children:e}){const t=o.useMemo(()=>new Pv,[]);return o.useEffect(()=>()=>{t.destroy()},[t]),o.createElement(xv.Provider,{value:t},e)},e.getUsableCameraEffectPresets=function(){return Ap(this,void 0,void 0,function*(){const{getUsablePresets:e}=yield Promise.resolve().then(function(){return jV});return e()})},e.isAudioDenoiserSupported=function(){return Ap(this,void 0,void 0,function*(){const{canUse:e}=yield Promise.resolve().then(function(){return n_});return e()})},e.useLocalMedia=function(e={audio:!0,video:!0}){var t;const i=null===(t=o.useContext(xv))||void 0===t?void 0:t.getLocalMedia(),[n,r]=o.useState(()=>jv);if(!i)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");return o.useEffect(()=>{i.startMedia(e);const t=i.subscribe(e=>{r(t=>Object.assign(Object.assign({},t),e))});return()=>{t(),i.stopMedia()}},[]),{state:n,actions:{setCameraDevice:o.useCallback(e=>i.setCameraDevice(e),[i]),setMicrophoneDevice:o.useCallback(e=>i.setMicrophoneDevice(e),[i]),setSpeakerDevice:o.useCallback(e=>i.setSpeakerDevice(e),[i]),toggleCameraEnabled:o.useCallback(e=>i.toggleCamera(e),[i]),toggleMicrophoneEnabled:o.useCallback(e=>i.toggleMicrophone(e),[i]),toggleHdModeEnabled:o.useCallback(e=>i.toggleHdMode(e),[i]),toggleLowDataModeEnabled:o.useCallback(e=>i.toggleLowDataMode(e),[i]),toggleWidescreenModeEnabled:o.useCallback(e=>i.toggleWidescreenMode(e),[i])}}},e.useRoomConnection=function(e,t=Yv){var i;const n=null===(i=o.useContext(xv))||void 0===i?void 0:i.getRoomConnection(),[r,s]=o.useState(()=>Kv);if(!n)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");const a=o.useMemo(()=>{const i=new URL(e),n=new URLSearchParams(i.search),r=t.roomKey||n.get("roomKey");return{displayName:t.displayName||"Guest",localMediaOptions:t.localMedia?void 0:t.localMediaOptions,roomKey:r,roomUrl:e,userAgent:"browser-sdk:3.26.7",externalId:t.externalId||null}},[e,t]);o.useEffect(()=>{const e=n.subscribe(e=>{s(t=>Object.assign(Object.assign({},t),e))}),t=n.getNotificationsEventEmitter();return s(e=>Object.assign(Object.assign({},e),{events:t})),()=>{e(),n.leaveRoom()}},[]);const c=o.useCallback(()=>(n.initialize(a),n.joinRoom()),[n]),g=o.useCallback((e,t)=>n.sendChatMessage(e,t),[n]),d=o.useCallback((e,t)=>n.removeChatMessage(e,t),[n]),I=o.useCallback(e=>n.sendFiles(e),[n]),C=o.useCallback(e=>n.downloadFile(e),[n]),l=o.useCallback(()=>n.knock(),[n]),A=o.useCallback(()=>n.cancelKnock(),[n]),u=o.useCallback(e=>n.setDisplayName(e),[n]),p=o.useCallback(e=>n.toggleCamera(e),[n]),h=o.useCallback(e=>n.toggleMicrophone(e),[n]),m=o.useCallback(e=>n.toggleHdMode(e),[n]),f=o.useCallback(e=>n.toggleLowDataMode(e),[n]),b=o.useCallback(e=>n.toggleWidescreenMode(e),[n]),v=o.useCallback(e=>n.toggleRaiseHand(e),[n]),y=o.useCallback(e=>n.askToSpeak(e),[n]),w=o.useCallback(e=>n.askToTurnOnCamera(e),[n]),S=o.useCallback(e=>n.acceptWaitingParticipant(e),[n]),Z=o.useCallback(e=>n.rejectWaitingParticipant(e),[n]),R=o.useCallback(()=>n.startCloudRecording(),[n]),k=o.useCallback(()=>n.startLiveCaptions(),[n]),V=o.useCallback(()=>n.startLiveTranscription(),[n]),_=o.useCallback(()=>n.startScreenshare(),[n]),T=o.useCallback(()=>n.stopCloudRecording(),[n]),W=o.useCallback(()=>n.stopLiveCaptions(),[n]),G=o.useCallback(()=>n.stopLiveTranscription(),[n]),B=o.useCallback(()=>n.stopScreenshare(),[n]),E=o.useCallback(()=>n.leaveRoom(),[n]),X=o.useCallback(e=>n.lockRoom(e),[n]),N=o.useCallback(e=>n.muteParticipants(e),[n]),P=o.useCallback(e=>n.turnOffParticipantCameras(e),[n]),x=o.useCallback(e=>n.spotlightParticipant(e),[n]),F=o.useCallback(e=>n.removeSpotlight(e),[n]),O=o.useCallback(e=>n.kickParticipant(e),[n]),H=o.useCallback(e=>n.endMeeting(e),[n]),M=o.useCallback(e=>n.joinBreakoutGroup(e),[n]),D=o.useCallback(()=>n.joinBreakoutMainRoom(),[n]),K=o.useCallback(e=>Hv(this,void 0,void 0,function*(){yield n.switchCameraEffect(e)}),[n]),Y=o.useCallback(e=>Hv(this,void 0,void 0,function*(){yield n.switchCameraEffectCustom(e)}),[n]),j=o.useCallback(()=>Hv(this,void 0,void 0,function*(){yield n.clearCameraEffect()}),[n]),J=o.useCallback(()=>Hv(this,void 0,void 0,function*(){yield n.enableAudioDenoiser()}),[n]),L=o.useCallback(()=>Hv(this,void 0,void 0,function*(){yield n.disableAudioDenoiser()}),[n]),{events:U}=r;return{state:Ov(r,["events"]),events:U,actions:{askToSpeak:y,askToTurnOnCamera:w,acceptWaitingParticipant:S,knock:l,cancelKnock:A,joinRoom:c,leaveRoom:E,lockRoom:X,muteParticipants:N,turnOffParticipantCameras:P,kickParticipant:O,endMeeting:H,rejectWaitingParticipant:Z,sendChatMessage:g,removeChatMessage:d,sendFiles:I,downloadFile:C,setDisplayName:u,startCloudRecording:R,startLiveCaptions:k,startLiveTranscription:V,startScreenshare:_,stopCloudRecording:T,stopLiveCaptions:W,stopLiveTranscription:G,stopScreenshare:B,toggleCamera:p,toggleMicrophone:h,toggleRaiseHand:v,toggleHdMode:m,toggleLowDataMode:f,toggleWidescreenMode:b,spotlightParticipant:x,removeSpotlight:F,joinBreakoutGroup:M,joinBreakoutMainRoom:D,switchCameraEffect:K,switchCameraEffectCustom:Y,clearCameraEffect:j,enableAudioDenoiser:J,disableAudioDenoiser:L}}},e}({},React,ReactDOM);
|
|
134
|
+
}`,d=s/o,I=mV(e,e.VERTEX_SHADER,c),C=mV(e,e.FRAGMENT_SHADER,g),l=hV(e,I,C,t,i),A=e.getUniformLocation(l,"u_backgroundScale"),u=e.getUniformLocation(l,"u_backgroundOffset"),p=e.getUniformLocation(l,"u_inputFrame"),h=e.getUniformLocation(l,"u_personMask"),m=e.getUniformLocation(l,"u_background"),f=e.getUniformLocation(l,"u_coverage");e.useProgram(l),e.uniform2f(A,1,1),e.uniform2f(u,0,0),e.uniform1i(p,0),e.uniform1i(h,1);let b=null;function v(t){const i=t.naturalWidth||t.videoWidth||t.width,n=t.naturalHeight||t.videoHeight||t.height;b=fV(e,e.RGBA8,i,n,e.LINEAR,e.LINEAR),e.texSubImage2D(e.TEXTURE_2D,0,0,0,i,n,e.RGBA,e.UNSIGNED_BYTE,t);let r=0,s=0,o=i,a=n;o/a<d?(a=o/d,s=(n-a)/2):(o=a*d,r=(i-o)/2);const c=o/i,g=a/n;r/=i,s/=n,e.uniform2f(A,c,g),e.uniform2f(u,r,s)}function y(t){e.useProgram(l);const i=t.coverage||[0,1];e.uniform2f(f,i[0],i[1])}return y(a),r&&v(r),{render:function(){e.viewport(0,0,s,o),e.useProgram(l),e.activeTexture(e.TEXTURE1),e.bindTexture(e.TEXTURE_2D,n),null!==b&&(e.activeTexture(e.TEXTURE2),e.bindTexture(e.TEXTURE_2D,b),e.uniform1i(m,2)),e.bindFramebuffer(e.FRAMEBUFFER,null),e.drawArrays(e.TRIANGLE_STRIP,0,4)},updateParams:y,cleanUp:function(){e.deleteTexture(b),e.deleteProgram(l),e.deleteShader(C),e.deleteShader(I)},updateBackgroundImage:function(t,i){i&&(b=null),t?b?(e.bindTexture(e.TEXTURE_2D,b),e.texSubImage2D(e.TEXTURE_2D,0,0,0,t.naturalWidth||t.videoWidth||t.width,t.naturalHeight||t.videoHeight||t.height,e.RGBA,e.UNSIGNED_BYTE,t)):v(t):b&&(b=null)}}}(A,h,m,w,s,e,t,C);return{effectCtx:A,updateBackgroundFrame(e,t,i){V.updateBackgroundImage(e,i)},updateParams(e){C=yV(r=e),k.updateParams(C),V.updateParams(C)},processFrame(e){A.clearColor(0,0,0,0),A.clear(A.COLOR_BUFFER_BIT),A.activeTexture(A.TEXTURE0),A.bindTexture(A.TEXTURE_2D,f),A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,e),A.bindVertexArray(p),S.render(),o._runInference(),Z.render(),R.render(),r.backgroundUrl?V.render():k.render()},dispose(){V.cleanUp(),k.cleanUp(),R.cleanUp(),Z.cleanUp(),S.cleanUp(),A.deleteTexture(w),A.deleteTexture(b),A.deleteTexture(f),A.deleteBuffer(m),A.deleteBuffer(h),A.deleteVertexArray(p),A.deleteShader(u)}}})}function SV(e,t,i){var n=function(e){return atob(e)}(e),r=n.indexOf("\n",10)+1,s=n.substring(r)+"",o=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(o)}function ZV(e,t,i){var n;return function(t){return n=n||SV(e),new Worker(n,t)}}var RV=ZV("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGxldCB0aW1lciA9IG51bGw7CiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiAocmVxdWVzdCkgewogICAgICAgIGNvbnN0IHRpbWUgPSByZXF1ZXN0LmRhdGE7CiAgICAgICAgaWYgKHRpbWUgPj0gMCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHBvc3RNZXNzYWdlKCIiKSwgdGltZSk7CiAgICAgICAgZWxzZSBpZiAodGltZXIpCiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXIud29ya2VyLmpzLm1hcAoK");class kV extends eV.EventEmitter{constructor({setup:e,params:t,videoWidth:i,videoHeight:n,emit:r}){super(),this.setup=e,this.params=t,this.videoWidth=i,this.videoHeight=n,this.status="new",r&&(this.emit=r)}setupEngine(e,t,i,n){return Pk(this,void 0,void 0,function*(){this.videoWidth=e,this.videoHeight=t,this.videoAspectRatio=this.videoWidth/this.videoHeight,this.effectCanvas=i||nV(this.videoWidth,this.videoHeight);const r=this.setup.useWebGL?wV:uV;this.engine=yield r(this.videoWidth,this.videoHeight,this.setup,this.effectCanvas,this.params,n),this.effectCtx=this.engine.effectCtx,n&&this.updateBackgroundFrame({frame:n})})}updateVideoSize(e){return Pk(this,arguments,void 0,function*({videoWidth:e,videoHeight:t}){const i=this.currentBackgroundFrame;this.currentBackgroundFrame=null;const n=this.engine;if("new"===this.status)return console.warn("Video size updated before engine was initialized."),this.videoWidth=e,void(this.videoHeight=t);"init"===this.status&&console.warn("Video size updated while engine was initializating."),yield this.setupEngine(e,t,this.effectCanvas,i),n.dispose()})}init(e){return Pk(this,arguments,void 0,function*({initialBackgroundFrame:e,useInsertableStreams:t,effectCanvas:i}){if(this.status="init",yield this.setupEngine(this.videoWidth,this.videoHeight,i,e),t){let e=5,t=0,i=0,n=!1;this.transformer=new TransformStream({transform:(r,s)=>Pk(this,void 0,void 0,function*(){this.transformController=s;const o=r.timestamp,a=performance.now();t||(t=a,i=o/1e3);e>0||a-t<o/1e3-i+200?(this.processAndRenderFrame(r),r.close(),this.hasVideoBackground&&"canvas"!==this.setup.transferType&&this.emit("getbackgroundframe"),e>0&&(e--,t=a,i=o/1e3),s.enqueue(new VideoFrame(this.effectCanvas,{timestamp:o})),n||(n=!0,this.emit("firstframerendered"))):r.close()})})}else this.setup.useBackgroundWorker||(this.timerWorker=new RV,this.timerWorker.addEventListener("message",()=>{this.emit("output",{frame:this.currentOutputFrame},[this.currentOutputFrame])}));this.status="ready",this.emit("ready")})}updateParams({params:e,initialBackgroundFrame:t}){!this._terminated&&this.engine&&(this.params=e,this.currentBackgroundFrame=null,this.currentBackgroundFrameCtx=null,t?this.updateBackgroundFrame({frame:t,reInit:!0}):this.engine.updateBackgroundFrame(null),this.engine.updateParams(e))}updateBackgroundFrame({frame:e,reInit:t}){let i;switch(this.currentBackgroundFrame||(this.hasVideoBackground=this.params.backgroundUrl&&"video"===this.params.backgroundType,i={x:0,y:0,width:this.videoWidth,height:this.videoHeight}),this.setup.transferType){case"imagebitmap":this.currentBackgroundFrame=e;break;case"imagedata":this.currentBackgroundFrame||(this.currentBackgroundFrame=nV(this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx=this.currentBackgroundFrame.getContext("2d")),e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.currentBackgroundFrameCtx.putImageData(e,0,0);break;case"canvas":if(!this.currentBackgroundFrame){i.width=e.videoWidth||e.naturalWidth||e.width,i.height=e.videoHeight||e.naturalHeight||e.height;const t=i.width/i.height;if(t>this.videoAspectRatio){const e=i.width-i.height*this.videoAspectRatio;i.width-=e,i.x=Math.floor(e/2)}else if(t<this.videoAspectRatio){const e=i.height-i.width/this.videoAspectRatio;i.height-=e,i.y=Math.floor(e/2)}}this.currentBackgroundFrame=e}this.engine.updateBackgroundFrame(this.currentBackgroundFrame,i,t)}terminate(){this.transformController&&this.transformController.terminate(),this.timerWorker&&this.timerWorker.terminate(),this.engine&&(this.engine.dispose(),this.engine=null),this._terminated=!0,this.emit("terminated")}start({inputStream:e,outputStream:t}){e&&e.pipeThrough(this.transformer).pipeTo(t),this.frameCounter=0,this.frameCounterTime=performance.now()}input(e){return Pk(this,arguments,void 0,function*({videoFrame:e,backgroundFrame:t,requestTime:i,lastRenderTime:n,delay:r}){var s;if(this._terminated)return;const o=n+r-2*(Date.now()-i);let a;switch(t&&this.updateBackgroundFrame({frame:t}),this.setup.transferType){case"imagebitmap":null===(s=this.prevVideoFrame)||void 0===s||s.close(),this.prevVideoFrame=e,this.processAndRenderFrame(e),a=yield createImageBitmap(this.effectCanvas);break;case"imagedata":e=new ImageData(new Uint8ClampedArray(e),this.videoWidth,this.videoHeight),this.inputCanvas||(this.inputCanvas=nV(this.videoWidth,this.videoHeight),this.inputCanvasCtx=this.inputCanvas.getContext("2d")),this.inputCanvasCtx.putImageData(e,0,0),this.processAndRenderFrame(this.inputCanvas),a=this.effectCtx.getImageData(0,0,this.videoWidth,this.videoHeight).data.buffer;break;case"canvas":this.processAndRenderFrame(e),a=this.effectCanvas}const c=Math.max(0,o-Date.now());this.timerWorker?(this.currentOutputFrame=a,this.timerWorker.postMessage(c)):setTimeout(()=>{this.emit("output",{frame:a},[a])},c)})}processAndRenderFrame(e){if(this.engine.processFrame(e),this.setup.logToConsole){this.frameCounter++;const e=performance.now();e-this.frameCounterTime>1e3&&(console.log(`Running camera effects, ${Math.round(1e3*this.frameCounter/(e-this.frameCounterTime))} fps`),this.frameCounter=0,this.frameCounterTime=e)}}}let VV=0;class _V extends eV.EventEmitter{constructor(e,t){super();const i=VV++,n=(t,n)=>{this[t]=r=>{e.postMessage(Object.assign({type:t,processorId:i},r),n&&n(r).filter(e=>e))}};n("init",e=>[e.initialBackgroundFrame]),n("start",e=>[e.inputStream,e.outputStream]),n("input",e=>[e.videoFrame,e.backgroundFrame]),n("updateBackgroundFrame",e=>[e.frame]),n("updateParams",e=>[e.initialBackgroundFrame]),n("updateVideoSize"),n("terminate");const r=t=>Pk(this,void 0,void 0,function*(){if(t.data.processorId!==i)return;const n=t.data,{type:s}=n,o=function(e,t){var i={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(i[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(n=Object.getOwnPropertySymbols(e);r<n.length;r++)t.indexOf(n[r])<0&&Object.prototype.propertyIsEnumerable.call(e,n[r])&&(i[n[r]]=e[n[r]])}return i}(n,["type"]);this.emit(s,o),"terminated"===s&&e.removeEventListener("message",r)});e.postMessage(Object.assign({type:"create",processorId:i},t)),e.addEventListener("message",r)}}var TV=ZV("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKHdhc21GZWF0dXJlRGV0ZWN0KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdCA6IG51bGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uDQoNCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkNCiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuDQoNCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSA0KICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQ0KICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwNCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUg0KICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1INCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQogICAgLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqLw0KDQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQ0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7DQogICAgICAgIHJldHVybiBlLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlOw0KICAgIH07CgogICAgdmFyIGV2ZW50cyA9IHtleHBvcnRzOiB7fX07CgogICAgdmFyIFIgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgPyBSZWZsZWN0IDogbnVsbDsKICAgIHZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nCiAgICAgID8gUi5hcHBseQogICAgICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpOwogICAgICB9OwoKICAgIHZhciBSZWZsZWN0T3duS2V5czsKICAgIGlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXM7CiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KQogICAgICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgUmVmbGVjdE93bktleXMgPSBmdW5jdGlvbiBSZWZsZWN0T3duS2V5cyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgIH0KCiAgICB2YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkgewogICAgICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpOwogICAgfQogICAgZXZlbnRzLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7CiAgICBldmVudHMuZXhwb3J0cy5vbmNlID0gb25jZTsKCiAgICAvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLngKICAgIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwOwogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkOwoKICAgIC8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZQogICAgLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy4KICAgIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7CgogICAgZnVuY3Rpb24gY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50RW1pdHRlciwgJ2RlZmF1bHRNYXhMaXN0ZW5lcnMnLCB7CiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInIHx8IGFyZyA8IDAgfHwgTnVtYmVySXNOYU4oYXJnKSkgewogICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7CiAgICAgIH0KICAgIH0pOwoKICAgIEV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHsKICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfQoKICAgICAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDsKICAgIH07CgogICAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzCiAgICAvLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC4KICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHsKICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBOdW1iZXJJc05hTihuKSkgewogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTsKICAgICAgfQogICAgICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgZnVuY3Rpb24gX2dldE1heExpc3RlbmVycyh0aGF0KSB7CiAgICAgIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7CiAgICAgIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7CiAgICB9CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7CiAgICAgIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHsKICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTsKCiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7CiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkKICAgICAgICBkb0Vycm9yID0gKGRvRXJyb3IgJiYgZXZlbnRzLmVycm9yID09PSB1bmRlZmluZWQpOwogICAgICBlbHNlIGlmICghZG9FcnJvcikKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuCiAgICAgIGlmIChkb0Vycm9yKSB7CiAgICAgICAgdmFyIGVyOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCiAgICAgICAgICBlciA9IGFyZ3NbMF07CiAgICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvdwogICAgICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4KICAgICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudAogICAgICAgIH0KICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyCiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7CiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjsKICAgICAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50CiAgICAgIH0KCiAgICAgIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoOwogICAgICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkKICAgICAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIsIHByZXBlbmQpIHsKICAgICAgdmFyIG07CiAgICAgIHZhciBldmVudHM7CiAgICAgIHZhciBleGlzdGluZzsKCiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSAibmV3TGlzdGVuZXIiISBCZWZvcmUKICAgICAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCAibmV3TGlzdGVuZXIiLgogICAgICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGFyZ2V0LmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyID8gbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7CgogICAgICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZQogICAgICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdAogICAgICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdOwogICAgICB9CgogICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LgogICAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7CiAgICAgICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LgogICAgICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPQogICAgICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTsKICAgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC4KICAgICAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHsKICAgICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrCiAgICAgICAgbSA9IF9nZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTsKICAgICAgICBpZiAobSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSAmJiAhZXhpc3Rpbmcud2FybmVkKSB7CiAgICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlOwogICAgICAgICAgLy8gTm8gZXJyb3IgY29kZSBmb3IgdGhpcyBzaW5jZSBpdCBpcyBhIFdhcm5pbmcKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogICAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxlbmd0aCArICcgJyArIFN0cmluZyh0eXBlKSArICcgbGlzdGVuZXJzICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVhc2UgbGltaXQnKTsKICAgICAgICAgIHcubmFtZSA9ICdNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmcnOwogICAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0OwogICAgICAgICAgdy50eXBlID0gdHlwZTsKICAgICAgICAgIHcuY291bnQgPSBleGlzdGluZy5sZW5ndGg7CiAgICAgICAgICBQcm9jZXNzRW1pdFdhcm5pbmcodyk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikgewogICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgIH07CgogICAgZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7CiAgICAgIGlmICghdGhpcy5maXJlZCkgewogICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pOwogICAgICAgIHRoaXMuZmlyZWQgPSB0cnVlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikgewogICAgICB2YXIgc3RhdGUgPSB7IGZpcmVkOiBmYWxzZSwgd3JhcEZuOiB1bmRlZmluZWQsIHRhcmdldDogdGFyZ2V0LCB0eXBlOiB0eXBlLCBsaXN0ZW5lcjogbGlzdGVuZXIgfTsKICAgICAgdmFyIHdyYXBwZWQgPSBvbmNlV3JhcHBlci5iaW5kKHN0YXRlKTsKICAgICAgd3JhcHBlZC5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICBzdGF0ZS53cmFwRm4gPSB3cmFwcGVkOwogICAgICByZXR1cm4gd3JhcHBlZDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwogICAgICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID0KICAgICAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICAgICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKCiAgICAvLyBFbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9CiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHsKICAgICAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyOwoKICAgICAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTsKICAgICAgICAgIGlmIChsaXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikgewogICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdOwogICAgICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpCiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcG9zaXRpb24gPSAtMTsKCiAgICAgICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyOwogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwKQogICAgICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKQogICAgICAgICAgICAgIGxpc3Quc2hpZnQoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKQogICAgICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07CgogICAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CgogICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyOwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0KICAgICAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkgewogICAgICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzLCBpOwoKICAgICAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CgogICAgICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdAogICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHMKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXZlbnRzKTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlOwogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gTElGTyBvcmRlcgogICAgICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwoKICAgIGZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LCB0eXBlLCB1bndyYXApIHsKICAgICAgdmFyIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzOwoKICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwogICAgICBpZiAoZXZsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBbXTsKCiAgICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykKICAgICAgICByZXR1cm4gdW53cmFwID8gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl0gOiBbZXZsaXN0ZW5lcl07CgogICAgICByZXR1cm4gdW53cmFwID8KICAgICAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIHRydWUpOwogICAgfTsKCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJhd0xpc3RlbmVycyA9IGZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKSB7CiAgICAgIHJldHVybiBfbGlzdGVuZXJzKHRoaXMsIHR5cGUsIGZhbHNlKTsKICAgIH07CgogICAgRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpOwogICAgICB9CiAgICB9OwoKICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpIHsKICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50czsKCiAgICAgIGlmIChldmVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdOwoKICAgICAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkgewogICAgICByZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQgPiAwID8gUmVmbGVjdE93bktleXModGhpcy5fZXZlbnRzKSA6IFtdOwogICAgfTsKCiAgICBmdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikgewogICAgICB2YXIgY29weSA9IG5ldyBBcnJheShuKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpCiAgICAgICAgY29weVtpXSA9IGFycltpXTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7CiAgICAgIGZvciAoOyBpbmRleCArIDEgPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykKICAgICAgICBsaXN0W2luZGV4XSA9IGxpc3RbaW5kZXggKyAxXTsKICAgICAgbGlzdC5wb3AoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMoYXJyKSB7CiAgICAgIHZhciByZXQgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcmV0W2ldID0gYXJyW2ldLmxpc3RlbmVyIHx8IGFycltpXTsKICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkgewogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7CiAgICAgICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTsKICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZXIoKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBlcnJvckxpc3RlbmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgICB9CiAgICAgICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsIG5hbWUsIHJlc29sdmVyLCB7IG9uY2U6IHRydWUgfSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdlcnJvcicpIHsKICAgICAgICAgIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGVycm9yTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGhhbmRsZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCAnZXJyb3InLCBoYW5kbGVyLCBmbGFncyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7CiAgICAgIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlCiAgICAgICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS4KICAgICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykgewogICAgICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZQogICAgICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS4KICAgICAgICAgIGlmIChmbGFncy5vbmNlKSB7CiAgICAgICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpOwogICAgICAgICAgfQogICAgICAgICAgbGlzdGVuZXIoYXJnKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlbWl0dGVyKTsKICAgICAgfQogICAgfQoKICAgIHZhciBldmVudHNFeHBvcnRzID0gZXZlbnRzLmV4cG9ydHM7CgogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBpZiAoc2VsZi5kb2N1bWVudCkgewogICAgICAgICAgICBjb25zdCBjYW52YXMgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsZi5PZmZzY3JlZW5DYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IENETl9CQVNFX1VSTCA9ICJodHRwczovL2Nkbi5zcnYud2hlcmVieS5jb20vY2FtZXJhLWVmZmVjdHMvdjEtMS0zIjsKICAgIGNvbnN0IGdldEFzc2V0VXJsID0gKHBhdGgpID0+IHsKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBgJHtDRE5fQkFTRV9VUkx9LyR7cGF0aH1gOwogICAgICAgIH0KICAgIH07CiAgICBjb25zdCBhc3NldFVybHMgPSB7CiAgICAgICAgdGZsaXRlOiB7CiAgICAgICAgICAgIHdhc206IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL3RmbGl0ZS53YXNtIikgLAogICAgICAgICAgICB3YXNtU2ltZDogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvdGZsaXRlLXNpbWQud2FzbSIpICwKICAgICAgICB9LAogICAgICAgIG1vZGVsczogewogICAgICAgICAgICBzZWdtTGl0ZTogZ2V0QXNzZXRVcmwoImFzc2V0cy90ZmxpdGUvbW9kZWxzL3NlZ21fbGl0ZV92NjgxLnRmbGl0ZSIpICwKICAgICAgICAgICAgc2VnbUZ1bGw6IGdldEFzc2V0VXJsKCJhc3NldHMvdGZsaXRlL21vZGVscy9zZWdtX2Z1bGxfdjY3OS50ZmxpdGUiKSAsCiAgICAgICAgICAgIG1sa2l0OiBnZXRBc3NldFVybCgiYXNzZXRzL3RmbGl0ZS9tb2RlbHMvc2VsZmllc2VnbWVudGF0aW9uX21sa2l0LTI1NngyNTYtMjAyMV8wMV8xOS12MTIxNS5mMTYudGZsaXRlIikKICAgICAgICAgICAgICAgICwKICAgICAgICB9fTsKCiAgICBjb25zdCBsb2FkVGZsaXRlTW9kdWxlID0gKGlzU2ltZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0gaXNTaW1kCiAgICAgICAgICAgID8geWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGVTaW1kOyB9KS50aGVuKChtKSA9PiBtLmRlZmF1bHQpCiAgICAgICAgICAgIDogeWllbGQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB0ZmxpdGU7IH0pLnRoZW4oKG0pID0+IG0uZGVmYXVsdCk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRmbGl0ZU1vZHVsZTsKICAgIH0pOwogICAgY29uc3QgZ2V0TW9kZWxVcmwgPSAobW9kZWxJZCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2ggKG1vZGVsSWQpIHsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRsaXRlIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtTGl0ZTsKICAgICAgICAgICAgICAgIGNhc2UgIm1lZXRmdWxsIjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5zZWdtRnVsbDsKICAgICAgICAgICAgICAgIGNhc2UgIm1sa2l0IjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXRVcmxzLm1vZGVscy5tbGtpdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwogICAgY29uc3QgZ2V0V2FzbVVybCA9IChpc1NpbWQpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGlzU2ltZCA/IGFzc2V0VXJscy50ZmxpdGUud2FzbVNpbWQgOiBhc3NldFVybHMudGZsaXRlLndhc207CiAgICAgICAgfQogICAgfSk7CiAgICBjb25zdCBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OID0gMTsKICAgIGNvbnN0IFNFR01FTlRBVElPTk1PREVMX1RZUEVfUEVSU09OID0gMjsKICAgIGNvbnN0IHJlc29sdmVBc3NldFVybCA9ICh1cmwpID0+IHsKICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSB8fCB1cmwuc3RhcnRzV2l0aCgiYmxvYjoiKSB8fCB1cmwuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgICAgICAgICByZXR1cm4gdXJsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwsIChfZG9jdW1lbnRDdXJyZW50U2NyaXB0ICYmIF9kb2N1bWVudEN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnU0NSSVBUJyAmJiBfZG9jdW1lbnRDdXJyZW50U2NyaXB0LnNyYyB8fCBuZXcgVVJMKCdQcm9jZXNzb3JQcm94eS53b3JrZXIuanMnLCBkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSkuaHJlZjsKICAgIH07CiAgICBjb25zdCBtb2RlbHMgPSB7CiAgICAgICAgbWVldGxpdGU6IHsKICAgICAgICAgICAgaWQ6ICJtZWV0bGl0ZSIsCiAgICAgICAgICAgIHR5cGU6IFNFR01FTlRBVElPTk1PREVMX1RZUEVfQkFDS0dST1VORF9QRVJTT04sCiAgICAgICAgfSwKICAgICAgICBtZWV0ZnVsbDogewogICAgICAgICAgICBpZDogIm1lZXRmdWxsIiwKICAgICAgICAgICAgdHlwZTogU0VHTUVOVEFUSU9OTU9ERUxfVFlQRV9CQUNLR1JPVU5EX1BFUlNPTiwKICAgICAgICB9LAogICAgICAgIG1sa2l0OiB7CiAgICAgICAgICAgIGlkOiAibWxraXQiLAogICAgICAgICAgICB0eXBlOiBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTiwKICAgICAgICB9LAogICAgfTsKICAgIGxldCBfdGZsaXRlUHJvbWlzZSA9IG51bGw7CiAgICBjb25zdCBsb2FkVEZMaXRlID0gKCkgPT4gewogICAgICAgIGlmIChfdGZsaXRlUHJvbWlzZSkKICAgICAgICAgICAgcmV0dXJuIF90ZmxpdGVQcm9taXNlOwogICAgICAgIF90ZmxpdGVQcm9taXNlID0gKCgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3Qgc2ltZElzU3VwcG9ydGVkID0geWllbGQgd2FzbUZlYXR1cmVEZXRlY3Quc2ltZCgpOwogICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlVGZsaXRlTW9kdWxlID0geWllbGQgbG9hZFRmbGl0ZU1vZHVsZShzaW1kSXNTdXBwb3J0ZWQpOwogICAgICAgICAgICAgICAgY29uc3Qgd2FzbVVybCA9IHlpZWxkIGdldFdhc21Vcmwoc2ltZElzU3VwcG9ydGVkKTsKICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCBjcmVhdGVUZmxpdGVNb2R1bGUoewogICAgICAgICAgICAgICAgICAgIGxvY2F0ZUZpbGUocGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLndhc20iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVBc3NldFVybCh3YXNtVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgX3RmbGl0ZVByb21pc2UgPSBudWxsOwogICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICB9CiAgICAgICAgfSkpKCk7CiAgICAgICAgcmV0dXJuIF90ZmxpdGVQcm9taXNlOwogICAgfTsKICAgIGxldCBfbW9kZWxQcm9taXNlID0gbnVsbDsKICAgIGxldCBfbW9kZWxQcm9taXNlVXJsID0gbnVsbDsKICAgIGNvbnN0IGxvYWRTZWdtZW50YXRpb25Nb2RlbCA9IChzZWdtZW50YXRpb25Nb2RlbElkKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICBjb25zdCBtb2RlbCA9IG1vZGVsc1tzZWdtZW50YXRpb25Nb2RlbElkXTsKICAgICAgICBjb25zdCBtb2RlbFVybCA9IHJlc29sdmVBc3NldFVybCh5aWVsZCBnZXRNb2RlbFVybChtb2RlbC5pZCkpOwogICAgICAgIGlmIChfbW9kZWxQcm9taXNlVXJsID09PSBtb2RlbFVybCAmJiBfbW9kZWxQcm9taXNlKQogICAgICAgICAgICByZXR1cm4gX21vZGVsUHJvbWlzZTsKICAgICAgICBfbW9kZWxQcm9taXNlVXJsID0gbW9kZWxVcmw7CiAgICAgICAgX21vZGVsUHJvbWlzZSA9ICgoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHRmbGl0ZSA9IHlpZWxkIGxvYWRURkxpdGUoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsUmVzcG9uc2UgPSB5aWVsZCBmZXRjaChtb2RlbFVybCk7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbEJ1ZmZlciA9IHlpZWxkIG1vZGVsUmVzcG9uc2UuYXJyYXlCdWZmZXIoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsQnVmZmVyT2Zmc2V0ID0gdGZsaXRlLl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCgpOwogICAgICAgICAgICAgICAgdGZsaXRlLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkobW9kZWxCdWZmZXIpLCBtb2RlbEJ1ZmZlck9mZnNldCk7CiAgICAgICAgICAgICAgICB0ZmxpdGUuX2xvYWRNb2RlbChtb2RlbEJ1ZmZlci5ieXRlTGVuZ3RoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0SGVpZ2h0ID0gdGZsaXRlLl9nZXRJbnB1dEhlaWdodCgpOwogICAgICAgICAgICAgICAgY29uc3QgaW5wdXRXaWR0aCA9IHRmbGl0ZS5fZ2V0SW5wdXRXaWR0aCgpOwogICAgICAgICAgICAgICAgY29uc3QgaW5wdXRNZW1vcnlPZmZzZXQgPSB0ZmxpdGUuX2dldElucHV0TWVtb3J5T2Zmc2V0KCkgLyA0OwogICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TWVtb3J5T2Zmc2V0ID0gdGZsaXRlLl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQoKSAvIDQ7CiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25QaXhlbENvdW50ID0gaW5wdXRXaWR0aCAqIGlucHV0SGVpZ2h0OwogICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLAogICAgICAgICAgICAgICAgICAgIG1vZGVsLAogICAgICAgICAgICAgICAgICAgIHVybDogbW9kZWxVcmwsCiAgICAgICAgICAgICAgICAgICAgaW5wdXRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgaW5wdXRXaWR0aCwKICAgICAgICAgICAgICAgICAgICBpbnB1dE1lbW9yeU9mZnNldCwKICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZW1vcnlPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgaWYgKF9tb2RlbFByb21pc2VVcmwgPT09IG1vZGVsVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgX21vZGVsUHJvbWlzZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgX21vZGVsUHJvbWlzZVVybCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgIH0KICAgICAgICB9KSkoKTsKICAgICAgICByZXR1cm4gX21vZGVsUHJvbWlzZTsKICAgIH0pOwoKICAgIGNvbnN0IGJhc2VDYW52YXNQYXJhbXMgPSB7CiAgICAgICAgbWFza09wZXJhdGlvbjogImNvcHkiLAogICAgICAgIG1hc2tGaWx0ZXI6ICJibHVyKDRweCkiLAogICAgICAgIHBlcnNvbk9wZXJhdGlvbjogInNvdXJjZS1pbiIsCiAgICAgICAgcGVyc29uRmlsdGVyOiAibm9uZSIsCiAgICAgICAgYmFja2dyb3VuZE9wZXJhdGlvbjogImRlc3RpbmF0aW9uLW92ZXIiLAogICAgICAgIGJhY2tncm91bmRGaWx0ZXI6ICJub25lIiwKICAgIH07CiAgICBmdW5jdGlvbiBnZXRCbHVyQ2FudmFzUGFyYW1zKGFtb3VudCkgewogICAgICAgIHN3aXRjaCAoYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VDYW52YXNQYXJhbXMpLCB7IGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDRweCkiLCBjcm9wOiA0IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDE2cHgpIiwgY3JvcDogMTYgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmFzZUNhbnZhc1BhcmFtcyksIHsgbWFza0ZpbHRlcjogImJsdXIoOHB4KSIsIGJhY2tncm91bmRGaWx0ZXI6ICJibHVyKDhweCkiLCBjcm9wOiA4IH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Q2FudmFzUGFyYW1zKHBhcmFtcykgewogICAgICAgIGlmIChwYXJhbXMuYmFja2dyb3VuZEJsdXIpCiAgICAgICAgICAgIHJldHVybiBnZXRCbHVyQ2FudmFzUGFyYW1zKHBhcmFtcy5iYWNrZ3JvdW5kQmx1ci5hbW91bnQpOwogICAgICAgIHJldHVybiBiYXNlQ2FudmFzUGFyYW1zOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQ2FudmFzRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBzZXR1cCwgZWZmZWN0Q2FudmFzLCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICBjb25zdCB7IHRmbGl0ZSwgbW9kZWw6IHNlZ21lbnRhdGlvbk1vZGVsLCBpbnB1dEhlaWdodCwgaW5wdXRXaWR0aCwgaW5wdXRNZW1vcnlPZmZzZXQsIG91dHB1dE1lbW9yeU9mZnNldCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgfSA9IHlpZWxkIGxvYWRTZWdtZW50YXRpb25Nb2RlbChzZXR1cC5zZWdtZW50YXRpb25Nb2RlbElkKTsKICAgICAgICAgICAgbGV0IGNhbnZhc1BhcmFtcyA9IGdldENhbnZhc1BhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DYW52YXMgPSBjcmVhdGVDYW52YXMoaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25DdHggPSBzZWdtZW50YXRpb25DYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgICAgICAgICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBzZWdtZW50YXRpb25NYXNrID0gbmV3IEltYWdlRGF0YShpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgIGxldCBjcm9wWCA9IDA7CiAgICAgICAgICAgIGxldCBjcm9wWSA9IDA7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUNyb3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjcm9wID0gY2FudmFzUGFyYW1zLmNyb3AgfHwgMDsKICAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSB2aWRlb0FzcGVjdFJhdGlvID4gMSA/IE1hdGgucm91bmQoY3JvcCAqIHZpZGVvQXNwZWN0UmF0aW8pIDogY3JvcDsKICAgICAgICAgICAgICAgICAgICBjcm9wWSA9IHZpZGVvQXNwZWN0UmF0aW8gPCAxID8gTWF0aC5yb3VuZChjcm9wIC8gdmlkZW9Bc3BlY3RSYXRpbykgOiBjcm9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3JvcFggPSAwOwogICAgICAgICAgICAgICAgICAgIGNyb3BZID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdXBkYXRlQ3JvcCgpOwogICAgICAgICAgICBjb25zdCBlZmZlY3RDdHggPSBlZmZlY3RDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eCwKICAgICAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRGcmFtZShmcmFtZSwgZGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZERpbWVuc2lvbnMgPSBkaW1lbnNpb25zOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtcyh1cGRhdGVkUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzUGFyYW1zID0gZ2V0Q2FudmFzUGFyYW1zKHVwZGF0ZWRQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNyb3AoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHguZHJhd0ltYWdlKGZyYW1lLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IHNlZ21lbnRhdGlvbkN0eC5nZXRJbWFnZURhdGEoMCwgMCwgaW5wdXRXaWR0aCwgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZS5IRUFQRjMyW2lucHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDNdID0gaW1hZ2VEYXRhLmRhdGFbaSAqIDRdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMV0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDFdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuSEVBUEYzMltpbnB1dE1lbW9yeU9mZnNldCArIGkgKiAzICsgMl0gPSBpbWFnZURhdGEuZGF0YVtpICogNCArIDJdIC8gMjU1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZmxpdGUuX3J1bkluZmVyZW5jZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX0JBQ0tHUk9VTkRfUEVSU09OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaSAqIDIgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gTWF0aC5tYXgoYmFja2dyb3VuZCwgcGVyc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRFeHAgPSBNYXRoLmV4cChiYWNrZ3JvdW5kIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uRXhwID0gTWF0aC5leHAocGVyc29uIC0gc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudGF0aW9uTWFzay5kYXRhW2kgKiA0ICsgM10gPSAoMjU1ICogcGVyc29uRXhwKSAvIChiYWNrZ3JvdW5kRXhwICsgcGVyc29uRXhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWdtZW50YXRpb25Nb2RlbC50eXBlID09PSBTRUdNRU5UQVRJT05NT0RFTF9UWVBFX1BFUlNPTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyc29uID0gdGZsaXRlLkhFQVBGMzJbb3V0cHV0TWVtb3J5T2Zmc2V0ICsgaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25NYXNrLmRhdGFbaSAqIDQgKyAzXSA9IDI1NSAqIHBlcnNvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWdtZW50YXRpb25DdHgucHV0SW1hZ2VEYXRhKHNlZ21lbnRhdGlvbk1hc2ssIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBjYW52YXNQYXJhbXMubWFza09wZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZmlsdGVyID0gY2FudmFzUGFyYW1zLm1hc2tGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShzZWdtZW50YXRpb25DYW52YXMsIDAsIDAsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5wZXJzb25PcGVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmZpbHRlciA9IGNhbnZhc1BhcmFtcy5wZXJzb25GaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4LmRyYXdJbWFnZShmcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNhbnZhc1BhcmFtcy5iYWNrZ3JvdW5kT3BlcmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSBjYW52YXNQYXJhbXMuYmFja2dyb3VuZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RDdHguZHJhd0ltYWdlKGN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIGJhY2tncm91bmREaW1lbnNpb25zLngsIGJhY2tncm91bmREaW1lbnNpb25zLnksIGJhY2tncm91bmREaW1lbnNpb25zLndpZHRoLCBiYWNrZ3JvdW5kRGltZW5zaW9ucy5oZWlnaHQsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcFggfHwgY3JvcFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICJzb3VyY2Utb3ZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5maWx0ZXIgPSAibm9uZSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEN0eC5kcmF3SW1hZ2UoZWZmZWN0Q2FudmFzLCBjcm9wWCwgY3JvcFksIHZpZGVvV2lkdGggLSBjcm9wWCAqIDIsIHZpZGVvSGVpZ2h0IC0gY3JvcFkgKiAyLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9CgogICAgY29uc3QgZ2xzbCA9IFN0cmluZy5yYXc7CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKICAgICAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbGluayBXZWJHTCBwcm9ncmFtOiAke2dsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvZ3JhbTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKSB7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9wb3NpdGlvbiIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBwb3NpdGlvbkJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihwb3NpdGlvbkF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIGNvbnN0IHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24gPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV90ZXhDb29yZCIpOwogICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRleENvb3JkQXR0cmlidXRlTG9jYXRpb24pOwogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcih0ZXhDb29yZEF0dHJpYnV0ZUxvY2F0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwogICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gY29tcGlsZVNoYWRlcihnbCwgc2hhZGVyVHlwZSwgc2hhZGVyU291cmNlKSB7CiAgICAgICAgY29uc3Qgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwogICAgICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNoYWRlclNvdXJjZSk7CiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpOwogICAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyOiAke2dsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNoYWRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUoZ2wsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBtaW5GaWx0ZXIgPSBnbC5ORUFSRVNULCBtYWdGaWx0ZXIgPSBnbC5ORUFSRVNUKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgbWluRmlsdGVyKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgbWFnRmlsdGVyKTsKICAgICAgICBnbC50ZXhTdG9yYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMSwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlT3B0aW1pemVkR2F1c3NpYW5LZXJuZWwoc2lnbWEpIHsKICAgICAgICBjb25zdCBnID0gKHgpID0+IE1hdGguZXhwKC0oeCAqIHgpIC8gKDIgKiBzaWdtYSAqIHNpZ21hKSk7CiAgICAgICAgY29uc3QgbnVtYmVycyA9IFtdOwogICAgICAgIGxldCB4ID0gMDsKICAgICAgICBsZXQgY3VycmVudFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbiA9IGcoeCk7CiAgICAgICAgICAgIGNvbnN0IG5leHRTdW0gPSBjdXJyZW50U3VtICsgKGN1cnJlbnRTdW0gPyBuICogMiA6IG4pOwogICAgICAgICAgICBpZiAoY3VycmVudFN1bSAmJiBuIC8gbmV4dFN1bSA8IDAuMDEgJiYgbnVtYmVycy5sZW5ndGggJSAyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGN1cnJlbnRTdW0gPSBuZXh0U3VtOwogICAgICAgICAgICBudW1iZXJzLnB1c2gobik7CiAgICAgICAgICAgIHgrKzsKICAgICAgICB9CiAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IG51bWJlcnMubWFwKChuKSA9PiBuIC8gY3VycmVudFN1bSk7CiAgICAgICAgY29uc3Qgb3B0aW1pemVkV2VpZ2h0cyA9IFt3ZWlnaHRzWzBdXTsKICAgICAgICBjb25zdCBvcHRpbWl6ZWRQb3NpdGlvbnMgPSBbMF07CiAgICAgICAgaWYgKHdlaWdodHMubGVuZ3RoID49IDMgJiYgd2VpZ2h0cy5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgY29uc3QgdzEgPSB3ZWlnaHRzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgdzIgPSB3ZWlnaHRzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB3MSArIHcyOwogICAgICAgICAgICAgICAgY29uc3QgcCA9IHcyIC8gKHcxICsgdzIpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkV2VpZ2h0cy5wdXNoKHcpOwogICAgICAgICAgICAgICAgb3B0aW1pemVkUG9zaXRpb25zLnB1c2goaSArIHApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdlaWdodHM6IG9wdGltaXplZFdlaWdodHMsCiAgICAgICAgICAgIHBvc2l0aW9uczogb3B0aW1pemVkUG9zaXRpb25zLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3dlaWdodFsyMF07CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X29mZnNldFsyMF07CiAgICAgICAgdW5pZm9ybSBpbnQgdV9rc2l6ZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV90ZXhlbFNpemU7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIG91dCB2ZWM0IG91dENvbG9yOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjNCBjZW50ZXJDb2xvciA9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB2X3RleENvb3JkKTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICB2ZWM0IGZyYW1lQ29sb3IgPSBjZW50ZXJDb2xvciAqIHVfd2VpZ2h0WzBdICogKDEuMCAtIHBlcnNvbk1hc2spOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHVfa3NpemU7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKHVfb2Zmc2V0W2ldKSAqIHVfdGV4ZWxTaXplOwogICAgICAgICAgICAgICAgdmVjMiB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgKyBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgICAgICB0ZXhDb29yZCA9IHZfdGV4Q29vcmQgLSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBmcmFtZUNvbG9yICs9IHRleHR1cmUodV9pbnB1dEZyYW1lLCB0ZXhDb29yZCkgKiB1X3dlaWdodFtpXSAqCiAgICAgICAgICAgICAgICAgICAgKDEuMCAtIHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KGZyYW1lQ29sb3IucmdiICsgKDEuMCAtIGZyYW1lQ29sb3IuYSkgKiBjZW50ZXJDb2xvci5yZ2IsIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3Qgc2NhbGUgPSBwYXJhbXMuYmFja2dyb3VuZFJlc2FtcGxlU2NhbGUgfHwgMC4yOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGggPSBNYXRoLnJvdW5kKG91dHB1dFdpZHRoICogc2NhbGUpOwogICAgICAgIGNvbnN0IGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0ID0gTWF0aC5yb3VuZChvdXRwdXRIZWlnaHQgKiBzY2FsZSk7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBibHVycmVkQmFja2dyb3VuZFdpZHRoOwogICAgICAgIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0OwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVBpcGxlbGluZVN0YWdlUHJvZ3JhbShnbCwgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyKTsKICAgICAgICBjb25zdCBpbnB1dEZyYW1lTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRGcmFtZSIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3Qgd2VpZ2h0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfd2VpZ2h0Iik7CiAgICAgICAgY29uc3Qgb2Zmc2V0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfb2Zmc2V0Iik7CiAgICAgICAgY29uc3Qga2VybmVsc2l6ZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2tzaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgdGV4dHVyZTIgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgYmx1cnJlZEJhY2tncm91bmRXaWR0aCwgYmx1cnJlZEJhY2tncm91bmRIZWlnaHQsIGdsLk5FQVJFU1QsIGdsLkxJTkVBUik7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMiwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVLZXJuZWwoa2VybmVsID0gIjV4NSIpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgaWYgKGtlcm5lbCA9PT0gIjl4OSIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDUpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWzAuMjI3MDI3MDI3LCAwLjE5NDU5NDU5NDYsIDAuMTIxNjIxNjIxNiwgMC4wNTQwNTQwNTQxLCAwLjAxNjIxNjIxNjJdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjl4OW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjI3MzQzNzUsIDAuMzI4MTI1LCAwLjAzNTE1NjI1XSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KG9mZnNldExvY2F0aW9uLCBbMC4wLCAxLjMzMzMzMzMzMzMzMzMzMzMsIDMuMTExMTExMTExMTExMTExXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiN3g3IikgewogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGtlcm5lbHNpemVMb2NhdGlvbiwgNCk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWZ2KHdlaWdodExvY2F0aW9uLCBbMC4zMTI1LCAwLjIzNDM3NSwgMC4wOTM3NSwgMC4wMTU2MjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMCwgMi4wLCAzLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICI1eDUiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjM3MTUsIDAuMjUsIDAuMDYyNV0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAuMCwgMS4wLCAyLjBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwgPT09ICIzeDMiKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCAyKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFswLjUsIDAuMjVdKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYob2Zmc2V0TG9jYXRpb24sIFswLjAsIDEuMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtlcm5lbCA9PT0gIjEwMW8iKSB7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoa2VybmVsc2l6ZUxvY2F0aW9uLCA2KTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIFsKICAgICAgICAgICAgICAgICAgICAwLjA4MjQ5MzAwNzc3NzUwNzcsIDAuMTU3MDg1MTAxNTM3MTA5MywgMC4xMjkwOTI5OTc0ODk2MTYwNiwgMC4wOTA2MTY1NzgxMDc5NzA3NSwKICAgICAgICAgICAgICAgICAgICAwLjA1NDI3MTI3MTgyNTEwMDQ0LCAwLjAyNzY4NzU0NzE1MTQ0OTU0NCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWzAsIDEuNDg1MTQ4NTE0ODUxNDg1MSwgMy40NjUzNDY1MzQ2NTM0NjUzLCA1LjQ0NTU0NDU1NDQ1NTQ0NiwgNy40MjU3NDI1NzQyNTc0MjYsIDkuNDA1OTQwNTk0MDU5NDA1XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2VybmVsID09PSAiMTcxbyIpIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIDcpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdih3ZWlnaHRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAuMDY0NjUyMTgwMDU4MTExODUsIDAuMTI1NTk3MzU4NjEzMjkyNywgMC4xMTE4MDYwMjQ1NDY5NzA5OSwgMC4wOTA2NzM0NTcyNjk5NjEwNywKICAgICAgICAgICAgICAgICAgICAwLjA2Njk3NzEyMTMxMjA3OTcxLCAwLjA0NTA0NjQyNjcxODk2NDI1LCAwLjAyNzU3MzUyMTUwOTY3NTI3OCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgWwogICAgICAgICAgICAgICAgICAgIDAsIDEuNDkxMjI4MDcwMTc1NDM4OCwgMy40Nzk1MzIxNjM3NDI2OTA0LCA1LjQ2NzgzNjI1NzMwOTk0MTUsIDcuNDU2MTQwMzUwODc3MTkzLCA5LjQ0NDQ0NDQ0NDQ0NDQ0NSwKICAgICAgICAgICAgICAgICAgICAxMS40MzI3NDg1MzgwMTE2OTYsCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChrZXJuZWwuc3RhcnRzV2l0aCgib2ciKSkgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlRmxvYXQoa2VybmVsLnN1YnN0cmluZygyKSk7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdlaWdodHMsIHBvc2l0aW9ucyB9ID0gZ2VuZXJhdGVPcHRpbWl6ZWRHYXVzc2lhbktlcm5lbChzKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShrZXJuZWxzaXplTG9jYXRpb24sIHdlaWdodHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xZnYod2VpZ2h0TG9jYXRpb24sIHdlaWdodHMpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTFmdihvZmZzZXRMb2NhdGlvbiwgcG9zaXRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsZXQgbnVtUGFzc2VzID0gMTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIHVwZGF0ZUtlcm5lbChwYXJhbXMua2VybmVsKTsKICAgICAgICAgICAgbnVtUGFzc2VzID0gcGFyYW1zLm51bVBhc3NlcyB8fCAxOwogICAgICAgIH0KICAgICAgICB1cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIGJsdXJyZWRCYWNrZ3JvdW5kV2lkdGgsIGJsdXJyZWRCYWNrZ3JvdW5kSGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcjEpOwogICAgICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUyKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUxKTsKICAgICAgICAgICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDIpOwogICAgICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHRleGVsU2l6ZUxvY2F0aW9uLCB0ZXhlbFdpZHRoLCAwKTsKICAgICAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZTIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUxKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmxlbmRQYXNzKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgaXMgcmVxdWlyZWQgd2hlbiByZW5kZXJpbmcgdG8gY2FudmFzCiAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uICogdmVjMigxLjAsIC0xLjApLCAwLjAsIDEuMCk7CiAgICAgICAgICAgIHZfdGV4Q29vcmQgPSBhX3RleENvb3JkOwogICAgICAgIH1gOwogICAgICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X3BlcnNvbk1hc2s7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9ibHVycmVkSW5wdXRGcmFtZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9jb3ZlcmFnZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICB2ZWMzIGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBibHVycmVkQ29sb3IgPSB0ZXh0dXJlKHVfYmx1cnJlZElucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChtaXgoYmx1cnJlZENvbG9yLCBjb2xvciwgcGVyc29uTWFzayksIDEuMCk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRTaGFkZXJTb3VyY2UpOwogICAgICAgIGNvbnN0IHByb2dyYW0gPSBjcmVhdGVQaXBsZWxpbmVTdGFnZVByb2dyYW0oZ2wsIHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJsdXJyZWRJbnB1dEZyYW1lID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JsdXJyZWRJbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGlucHV0RnJhbWVMb2NhdGlvbiwgMCk7CiAgICAgICAgZ2wudW5pZm9ybTFpKHBlcnNvbk1hc2tMb2NhdGlvbiwgMSk7CiAgICAgICAgZ2wudW5pZm9ybTFpKGJsdXJyZWRJbnB1dEZyYW1lLCAyKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGNvbnN0IGNvdmVyYWdlID0gcGFyYW1zLmNvdmVyYWdlIHx8IFswLCAxXTsKICAgICAgICAgICAgZ2wudW5pZm9ybTJmKGNvdmVyYWdlTG9jYXRpb24sIGNvdmVyYWdlWzBdLCBjb3ZlcmFnZVsxXSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkQmFja2dyb3VuZEJsdXJTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBwYXJhbXMpIHsKICAgICAgICBsZXQgYmx1clBhc3MgPSBidWlsZEJsdXJQYXNzKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgcGVyc29uTWFza1RleHR1cmUsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgYmxlbmRQYXNzID0gYnVpbGRCbGVuZFBhc3MoZ2wsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgICAgIGJsdXJQYXNzLnJlbmRlcigpOwogICAgICAgICAgICBibGVuZFBhc3MucmVuZGVyKCk7CiAgICAgICAgfQogICAgICAgIGxldCBjdXJyZW50UmVzYW1wbGVTY2FsZSA9IHBhcmFtcy5iYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50UmVzYW1wbGVTY2FsZSAhPT0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlKSB7CiAgICAgICAgICAgICAgICBibHVyUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgICAgICBibHVyUGFzcyA9IGJ1aWxkQmx1clBhc3MoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBwZXJzb25NYXNrVGV4dHVyZSwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgcGFyYW1zKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRSZXNhbXBsZVNjYWxlID0gcGFyYW1zLmJhY2tncm91bmRSZXNhbXBsZVNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJsdXJQYXNzLnVwZGF0ZVBhcmFtcyhwYXJhbXMpOwogICAgICAgICAgICBibGVuZFBhc3MudXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGJsZW5kUGFzcy5jbGVhblVwKCk7CiAgICAgICAgICAgIGJsdXJQYXNzLmNsZWFuVXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZEJhY2tncm91bmRJbWFnZVN0YWdlKGdsLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBiYWNrZ3JvdW5kSW1hZ2UsIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIHBhcmFtcykgewogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHVuaWZvcm0gdmVjMiB1X2JhY2tncm91bmRTY2FsZTsKICAgICAgICB1bmlmb3JtIHZlYzIgdV9iYWNrZ3JvdW5kT2Zmc2V0OwogICAgICAgIGluIHZlYzIgYV9wb3NpdGlvbjsKICAgICAgICBpbiB2ZWMyIGFfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzIgdl90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X2JhY2tncm91bmRDb29yZDsKICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIC8vIEZsaXBwaW5nIFkgZm9yIGNhbnZhcwogICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbiAqIHZlYzIoMS4wLCAtMS4wKSwgMC4wLCAxLjApOwogICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDsKICAgICAgICAgICAgdl9iYWNrZ3JvdW5kQ29vcmQgPSBhX3RleENvb3JkICogdV9iYWNrZ3JvdW5kU2NhbGUgKyB1X2JhY2tncm91bmRPZmZzZXQ7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbnB1dEZyYW1lOwogICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfcGVyc29uTWFzazsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2JhY2tncm91bmQ7CiAgICAgICAgdW5pZm9ybSB2ZWMyIHVfY292ZXJhZ2U7CiAgICAgICAgaW4gdmVjMiB2X3RleENvb3JkOwogICAgICAgIGluIHZlYzIgdl9iYWNrZ3JvdW5kQ29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpLnJnYjsKICAgICAgICAgICAgdmVjMyBiYWNrZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlKHVfYmFja2dyb3VuZCwgdl9iYWNrZ3JvdW5kQ29vcmQpLnJnYjsKICAgICAgICAgICAgZmxvYXQgcGVyc29uTWFzayA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hOwogICAgICAgICAgICBwZXJzb25NYXNrID0gc21vb3Roc3RlcCh1X2NvdmVyYWdlLngsIHVfY292ZXJhZ2UueSwgcGVyc29uTWFzayk7CiAgICAgICAgICAgIG91dENvbG9yID0gdmVjNChmcmFtZUNvbG9yICogcGVyc29uTWFzayArIGJhY2tncm91bmRDb2xvciAqICgxLjAgLSBwZXJzb25NYXNrKSwgMS4wKTsKICAgICAgICB9YDsKICAgICAgICBjb25zdCBvdXRwdXRSYXRpbyA9IG91dHB1dFdpZHRoIC8gb3V0cHV0SGVpZ2h0OwogICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGNvbXBpbGVTaGFkZXIoZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleFNoYWRlclNvdXJjZSk7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRTY2FsZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2JhY2tncm91bmRTY2FsZSIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRPZmZzZXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kT2Zmc2V0Iik7CiAgICAgICAgY29uc3QgaW5wdXRGcmFtZUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ1X2lucHV0RnJhbWUiKTsKICAgICAgICBjb25zdCBwZXJzb25NYXNrTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGVyc29uTWFzayIpOwogICAgICAgIGNvbnN0IGJhY2tncm91bmRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9iYWNrZ3JvdW5kIik7CiAgICAgICAgY29uc3QgY292ZXJhZ2VMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9jb3ZlcmFnZSIpOwogICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgZ2wudW5pZm9ybTJmKGJhY2tncm91bmRTY2FsZUxvY2F0aW9uLCAxLCAxKTsKICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCAwLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRGcmFtZUxvY2F0aW9uLCAwKTsKICAgICAgICBnbC51bmlmb3JtMWkocGVyc29uTWFza0xvY2F0aW9uLCAxKTsKICAgICAgICBsZXQgYmFja2dyb3VuZFRleHR1cmUgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMik7CiAgICAgICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBiYWNrZ3JvdW5kVGV4dHVyZSk7CiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWkoYmFja2dyb3VuZExvY2F0aW9uLCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlV2lkdGggPSBiYWNrZ3JvdW5kSW1hZ2UubmF0dXJhbFdpZHRoIHx8IGJhY2tncm91bmRJbWFnZS52aWRlb1dpZHRoIHx8IGJhY2tncm91bmRJbWFnZS53aWR0aDsKICAgICAgICAgICAgY29uc3Qgc291cmNlSGVpZ2h0ID0gYmFja2dyb3VuZEltYWdlLm5hdHVyYWxIZWlnaHQgfHwgYmFja2dyb3VuZEltYWdlLnZpZGVvSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS5oZWlnaHQ7CiAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHQsIGdsLkxJTkVBUiwgZ2wuTElORUFSKTsKICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDsKICAgICAgICAgICAgbGV0IGJhY2tncm91bmRXaWR0aCA9IHNvdXJjZVdpZHRoOwogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEhlaWdodCA9IHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFJhdGlvID0gYmFja2dyb3VuZFdpZHRoIC8gYmFja2dyb3VuZEhlaWdodDsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRSYXRpbyA8IG91dHB1dFJhdGlvKSB7CiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSGVpZ2h0ID0gYmFja2dyb3VuZFdpZHRoIC8gb3V0cHV0UmF0aW87CiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gKHNvdXJjZUhlaWdodCAtIGJhY2tncm91bmRIZWlnaHQpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRXaWR0aCA9IGJhY2tncm91bmRIZWlnaHQgKiBvdXRwdXRSYXRpbzsKICAgICAgICAgICAgICAgIHhPZmZzZXQgPSAoc291cmNlV2lkdGggLSBiYWNrZ3JvdW5kV2lkdGgpIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB4U2NhbGUgPSBiYWNrZ3JvdW5kV2lkdGggLyBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgY29uc3QgeVNjYWxlID0gYmFja2dyb3VuZEhlaWdodCAvIHNvdXJjZUhlaWdodDsKICAgICAgICAgICAgeE9mZnNldCAvPSBzb3VyY2VXaWR0aDsKICAgICAgICAgICAgeU9mZnNldCAvPSBzb3VyY2VIZWlnaHQ7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihiYWNrZ3JvdW5kU2NhbGVMb2NhdGlvbiwgeFNjYWxlLCB5U2NhbGUpOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoYmFja2dyb3VuZE9mZnNldExvY2F0aW9uLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQmFja2dyb3VuZEltYWdlKGJhY2tncm91bmRJbWFnZSwgcmVJbml0KSB7CiAgICAgICAgICAgIGlmIChyZUluaXQpIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJhY2tncm91bmRJbWFnZSkgewogICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRUZXh0dXJlKQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRUZXh0dXJlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFja2dyb3VuZFRleHR1cmUpIHsKICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGJhY2tncm91bmRUZXh0dXJlKTsKICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgYmFja2dyb3VuZEltYWdlLm5hdHVyYWxXaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2UudmlkZW9XaWR0aCB8fCBiYWNrZ3JvdW5kSW1hZ2Uud2lkdGgsIGJhY2tncm91bmRJbWFnZS5uYXR1cmFsSGVpZ2h0IHx8IGJhY2tncm91bmRJbWFnZS52aWRlb0hlaWdodCB8fCBiYWNrZ3JvdW5kSW1hZ2UuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgY29uc3QgY292ZXJhZ2UgPSBwYXJhbXMuY292ZXJhZ2UgfHwgWzAsIDFdOwogICAgICAgICAgICBnbC51bmlmb3JtMmYoY292ZXJhZ2VMb2NhdGlvbiwgY292ZXJhZ2VbMF0sIGNvdmVyYWdlWzFdKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSkKICAgICAgICAgICAgaW5pdEJhY2tncm91bmRJbWFnZShiYWNrZ3JvdW5kSW1hZ2UpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoYmFja2dyb3VuZFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcmVuZGVyLAogICAgICAgICAgICB1cGRhdGVQYXJhbXMsCiAgICAgICAgICAgIGNsZWFuVXAsCiAgICAgICAgICAgIHVwZGF0ZUJhY2tncm91bmRJbWFnZSwKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkSW1wcm92ZU1hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIHBlcnNvbk1hc2tUZXh0dXJlLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBnbHNsIGAjdmVyc2lvbiAzMDAgZXMKICAgICAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9wZXJzb25NYXNrOwogICAgICAgIHVuaWZvcm0gdmVjMiB1X3RleGVsU2l6ZTsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CiAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0WzNdID0gZmxvYXRbXSgwLjAsIDEuMCwgMi4wKTsKICAgICAgICBjb25zdCBmbG9hdCB3ZWlnaHRbM10gPSBmbG9hdFtdKDAuMzg3NzQsIDAuMjQ0NzcsIDAuMDYxMzYpOwogICAgICAgICAgICB2b2lkIG1haW4oKSB7CiAgICAgICAgICAgIGZsb2F0IGJsdXJyZWRBbHBoYSA9IHRleHR1cmUodV9wZXJzb25NYXNrLCB2X3RleENvb3JkKS5hICogd2VpZ2h0WzBdOwogICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgdmVjMiBvZmZzZXQgPSB2ZWMyKG9mZnNldFtpXSkgKiB1X3RleGVsU2l6ZTsKICAgICAgICAgICAgICAgIHZlYzIgdGV4Q29vcmQgPSB2X3RleENvb3JkICsgb2Zmc2V0OwogICAgICAgICAgICAgICAgYmx1cnJlZEFscGhhICs9IHRleHR1cmUodV9wZXJzb25NYXNrLCB0ZXhDb29yZCkuYSAqIHdlaWdodFtpXTsKICAgICAgICAgICAgICAgIHRleENvb3JkID0gdl90ZXhDb29yZCAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGJsdXJyZWRBbHBoYSArPSB0ZXh0dXJlKHVfcGVyc29uTWFzaywgdGV4Q29vcmQpLmEgKiB3ZWlnaHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KDAsMCwwLGJsdXJyZWRBbHBoYSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgdGV4ZWxXaWR0aCA9IDEgLyBvdXRwdXRXaWR0aDsKICAgICAgICBjb25zdCB0ZXhlbEhlaWdodCA9IDEgLyBvdXRwdXRIZWlnaHQ7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IHBlcnNvbk1hc2tMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9wZXJzb25NYXNrIik7CiAgICAgICAgY29uc3QgdGV4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfdGV4ZWxTaXplIik7CiAgICAgICAgY29uc3QgdGV4dHVyZTEgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIxID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSwgMCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBpbXByb3ZlZE1hc2tUZXh0dXJlLCAwKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShwZXJzb25NYXNrTG9jYXRpb24sIDEpOwogICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpIHsKICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7CiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwZXJzb25NYXNrVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgMCwgdGV4ZWxIZWlnaHQpOwogICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlMSk7CiAgICAgICAgICAgIGdsLnVuaWZvcm0yZih0ZXhlbFNpemVMb2NhdGlvbiwgdGV4ZWxXaWR0aCwgMCk7CiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIyKTsKICAgICAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgNCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKSB7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMik7CiAgICAgICAgICAgIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyMSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZTEpOwogICAgICAgICAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyByZW5kZXIsIGNsZWFuVXAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZFRGTGl0ZU91dHB1dFRvTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgb3V0cHV0VGV4dHVyZSwgdGZsaXRlLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0U2VnbWVudGF0aW9uOwoKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgb3V0IHZlYzQgb3V0Q29sb3I7CgogICAgICAgIGZsb2F0IGdldE1hc2sodmVjMiBzZWdtZW50YXRpb24pIHsKICAgICAgICAgICAgZmxvYXQgc2hpZnQgPSBtYXgoc2VnbWVudGF0aW9uLnIsIHNlZ21lbnRhdGlvbi5nKTsKICAgICAgICAgICAgZmxvYXQgYmFja2dyb3VuZEV4cCA9IGV4cChzZWdtZW50YXRpb24uciAtIHNoaWZ0KTsKICAgICAgICAgICAgZmxvYXQgcGVyc29uRXhwID0gZXhwKHNlZ21lbnRhdGlvbi5nIC0gc2hpZnQpOwogICAgICAgICAgICByZXR1cm4gcGVyc29uRXhwIC8gKGJhY2tncm91bmRFeHAgKyBwZXJzb25FeHApOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCBtYXNrID0gZ2V0TWFzayh0ZXh0dXJlKHVfaW5wdXRTZWdtZW50YXRpb24sIHZfdGV4Q29vcmQpLnJnKTsKICAgICAgICAgICAgb3V0Q29sb3IgPSB2ZWM0KHZlYzMoMC4wKSwgbWFzayk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0TG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfaW5wdXRTZWdtZW50YXRpb24iKTsKICAgICAgICBjb25zdCBpbnB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SRzMyRiwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuTkVBUkVTVCwgZ2wuTkVBUkVTVCk7CiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpOwogICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgb3V0cHV0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICBnbC51bmlmb3JtMWkoaW5wdXRMb2NhdGlvbiwgMSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKICAgICAgICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7CiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgb3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCwgZ2wuUkcsIGdsLkZMT0FULCB0ZmxpdGUuSEVBUEYzMiwgb3V0cHV0TWVtb3J5T2Zmc2V0KTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjbGVhblVwKCkgewogICAgICAgICAgICBnbC5kZWxldGVGcmFtZWJ1ZmZlcihmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgcmVuZGVyLCBjbGVhblVwIH07CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRURkxpdGVJbnB1dFN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgdGZsaXRlLCBpbnB1dFdpZHRoLCBpbnB1dEhlaWdodCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCwgaW5wdXRNZW1vcnlPZmZzZXQpIHsKICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGdsc2wgYCN2ZXJzaW9uIDMwMCBlcwogICAgICAgIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1X2lucHV0RnJhbWU7CiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9mbG9hdGx1dDsKICAgICAgICBpbiB2ZWMyIHZfdGV4Q29vcmQ7CiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X3BpeGVsU2l6ZTsKICAgICAgICBvdXQgdmVjNCBvdXRDb2xvcjsKCiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgICBmbG9hdCB4ID0gdl90ZXhDb29yZC54OwogICAgICAgICAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X2lucHV0RnJhbWUsIHZfdGV4Q29vcmQpOwogICAgICAgICAgICBmbG9hdCByID0gbW9kKHggKiB1X3BpeGVsU2l6ZSwgMy4wKTsKICAgICAgICAgICAgZmxvYXQgYyA9IDAuMDsKICAgICAgICAgICAgaWYgKHIgPj0gMi4wICkgYyA9IGNvbG9yLmI7CiAgICAgICAgICAgIGVsc2UgaWYgKHIgPj0gMS4wKSBjID0gY29sb3IuZzsKICAgICAgICAgICAgZWxzZSBjID0gY29sb3IucjsKICAgICAgICAgICAgb3V0Q29sb3IgPSB0ZXh0dXJlKHVfZmxvYXRsdXQsIHZlYzIoYywgMC41KSk7CiAgICAgICAgfWA7CiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjb21waWxlU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U2hhZGVyU291cmNlKTsKICAgICAgICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUGlwbGVsaW5lU3RhZ2VQcm9ncmFtKGdsLCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIpOwogICAgICAgIGNvbnN0IGlucHV0RnJhbWVMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9pbnB1dEZyYW1lIik7CiAgICAgICAgY29uc3QgcGl4ZWxTaXplTG9jYXRpb24gPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgInVfcGl4ZWxTaXplIik7CiAgICAgICAgY29uc3QgZmxvYXRsdXRMb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCAidV9mbG9hdGx1dCIpOwogICAgICAgIGNvbnN0IG91dHB1dFRleHR1cmUgPSBjcmVhdGVUZXh0dXJlKGdsLCBnbC5SR0JBOCwgaW5wdXRXaWR0aCAqIDMsIGlucHV0SGVpZ2h0KTsKICAgICAgICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBvdXRwdXRUZXh0dXJlLCAwKTsKICAgICAgICBjb25zdCBvdXRwdXRQaXhlbHMgPSBuZXcgVWludDhBcnJheSh0ZmxpdGUuSEVBUEYzMi5idWZmZXIsIGlucHV0TWVtb3J5T2Zmc2V0ICogNCwgc2VnbWVudGF0aW9uUGl4ZWxDb3VudCAqIDQgKiAzKTsKICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgIGdsLnVuaWZvcm0xaShpbnB1dEZyYW1lTG9jYXRpb24sIDApOwogICAgICAgIGdsLnVuaWZvcm0xZihwaXhlbFNpemVMb2NhdGlvbiwgaW5wdXRXaWR0aCAqIDMpOwogICAgICAgIGdsLnVuaWZvcm0xaShmbG9hdGx1dExvY2F0aW9uLCAzKTsKICAgICAgICBjb25zdCBmbG9hdEx1dFRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgIGNvbnN0IGx1dCA9IG5ldyBGbG9hdDMyQXJyYXkoMjU2KTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgICAgICAgICBsdXRbaV0gPSBpIC8gMjU2OwogICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMjU2LCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBuZXcgVWludDhBcnJheShsdXQuYnVmZmVyLCAwLCAyNTYgKiA0KSk7CiAgICAgICAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCBpbnB1dFdpZHRoICogMywgaW5wdXRIZWlnaHQpOwogICAgICAgICAgICBnbC51c2VQcm9ncmFtKHByb2dyYW0pOwogICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUzKTsKICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmxvYXRMdXRUZXh0dXJlKTsKICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZUJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKDAsIDAsIGlucHV0V2lkdGggKiAzLCBpbnB1dEhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgb3V0cHV0UGl4ZWxzKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpIHsKICAgICAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKG91dHB1dFRleHR1cmUpOwogICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGZsb2F0THV0VGV4dHVyZSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgICAgIGdsLmRlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlbmRlciwgY2xlYW5VcCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEJsdXJFbmdpbmVQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgc3dpdGNoIChwYXJhbXMuYW1vdW50KSB7CiAgICAgICAgICAgIGNhc2UgInNsaWdodCI6IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsga2VybmVsOiAib2c1IiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMSB9LCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgImhlYXZ5IjogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzEwIiwgbnVtUGFzc2VzOiAxLCBiYWNrZ3JvdW5kUmVzYW1wbGVTY2FsZTogMC41IH0sIHBhcmFtcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBrZXJuZWw6ICJvZzUiLCBudW1QYXNzZXM6IDEsIGJhY2tncm91bmRSZXNhbXBsZVNjYWxlOiAwLjUgfSwgcGFyYW1zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEVuZ2luZVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBiYXNlRW5naW5lUGFyYW1zID0gewogICAgICAgICAgICBjb3ZlcmFnZTogcGFyYW1zLmNvdmVyYWdlLAogICAgICAgIH07CiAgICAgICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kQmx1cikgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGJhc2VFbmdpbmVQYXJhbXMgfSwgZ2V0Qmx1ckVuZ2luZVBhcmFtcyhwYXJhbXMuYmFja2dyb3VuZEJsdXIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJhc2VFbmdpbmVQYXJhbXM7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVXZWJHTEVuZ2luZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgc2V0dXAsIGVmZmVjdENhbnZhcywgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgeyB0ZmxpdGUsIGlucHV0SGVpZ2h0LCBpbnB1dFdpZHRoLCBpbnB1dE1lbW9yeU9mZnNldCwgb3V0cHV0TWVtb3J5T2Zmc2V0LCBzZWdtZW50YXRpb25QaXhlbENvdW50IH0gPSB5aWVsZCBsb2FkU2VnbWVudGF0aW9uTW9kZWwoc2V0dXAuc2VnbWVudGF0aW9uTW9kZWxJZCk7CiAgICAgICAgICAgIGxldCBlbmdpbmVQYXJhbXMgPSBnZXRFbmdpbmVQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gZ2xzbCBgI3ZlcnNpb24gMzAwIGVzCiAgICAgICAgaW4gdmVjMiBhX3Bvc2l0aW9uOwogICAgICAgIGluIHZlYzIgYV90ZXhDb29yZDsKICAgICAgICBvdXQgdmVjMiB2X3RleENvb3JkOwogICAgICAgIHZvaWQgbWFpbigpIHsKICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24sIDAuMCwgMS4wKTsKICAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7CiAgICAgICAgfWA7CiAgICAgICAgICAgIGNvbnN0IGdsID0gZWZmZWN0Q2FudmFzLmdldENvbnRleHQoIndlYmdsMiIsIHNldHVwLndlYmdsQ29udGV4dFNldHRpbmdzKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gY29tcGlsZVNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4U2hhZGVyU291cmNlKTsKICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXkgPSBnbC5jcmVhdGVWZXJ0ZXhBcnJheSgpOwogICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbkJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgcG9zaXRpb25CdWZmZXIpOwogICAgICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAxLjAsIC0xLCAtMSwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IHRleENvb3JkQnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAxLjAsIDEuMF0pLCBnbC5TVEFUSUNfRFJBVyk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0RnJhbWVUZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpOwogICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBpbnB1dEZyYW1lVGV4dHVyZSk7CiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTsKICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7CiAgICAgICAgICAgIGNvbnN0IG1hc2tUZXh0dXJlID0gY3JlYXRlVGV4dHVyZShnbCwgZ2wuUkdCQTgsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrV2lkdGggPSBpbnB1dFdpZHRoOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlZE1hc2tIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICAgICAgICAgY29uc3QgaW1wcm92ZWRNYXNrVGV4dHVyZSA9IGNyZWF0ZVRleHR1cmUoZ2wsIGdsLlJHQkE4LCBpbXByb3ZlZE1hc2tXaWR0aCwgaW1wcm92ZWRNYXNrSGVpZ2h0LCBnbC5MSU5FQVIsIGdsLkxJTkVBUik7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZUlucHV0U3RhZ2UgPSBidWlsZFRGTGl0ZUlucHV0U3RhZ2UoZ2wsIHZlcnRleFNoYWRlciwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBzZWdtZW50YXRpb25QaXhlbENvdW50LCBpbnB1dE1lbW9yeU9mZnNldCk7CiAgICAgICAgICAgIGNvbnN0IHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlID0gYnVpbGRURkxpdGVPdXRwdXRUb01hc2tTdGFnZShnbCwgdmVydGV4U2hhZGVyLCBwb3NpdGlvbkJ1ZmZlciwgdGV4Q29vcmRCdWZmZXIsIG1hc2tUZXh0dXJlLCB0ZmxpdGUsIGlucHV0V2lkdGgsIGlucHV0SGVpZ2h0LCBvdXRwdXRNZW1vcnlPZmZzZXQpOwogICAgICAgICAgICBjb25zdCBpbXByb3ZlTWFza1N0YWdlID0gYnVpbGRJbXByb3ZlTWFza1N0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgbWFza1RleHR1cmUsIGltcHJvdmVkTWFza1RleHR1cmUsIGltcHJvdmVkTWFza1dpZHRoLCBpbXByb3ZlZE1hc2tIZWlnaHQpOwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQmx1clN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kQmx1clN0YWdlKGdsLCB2ZXJ0ZXhTaGFkZXIsIHBvc2l0aW9uQnVmZmVyLCB0ZXhDb29yZEJ1ZmZlciwgaW1wcm92ZWRNYXNrVGV4dHVyZSwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIGVuZ2luZVBhcmFtcyk7CiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmRJbWFnZVN0YWdlID0gYnVpbGRCYWNrZ3JvdW5kSW1hZ2VTdGFnZShnbCwgcG9zaXRpb25CdWZmZXIsIHRleENvb3JkQnVmZmVyLCBpbXByb3ZlZE1hc2tUZXh0dXJlLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVmZmVjdEN0eDogZ2wsCiAgICAgICAgICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kRnJhbWUoZnJhbWUsIF8sIHJlSW5pdCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZVN0YWdlLnVwZGF0ZUJhY2tncm91bmRJbWFnZShmcmFtZSwgcmVJbml0KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbXModXBkYXRlZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lUGFyYW1zID0gZ2V0RW5naW5lUGFyYW1zKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEJsdXJTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VTdGFnZS51cGRhdGVQYXJhbXMoZW5naW5lUGFyYW1zKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwcm9jZXNzRnJhbWUoZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQpOwogICAgICAgICAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApOwogICAgICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGlucHV0RnJhbWVUZXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICBnbC5iaW5kVmVydGV4QXJyYXkodmVydGV4QXJyYXkpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZUlucHV0U3RhZ2UucmVuZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgdGZsaXRlLl9ydW5JbmZlcmVuY2UoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVPdXRwdXRUb01hc2tTdGFnZS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICBpbXByb3ZlTWFza1N0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5iYWNrZ3JvdW5kVXJsID8gYmFja2dyb3VuZEltYWdlU3RhZ2UucmVuZGVyKCkgOiBiYWNrZ3JvdW5kQmx1clN0YWdlLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRCbHVyU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIGltcHJvdmVNYXNrU3RhZ2UuY2xlYW5VcCgpOwogICAgICAgICAgICAgICAgICAgIHRmbGl0ZU91dHB1dFRvTWFza1N0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICB0ZmxpdGVJbnB1dFN0YWdlLmNsZWFuVXAoKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVUZXh0dXJlKGltcHJvdmVkTWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUobWFza1RleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaW5wdXRGcmFtZVRleHR1cmUpOwogICAgICAgICAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0ZXhDb29yZEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHBvc2l0aW9uQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBnbC5kZWxldGVWZXJ0ZXhBcnJheSh2ZXJ0ZXhBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlY29kZUJhc2U2NChiYXNlNjQsIGVuYWJsZVVuaWNvZGUpIHsKICAgICAgICB2YXIgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpOwogICAgICAgIHJldHVybiBiaW5hcnlTdHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVVJMKGJhc2U2NCwgc291cmNlbWFwQXJnLCBlbmFibGVVbmljb2RlQXJnKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGRlY29kZUJhc2U2NChiYXNlNjQpOwogICAgICAgIHZhciBzdGFydCA9IHNvdXJjZS5pbmRleE9mKCdcbicsIDEwKSArIDE7CiAgICAgICAgdmFyIGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKHN0YXJ0KSArICgnJyk7CiAgICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pOwogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2U2NFdvcmtlckZhY3RvcnkoYmFzZTY0LCBzb3VyY2VtYXBBcmcsIGVuYWJsZVVuaWNvZGVBcmcpIHsKICAgICAgICB2YXIgdXJsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBXb3JrZXJGYWN0b3J5KG9wdGlvbnMpIHsKICAgICAgICAgICAgdXJsID0gdXJsIHx8IGNyZWF0ZVVSTChiYXNlNjQpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtlcih1cmwsIG9wdGlvbnMpOwogICAgICAgIH07CiAgICB9CgogICAgdmFyIFdvcmtlckZhY3RvcnkgPSAvKiNfX1BVUkVfXyovY3JlYXRlQmFzZTY0V29ya2VyRmFjdG9yeSgnTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdvb1puVnVZM1JwYjI0Z0tDa2dld29nSUNBZ0ozVnpaU0J6ZEhKcFkzUW5Pd29LSUNBZ0lHeGxkQ0IwYVcxbGNpQTlJRzUxYkd3N0NpQWdJQ0J2Ym0xbGMzTmhaMlVnUFNCbWRXNWpkR2x2YmlBb2NtVnhkV1Z6ZENrZ2V3b2dJQ0FnSUNBZ0lHTnZibk4wSUhScGJXVWdQU0J5WlhGMVpYTjBMbVJoZEdFN0NpQWdJQ0FnSUNBZ2FXWWdLSFJwYldVZ1BqMGdNQ2tLSUNBZ0lDQWdJQ0FnSUNBZ2RHbHRaWElnUFNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhCdmMzUk5aWE56WVdkbEtDSWlLU3dnZEdsdFpTazdDaUFnSUNBZ0lDQWdaV3h6WlNCcFppQW9kR2x0WlhJcENpQWdJQ0FnSUNBZ0lDQWdJR05zWldGeVZHbHRaVzkxZENoMGFXMWxjaWs3Q2lBZ0lDQjlPd29LZlNrb0tUc0tMeThqSUhOdmRYSmpaVTFoY0hCcGJtZFZVa3c5ZEdsdFpYSXVkMjl5YTJWeUxtcHpMbTFoY0FvSycpOwogICAgLyogZXNsaW50LWVuYWJsZSAqLwoKICAgIGNsYXNzIFByb2Nlc3NvciBleHRlbmRzIGV2ZW50c0V4cG9ydHMuRXZlbnRFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih7IHNldHVwLCBwYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlbWl0IH0pIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICJuZXciOwogICAgICAgICAgICBpZiAoZW1pdCkKICAgICAgICAgICAgICAgIHRoaXMuZW1pdCA9IGVtaXQ7CiAgICAgICAgfQogICAgICAgIHNldHVwRW5naW5lKHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCBlZmZlY3RDYW52YXMsIGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvQXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGggLyB0aGlzLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RDYW52YXMgPSBlZmZlY3RDYW52YXMgfHwgY3JlYXRlQ2FudmFzKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVFbmdpbmUgPSB0aGlzLnNldHVwLnVzZVdlYkdMID8gY3JlYXRlV2ViR0xFbmdpbmUgOiBjcmVhdGVDYW52YXNFbmdpbmU7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IHlpZWxkIGNyZWF0ZUVuZ2luZSh0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQsIHRoaXMuc2V0dXAsIHRoaXMuZWZmZWN0Q2FudmFzLCB0aGlzLnBhcmFtcywgaW5pdGlhbEJhY2tncm91bmRGcmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdEN0eCA9IHRoaXMuZW5naW5lLmVmZmVjdEN0eDsKICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogaW5pdGlhbEJhY2tncm91bmRGcmFtZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShfYSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIGFyZ3VtZW50cywgdm9pZCAwLCBmdW5jdGlvbiogKHsgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQgfSkgewogICAgICAgICAgICAgICAgY29uc3Qgb2xkQmFja2dyb3VuZEZyYW1lID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVuZ2luZSA9IHRoaXMuZW5naW5lOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAibmV3IikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVmlkZW8gc2l6ZSB1cGRhdGVkIGJlZm9yZSBlbmdpbmUgd2FzIGluaXRpYWxpemVkLiIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gImluaXQiKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJWaWRlbyBzaXplIHVwZGF0ZWQgd2hpbGUgZW5naW5lIHdhcyBpbml0aWFsaXphdGluZy4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBFbmdpbmUodmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHRoaXMuZWZmZWN0Q2FudmFzLCBvbGRCYWNrZ3JvdW5kRnJhbWUpOwogICAgICAgICAgICAgICAgb2xkRW5naW5lLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGluaXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHVzZUluc2VydGFibGVTdHJlYW1zLCBlZmZlY3RDYW52YXMgfSkgewogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAiaW5pdCI7CiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNldHVwRW5naW5lKHRoaXMudmlkZW9XaWR0aCwgdGhpcy52aWRlb0hlaWdodCwgZWZmZWN0Q2FudmFzLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lKTsKICAgICAgICAgICAgICAgIGlmICh1c2VJbnNlcnRhYmxlU3RyZWFtcykgewogICAgICAgICAgICAgICAgICAgIGxldCBkcm9wRmlyc3QgPSA1OwogICAgICAgICAgICAgICAgICAgIGxldCBsb2NhbFN0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lU3RhcnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RGcmFtZVJlbmRlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IChmcmFtZSwgY29udHJvbGxlcikgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sbGVyID0gY29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lVGltZXN0YW1wID0gZnJhbWUudGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsU3RhcnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkRnJhbWVUaW1lID0gZnJhbWVUaW1lc3RhbXAgLyAxMDAwIC0gZnJhbWVTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkTG9jYWxUaW1lID0gbm93IC0gbG9jYWxTdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcEZpcnN0ID4gMCB8fCBlbGFwc2VkTG9jYWxUaW1lIDwgZWxhcHNlZEZyYW1lVGltZSArIDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZpZGVvQmFja2dyb3VuZCAmJiB0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSAhPT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJnZXRiYWNrZ3JvdW5kZnJhbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wRmlyc3QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcEZpcnN0LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdGFydFRpbWUgPSBub3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFydFRpbWUgPSBmcmFtZVRpbWVzdGFtcCAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFZpZGVvRnJhbWUodGhpcy5lZmZlY3RDYW52YXMsIHsgdGltZXN0YW1wOiBmcmFtZVRpbWVzdGFtcCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0RnJhbWVSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RnJhbWVSZW5kZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJmaXJzdGZyYW1lcmVuZGVyZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zZXR1cC51c2VCYWNrZ3JvdW5kV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlciA9IG5ldyBXb3JrZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWU6IHRoaXMuY3VycmVudE91dHB1dEZyYW1lIH0sIFt0aGlzLmN1cnJlbnRPdXRwdXRGcmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAicmVhZHkiOwogICAgICAgICAgICAgICAgdGhpcy5lbWl0KCJyZWFkeSIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlUGFyYW1zKHsgcGFyYW1zLCBpbml0aWFsQmFja2dyb3VuZEZyYW1lIH0pIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmF0ZWQgfHwgIXRoaXMuZW5naW5lKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lQ3R4ID0gbnVsbDsKICAgICAgICAgICAgaWYgKGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWU6IGluaXRpYWxCYWNrZ3JvdW5kRnJhbWUsIHJlSW5pdDogdHJ1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUJhY2tncm91bmRGcmFtZShudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVuZ2luZS51cGRhdGVQYXJhbXMocGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlQmFja2dyb3VuZEZyYW1lKHsgZnJhbWUsIHJlSW5pdCB9KSB7CiAgICAgICAgICAgIGxldCB1cGRhdGVkRGltZW5zaW9uczsKICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuaGFzVmlkZW9CYWNrZ3JvdW5kID0gdGhpcy5wYXJhbXMuYmFja2dyb3VuZFVybCAmJiB0aGlzLnBhcmFtcy5iYWNrZ3JvdW5kVHlwZSA9PT0gInZpZGVvIjsKICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zID0geyB4OiAwLCB5OiAwLCB3aWR0aDogdGhpcy52aWRlb1dpZHRoLCBoZWlnaHQ6IHRoaXMudmlkZW9IZWlnaHQgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc2V0dXAudHJhbnNmZXJUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlICJpbWFnZWJpdG1hcCI6IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgImltYWdlZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUgPSBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lQ3R4ID0gdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoZnJhbWUpLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZUN0eC5wdXRJbWFnZURhdGEoZnJhbWUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSAiY2FudmFzIjogewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50QmFja2dyb3VuZEZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoID0gZnJhbWUudmlkZW9XaWR0aCB8fCBmcmFtZS5uYXR1cmFsV2lkdGggfHwgZnJhbWUud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCA9IGZyYW1lLnZpZGVvSGVpZ2h0IHx8IGZyYW1lLm5hdHVyYWxIZWlnaHQgfHwgZnJhbWUuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPSB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAvIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmRBc3BlY3RSYXRpbyA+IHRoaXMudmlkZW9Bc3BlY3RSYXRpbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZVggPSB1cGRhdGVkRGltZW5zaW9ucy53aWR0aCAtIHVwZGF0ZWREaW1lbnNpb25zLmhlaWdodCAqIHRoaXMudmlkZW9Bc3BlY3RSYXRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWREaW1lbnNpb25zLndpZHRoIC09IG91dHNpZGVYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpbWVuc2lvbnMueCA9IE1hdGguZmxvb3Iob3V0c2lkZVggLyAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYWNrZ3JvdW5kQXNwZWN0UmF0aW8gPCB0aGlzLnZpZGVvQXNwZWN0UmF0aW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHNpZGVZID0gdXBkYXRlZERpbWVuc2lvbnMuaGVpZ2h0IC0gdXBkYXRlZERpbWVuc2lvbnMud2lkdGggLyB0aGlzLnZpZGVvQXNwZWN0UmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy5oZWlnaHQgLT0gb3V0c2lkZVk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGltZW5zaW9ucy55ID0gTWF0aC5mbG9vcihvdXRzaWRlWSAvIDIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhY2tncm91bmRGcmFtZSA9IGZyYW1lOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZUJhY2tncm91bmRGcmFtZSh0aGlzLmN1cnJlbnRCYWNrZ3JvdW5kRnJhbWUsIHVwZGF0ZWREaW1lbnNpb25zLCByZUluaXQpOwogICAgICAgIH0KICAgICAgICB0ZXJtaW5hdGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybUNvbnRyb2xsZXIpCiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2xsZXIudGVybWluYXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyV29ya2VyKQogICAgICAgICAgICAgICAgdGhpcy50aW1lcldvcmtlci50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZW5naW5lKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGVybWluYXRlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZW1pdCgidGVybWluYXRlZCIpOwogICAgICAgIH0KICAgICAgICBzdGFydCh7IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0gfSkgewogICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0pCiAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5waXBlVGhyb3VnaCh0aGlzLnRyYW5zZm9ybWVyKS5waXBlVG8ob3V0cHV0U3RyZWFtKTsKICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwOwogICAgICAgICAgICB0aGlzLmZyYW1lQ291bnRlclRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICB9CiAgICAgICAgaW5wdXQoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCBhcmd1bWVudHMsIHZvaWQgMCwgZnVuY3Rpb24qICh7IHZpZGVvRnJhbWUsIGJhY2tncm91bmRGcmFtZSwgcmVxdWVzdFRpbWUsIGxhc3RSZW5kZXJUaW1lLCBkZWxheSB9KSB7CiAgICAgICAgICAgICAgICB2YXIgX2I7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYXRlZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zdCBydHQgPSAoRGF0ZS5ub3coKSAtIHJlcXVlc3RUaW1lKSAqIDI7CiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5UaW1lID0gbGFzdFJlbmRlclRpbWUgKyBkZWxheSAtIHJ0dDsKICAgICAgICAgICAgICAgIGlmIChiYWNrZ3JvdW5kRnJhbWUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrZ3JvdW5kRnJhbWUoeyBmcmFtZTogYmFja2dyb3VuZEZyYW1lIH0pOwogICAgICAgICAgICAgICAgbGV0IGZyYW1lOwogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnNldHVwLnRyYW5zZmVyVHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlYml0bWFwIjogewogICAgICAgICAgICAgICAgICAgICAgICAoX2IgPSB0aGlzLnByZXZWaWRlb0ZyYW1lKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2VmlkZW9GcmFtZSA9IHZpZGVvRnJhbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKHZpZGVvRnJhbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIGNyZWF0ZUltYWdlQml0bWFwKHRoaXMuZWZmZWN0Q2FudmFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgImltYWdlZGF0YSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHZpZGVvRnJhbWUpLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRDYW52YXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXMgPSBjcmVhdGVDYW52YXModGhpcy52aWRlb1dpZHRoLCB0aGlzLnZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDYW52YXNDdHggPSB0aGlzLmlucHV0Q2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dENhbnZhc0N0eC5wdXRJbWFnZURhdGEodmlkZW9GcmFtZSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FuZFJlbmRlckZyYW1lKHRoaXMuaW5wdXRDYW52YXMpOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHRoaXMuZWZmZWN0Q3R4LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLnZpZGVvV2lkdGgsIHRoaXMudmlkZW9IZWlnaHQpLmRhdGEuYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiY2FudmFzIjogewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRSZW5kZXJGcmFtZSh2aWRlb0ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSB0aGlzLmVmZmVjdENhbnZhczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5EZWxheSA9IE1hdGgubWF4KDAsIHJldHVyblRpbWUgLSBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyV29ya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50T3V0cHV0RnJhbWUgPSBmcmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyV29ya2VyLnBvc3RNZXNzYWdlKHJldHVybkRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoIm91dHB1dCIsIHsgZnJhbWUgfSwgW2ZyYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgcmV0dXJuRGVsYXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcHJvY2Vzc0FuZFJlbmRlckZyYW1lKGZyYW1lKSB7CiAgICAgICAgICAgIHRoaXMuZW5naW5lLnByb2Nlc3NGcmFtZShmcmFtZSk7CiAgICAgICAgICAgIGlmICh0aGlzLnNldHVwLmxvZ1RvQ29uc29sZSkgewogICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgaWYgKG5vdyAtIHRoaXMuZnJhbWVDb3VudGVyVGltZSA+IDEwMDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUnVubmluZyBjYW1lcmEgZWZmZWN0cywgJHtNYXRoLnJvdW5kKCh0aGlzLmZyYW1lQ291bnRlciAqIDEwMDApIC8gKG5vdyAtIHRoaXMuZnJhbWVDb3VudGVyVGltZSkpfSBmcHNgKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXJUaW1lID0gbm93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IHByb2Nlc3NvcnMgPSB7fTsKICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIGNvbnN0IHByb2Nlc3NvcklkID0gcmVxdWVzdC5kYXRhLnByb2Nlc3NvcklkOwogICAgICAgIGlmIChyZXF1ZXN0LmRhdGEudHlwZSA9PT0gImNyZWF0ZSIpIHsKICAgICAgICAgICAgY29uc3QgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NvcihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuZGF0YSksIHsgZW1pdDogKHR5cGUsIGRhdGEsIHRyYW5zZmVyKSA9PiBwb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgcHJvY2Vzc29ySWQsIHR5cGUgfSwgZGF0YSksIHRyYW5zZmVyKSB9KSk7CiAgICAgICAgICAgIHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdID0gcHJvY2Vzc29yOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKF9hID0gcHJvY2Vzc29yc1twcm9jZXNzb3JJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVtyZXF1ZXN0LmRhdGEudHlwZV0ocmVxdWVzdC5kYXRhKTsKICAgICAgICAgICAgaWYgKHJlcXVlc3QuZGF0YS50eXBlID09PSAidGVybWluYXRlIikgewogICAgICAgICAgICAgICAgZGVsZXRlIHByb2Nlc3NvcnNbcHJvY2Vzc29ySWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBjb25zdCBjcmVhdGVURkxpdGVTSU1ETW9kdWxlID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgX3NjcmlwdERpciA9IHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCA/IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIDogdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2YgX19maWxlbmFtZSAhPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIF9zY3JpcHREaXIgPSBfc2NyaXB0RGlyIHx8IF9fZmlsZW5hbWU7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVURkxpdGVTSU1ETW9kdWxlKSB7CiAgICAgICAgICAgIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgPSBjcmVhdGVURkxpdGVTSU1ETW9kdWxlIHx8IHt9OwogICAgICAgICAgICB2YXIgTW9kdWxlID0gdHlwZW9mIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUgIT09ICJ1bmRlZmluZWQiID8gY3JlYXRlVEZMaXRlU0lNRE1vZHVsZSA6IHt9OwogICAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgICBNb2R1bGVbInJlYWR5Il0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gTW9kdWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVPdmVycmlkZXNba2V5XSA9IE1vZHVsZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIHZhciBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgICAgIHRocm93IHRvVGhyb3c7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICJzdHJpbmciOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgICAgdmFyIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlYWRfLCByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICAgIHZhciBub2RlUGF0aDsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSByZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19kaXJuYW1lICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLCBiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVGUykKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZTID0gcmVxdWlyZSgiZnMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHJlYWRfKGZpbGVuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5idWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NbImFyZ3YiXS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1Byb2dyYW0gPSBwcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NbImV4aXQiXShzdGF0dXMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiaW5zcGVjdCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVhZChmLCAiYmluYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSAib2JqZWN0Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHRBcmdzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0QXJnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBxdWl0KHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nID0gcHJpbnQ7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuID0gY29uc29sZS5lcnJvciA9IHR5cGVvZiBwcmludEVyciAhPT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgKHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgICAgICAgICAgdmFyIGVyciA9IE1vZHVsZVsicHJpbnRFcnIiXSB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVba2V5XSA9IG1vZHVsZU92ZXJyaWRlc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICAgIGlmIChNb2R1bGVbImFyZ3VtZW50cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJhcmd1bWVudHMiXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgICAgICAgICAgICBxdWl0XyA9IE1vZHVsZVsicXVpdCJdOwogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKQogICAgICAgICAgICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgICAgICAgICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgYWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbU1lbW9yeTsKICAgICAgICAgICAgdmFyIEFCT1JUID0gZmFsc2U7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHsKICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgICAgICAgICAgIHZhciBlbmRQdHIgPSBpZHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpCiAgICAgICAgICAgICAgICAgICAgKytlbmRQdHI7CiAgICAgICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUwID0gaGVhcFtpZHgrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUyID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBbaWR4KytdICYgNjMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDY1NTM2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCAoY2ggPj4gMTApLCA1NjMyMCB8IChjaCAmIDEwMjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0ciwgYnVmZmVyLCBkb250QWRkTnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhbGlnblVwKHgsIG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWZmZXIsIEhFQVA4LCBIRUFQVTgsIEhFQVAzMjsKICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBuZXcgSW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVOCJdID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gbmV3IFVpbnQxNkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMzIiXSA9IG5ldyBVaW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbIklOSVRJQUxfTUVNT1JZIl0gfHwgMTY3NzcyMTY7CiAgICAgICAgICAgIHZhciB3YXNtVGFibGU7CiAgICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRJTklUX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgICAgX19BVElOSVRfXy5wdXNoKHsKICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfX193YXNtX2NhbGxfY3RvcnMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICAgICAgICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdID0ge307CiAgICAgICAgICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl0gPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25BYm9ydCJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvbkFib3J0Il0od2hhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICAgICAgZXJyKHdoYXQpOwogICAgICAgICAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hhdCA9ICJhYm9ydCgiICsgd2hhdCArICIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA/IHN0ci5zdGFydHNXaXRoKHByZWZpeCkgOiBzdHIuaW5kZXhPZihwcmVmaXgpID09PSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGRhdGFVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgICBmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3YXNtQmluYXJ5RmlsZSA9ICJ0ZmxpdGUtc2ltZC53YXNtIjsKICAgICAgICAgICAgaWYgKCFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICB3YXNtQmluYXJ5RmlsZSA9IGxvY2F0ZUZpbGUod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeShmaWxlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IHdhc21CaW5hcnlGaWxlICYmIHdhc21CaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHdhc21CaW5hcnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEJpbmFyeShmaWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIGFib3J0KGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QmluYXJ5UHJvbWlzZSgpIHsKICAgICAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJiAoRU5WSVJPTk1FTlRfSVNfV0VCIHx8IEVOVklST05NRU5UX0lTX1dPUktFUikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iICYmICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlWyJvayJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIgKyB3YXNtQmluYXJ5RmlsZSArICInIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVsiYXJyYXlCdWZmZXIiXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnkod2FzbUJpbmFyeUZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQXN5bmMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFzeW5jKHdhc21CaW5hcnlGaWxlLCBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShyZXNwb25zZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgICAgICAgICAgICB2YXIgaW5mbyA9IHsgYTogYXNtTGlicmFyeUFyZyB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZUluc3RhbmNlKGluc3RhbmNlLCBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJhc20iXSA9IGV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeSA9IE1vZHVsZVsiYXNtIl1bInEiXTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlID0gTW9kdWxlWyJhc20iXVsiRCJdOwogICAgICAgICAgICAgICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFkZFJ1bkRlcGVuZGVuY3koKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2Uob3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZUluc3RhbmNlKG91dHB1dFsiaW5zdGFuY2UiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeVByb21pc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShiaW5hcnksIGluZm8pOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlY2VpdmVyLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFzeW5jKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghd2FzbUJpbmFyeSAmJgogICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgPT09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzRGF0YVVSSSh3YXNtQmluYXJ5RmlsZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzRmlsZVVSSSh3YXNtQmluYXJ5RmlsZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGZldGNoID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh3YXNtQmluYXJ5RmlsZSwgeyBjcmVkZW50aWFsczogInNhbWUtb3JpZ2luIiB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlLCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogIiArIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQXJyYXlCdWZmZXIocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IE1vZHVsZVsiaW5zdGFudGlhdGVXYXNtIl0oaW5mbywgcmVjZWl2ZUluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycigiTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogIiArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5zdGFudGlhdGVBc3luYygpLmNhdGNoKHJlYWR5UHJvbWlzZVJlamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3Muc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBmdW5jID0gY2FsbGJhY2suZnVuYzsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbVRhYmxlLmdldChmdW5jKShjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jKGNhbGxiYWNrLmFyZyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9hYm9ydCgpIHsKICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3c7CiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7CiAgICAgICAgICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcHJvY2Vzc1siaHJ0aW1lIl0oKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFswXSAqIDFlMyArIHRbMV0gLyAxZTY7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkYXRlTm93ICE9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGRhdGVOb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMgPSB0cnVlOwogICAgICAgICAgICBmdW5jdGlvbiBzZXRFcnJObyh2YWx1ZSkgewogICAgICAgICAgICAgICAgSEVBUDMyW19fX2Vycm5vX2xvY2F0aW9uKCkgPj4gMl0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfY2xvY2tfZ2V0dGltZShjbGtfaWQsIHRwKSB7CiAgICAgICAgICAgICAgICB2YXIgbm93OwogICAgICAgICAgICAgICAgaWYgKGNsa19pZCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICgoY2xrX2lkID09PSAxIHx8IGNsa19pZCA9PT0gNCkgJiYgX2Vtc2NyaXB0ZW5fZ2V0X25vd19pc19tb25vdG9uaWMpIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDMyW3RwID4+IDJdID0gKG5vdyAvIDFlMykgfCAwOwogICAgICAgICAgICAgICAgSEVBUDMyWyh0cCArIDQpID4+IDJdID0gKChub3cgJSAxZTMpICogMWUzICogMWUzKSB8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZGxvcGVuKGZpbGVuYW1lLCBmbGFnKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsc3ltKGhhbmRsZSwgc3ltYm9sKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fbWVtY3B5X2JpZyhkZXN0LCBzcmMsIG51bSkgewogICAgICAgICAgICAgICAgSEVBUFU4LmNvcHlXaXRoaW4oZGVzdCwgc3JjLCBzcmMgKyBudW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9oZWFwX3NpemUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4Lmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKHNpemUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeS5ncm93KChzaXplIC0gYnVmZmVyLmJ5dGVMZW5ndGggKyA2NTUzNSkgPj4+IDE2KTsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVHbG9iYWxCdWZmZXJBbmRWaWV3cyh3YXNtTWVtb3J5LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAocmVxdWVzdGVkU2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIG9sZFNpemUgPSBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCk7CiAgICAgICAgICAgICAgICB2YXIgbWF4SGVhcFNpemUgPSAyMTQ3NDgzNjQ4OwogICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFNpemUgPiBtYXhIZWFwU2l6ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGN1dERvd24gPSAxOyBjdXREb3duIDw9IDQ7IGN1dERvd24gKj0gMikgewogICAgICAgICAgICAgICAgICAgIHZhciBvdmVyR3Jvd25IZWFwU2l6ZSA9IG9sZFNpemUgKiAoMSArIDAuMiAvIGN1dERvd24pOwogICAgICAgICAgICAgICAgICAgIG92ZXJHcm93bkhlYXBTaXplID0gTWF0aC5taW4ob3Zlckdyb3duSGVhcFNpemUsIHJlcXVlc3RlZFNpemUgKyAxMDA2NjMyOTYpOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdTaXplID0gTWF0aC5taW4obWF4SGVhcFNpemUsIGFsaWduVXAoTWF0aC5tYXgocmVxdWVzdGVkU2l6ZSwgb3Zlckdyb3duSGVhcFNpemUpLCA2NTUzNikpOwogICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IGVtc2NyaXB0ZW5fcmVhbGxvY19idWZmZXIobmV3U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAobXNlY3MpIHsKICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsKICAgICAgICAgICAgICAgIHdoaWxlIChfZW1zY3JpcHRlbl9nZXRfbm93KCkgLSBzdGFydCA8IG1zZWNzKSB7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgRU5WID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGVOYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNQcm9ncmFtIHx8ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW52U3RyaW5ncygpIHsKICAgICAgICAgICAgICAgIGlmICghZ2V0RW52U3RyaW5ncy5zdHJpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSAoKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJvYmplY3QiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgIkMiKS5yZXBsYWNlKCItIiwgIl8iKSArICIuVVRGLTgiOwogICAgICAgICAgICAgICAgICAgIHZhciBlbnYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVTRVI6ICJ3ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBBVEg6ICIvIiwKICAgICAgICAgICAgICAgICAgICAgICAgUFdEOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIExBTkc6IGxhbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIF86IGdldEV4ZWN1dGFibGVOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4IGluIEVOVikgewogICAgICAgICAgICAgICAgICAgICAgICBlbnZbeF0gPSBFTlZbeF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBzdHJpbmdzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBlbnYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5wdXNoKHggKyAiPSIgKyBlbnZbeF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGdldEVudlN0cmluZ3Muc3RyaW5nczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgU1lTQ0FMTFMgPSB7CiAgICAgICAgICAgICAgICBtYXBwaW5nczoge30sCiAgICAgICAgICAgICAgICBidWZmZXJzOiBbbnVsbCwgW10sIFtdXSwKICAgICAgICAgICAgICAgIHByaW50Q2hhcjogZnVuY3Rpb24gKHN0cmVhbSwgY3VycikgewogICAgICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSBTWVNDQUxMUy5idWZmZXJzW3N0cmVhbV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PT0gMSA/IG91dCA6IGVycikoVVRGOEFycmF5VG9TdHJpbmcoYnVmZmVyLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goY3Vycik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZhcmFyZ3M6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIFNZU0NBTExTLnZhcmFyZ3MgKz0gNDsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gSEVBUDMyWyhTWVNDQUxMUy52YXJhcmdzIC0gNCkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXRTdHI6IGZ1bmN0aW9uIChwdHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gVVRGOFRvU3RyaW5nKHB0cik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQ2NDogZnVuY3Rpb24gKGxvdywgaGlnaCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsb3c7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBfZW52aXJvbl9nZXQoX19lbnZpcm9uLCBlbnZpcm9uX2J1ZikgewogICAgICAgICAgICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncygpLmZvckVhY2goZnVuY3Rpb24gKHN0cmluZywgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBlbnZpcm9uX2J1ZiArIGJ1ZlNpemU7CiAgICAgICAgICAgICAgICAgICAgSEVBUDMyWyhfX2Vudmlyb24gKyBpICogNCkgPj4gMl0gPSBwdHI7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVBc2NpaVRvTWVtb3J5KHN0cmluZywgcHRyKTsKICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW52aXJvbl9zaXplc19nZXQocGVudmlyb25fY291bnQsIHBlbnZpcm9uX2J1Zl9zaXplKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgICAgICAgICAgIEhFQVAzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICAgICAgICAgICAgc3RyaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICBidWZTaXplICs9IHN0cmluZy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2V4aXQoc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBleGl0KHN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX2Nsb3NlKGZkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZmRfc2VlayhmZCwgb2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gsIHdoZW5jZSwgbmV3T2Zmc2V0KSB7IH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3dyaXRlKGZkLCBpb3YsIGlvdmNudCwgcG51bSkgewogICAgICAgICAgICAgICAgdmFyIG51bSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvdmNudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHB0ciA9IEhFQVAzMlsoaW92ICsgaSAqIDgpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBIRUFQMzJbKGlvdiArIChpICogOCArIDQpKSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NBTExTLnByaW50Q2hhcihmZCwgSEVBUFU4W3B0ciArIGpdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbnVtICs9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMltwbnVtID4+IDJdID0gbnVtOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3B0aHJlYWRfY3JlYXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3B0aHJlYWRfam9pbigpIHsKICAgICAgICAgICAgICAgIHJldHVybiAyODsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfc3lzY29uZihuYW1lKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4NToKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heEhlYXBTaXplIC8gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDA4MDk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTcyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTczOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDk0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAyNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjE0NzQ4MzY0NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ3ODM5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwNDg7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA5NzE1MjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njg7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY3OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjM4NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMWUzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgODk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3MDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3MToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU1OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDY0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJvYmplY3QiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvclsiaGFyZHdhcmVDb25jdXJyZW5jeSJdIHx8IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldEVyck5vKDI4KTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYXNtTGlicmFyeUFyZyA9IHsKICAgICAgICAgICAgICAgIGE6IF9hYm9ydCwKICAgICAgICAgICAgICAgIG46IF9jbG9ja19nZXR0aW1lLAogICAgICAgICAgICAgICAgaTogX2Rsb3BlbiwKICAgICAgICAgICAgICAgIGU6IF9kbHN5bSwKICAgICAgICAgICAgICAgIGw6IF9lbXNjcmlwdGVuX21lbWNweV9iaWcsCiAgICAgICAgICAgICAgICBtOiBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCwKICAgICAgICAgICAgICAgIG86IF9lbXNjcmlwdGVuX3RocmVhZF9zbGVlcCwKICAgICAgICAgICAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgICAgICAgICAgIGc6IF9lbnZpcm9uX3NpemVzX2dldCwKICAgICAgICAgICAgICAgIGo6IF9leGl0LAogICAgICAgICAgICAgICAgaDogX2ZkX2Nsb3NlLAogICAgICAgICAgICAgICAgazogX2ZkX3NlZWssCiAgICAgICAgICAgICAgICBjOiBfZmRfd3JpdGUsCiAgICAgICAgICAgICAgICBkOiBfcHRocmVhZF9jcmVhdGUsCiAgICAgICAgICAgICAgICBmOiBfcHRocmVhZF9qb2luLAogICAgICAgICAgICAgICAgYjogX3N5c2NvbmYsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNyZWF0ZVdhc20oKTsKICAgICAgICAgICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IChNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfX193YXNtX2NhbGxfY3RvcnMgPSBNb2R1bGVbIl9fX3dhc21fY2FsbF9jdG9ycyJdID0gTW9kdWxlWyJhc20iXVsiciJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE1vZGVsQnVmZmVyTWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJzIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRNZW1vcnlPZmZzZXQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bInQiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dEhlaWdodCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dEhlaWdodCJdID0gTW9kdWxlWyJhc20iXVsidSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRXaWR0aCJdID0gTW9kdWxlWyJhc20iXVsidiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0Q2hhbm5lbENvdW50Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJ3Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsieCJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dEhlaWdodCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInkiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRXaWR0aCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRXaWR0aCJdID0gTW9kdWxlWyJhc20iXVsieiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IE1vZHVsZVsiYXNtIl1bIkEiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9sb2FkTW9kZWwiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBNb2R1bGVbImFzbSJdWyJCIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfcnVuSW5mZXJlbmNlIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gTW9kdWxlWyJhc20iXVsiQyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIF9fX2Vycm5vX2xvY2F0aW9uID0gKE1vZHVsZVsiX19fZXJybm9fbG9jYXRpb24iXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fZXJybm9fbG9jYXRpb24gPSBNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBNb2R1bGVbImFzbSJdWyJFIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgY2FsbGVkUnVuOwogICAgICAgICAgICBmdW5jdGlvbiBFeGl0U3RhdHVzKHN0YXR1cykgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gIkV4aXRTdGF0dXMiOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gIlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIiArIHN0YXR1cyArICIpIjsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IGZ1bmN0aW9uIHJ1bkNhbGxlcigpIHsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIHJ1bigpOwogICAgICAgICAgICAgICAgaWYgKCFjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gcnVuQ2FsbGVyOwogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBydW4oYXJncykgewogICAgICAgICAgICAgICAgaWYgKHJ1bkRlcGVuZGVuY2llcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmVSdW4oKTsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9SdW4oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNhbGxlZFJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJjYWxsZWRSdW4iXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFCT1JUKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgaW5pdFJ1bnRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBwcmVNYWluKCk7CiAgICAgICAgICAgICAgICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZShNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0pCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsib25SdW50aW1lSW5pdGlhbGl6ZWQiXSgpOwogICAgICAgICAgICAgICAgICAgIHBvc3RSdW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInNldFN0YXR1cyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJzZXRTdGF0dXMiXSgiUnVubmluZy4uLiIpOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9SdW4oKTsKICAgICAgICAgICAgICAgICAgICB9LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTW9kdWxlWyJydW4iXSA9IHJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gZXhpdChzdGF0dXMsIGltcGxpY2l0KSB7CiAgICAgICAgICAgICAgICBxdWl0XyhzdGF0dXMsIG5ldyBFeGl0U3RhdHVzKHN0YXR1cykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChNb2R1bGVbInByZUluaXQiXSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdID0gW01vZHVsZVsicHJlSW5pdCJdXTsKICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZUluaXQiXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUucmVhZHk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgdmFyIHRmbGl0ZVNpbWQgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGRlZmF1bHQ6IGNyZWF0ZVRGTGl0ZVNJTURNb2R1bGUKICAgIH0pOwoKICAgIHZhciBjcmVhdGVURkxpdGVNb2R1bGUgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7CiAgICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNyZWF0ZVRGTGl0ZU1vZHVsZSkgewogICAgICAgICAgICBjcmVhdGVURkxpdGVNb2R1bGUgPSBjcmVhdGVURkxpdGVNb2R1bGUgfHwge307CiAgICAgICAgICAgIHZhciBNb2R1bGUgPSB0eXBlb2YgY3JlYXRlVEZMaXRlTW9kdWxlICE9PSAidW5kZWZpbmVkIiA/IGNyZWF0ZVRGTGl0ZU1vZHVsZSA6IHt9OwogICAgICAgICAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgICAgICAgICBNb2R1bGVbInJlYWR5Il0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTsKICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBtb2R1bGVPdmVycmlkZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gTW9kdWxlKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVPdmVycmlkZXNba2V5XSA9IE1vZHVsZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzUHJvZ3JhbSA9ICIuL3RoaXMucHJvZ3JhbSI7CiAgICAgICAgICAgIHZhciBxdWl0XyA9IGZ1bmN0aW9uIChzdGF0dXMsIHRvVGhyb3cpIHsKICAgICAgICAgICAgICAgIHRocm93IHRvVGhyb3c7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19XRUIgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIEVOVklST05NRU5UX0lTX1dPUktFUiA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfTk9ERSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgRU5WSVJPTk1FTlRfSVNfU0hFTEwgPSBmYWxzZTsKICAgICAgICAgICAgRU5WSVJPTk1FTlRfSVNfV0VCID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCI7CiAgICAgICAgICAgIEVOVklST05NRU5UX0lTX1dPUktFUiA9IHR5cGVvZiBpbXBvcnRTY3JpcHRzID09PSAiZnVuY3Rpb24iOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19OT0RFID0KICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICJzdHJpbmciOwogICAgICAgICAgICBFTlZJUk9OTUVOVF9JU19TSEVMTCA9ICFFTlZJUk9OTUVOVF9JU19XRUIgJiYgIUVOVklST05NRU5UX0lTX05PREUgJiYgIUVOVklST05NRU5UX0lTX1dPUktFUjsKICAgICAgICAgICAgdmFyIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICBmdW5jdGlvbiBsb2NhdGVGaWxlKHBhdGgpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImxvY2F0ZUZpbGUiXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVbImxvY2F0ZUZpbGUiXShwYXRoLCBzY3JpcHREaXJlY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdERpcmVjdG9yeSArIHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlYWRfLCByZWFkQXN5bmMsIHJlYWRCaW5hcnk7CiAgICAgICAgICAgIHZhciBub2RlRlM7CiAgICAgICAgICAgIHZhciBub2RlUGF0aDsKICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSByZXF1aXJlKCJwYXRoIikuZGlybmFtZShzY3JpcHREaXJlY3RvcnkpICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX19kaXJuYW1lICsgIi8iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGZpbGVuYW1lLCBiaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVGUykKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZTID0gcmVxdWlyZSgiZnMiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBub2RlUGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGVQYXRoWyJub3JtYWxpemUiXShmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVGU1sicmVhZEZpbGVTeW5jIl0oZmlsZW5hbWUsIGJpbmFyeSA/IG51bGwgOiAidXRmOCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGZpbGVuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IHJlYWRfKGZpbGVuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJldC5idWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFVpbnQ4QXJyYXkocmV0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJldC5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NbImFyZ3YiXS5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1Byb2dyYW0gPSBwcm9jZXNzWyJhcmd2Il1bMV0ucmVwbGFjZSgvXFwvZywgIi8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHByb2Nlc3NbImFyZ3YiXS5zbGljZSgyKTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuY2F1Z2h0RXhjZXB0aW9uIiwgZnVuY3Rpb24gKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBFeGl0U3RhdHVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NbIm9uIl0oInVuaGFuZGxlZFJlamVjdGlvbiIsIGFib3J0KTsKICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NbImV4aXQiXShzdGF0dXMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiaW5zcGVjdCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiW0Vtc2NyaXB0ZW4gTW9kdWxlIG9iamVjdF0iOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChFTlZJUk9OTUVOVF9JU19TSEVMTCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFkICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgcmVhZF8gPSBmdW5jdGlvbiBzaGVsbF9yZWFkKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlYWRCaW5hcnkgPSBmdW5jdGlvbiByZWFkQmluYXJ5KGYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWRidWZmZXIgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJlYWRidWZmZXIoZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVhZChmLCAiYmluYXJ5Iik7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiBkYXRhID09PSAib2JqZWN0Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY3JpcHRBcmdzICE9ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0QXJnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVpdCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIHF1aXRfID0gZnVuY3Rpb24gKHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICBxdWl0KHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJpbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nID0gcHJpbnQ7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuID0gY29uc29sZS5lcnJvciA9IHR5cGVvZiBwcmludEVyciAhPT0gInVuZGVmaW5lZCIgPyBwcmludEVyciA6IHByaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBzZWxmLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpIHsKICAgICAgICAgICAgICAgICAgICBzY3JpcHREaXJlY3RvcnkgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfc2NyaXB0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgc2NyaXB0RGlyZWN0b3J5ID0gX3NjcmlwdERpcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY3JpcHREaXJlY3RvcnkuaW5kZXhPZigiYmxvYjoiKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5Lmxhc3RJbmRleE9mKCIvIikgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJlYWRfID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnNlbmQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgICAgICAgICAgICAgICAgICByZWFkQmluYXJ5ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2VuZChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWFkQXN5bmMgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICJhcnJheWJ1ZmZlciI7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDAgfHwgKHhoci5zdGF0dXMgPT0gMCAmJiB4aHIucmVzcG9uc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkKHhoci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IG9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zZW5kKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgICAgICAgICAgdmFyIGVyciA9IE1vZHVsZVsicHJpbnRFcnIiXSB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTsKICAgICAgICAgICAgZm9yIChrZXkgaW4gbW9kdWxlT3ZlcnJpZGVzKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVba2V5XSA9IG1vZHVsZU92ZXJyaWRlc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZHVsZU92ZXJyaWRlcyA9IG51bGw7CiAgICAgICAgICAgIGlmIChNb2R1bGVbImFyZ3VtZW50cyJdKQogICAgICAgICAgICAgICAgTW9kdWxlWyJhcmd1bWVudHMiXTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkKICAgICAgICAgICAgICAgIHRoaXNQcm9ncmFtID0gTW9kdWxlWyJ0aGlzUHJvZ3JhbSJdOwogICAgICAgICAgICBpZiAoTW9kdWxlWyJxdWl0Il0pCiAgICAgICAgICAgICAgICBxdWl0XyA9IE1vZHVsZVsicXVpdCJdOwogICAgICAgICAgICB2YXIgd2FzbUJpbmFyeTsKICAgICAgICAgICAgaWYgKE1vZHVsZVsid2FzbUJpbmFyeSJdKQogICAgICAgICAgICAgICAgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgICAgICAgICBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgICAgICAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgYWJvcnQoIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd2FzbU1lbW9yeTsKICAgICAgICAgICAgdmFyIEFCT1JUID0gZmFsc2U7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIHRleHQpIHsKICAgICAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnQoIkFzc2VydGlvbiBmYWlsZWQ6ICIgKyB0ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT09ICJ1bmRlZmluZWQiID8gbmV3IFRleHREZWNvZGVyKCJ1dGY4IikgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIGZ1bmN0aW9uIFVURjhBcnJheVRvU3RyaW5nKGhlYXAsIGlkeCwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBpZHggKyBtYXhCeXRlc1RvUmVhZDsKICAgICAgICAgICAgICAgIHZhciBlbmRQdHIgPSBpZHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoaGVhcFtlbmRQdHJdICYmICEoZW5kUHRyID49IGVuZElkeCkpCiAgICAgICAgICAgICAgICAgICAgKytlbmRQdHI7CiAgICAgICAgICAgICAgICBpZiAoZW5kUHRyIC0gaWR4ID4gMTYgJiYgaGVhcC5zdWJhcnJheSAmJiBVVEY4RGVjb2RlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcC5zdWJhcnJheShpZHgsIGVuZFB0cikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICIiOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUwID0gaGVhcFtpZHgrK107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUwICYgMTI4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKHUwICYgMzEpIDw8IDYpIHwgdTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUyID0gaGVhcFtpZHgrK10gJiA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDI0MCkgPT0gMjI0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKGhlYXBbaWR4KytdICYgNjMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDY1NTM2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCAoY2ggPj4gMTApLCA1NjMyMCB8IChjaCAmIDEwMjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gVVRGOFRvU3RyaW5nKHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwdHIgPyBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgsIHB0ciwgbWF4Qnl0ZXNUb1JlYWQpIDogIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gd3JpdGVBc2NpaVRvTWVtb3J5KHN0ciwgYnVmZmVyLCBkb250QWRkTnVsbCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBIRUFQOFtidWZmZXIrKyA+PiAwXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSEVBUDhbYnVmZmVyID4+IDBdID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhbGlnblVwKHgsIG11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBpZiAoeCAlIG11bHRpcGxlID4gMCkgewogICAgICAgICAgICAgICAgICAgIHggKz0gbXVsdGlwbGUgLSAoeCAlIG11bHRpcGxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWZmZXIsIEhFQVA4LCBIRUFQVTgsIEhFQVAzMjsKICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3MoYnVmKSB7CiAgICAgICAgICAgICAgICBidWZmZXIgPSBidWY7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVA4Il0gPSBIRUFQOCA9IG5ldyBJbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUDE2Il0gPSBuZXcgSW50MTZBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQMzIiXSA9IEhFQVAzMiA9IG5ldyBJbnQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVOCJdID0gSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgICAgICAgICAgIE1vZHVsZVsiSEVBUFUxNiJdID0gbmV3IFVpbnQxNkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBVMzIiXSA9IG5ldyBVaW50MzJBcnJheShidWYpOwogICAgICAgICAgICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBuZXcgRmxvYXQzMkFycmF5KGJ1Zik7CiAgICAgICAgICAgICAgICBNb2R1bGVbIkhFQVBGNjQiXSA9IG5ldyBGbG9hdDY0QXJyYXkoYnVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbIklOSVRJQUxfTUVNT1JZIl0gfHwgMTY3NzcyMTY7CiAgICAgICAgICAgIHZhciB3YXNtVGFibGU7CiAgICAgICAgICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRJTklUX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRNQUlOX18gPSBbXTsKICAgICAgICAgICAgdmFyIF9fQVRQT1NUUlVOX18gPSBbXTsKICAgICAgICAgICAgX19BVElOSVRfXy5wdXNoKHsKICAgICAgICAgICAgICAgIGZ1bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfX193YXNtX2NhbGxfY3RvcnMoKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBwcmVSdW4oKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRPblByZVJ1bihNb2R1bGVbInByZVJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQUkVSVU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5pdFJ1bnRpbWUoKSB7CiAgICAgICAgICAgICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwcmVNYWluKCkgewogICAgICAgICAgICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcG9zdFJ1bigpIHsKICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhbGxSdW50aW1lQ2FsbGJhY2tzKF9fQVRQT1NUUlVOX18pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE9uUHJlUnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWRkT25Qb3N0UnVuKGNiKSB7CiAgICAgICAgICAgICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBydW5EZXBlbmRlbmNpZXMgPSAwOwogICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzRnVsZmlsbGVkID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkUnVuRGVwZW5kZW5jeShpZCkgewogICAgICAgICAgICAgICAgcnVuRGVwZW5kZW5jaWVzKys7CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0pIHsKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXShydW5EZXBlbmRlbmNpZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpIHsKICAgICAgICAgICAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsibW9uaXRvclJ1bkRlcGVuZGVuY2llcyJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJtb25pdG9yUnVuRGVwZW5kZW5jaWVzIl0ocnVuRGVwZW5kZW5jaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwZW5kZW5jaWVzRnVsZmlsbGVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBNb2R1bGVbInByZWxvYWRlZEltYWdlcyJdID0ge307CiAgICAgICAgICAgIE1vZHVsZVsicHJlbG9hZGVkQXVkaW9zIl0gPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICAgICAgICAgICAgaWYgKE1vZHVsZVsib25BYm9ydCJdKSB7CiAgICAgICAgICAgICAgICAgICAgTW9kdWxlWyJvbkFib3J0Il0od2hhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGF0ICs9ICIiOwogICAgICAgICAgICAgICAgZXJyKHdoYXQpOwogICAgICAgICAgICAgICAgQUJPUlQgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hhdCA9ICJhYm9ydCgiICsgd2hhdCArICIpLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7CiAgICAgICAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1ByZWZpeChzdHIsIHByZWZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA/IHN0ci5zdGFydHNXaXRoKHByZWZpeCkgOiBzdHIuaW5kZXhPZihwcmVmaXgpID09PSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhVVJJUHJlZml4ID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwiOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGRhdGFVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWxlVVJJUHJlZml4ID0gImZpbGU6Ly8iOwogICAgICAgICAgICBmdW5jdGlvbiBpc0ZpbGVVUkkoZmlsZW5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcmVmaXgoZmlsZW5hbWUsIGZpbGVVUklQcmVmaXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3YXNtQmluYXJ5RmlsZSA9ICJ0ZmxpdGUud2FzbSI7CiAgICAgICAgICAgIGlmICghaXNEYXRhVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgd2FzbUJpbmFyeUZpbGUgPSBsb2NhdGVGaWxlKHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnZXRCaW5hcnkoZmlsZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSB3YXNtQmluYXJ5RmlsZSAmJiB3YXNtQmluYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCaW5hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWQiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBhYm9ydChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEJpbmFyeVByb21pc2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIiAmJiAhaXNGaWxlVVJJKHdhc21CaW5hcnlGaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZVsib2siXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICJmYWlsZWQgdG8gbG9hZCB3YXNtIGJpbmFyeSBmaWxlIGF0ICciICsgd2FzbUJpbmFyeUZpbGUgKyAiJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VbImFycmF5QnVmZmVyIl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmluYXJ5KHdhc21CaW5hcnlGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZEFzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBc3luYyh3YXNtQmluYXJ5RmlsZSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEJpbmFyeSh3YXNtQmluYXJ5RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVXYXNtKCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7IGE6IGFzbUxpYnJhcnlBcmcgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiYXNtIl0gPSBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkgPSBNb2R1bGVbImFzbSJdWyJxIl07CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IE1vZHVsZVsiYXNtIl1bIkQiXTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRSdW5EZXBlbmRlbmN5KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKG91dHB1dCkgewogICAgICAgICAgICAgICAgICAgIHJlY2VpdmVJbnN0YW5jZShvdXRwdXRbImluc3RhbmNlIl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5hcnlQcm9taXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGJpbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYmluYXJ5LCBpbmZvKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZWNlaXZlciwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBhYm9ydChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5zdGFudGlhdGVBc3luYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc21CaW5hcnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAiZnVuY3Rpb24iICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0RhdGFVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0ZpbGVVUkkod2FzbUJpbmFyeUZpbGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBmZXRjaCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2god2FzbUJpbmFyeUZpbGUsIHsgY3JlZGVudGlhbHM6ICJzYW1lLW9yaWdpbiIgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhyZXNwb25zZSwgaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmVjZWl2ZUluc3RhbnRpYXRlZFNvdXJjZSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIgKyByZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycigiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBcnJheUJ1ZmZlcihyZWNlaXZlSW5zdGFudGlhdGVkU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFycmF5QnVmZmVyKHJlY2VpdmVJbnN0YW50aWF0ZWRTb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnIoIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlQXN5bmMoKS5jYXRjaChyZWFkeVByb21pc2VSZWplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxSdW50aW1lQ2FsbGJhY2tzKGNhbGxiYWNrcykgewogICAgICAgICAgICAgICAgd2hpbGUgKGNhbGxiYWNrcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IGNhbGxiYWNrLmZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suYXJnID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc21UYWJsZS5nZXQoZnVuYykoY2FsbGJhY2suYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhjYWxsYmFjay5hcmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjay5hcmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfYWJvcnQoKSB7CiAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfZW1zY3JpcHRlbl9nZXRfbm93OwogICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkgewogICAgICAgICAgICAgICAgX2Vtc2NyaXB0ZW5fZ2V0X25vdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHByb2Nlc3NbImhydGltZSJdKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKiAxZTMgKyB0WzFdIC8gMWU2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGF0ZU5vdyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBkYXRlTm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIF9lbXNjcmlwdGVuX2dldF9ub3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgZnVuY3Rpb24gc2V0RXJyTm8odmFsdWUpIHsKICAgICAgICAgICAgICAgIEhFQVAzMltfX19lcnJub19sb2NhdGlvbigpID4+IDJdID0gdmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Nsb2NrX2dldHRpbWUoY2xrX2lkLCB0cCkgewogICAgICAgICAgICAgICAgdmFyIG5vdzsKICAgICAgICAgICAgICAgIGlmIChjbGtfaWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsa19pZCA9PT0gMSB8fCBjbGtfaWQgPT09IDQpICYmIF9lbXNjcmlwdGVuX2dldF9ub3dfaXNfbW9ub3RvbmljKSB7CiAgICAgICAgICAgICAgICAgICAgbm93ID0gX2Vtc2NyaXB0ZW5fZ2V0X25vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0RXJyTm8oMjgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEhFQVAzMlt0cCA+PiAyXSA9IChub3cgLyAxZTMpIHwgMDsKICAgICAgICAgICAgICAgIEhFQVAzMlsodHAgKyA0KSA+PiAyXSA9ICgobm93ICUgMWUzKSAqIDFlMyAqIDFlMykgfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Rsb3BlbihmaWxlbmFtZSwgZmxhZykgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9kbHN5bShoYW5kbGUsIHN5bWJvbCkgewogICAgICAgICAgICAgICAgYWJvcnQoIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX21lbWNweV9iaWcoZGVzdCwgc3JjLCBudW0pIHsKICAgICAgICAgICAgICAgIEhFQVBVOC5jb3B5V2l0aGluKGRlc3QsIHNyYywgc3JjICsgbnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBfZW1zY3JpcHRlbl9nZXRfaGVhcF9zaXplKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW1zY3JpcHRlbl9yZWFsbG9jX2J1ZmZlcihzaXplKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnkuZ3Jvdygoc2l6ZSAtIGJ1ZmZlci5ieXRlTGVuZ3RoICsgNjU1MzUpID4+PiAxNik7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2xvYmFsQnVmZmVyQW5kVmlld3Mod2FzbU1lbW9yeS5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9lbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwKHJlcXVlc3RlZFNpemUpIHsKICAgICAgICAgICAgICAgIHZhciBvbGRTaXplID0gX2Vtc2NyaXB0ZW5fZ2V0X2hlYXBfc2l6ZSgpOwogICAgICAgICAgICAgICAgdmFyIG1heEhlYXBTaXplID0gMjE0NzQ4MzY0ODsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjdXREb3duID0gMTsgY3V0RG93biA8PSA0OyBjdXREb3duICo9IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3Zlckdyb3duSGVhcFNpemUgPSBvbGRTaXplICogKDEgKyAwLjIgLyBjdXREb3duKTsKICAgICAgICAgICAgICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnblVwKE1hdGgubWF4KHJlcXVlc3RlZFNpemUsIG92ZXJHcm93bkhlYXBTaXplKSwgNjU1MzYpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBlbXNjcmlwdGVuX3JlYWxsb2NfYnVmZmVyKG5ld1NpemUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fdGhyZWFkX3NsZWVwKG1zZWNzKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBfZW1zY3JpcHRlbl9nZXRfbm93KCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoX2Vtc2NyaXB0ZW5fZ2V0X25vdygpIC0gc3RhcnQgPCBtc2VjcykgeyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVOViA9IHt9OwogICAgICAgICAgICBmdW5jdGlvbiBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzUHJvZ3JhbSB8fCAiLi90aGlzLnByb2dyYW0iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudlN0cmluZ3MoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYW5nID0gKCh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0pIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgICAgICAgICAgICAgICBVU0VSOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMT0dOQU1FOiAid2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFBXRDogIi8iLAogICAgICAgICAgICAgICAgICAgICAgICBIT01FOiAiL2hvbWUvd2ViX3VzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICBfOiBnZXRFeGVjdXRhYmxlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW52W3hdID0gRU5WW3hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggaW4gZW52KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MucHVzaCh4ICsgIj0iICsgZW52W3hdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RW52U3RyaW5ncy5zdHJpbmdzID0gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbnZTdHJpbmdzLnN0cmluZ3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFNZU0NBTExTID0gewogICAgICAgICAgICAgICAgbWFwcGluZ3M6IHt9LAogICAgICAgICAgICAgICAgYnVmZmVyczogW251bGwsIFtdLCBbXV0sCiAgICAgICAgICAgICAgICBwcmludENoYXI6IGZ1bmN0aW9uIChzdHJlYW0sIGN1cnIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gU1lTQ0FMTFMuYnVmZmVyc1tzdHJlYW1dOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyID09PSAwIHx8IGN1cnIgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJlYW0gPT09IDEgPyBvdXQgOiBlcnIpKFVURjhBcnJheVRvU3RyaW5nKGJ1ZmZlciwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGN1cnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2YXJhcmdzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy52YXJhcmdzICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEhFQVAzMlsoU1lTQ0FMTFMudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAocHRyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IFVURjhUb1N0cmluZyhwdHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0NjQ6IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG93OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fZ2V0KF9fZW52aXJvbiwgZW52aXJvbl9idWYpIHsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIGdldEVudlN0cmluZ3MoKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHJpbmcsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHRyID0gZW52aXJvbl9idWYgKyBidWZTaXplOwogICAgICAgICAgICAgICAgICAgIEhFQVAzMlsoX19lbnZpcm9uICsgaSAqIDQpID4+IDJdID0gcHRyOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQXNjaWlUb01lbW9yeShzdHJpbmcsIHB0cik7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2Vudmlyb25fc2l6ZXNfZ2V0KHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgewogICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSBnZXRFbnZTdHJpbmdzKCk7CiAgICAgICAgICAgICAgICBIRUFQMzJbcGVudmlyb25fY291bnQgPj4gMl0gPSBzdHJpbmdzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBidWZTaXplID0gMDsKICAgICAgICAgICAgICAgIHN0cmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgSEVBUDMyW3BlbnZpcm9uX2J1Zl9zaXplID4+IDJdID0gYnVmU2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9leGl0KHN0YXR1cykgewogICAgICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF9jbG9zZShmZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX2ZkX3NlZWsoZmQsIG9mZnNldF9sb3csIG9mZnNldF9oaWdoLCB3aGVuY2UsIG5ld09mZnNldCkgeyB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9mZF93cml0ZShmZCwgaW92LCBpb3ZjbnQsIHBudW0pIHsKICAgICAgICAgICAgICAgIHZhciBudW0gPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBwdHIgPSBIRUFQMzJbKGlvdiArIGkgKiA4KSA+PiAyXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gSEVBUDMyWyhpb3YgKyAoaSAqIDggKyA0KSkgPj4gMl07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsZW47IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBTWVNDQUxMUy5wcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG51bSArPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBIRUFQMzJbcG51bSA+PiAyXSA9IG51bTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2NyZWF0ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF9wdGhyZWFkX2pvaW4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gX3N5c2NvbmYobmFtZSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgODU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWFwU2l6ZSA9IDIxNDc0ODM2NDg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhIZWFwU2l6ZSAvIDE2Mzg0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIzNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjM2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTUzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDc3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwODA5OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTYxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTgzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE3MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MToKICAgICAgICAgICAgICAgICAgICBjYXNlIDc5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTU1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5NDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDcwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg3OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDc7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NzgzOTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5OTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDQ4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwOTcxNTI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzMjc2NzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDc1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYzODQ7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDFlMzsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzAwOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTY7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjsKICAgICAgICAgICAgICAgICAgICBjYXNlIDczOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgICBjYXNlIDg0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAib2JqZWN0IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3JbImhhcmR3YXJlQ29uY3VycmVuY3kiXSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRFcnJObygyOCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFzbUxpYnJhcnlBcmcgPSB7CiAgICAgICAgICAgICAgICBhOiBfYWJvcnQsCiAgICAgICAgICAgICAgICBuOiBfY2xvY2tfZ2V0dGltZSwKICAgICAgICAgICAgICAgIGk6IF9kbG9wZW4sCiAgICAgICAgICAgICAgICBlOiBfZGxzeW0sCiAgICAgICAgICAgICAgICBsOiBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLAogICAgICAgICAgICAgICAgbTogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgICAgICAgICAgICBvOiBfZW1zY3JpcHRlbl90aHJlYWRfc2xlZXAsCiAgICAgICAgICAgICAgICBwOiBfZW52aXJvbl9nZXQsCiAgICAgICAgICAgICAgICBnOiBfZW52aXJvbl9zaXplc19nZXQsCiAgICAgICAgICAgICAgICBqOiBfZXhpdCwKICAgICAgICAgICAgICAgIGg6IF9mZF9jbG9zZSwKICAgICAgICAgICAgICAgIGs6IF9mZF9zZWVrLAogICAgICAgICAgICAgICAgYzogX2ZkX3dyaXRlLAogICAgICAgICAgICAgICAgZDogX3B0aHJlYWRfY3JlYXRlLAogICAgICAgICAgICAgICAgZjogX3B0aHJlYWRfam9pbiwKICAgICAgICAgICAgICAgIGI6IF9zeXNjb25mLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjcmVhdGVXYXNtKCk7CiAgICAgICAgICAgIHZhciBfX193YXNtX2NhbGxfY3RvcnMgPSAoTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoX19fd2FzbV9jYWxsX2N0b3JzID0gTW9kdWxlWyJfX193YXNtX2NhbGxfY3RvcnMiXSA9IE1vZHVsZVsiYXNtIl1bInIiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldCJdID0gTW9kdWxlWyJhc20iXVsicyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0TWVtb3J5T2Zmc2V0Il0gPSBNb2R1bGVbImFzbSJdWyJ0Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0SW5wdXRIZWlnaHQiXSA9IE1vZHVsZVsiYXNtIl1bInUiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dFdpZHRoIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2dldElucHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInYiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRJbnB1dENoYW5uZWxDb3VudCJdID0gTW9kdWxlWyJhc20iXVsidyJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX2dldE91dHB1dE1lbW9yeU9mZnNldCJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9nZXRPdXRwdXRNZW1vcnlPZmZzZXQiXSA9IE1vZHVsZVsiYXNtIl1bIngiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRIZWlnaHQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0SGVpZ2h0Il0gPSBNb2R1bGVbImFzbSJdWyJ5Il0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0V2lkdGgiXSA9IE1vZHVsZVsiYXNtIl1bInoiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIChNb2R1bGVbIl9nZXRPdXRwdXRDaGFubmVsQ291bnQiXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTW9kdWxlWyJfZ2V0T3V0cHV0Q2hhbm5lbENvdW50Il0gPSBNb2R1bGVbImFzbSJdWyJBIl0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAoTW9kdWxlWyJfbG9hZE1vZGVsIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE1vZHVsZVsiX2xvYWRNb2RlbCJdID0gTW9kdWxlWyJhc20iXVsiQiJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgKE1vZHVsZVsiX3J1bkluZmVyZW5jZSJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChNb2R1bGVbIl9ydW5JbmZlcmVuY2UiXSA9IE1vZHVsZVsiYXNtIl1bIkMiXSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBfX19lcnJub19sb2NhdGlvbiA9IChNb2R1bGVbIl9fX2Vycm5vX2xvY2F0aW9uIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKF9fX2Vycm5vX2xvY2F0aW9uID0gTW9kdWxlWyJfX19lcnJub19sb2NhdGlvbiJdID0gTW9kdWxlWyJhc20iXVsiRSJdKS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGNhbGxlZFJ1bjsKICAgICAgICAgICAgZnVuY3Rpb24gRXhpdFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJFeGl0U3RhdHVzIjsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIgKyBzdGF0dXMgKyAiKSI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhbGxlZFJ1bikKICAgICAgICAgICAgICAgICAgICBydW4oKTsKICAgICAgICAgICAgICAgIGlmICghY2FsbGVkUnVuKQogICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZnVuY3Rpb24gcnVuKGFyZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHJlUnVuKCk7CiAgICAgICAgICAgICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUnVuKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsZWRSdW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYWxsZWRSdW4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsiY2FsbGVkUnVuIl0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChBQk9SVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGluaXRSdW50aW1lKCk7CiAgICAgICAgICAgICAgICAgICAgcHJlTWFpbigpOwogICAgICAgICAgICAgICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJvblJ1bnRpbWVJbml0aWFsaXplZCJdKQogICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0oKTsKICAgICAgICAgICAgICAgICAgICBwb3N0UnVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInNldFN0YXR1cyJdKCIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkb1J1bigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIE1vZHVsZVsicnVuIl0gPSBydW47CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4aXQoc3RhdHVzLCBpbXBsaWNpdCkgewogICAgICAgICAgICAgICAgcXVpdF8oc3RhdHVzLCBuZXcgRXhpdFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVJbml0Il0gPT0gImZ1bmN0aW9uIikKICAgICAgICAgICAgICAgICAgICBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgICAgICAgICAgICB3aGlsZSAoTW9kdWxlWyJwcmVJbml0Il0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIE1vZHVsZVsicHJlSW5pdCJdLnBvcCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcnVuKCk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVURkxpdGVNb2R1bGUucmVhZHk7CiAgICAgICAgfTsKICAgIH0pKCk7CgogICAgdmFyIHRmbGl0ZSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgZGVmYXVsdDogY3JlYXRlVEZMaXRlTW9kdWxlCiAgICB9KTsKCn0pKHdhc21GZWF0dXJlRGV0ZWN0KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvY2Vzc29yUHJveHkud29ya2VyLmpzLm1hcAoK");let WV;const GV=new Image(1,1);function BV(e,t){return Pk(this,void 0,void 0,function*(){try{return yield createImageBitmap(e,t)}catch(e){return yield createImageBitmap(GV,t)}})}GV.src="data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";var EV=Object.freeze({__proto__:null,createEffectStream:(e,t,i)=>Pk(void 0,void 0,void 0,function*(){yield tV(i);const n=[],r=e.getVideoTracks()[0],s=e.getAudioTracks()[0];let{width:o,height:a}=r.getSettings();const c=(g=t.useBackgroundWorker,d={setup:t,params:i,videoWidth:o,videoHeight:a},g?(WV||(WV=new TV),new _V(WV,d)):new kV(d));var g,d;let I;const C=e=>Pk(void 0,void 0,void 0,function*(){const i=yield iV(e.backgroundUrl,e.backgroundType);return I=i&&i.play&&(()=>{i.paused&&i.play()}),function(e,t,i,n){return Pk(this,void 0,void 0,function*(){if(!e)return()=>Pk(this,void 0,void 0,function*(){});const r=e.videoWidth||e.naturalWidth||e.width,s=e.videoHeight||e.naturalHeight||e.height,o=r/s,a=t/i;if("imagedata"===n){const n=document.createElement("canvas");n.width=t,n.height=i;const c=n.getContext("2d");let[g,d,I,C]=[0,0,t,i];if(o>a){const e=i*o-t;g-=Math.round(e/2),I+=Math.round(e)}else if(o<a){const e=t/o-i;d-=Math.round(e/2),C+=Math.round(e)}return()=>Pk(this,void 0,void 0,function*(){return c.drawImage(e,0,0,r,s,g,d,I,C),c.getImageData(0,0,t,i).data.buffer})}if("imagebitmap"===n){let[n,c,g,d]=[0,0,r,s];if(o>a){const e=r-s*a;n+=Math.round(e/2),g-=Math.round(e)}else if(o<a){const e=s-r/a;c+=Math.round(e/2),d-=Math.round(e)}return()=>Pk(this,void 0,void 0,function*(){return yield createImageBitmap(e,n,c,g,d,{resizeWidth:t,resizeHeight:i})})}return"canvas"===n?()=>Pk(this,void 0,void 0,function*(){return e}):void 0})}(i,o,a,t.transferType)});let l=yield C(i),A=null;const u=new Promise(e=>A=e);let p,h;if(t.useInsertableStreams){const e=new window.MediaStreamTrackProcessor({track:r,maxBufferSize:2}),t=new window.MediaStreamTrackGenerator({kind:"video",signalTarget:r});h=t,c.on("ready",()=>{c.start({inputStream:null==e?void 0:e.readable,outputStream:null==t?void 0:t.writable})}),c.on("firstframerendered",()=>A()),c.on("getbackgroundframe",()=>Pk(void 0,void 0,void 0,function*(){I&&(I(),c.updateBackgroundFrame({frame:yield l()}))}))}else{const e=document.createElement("video"),s=()=>Pk(void 0,void 0,void 0,function*(){const{width:e,height:t}=r.getSettings();o===e&&a===t||(o=e,a=t,"object"==typeof p&&(p.width=o,p.height=a),yield c.updateVideoSize({videoWidth:o,videoHeight:a}),yield C(i))});e.addEventListener("resize",s),n.push(()=>{e.removeEventListener("resize",s)}),t.keepVideoElementInDom&&(e.playsInline=!0,e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="1px",e.style.opacity=0,document.body.appendChild(e),n.push(()=>{try{document.body.removeChild(e)}catch(e){console.warn("video element already removed from DOM")}e.srcObject=null})),yield new Promise(t=>{e.addEventListener("loadedmetadata",t),e.srcObject=new MediaStream([r]),e.play()});const g=()=>{"visible"!==document.visibilityState&&e.play()};let d,u,m;if(document.addEventListener("visibilitychange",g),n.push(()=>{document.removeEventListener("visibilitychange",g)}),p=nV(o,a),"imagebitmap"===t.transferType)d=p.getContext("bitmaprenderer"),u=()=>BV(e),m=e=>{d.transferFromImageBitmap(e),e.close()};else if("imagedata"===t.transferType){d=p.getContext("2d");const t=nV(o,a).getContext("2d");u=()=>(t.drawImage(e,0,0),t.getImageData(0,0,o,a).data.buffer),m=e=>{e=new ImageData(new Uint8ClampedArray(e),o,a),d.putImageData(e,0,0)}}else"canvas"===t.transferType&&(d=p.getContext(t.useWebGL?"webgl2":"2d",t.useWebGL?t.webglContextSettings:void 0),u=()=>e,t.useWebGL&&t.canvasMemoryLeakWorkaround&&(u=()=>BV(e)),m=()=>{});h=p.captureStream().getVideoTracks()[0];let f=Date.now();const b=()=>Pk(void 0,void 0,void 0,function*(){null==I||I();const[e,i]=yield Promise.all([u(),I&&l()]);c.input({videoFrame:e,backgroundFrame:i,lastRenderTime:f,requestTime:Date.now(),delay:t.framerate?1e3/t.framerate:0})}),v=()=>{b()};c.on("ready",()=>{v(),c.start({})}),c.on("output",({frame:e})=>{f=Date.now(),m(e),v(),A&&(A(),A=null)})}c.on("terminated",()=>{n.forEach(e=>e())}),c.init({useInsertableStreams:t.useInsertableStreams,initialBackgroundFrame:yield l(),effectCanvas:"canvas"===t.transferType?p:void 0});yield u,Object.defineProperty(h,"label",{get:()=>r.label}),Object.defineProperty(h,"readyState",{get:()=>r.readyState}),Object.defineProperty(h,"enabled",{get:()=>r.enabled,set:e=>{r.enabled=e}}),Object.defineProperty(h,"getSettings",{get:()=>()=>r.getSettings()});return{stream:new MediaStream([h,s].filter(e=>e)),stop:()=>{c.terminate()},updateParams:e=>Pk(void 0,void 0,void 0,function*(){return yield tV(e),l=yield C(e),c.updateParams({params:e,initialBackgroundFrame:yield l()}),!0})}})});const XV=e=>Pk(void 0,void 0,void 0,function*(){return{default:sV.backgrounds[e]}}),NV=!!document.createElement("canvas").getContext("webgl2"),PV={tfliteSegmentCanvasEffects:{module:EV,getDefaultSetup:()=>{const e={useWebGL:NV,segmentationModelId:"meetlite",logToConsole:!1,framerate:30,useInsertableStreams:!1,canvasMemoryLeakWorkaround:!0,transferType:"canvas",useBackgroundWorker:!1};return"chrome"===we.browserDetails.browser?Object.assign(Object.assign({},e),{useWebGL:!1}):"firefox"===we.browserDetails.browser?Object.assign(Object.assign({},e),{transferType:NV?"imagebitmap":"canvas"}):"safari"===we.browserDetails.browser?Object.assign(Object.assign({},e),{canvasMemoryLeakWorkaround:!1,keepVideoElementInDom:!0}):Object.assign({},e)},canUse:(e={})=>{var t,i,n;return"safari"===we.browserDetails.browser&&NV&&e.allowSafari||"chrome"===we.browserDetails.browser&&(null!==(t=we.browserDetails.version)&&void 0!==t?t:0)>=90||"firefox"===we.browserDetails.browser&&(null!==(n=null===(i=we.browserDetails)||void 0===i?void 0:i.version)&&void 0!==n?n:0)>=89}}},xV=[{id:"slight-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"slight"}}}}},{id:"blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"normal"}}}}},{id:"heavy-blur",pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundBlur:{amount:"heavy"}}}}}];xV.push(...[{id:"clay",backgroundName:"clay"},{id:"haven",backgroundName:"haven"},{id:"focus",backgroundName:"focus"},{id:"studio",backgroundName:"studio"},{id:"glow",backgroundName:"glow"},{id:"pulse",backgroundName:"pulse"},{id:"cabin",backgroundName:"cabin"},{id:"concrete",backgroundName:"concrete"},{id:"brick",backgroundName:"brick"},{id:"sunrise",backgroundName:"sunrise"},{id:"day",backgroundName:"day"},{id:"night",backgroundName:"night"},{id:"custom"}].map(({id:e,backgroundName:t})=>({id:`image-${e}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundUrl:t?XV(t):void 0}}}}))),xV.push(...[{name:"neon",index:1},{name:"bubbles",index:2}].map(({name:e,index:t})=>({id:`video-${t}`,pipelineConfigs:{tfliteSegmentCanvasEffects:{params:{backgroundType:"video",backgroundUrl:XV(e)}}}})));const FV=(e,t,i)=>{var n,r,s;const o=xV.find(t=>t.id===e);if(!o)return;let a=Object.keys(null!==(n=o.pipelineConfigs)&&void 0!==n?n:[]).find(e=>PV[e].canUse());if(a||(a=Object.keys(null!==(r=o.pipelineConfigs)&&void 0!==r?r:[])[0]),!a)return;const c=null===(s=o.pipelineConfigs)||void 0===s?void 0:s[a],g=PV[a],d=Object.assign(Object.assign(Object.assign({},g.getDefaultSetup()),null==c?void 0:c.setup),t);d.useWebGL=d.useWebGL&&NV;return{pipeline:g,mergedSetup:d,mergedParams:Object.assign(Object.assign({},null==c?void 0:c.params),i)}},OV=({filter:e,options:t}={filter:(e,t)=>e.canUse(t),options:{}})=>xV.filter(e=>"image-custom"!==e.id).filter(i=>{var n;return Object.keys(null!==(n=i.pipelineConfigs)&&void 0!==n?n:[]).find(i=>null==e?void 0:e(PV[i],null!=t?t:{}))}).map(e=>e.id),HV=function(){let e="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0;return"undefined"!=typeof __filename&&(e=e||__filename),function(t){var i,n,r=void 0!==(t=t||{})?t:{};r.ready=new Promise(function(e,t){i=e,n=t});var s,o={};for(s in r)r.hasOwnProperty(s)&&(o[s]=r[s]);var a,c,g,d,I="./this.program",C=function(e,t){throw t};a="object"==typeof window,c="function"==typeof importScripts,g="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,d=!a&&!g&&!c;var l,A,u,p,h,m="";g?(m=c?require("path").dirname(m)+"/":__dirname+"/",l=function(e,t){return p||(p=require("fs")),h||(h=require("path")),e=h.normalize(e),p.readFileSync(e,t?null:"utf8")},u=function(e){var t=l(e,!0);return t.buffer||(t=new Uint8Array(t)),S(t.buffer),t},process.argv.length>1&&(I=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof oe))throw e}),process.on("unhandledRejection",M),C=function(e){process.exit(e)},r.inspect=function(){return"[Emscripten Module object]"}):d?("undefined"!=typeof read&&(l=function(e){return read(e)}),u=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(S("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(C=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(a||c)&&(c?m=self.location.href:"undefined"!=typeof document&&document.currentScript&&(m=document.currentScript.src),e&&(m=e),m=0!==m.indexOf("blob:")?m.substr(0,m.lastIndexOf("/")+1):"",l=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},c&&(u=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),A=function(e,t,i){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?t(n.response):i()},n.onerror=i,n.send(null)});var f,b,v=r.print||console.log.bind(console),y=r.printErr||console.warn.bind(console);for(s in o)o.hasOwnProperty(s)&&(r[s]=o[s]);o=null,r.arguments&&r.arguments,r.thisProgram&&(I=r.thisProgram),r.quit&&(C=r.quit),r.wasmBinary&&(f=r.wasmBinary),r.noExitRuntime,"object"!=typeof WebAssembly&&M("no native wasm support detected");var w=!1;function S(e,t){e||M("Assertion failed: "+t)}var Z,R,k,V,_,T="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function W(e,t,i){for(var n=t+i,r=t;e[r]&&!(r>=n);)++r;if(r-t>16&&e.subarray&&T)return T.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function G(e,t){return e%t>0&&(e+=t-e%t),e}function B(e){Z=e,r.HEAP8=R=new Int8Array(e),r.HEAP16=new Int16Array(e),r.HEAP32=V=new Int32Array(e),r.HEAPU8=k=new Uint8Array(e),r.HEAPU16=new Uint16Array(e),r.HEAPU32=new Uint32Array(e),r.HEAPF32=new Float32Array(e),r.HEAPF64=new Float64Array(e)}r.INITIAL_MEMORY;var E=[],X=[],N=[],P=[];function x(e){E.unshift(e)}function F(e){P.unshift(e)}X.push({func:function(){ne()}});var O=0,H=null;function M(e){r.onAbort&&r.onAbort(e),y(e+=""),w=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw n(t),t}function D(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}r.preloadedImages={},r.preloadedAudios={};function K(e){return D(e,"data:application/octet-stream;base64,")}function Y(e){return D(e,"file://")}var j,J,L="tflite-simd.wasm";function U(e){try{if(e==L&&f)return new Uint8Array(f);if(u)return u(e);throw"both async and sync fetching of the wasm failed"}catch(e){M(e)}}function z(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var i=t.func;"number"==typeof i?void 0===t.arg?_.get(i)():_.get(i)(t.arg):i(void 0===t.arg?null:t.arg)}else t(r)}}K(L)||(j=L,L=r.locateFile?r.locateFile(j,m):m+j),J=g?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};function Q(e){return V[se()>>2]=e,e}function $(e){try{return b.grow(e-Z.byteLength+65535>>>16),B(b.buffer),1}catch(e){}}var q={};function ee(){if(!ee.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:I||"./this.program"};for(var t in q)e[t]=q[t];var i=[];for(var t in e)i.push(t+"="+e[t]);ee.strings=i}return ee.strings}var te={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var i=te.buffers[e];0===t||10===t?((1===e?v:y)(W(i,0)),i.length=0):i.push(t)},varargs:void 0,get:function(){return te.varargs+=4,V[te.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?W(k,e,t):""}(e);return t},get64:function(e,t){return e}};var ie={a:function(){M()},n:function(e,t){var i;if(0===e)i=Date.now();else{if(1!==e&&4!==e)return Q(28),-1;i=J()}return V[t>>2]=i/1e3|0,V[t+4>>2]=i%1e3*1e3*1e3|0,0},i:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){M("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,i){k.copyWithin(e,t,t+i)},m:function(e){var t=k.length,i=2147483648;if(e>i)return!1;for(var n=1;n<=4;n*=2){var r=t*(1+.2/n);if(r=Math.min(r,e+100663296),$(Math.min(i,G(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=J();J()-t<e;);},p:function(e,t){var i=0;return ee().forEach(function(n,r){var s=t+i;V[e+4*r>>2]=s,function(e,t){for(var i=0;i<e.length;++i)R[0|t++]=e.charCodeAt(i);R[0|t]=0}(n,s),i+=n.length+1}),0},g:function(e,t){var i=ee();V[e>>2]=i.length;var n=0;return i.forEach(function(e){n+=e.length+1}),V[t>>2]=n,0},j:function(e){!function(e){C(e,new oe(e))}(e)},h:function(e){return 0},k:function(e,t,i,n,r){},c:function(e,t,i,n){for(var r=0,s=0;s<i;s++){for(var o=V[t+8*s>>2],a=V[t+(8*s+4)>>2],c=0;c<a;c++)te.printChar(e,k[o+c]);r+=a}return V[n>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return Q(28),-1}};!function(){var e={a:ie};function t(e,t){var i=e.exports;r.asm=i,B((b=r.asm.q).buffer),_=r.asm.D,function(){if(O--,r.monitorRunDependencies&&r.monitorRunDependencies(O),0==O&&H){var e=H;H=null,e()}}()}function i(e){t(e.instance)}function s(t){return function(){if(!f&&(a||c)){if("function"==typeof fetch&&!Y(L))return fetch(L,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+L+"'";return e.arrayBuffer()}).catch(function(){return U(L)});if(A)return new Promise(function(e,t){A(L,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return U(L)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){y("failed to asynchronously prepare wasm: "+e),M(e)})}if(O++,r.monitorRunDependencies&&r.monitorRunDependencies(O),r.instantiateWasm)try{return r.instantiateWasm(e,t)}catch(e){return y("Module.instantiateWasm callback failed with error: "+e),!1}(f||"function"!=typeof WebAssembly.instantiateStreaming||K(L)||Y(L)||"function"!=typeof fetch?s(i):fetch(L,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(i,function(e){return y("wasm streaming compile failed: "+e),y("falling back to ArrayBuffer instantiation"),s(i)})})).catch(n)}();var ne=r.___wasm_call_ctors=function(){return(ne=r.___wasm_call_ctors=r.asm.r).apply(null,arguments)};r._getModelBufferMemoryOffset=function(){return(r._getModelBufferMemoryOffset=r.asm.s).apply(null,arguments)},r._getInputMemoryOffset=function(){return(r._getInputMemoryOffset=r.asm.t).apply(null,arguments)},r._getInputHeight=function(){return(r._getInputHeight=r.asm.u).apply(null,arguments)},r._getInputWidth=function(){return(r._getInputWidth=r.asm.v).apply(null,arguments)},r._getInputChannelCount=function(){return(r._getInputChannelCount=r.asm.w).apply(null,arguments)},r._getOutputMemoryOffset=function(){return(r._getOutputMemoryOffset=r.asm.x).apply(null,arguments)},r._getOutputHeight=function(){return(r._getOutputHeight=r.asm.y).apply(null,arguments)},r._getOutputWidth=function(){return(r._getOutputWidth=r.asm.z).apply(null,arguments)},r._getOutputChannelCount=function(){return(r._getOutputChannelCount=r.asm.A).apply(null,arguments)},r._loadModel=function(){return(r._loadModel=r.asm.B).apply(null,arguments)},r._runInference=function(){return(r._runInference=r.asm.C).apply(null,arguments)};var re,se=r.___errno_location=function(){return(se=r.___errno_location=r.asm.E).apply(null,arguments)};function oe(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function ae(e){function t(){re||(re=!0,r.calledRun=!0,w||(z(X),z(N),i(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),function(){if(r.postRun)for("function"==typeof r.postRun&&(r.postRun=[r.postRun]);r.postRun.length;)F(r.postRun.shift());z(P)}()))}O>0||(!function(){if(r.preRun)for("function"==typeof r.preRun&&(r.preRun=[r.preRun]);r.preRun.length;)x(r.preRun.shift());z(E)}(),O>0||(r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),t()},1)):t()))}if(H=function e(){re||ae(),re||(H=e)},r.run=ae,r.preInit)for("function"==typeof r.preInit&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return ae(),t.ready}}();var MV,DV=Object.freeze({__proto__:null,default:HV}),KV=(MV="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,"undefined"!=typeof __filename&&(MV=MV||__filename),function(e){var t,i,n=void 0!==(e=e||{})?e:{};n.ready=new Promise(function(e,n){t=e,i=n});var r,s={};for(r in n)n.hasOwnProperty(r)&&(s[r]=n[r]);var o,a,c,g,d="./this.program",I=function(e,t){throw t};o="object"==typeof window,a="function"==typeof importScripts,c="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,g=!o&&!c&&!a;var C,l,A,u,p,h="";c?(h=a?require("path").dirname(h)+"/":__dirname+"/",C=function(e,t){return u||(u=require("fs")),p||(p=require("path")),e=p.normalize(e),u.readFileSync(e,t?null:"utf8")},A=function(e){var t=C(e,!0);return t.buffer||(t=new Uint8Array(t)),w(t.buffer),t},process.argv.length>1&&(d=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),process.on("uncaughtException",function(e){if(!(e instanceof se))throw e}),process.on("unhandledRejection",H),I=function(e){process.exit(e)},n.inspect=function(){return"[Emscripten Module object]"}):g?("undefined"!=typeof read&&(C=function(e){return read(e)}),A=function(e){var t;return"function"==typeof readbuffer?new Uint8Array(readbuffer(e)):(w("object"==typeof(t=read(e,"binary"))),t)},"undefined"!=typeof scriptArgs&&scriptArgs,"function"==typeof quit&&(I=function(e){quit(e)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(o||a)&&(a?h=self.location.href:"undefined"!=typeof document&&document.currentScript&&(h=document.currentScript.src),MV&&(h=MV),h=0!==h.indexOf("blob:")?h.substr(0,h.lastIndexOf("/")+1):"",C=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},a&&(A=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),l=function(e,t,i){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){200==n.status||0==n.status&&n.response?t(n.response):i()},n.onerror=i,n.send(null)});var m,f,b=n.print||console.log.bind(console),v=n.printErr||console.warn.bind(console);for(r in s)s.hasOwnProperty(r)&&(n[r]=s[r]);s=null,n.arguments&&n.arguments,n.thisProgram&&(d=n.thisProgram),n.quit&&(I=n.quit),n.wasmBinary&&(m=n.wasmBinary),n.noExitRuntime,"object"!=typeof WebAssembly&&H("no native wasm support detected");var y=!1;function w(e,t){e||H("Assertion failed: "+t)}var S,Z,R,k,V,_="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function T(e,t,i){for(var n=t+i,r=t;e[r]&&!(r>=n);)++r;if(r-t>16&&e.subarray&&_)return _.decode(e.subarray(t,r));for(var s="";t<r;){var o=e[t++];if(128&o){var a=63&e[t++];if(192!=(224&o)){var c=63&e[t++];if((o=224==(240&o)?(15&o)<<12|a<<6|c:(7&o)<<18|a<<12|c<<6|63&e[t++])<65536)s+=String.fromCharCode(o);else{var g=o-65536;s+=String.fromCharCode(55296|g>>10,56320|1023&g)}}else s+=String.fromCharCode((31&o)<<6|a)}else s+=String.fromCharCode(o)}return s}function W(e,t){return e%t>0&&(e+=t-e%t),e}function G(e){S=e,n.HEAP8=Z=new Int8Array(e),n.HEAP16=new Int16Array(e),n.HEAP32=k=new Int32Array(e),n.HEAPU8=R=new Uint8Array(e),n.HEAPU16=new Uint16Array(e),n.HEAPU32=new Uint32Array(e),n.HEAPF32=new Float32Array(e),n.HEAPF64=new Float64Array(e)}n.INITIAL_MEMORY;var B=[],E=[],X=[],N=[];function P(e){B.unshift(e)}function x(e){N.unshift(e)}E.push({func:function(){ie()}});var F=0,O=null;function H(e){n.onAbort&&n.onAbort(e),v(e+=""),y=!0,e="abort("+e+"). Build with -s ASSERTIONS=1 for more info.";var t=new WebAssembly.RuntimeError(e);throw i(t),t}function M(e,t){return String.prototype.startsWith?e.startsWith(t):0===e.indexOf(t)}function D(e){return M(e,"data:application/octet-stream;base64,")}function K(e){return M(e,"file://")}n.preloadedImages={},n.preloadedAudios={};var Y,j,J="tflite.wasm";function L(e){try{if(e==J&&m)return new Uint8Array(m);if(A)return A(e);throw"both async and sync fetching of the wasm failed"}catch(e){H(e)}}function U(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var i=t.func;"number"==typeof i?void 0===t.arg?V.get(i)():V.get(i)(t.arg):i(void 0===t.arg?null:t.arg)}else t(n)}}function z(e){return k[re()>>2]=e,e}function Q(e){try{return f.grow(e-S.byteLength+65535>>>16),G(f.buffer),1}catch(e){}}D(J)||(Y=J,J=n.locateFile?n.locateFile(Y,h):h+Y),j=c?function(){var e=process.hrtime();return 1e3*e[0]+e[1]/1e6}:"undefined"!=typeof dateNow?dateNow:function(){return performance.now()};var $={};function q(){if(!q.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:d||"./this.program"};for(var t in $)e[t]=$[t];var i=[];for(var t in e)i.push(t+"="+e[t]);q.strings=i}return q.strings}var ee={mappings:{},buffers:[null,[],[]],printChar:function(e,t){var i=ee.buffers[e];0===t||10===t?((1===e?b:v)(T(i,0)),i.length=0):i.push(t)},varargs:void 0,get:function(){return ee.varargs+=4,k[ee.varargs-4>>2]},getStr:function(e){var t=function(e,t){return e?T(R,e,t):""}(e);return t},get64:function(e,t){return e}},te={a:function(){H()},n:function(e,t){var i;if(0===e)i=Date.now();else{if(1!==e&&4!==e)return z(28),-1;i=j()}return k[t>>2]=i/1e3|0,k[t+4>>2]=i%1e3*1e3*1e3|0,0},i:function(e,t){H("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},e:function(e,t){H("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")},l:function(e,t,i){R.copyWithin(e,t,t+i)},m:function(e){var t=R.length,i=2147483648;if(e>i)return!1;for(var n=1;n<=4;n*=2){var r=t*(1+.2/n);if(r=Math.min(r,e+100663296),Q(Math.min(i,W(Math.max(e,r),65536))))return!0}return!1},o:function(e){for(var t=j();j()-t<e;);},p:function(e,t){var i=0;return q().forEach(function(n,r){var s=t+i;k[e+4*r>>2]=s,function(e,t){for(var i=0;i<e.length;++i)Z[0|t++]=e.charCodeAt(i);Z[0|t]=0}(n,s),i+=n.length+1}),0},g:function(e,t){var i=q();k[e>>2]=i.length;var n=0;return i.forEach(function(e){n+=e.length+1}),k[t>>2]=n,0},j:function(e){!function(e){I(e,new se(e))}(e)},h:function(e){return 0},k:function(e,t,i,n,r){},c:function(e,t,i,n){for(var r=0,s=0;s<i;s++){for(var o=k[t+8*s>>2],a=k[t+(8*s+4)>>2],c=0;c<a;c++)ee.printChar(e,R[o+c]);r+=a}return k[n>>2]=r,0},d:function(){return 6},f:function(){return 28},b:function(e){switch(e){case 30:case 75:return 16384;case 85:return 131072;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return z(28),-1}};!function(){var e={a:te};function t(e,t){var i=e.exports;n.asm=i,G((f=n.asm.q).buffer),V=n.asm.D,function(){if(F--,n.monitorRunDependencies&&n.monitorRunDependencies(F),0==F&&O){var e=O;O=null,e()}}()}function r(e){t(e.instance)}function s(t){return function(){if(!m&&(o||a)){if("function"==typeof fetch&&!K(J))return fetch(J,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+J+"'";return e.arrayBuffer()}).catch(function(){return L(J)});if(l)return new Promise(function(e,t){l(J,function(t){e(new Uint8Array(t))},t)})}return Promise.resolve().then(function(){return L(J)})}().then(function(t){return WebAssembly.instantiate(t,e)}).then(t,function(e){v("failed to asynchronously prepare wasm: "+e),H(e)})}if(F++,n.monitorRunDependencies&&n.monitorRunDependencies(F),n.instantiateWasm)try{return n.instantiateWasm(e,t)}catch(e){return v("Module.instantiateWasm callback failed with error: "+e),!1}(m||"function"!=typeof WebAssembly.instantiateStreaming||D(J)||K(J)||"function"!=typeof fetch?s(r):fetch(J,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,e).then(r,function(e){return v("wasm streaming compile failed: "+e),v("falling back to ArrayBuffer instantiation"),s(r)})})).catch(i)}();var ie=n.___wasm_call_ctors=function(){return(ie=n.___wasm_call_ctors=n.asm.r).apply(null,arguments)};n._getModelBufferMemoryOffset=function(){return(n._getModelBufferMemoryOffset=n.asm.s).apply(null,arguments)},n._getInputMemoryOffset=function(){return(n._getInputMemoryOffset=n.asm.t).apply(null,arguments)},n._getInputHeight=function(){return(n._getInputHeight=n.asm.u).apply(null,arguments)},n._getInputWidth=function(){return(n._getInputWidth=n.asm.v).apply(null,arguments)},n._getInputChannelCount=function(){return(n._getInputChannelCount=n.asm.w).apply(null,arguments)},n._getOutputMemoryOffset=function(){return(n._getOutputMemoryOffset=n.asm.x).apply(null,arguments)},n._getOutputHeight=function(){return(n._getOutputHeight=n.asm.y).apply(null,arguments)},n._getOutputWidth=function(){return(n._getOutputWidth=n.asm.z).apply(null,arguments)},n._getOutputChannelCount=function(){return(n._getOutputChannelCount=n.asm.A).apply(null,arguments)},n._loadModel=function(){return(n._loadModel=n.asm.B).apply(null,arguments)},n._runInference=function(){return(n._runInference=n.asm.C).apply(null,arguments)};var ne,re=n.___errno_location=function(){return(re=n.___errno_location=n.asm.E).apply(null,arguments)};function se(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function oe(e){function i(){ne||(ne=!0,n.calledRun=!0,y||(U(E),U(X),t(n),n.onRuntimeInitialized&&n.onRuntimeInitialized(),function(){if(n.postRun)for("function"==typeof n.postRun&&(n.postRun=[n.postRun]);n.postRun.length;)x(n.postRun.shift());U(N)}()))}F>0||(function(){if(n.preRun)for("function"==typeof n.preRun&&(n.preRun=[n.preRun]);n.preRun.length;)P(n.preRun.shift());U(B)}(),F>0||(n.setStatus?(n.setStatus("Running..."),setTimeout(function(){setTimeout(function(){n.setStatus("")},1),i()},1)):i()))}if(O=function e(){ne||oe(),ne||(O=e)},n.run=oe,n.preInit)for("function"==typeof n.preInit&&(n.preInit=[n.preInit]);n.preInit.length>0;)n.preInit.pop()();return oe(),e.ready}),YV=Object.freeze({__proto__:null,default:KV}),jV=Object.freeze({__proto__:null,createEffectStream:(e,t,i,n)=>Pk(void 0,void 0,void 0,function*(){const{pipeline:r,mergedSetup:s,mergedParams:o}=FV(t,i,n);s.logToConsole&&console.log(`Setting effect preset ${t}`,{setup:s,params:o});const{stream:a,stop:c,updateParams:g}=yield r.module.createEffectStream(e,s,o),d="safari"===we.browserDetails.browser?(()=>{let e=!1;const t=()=>requestAnimationFrame(()=>{e||t()});return t(),()=>e=!0})():()=>{};return{stream:a,stop:()=>{s.logToConsole&&console.log("Stopping effects"),d(),c()},tryUpdate:(e,t,i)=>Pk(void 0,void 0,void 0,function*(){const{pipeline:n,mergedSetup:o,mergedParams:a}=FV(e,t,i);return g&&n===r&&JSON.stringify(o)===JSON.stringify(s)?(s.logToConsole&&console.log(`Updating to effect preset ${e}`,{params:a}),yield g(a)):(s.logToConsole&&console.log("Cannot update effect, needs to create new pipeline"),!1)})}}),getPresets:e=>xV.map(t=>{var i;const n=!!Object.keys(null!==(i=t.pipelineConfigs)&&void 0!==i?i:[]).find(t=>PV[t].canUse(null!=e?e:{}));return{id:t.id,kind:(r=t.id,r.startsWith("image-")?"image":r.startsWith("video-")?"video":"blur"),supported:n};var r}),getUsablePresets:OV,setDefaultSetup:(e,t)=>{const i=PV[e].getDefaultSetup(),n=Object.assign(Object.assign({},i),t);PV[e].getDefaultSetup=()=>n},warmup:(e,...t)=>Pk(void 0,[e,...t],void 0,function*(e,t=()=>({}),i={}){var n;const r=e||OV({filter:e=>e.canUse({}),options:{}}).at(0)||(null===(n=xV.at(0))||void 0===n?void 0:n.id);if(!r)return;const s=FV(r,t,i);if(!s)return;const{mergedSetup:o,mergedParams:a}=s;if(yield CV(o.segmentationModelId),null==a?void 0:a.backgroundUrl){yield tV(a);try{yield iV(a.backgroundUrl,a.backgroundType)}catch(e){}}})});function JV(e,t,i,n){return new(i||(i=Promise))(function(r,s){function o(e){try{c(n.next(e))}catch(e){s(e)}}function a(e){try{c(n.throw(e))}catch(e){s(e)}}function c(e){e.done?r(e.value):function(e){return e instanceof i?e:new i(function(t){t(e)})}(e.value).then(o,a)}c((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;const LV=e=>`https://cdn.srv.whereby.com/audio-denoiser/v1-0-6/${e}`,UV={denoiser:{wasm:LV("assets/denoiser/model.ext.wasm"),processor:LV("assets/denoiser/processor.ext.js")}},zV=new Map,QV="undefined"!=typeof AudioContext?AudioContext:globalThis.webkitAudioContext;let $V=null;const qV=e=>JV(void 0,void 0,void 0,function*(){return $V||($V=JV(void 0,void 0,void 0,function*(){const t=yield JV(void 0,void 0,void 0,function*(){return UV.denoiser.wasm}),i=yield fetch(t);if(!i.ok){const t=new Error(`Failed to fetch denoiser model: ${i.status} ${i.statusText}`);throw null==e||e(t,{tags:{from:"audioDenoiser.loadWasmBuffer"}}),$V=null,t}return i.arrayBuffer()})),$V});let e_=null;const t_=e=>JV(void 0,void 0,void 0,function*(){if(e_||(e_=new WeakSet),e_.has(e))return;const t=yield JV(void 0,void 0,void 0,function*(){return UV.denoiser.processor});yield e.audioWorklet.addModule(t),e_.add(e)});class i_ extends AudioWorkletNode{constructor(e,t){super(e,"denoiser",{channelCountMode:"explicit",channelCount:1,channelInterpretation:"speakers",numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1],processorOptions:{wasmBuffer:t}})}}var n_=Object.freeze({__proto__:null,applyAudioDenoiser:e=>JV(void 0,[e],void 0,function*({inputStream:e,doCaptureException:t}){const i=e.getAudioTracks()[0],n=null==i?void 0:i.getSettings().sampleRate,r=function(e,t){var i;if(!QV)throw new Error("AudioContext is not supported in this environment");const n=`${e}:${null!==(i=null==t?void 0:t.sampleRate)&&void 0!==i?i:"default"}`;let r=zV.get(n);return r||(r=new QV(t),zV.set(n,r)),r}("audiodenoiser",n?{sampleRate:n}:void 0),s=r.createMediaStreamDestination(),[o]=yield Promise.all([qV(t),t_(r)]),a=r.createMediaStreamSource(e),c=new i_(r,o);c.port.onmessage=e=>{var i;(null===(i=e.data)||void 0===i?void 0:i.error)&&(null==t||t(new Error(e.data.error),{tags:{from:"audioDenoiser.onmessage"},extra:{sampleRate:n}}))},c.onprocessorerror=e=>{const i=e,r=new Error(`Denoiser processor error: ${i.error} - ${i.message}`);null==t||t(r,{tags:{from:"audioDenoiser.onprocessorerror"},extra:{sampleRate:n}})},c.connect(s),a.connect(c);const g=s.stream.getAudioTracks()[0];g&&i&&Object.defineProperty(g,"enabled",{get:()=>i.enabled,set(e){i.enabled=e}}),g&&(Xa(g).isEffectTrack=!0);let d=!1;return{outputStream:s.stream,audioContext:r,denoiserNode:c,stop:()=>{if(!d){d=!0;try{c.port.postMessage(!1),a.disconnect(),c.disconnect()}catch(e){console.error("Error stopping audio denoiser",e)}}}}}),canUse:()=>"undefined"!=typeof AudioWorkletNode&&"undefined"!=typeof AudioContext,warmup:()=>JV(void 0,void 0,void 0,function*(){yield qV()})});return e.ACCEPTED_FILE_TYPES=tb,e.GridCell=Ek,e.GridVideoView=Xk,e.MAX_FILES_PER_UPLOAD=10,e.MAX_FILE_SIZE=eb,e.ParticipantMenu=Sk,e.ParticipantMenuContent=Zk,e.ParticipantMenuItem=kk,e.ParticipantMenuTrigger=Rk,e.VideoGrid=function({renderParticipant:e,renderSubgridParticipant:t,renderFloatingParticipant:i,stageParticipantLimit:n,gridGap:r,videoGridGap:s,enableSubgrid:a,enableParticipantMenu:c,enableConstrainedGrid:g}){const d=o.useRef(null),{containerFrame:I,cellViewsFloating:C,cellViewsVideoGrid:l,cellViewsInPresentationGrid:A,cellViewsInSubgrid:u,clientAspectRatios:p,videoStage:h,setContainerBounds:m,setClientAspectRatios:f,maximizedParticipant:b,setMaximizedParticipant:v,isConstrained:y,floatingParticipant:w,setFloatingParticipant:S}=function({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:i=12,gridGap:n=8,videoGridGap:r=8,enableSubgrid:s=!0,enableConstrainedGrid:a=!0}={}){const[c,g]=o.useState({width:0,height:0}),[d,I]=o.useState(!1),[C,l]=o.useState({}),[A,u]=o.useState(null),[p,h]=o.useState(null),{clientViewsInGrid:m,clientViewsInPresentationGrid:f,clientViewsInSubgrid:b,floatingClientView:v}=Gy({activeVideosSubgridTrigger:e,forceSubgrid:t,stageParticipantLimit:i,enableSubgrid:s,maximizedParticipant:A,floatingParticipant:p,isConstrained:!!a&&!!d}),y=o.useMemo(()=>v?[Wy({client:v,aspectRatio:C[v.id],avatarSize:0,cellPaddings:{top:0,right:0}})]:[],[v,C]),w=o.useMemo(()=>m.map(e=>Wy({client:e,aspectRatio:C[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[m,C]),S=o.useMemo(()=>f.map(e=>Wy({client:e,aspectRatio:C[e.id],avatarSize:0,cellPaddings:{top:0,right:0}})),[f,C]),Z=o.useMemo(()=>b.map(e=>Wy({client:e,aspectRatio:C[e.id],avatarSize:0,cellPaddings:{top:0,right:0},isSubgrid:!0})),[b,C]),R=o.useMemo(()=>zv(c),[c]);o.useEffect(()=>{a&&I(c.width<500||c.height<500)},[c,a]);const k=o.useMemo(()=>Ty({floatingVideo:y[0],frame:R,gridGap:n,isConstrained:d,roomBounds:R.bounds,videos:w,videoGridGap:r,presentationVideos:S,subgridVideos:Z}),[R,y,w,S,Z,n,r]);return{containerFrame:R,cellViewsFloating:y,cellViewsVideoGrid:w,cellViewsInPresentationGrid:S,cellViewsInSubgrid:Z,clientAspectRatios:C,videoStage:k,setContainerBounds:g,setClientAspectRatios:l,maximizedParticipant:A,setMaximizedParticipant:u,floatingParticipant:p,setFloatingParticipant:h,isConstrained:d}}({activeVideosSubgridTrigger:12,stageParticipantLimit:n,gridGap:r,videoGridGap:s,enableSubgrid:a,enableConstrainedGrid:g}),Z=o.useCallback(({aspectRatio:e,clientId:t})=>{f(i=>Object.assign(Object.assign({},i),{[t]:e}))},[f]),R=o.useMemo(()=>Nk(Object.assign({cellView:C[0],enableParticipantMenu:c},i?{render:({participant:e})=>i({participant:e})}:{})),[C]),k=o.useMemo(()=>A.map(t=>Nk(Object.assign({cellView:t,enableParticipantMenu:c},e?{render:({participant:t})=>e({participant:t})}:{}))),[A]),V=o.useMemo(()=>l.map(t=>Nk(Object.assign({cellView:t,enableParticipantMenu:c},e?{render:({participant:t})=>e({participant:t})}:{}))),[l]),_=o.useMemo(()=>u.map(e=>Nk(Object.assign({cellView:e,enableParticipantMenu:c},t?{render:({participant:e})=>t({participant:e})}:{}))),[u]);return o.useEffect(()=>{if(!d.current)return;const e=new ResizeObserver(pp(()=>{var e,t,i,n;m({width:null!==(t=null===(e=d.current)||void 0===e?void 0:e.clientWidth)&&void 0!==t?t:640,height:null!==(n=null===(i=d.current)||void 0===i?void 0:i.clientHeight)&&void 0!==n?n:480})},{delay:60,edges:!1}));return e.observe(d.current),()=>{e.disconnect()}},[]),o.createElement(bk.Provider,{value:{onSetClientAspectRatio:Z,cellViewsVideoGrid:l,cellViewsInPresentationGrid:A,cellViewsInSubgrid:u,clientAspectRatios:p,maximizedParticipant:b,setMaximizedParticipant:v,floatingParticipant:w,setFloatingParticipant:S,isConstrained:y}},o.createElement("div",{ref:d,style:{width:"100%",height:"100%",position:"relative"}},o.createElement(sy,{containerFrame:I,floatingContent:R,layoutVideoStage:h,presentationGridContent:k,gridContent:V,subgridContent:_})))},e.VideoView=Dv,e.WherebyProvider=function({children:e}){const t=o.useMemo(()=>new Pv,[]);return o.useEffect(()=>()=>{t.destroy()},[t]),o.createElement(xv.Provider,{value:t},e)},e.getUsableCameraEffectPresets=function(){return Ap(this,void 0,void 0,function*(){const{getUsablePresets:e}=yield Promise.resolve().then(function(){return jV});return e()})},e.isAudioDenoiserSupported=function(){return Ap(this,void 0,void 0,function*(){const{canUse:e}=yield Promise.resolve().then(function(){return n_});return e()})},e.useLocalMedia=function(e={audio:!0,video:!0}){var t;const i=null===(t=o.useContext(xv))||void 0===t?void 0:t.getLocalMedia(),[n,r]=o.useState(()=>jv);if(!i)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");return o.useEffect(()=>{i.startMedia(e);const t=i.subscribe(e=>{r(t=>Object.assign(Object.assign({},t),e))});return()=>{t(),i.stopMedia()}},[]),{state:n,actions:{setCameraDevice:o.useCallback(e=>i.setCameraDevice(e),[i]),setMicrophoneDevice:o.useCallback(e=>i.setMicrophoneDevice(e),[i]),setSpeakerDevice:o.useCallback(e=>i.setSpeakerDevice(e),[i]),toggleCameraEnabled:o.useCallback(e=>i.toggleCamera(e),[i]),toggleMicrophoneEnabled:o.useCallback(e=>i.toggleMicrophone(e),[i]),toggleHdModeEnabled:o.useCallback(e=>i.toggleHdMode(e),[i]),toggleLowDataModeEnabled:o.useCallback(e=>i.toggleLowDataMode(e),[i]),toggleWidescreenModeEnabled:o.useCallback(e=>i.toggleWidescreenMode(e),[i])}}},e.useRoomConnection=function(e,t=Yv){var i;const n=null===(i=o.useContext(xv))||void 0===i?void 0:i.getRoomConnection(),[r,s]=o.useState(()=>Kv);if(!n)throw new Error("WherebyClient is not initialized. Please wrap your component with WherebyProvider.");const a=o.useMemo(()=>{const i=new URL(e),n=new URLSearchParams(i.search),r=t.roomKey||n.get("roomKey");return{displayName:t.displayName||"Guest",localMediaOptions:t.localMedia?void 0:t.localMediaOptions,roomKey:r,roomUrl:e,userAgent:"browser-sdk:3.27.0",externalId:t.externalId||null}},[e,t]);o.useEffect(()=>{const e=n.subscribe(e=>{s(t=>Object.assign(Object.assign({},t),e))}),t=n.getNotificationsEventEmitter();return s(e=>Object.assign(Object.assign({},e),{events:t})),()=>{e(),n.leaveRoom()}},[]);const c=o.useCallback(()=>(n.initialize(a),n.joinRoom()),[n]),g=o.useCallback((e,t)=>n.sendChatMessage(e,t),[n]),d=o.useCallback((e,t)=>n.removeChatMessage(e,t),[n]),I=o.useCallback(e=>n.sendFiles(e),[n]),C=o.useCallback(e=>n.downloadFile(e),[n]),l=o.useCallback(()=>n.knock(),[n]),A=o.useCallback(()=>n.cancelKnock(),[n]),u=o.useCallback(e=>n.setDisplayName(e),[n]),p=o.useCallback(e=>n.toggleCamera(e),[n]),h=o.useCallback(e=>n.toggleMicrophone(e),[n]),m=o.useCallback(e=>n.toggleHdMode(e),[n]),f=o.useCallback(e=>n.toggleLowDataMode(e),[n]),b=o.useCallback(e=>n.toggleWidescreenMode(e),[n]),v=o.useCallback(e=>n.toggleRaiseHand(e),[n]),y=o.useCallback(e=>n.askToSpeak(e),[n]),w=o.useCallback(e=>n.askToTurnOnCamera(e),[n]),S=o.useCallback(e=>n.acceptWaitingParticipant(e),[n]),Z=o.useCallback(e=>n.rejectWaitingParticipant(e),[n]),R=o.useCallback(()=>n.startCloudRecording(),[n]),k=o.useCallback(()=>n.startLiveCaptions(),[n]),V=o.useCallback(()=>n.startLiveTranscription(),[n]),_=o.useCallback(()=>n.startScreenshare(),[n]),T=o.useCallback(()=>n.stopCloudRecording(),[n]),W=o.useCallback(()=>n.stopLiveCaptions(),[n]),G=o.useCallback(()=>n.stopLiveTranscription(),[n]),B=o.useCallback(()=>n.stopScreenshare(),[n]),E=o.useCallback(()=>n.leaveRoom(),[n]),X=o.useCallback(e=>n.lockRoom(e),[n]),N=o.useCallback(e=>n.muteParticipants(e),[n]),P=o.useCallback(e=>n.turnOffParticipantCameras(e),[n]),x=o.useCallback(e=>n.spotlightParticipant(e),[n]),F=o.useCallback(e=>n.removeSpotlight(e),[n]),O=o.useCallback(e=>n.kickParticipant(e),[n]),H=o.useCallback(e=>n.endMeeting(e),[n]),M=o.useCallback(e=>n.joinBreakoutGroup(e),[n]),D=o.useCallback(()=>n.joinBreakoutMainRoom(),[n]),K=o.useCallback(e=>Hv(this,void 0,void 0,function*(){yield n.switchCameraEffect(e)}),[n]),Y=o.useCallback(e=>Hv(this,void 0,void 0,function*(){yield n.switchCameraEffectCustom(e)}),[n]),j=o.useCallback(()=>Hv(this,void 0,void 0,function*(){yield n.clearCameraEffect()}),[n]),J=o.useCallback(()=>Hv(this,void 0,void 0,function*(){yield n.enableAudioDenoiser()}),[n]),L=o.useCallback(()=>Hv(this,void 0,void 0,function*(){yield n.disableAudioDenoiser()}),[n]),{events:U}=r;return{state:Ov(r,["events"]),events:U,actions:{askToSpeak:y,askToTurnOnCamera:w,acceptWaitingParticipant:S,knock:l,cancelKnock:A,joinRoom:c,leaveRoom:E,lockRoom:X,muteParticipants:N,turnOffParticipantCameras:P,kickParticipant:O,endMeeting:H,rejectWaitingParticipant:Z,sendChatMessage:g,removeChatMessage:d,sendFiles:I,downloadFile:C,setDisplayName:u,startCloudRecording:R,startLiveCaptions:k,startLiveTranscription:V,startScreenshare:_,stopCloudRecording:T,stopLiveCaptions:W,stopLiveTranscription:G,stopScreenshare:B,toggleCamera:p,toggleMicrophone:h,toggleRaiseHand:v,toggleHdMode:m,toggleLowDataMode:f,toggleWidescreenMode:b,spotlightParticipant:x,removeSpotlight:F,joinBreakoutGroup:M,joinBreakoutMainRoom:D,switchCameraEffect:K,switchCameraEffectCustom:Y,clearCameraEffect:j,enableAudioDenoiser:J,disableAudioDenoiser:L}}},e}({},React,ReactDOM);
|