mirror of
https://github.com/koush/scrypted.git
synced 2026-03-15 22:52:44 +00:00
2 lines
82 KiB
JavaScript
2 lines
82 KiB
JavaScript
(()=>{"use strict";var __webpack_modules__={636:(module,__webpack_exports__,__webpack_require__)=>{function startPeriodicGarbageCollection(){if(__webpack_require__.g.gc)try{const e=__webpack_require__.g;if(e.gc)return setInterval((()=>{e.gc()}),1e4)}catch(e){}else console.warn("rpc peer garbage collection not available: global.gc is not exposed.")}__webpack_require__.d(__webpack_exports__,{uD:()=>RpcPeer}),module=__webpack_require__.hmd(module);class RpcProxy{peer;entry;constructorName;proxyProps;proxyOneWayMethods;constructor(e,t,r,i,o){this.peer=e,this.entry=t,this.constructorName=r,this.proxyProps=i,this.proxyOneWayMethods=o}toPrimitive(){const e=this.peer;return`RpcProxy-${e.selfName}:${e.peerName}: ${this.constructorName}`}get(e,t,r){if("__proxy_id"===t)return this.entry.id;if("__proxy_constructor"===t)return this.constructorName;if("__proxy_peer"===t)return this.peer;if(t===RpcPeer.PROPERTY_PROXY_PROPERTIES)return this.proxyProps;if(t===RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS)return this.proxyOneWayMethods;if(t===RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION||t===RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN)return;if("then"===t)return;if("constructor"===t)return;if(void 0!==this.proxyProps?.[t])return this.proxyProps?.[t];return RpcPeer.handleFunctionInvocations(this,e,t,r)||new Proxy((()=>t),this)}set(e,t,r,i){return t===RpcPeer.finalizerIdSymbol&&(this.entry.finalizerId=r),!0}apply(e,t,r){if(Object.isFrozen(this.peer.pendingResults))return Promise.reject(new RPCResultError(this.peer,"RpcPeer has been killed"));const i=e()||null,o=[],n={};for(const e of r||[])o.push(this.peer.serialize(e,n));const s={type:"apply",id:void 0,proxyId:this.entry.id,args:o,method:i};return this.proxyOneWayMethods?.includes?.(i)?(s.oneway=!0,this.peer.send(s,void 0,n),Promise.resolve()):this.peer.createPendingResult(((e,t)=>{s.id=e,this.peer.send(s,t,n)}))}}class RPCResultError extends Error{cause;constructor(e,t,r,i){super(`${e.selfName}:${e.peerName}: ${t}`),this.cause=r,i?.name&&(this.name=i?.name),i?.stack&&(this.stack=`${e.peerName}:${e.selfName}\n${r?.stack||i.stack}`)}}function compileFunction(code,params,options){params=params||[];const f=`(function(${params.join(",")}) {;${code};})`;return eval(f)}try{const e=FinalizationRegistry}catch(e){window.WeakRef=class{target;constructor(e){this.target=e}deref(){return this.target}},window.FinalizationRegistry=class{register(){}}}class RpcPeer{selfName;peerName;send;idCounter=1;params={};pendingResults={};proxyCounter=1;localProxied=new Map;localProxyMap={};remoteWeakProxies={};finalizers=new FinalizationRegistry((e=>this.finalize(e)));nameDeserializerMap=new Map;constructorSerializerMap=new Map;transportSafeArgumentTypes=RpcPeer.getDefaultTransportSafeArgumentTypes();static finalizerIdSymbol=Symbol("rpcFinalizerId");static getDefaultTransportSafeArgumentTypes(){const e=new Set;return e.add(Number.name),e.add(String.name),e.add(Object.name),e.add(Boolean.name),e.add(Array.name),e}static handleFunctionInvocations(e,t,r,i){return"apply"===r?(r,i)=>e.apply(t,e,i):"call"===r?(r,...i)=>e.apply(t,e,i):"toString"===r||r===Symbol.toPrimitive?(t,...r)=>e.toPrimitive():void 0}static PROPERTY_PROXY_ONEWAY_METHODS="__proxy_oneway_methods";static PROPERTY_JSON_DISABLE_SERIALIZATION="__json_disable_serialization";static PROPERTY_PROXY_PROPERTIES="__proxy_props";static PROPERTY_JSON_COPY_SERIALIZE_CHILDREN="__json_copy_serialize_children";static PROBED_PROPERTIES=new Set(["then","constructor","__proxy_id","__proxy_constructor","__proxy_peer",RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS,RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION,RpcPeer.PROPERTY_PROXY_PROPERTIES,RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]);constructor(e,t,r){this.selfName=e,this.peerName=t,this.send=r}createPendingResult(e){if(Object.isFrozen(this.pendingResults))return Promise.reject(new RPCResultError(this,"RpcPeer has been killed"));const t=new Promise(((t,r)=>{const i=(this.idCounter++).toString();this.pendingResults[i]={resolve:t,reject:r},e(i,(e=>r(new RPCResultError(this,e.message,e))))}));return t.catch((()=>{})),t}kill(e){const t=new RPCResultError(this,e||"peer was killed");for(const e of Object.values(this.pendingResults))e.reject(t);this.pendingResults=Object.freeze({}),this.remoteWeakProxies=Object.freeze({}),this.localProxyMap=Object.freeze({}),this.localProxied.clear()}addSerializer(e,t,r){this.nameDeserializerMap.set(t,r),this.constructorSerializerMap.set(e,t)}finalize(e){delete this.remoteWeakProxies[e.id];const t={__local_proxy_id:e.id,__local_proxy_finalizer_id:e.finalizerId,type:"finalize"};this.send(t)}async getParam(e){return this.createPendingResult(((t,r)=>{const i={id:t,type:"param",param:e};this.send(i,r)}))}evalLocal(e,t,r){const i=Object.assign({},this.params,r);let o;try{o=module.require("vm").compileFunction}catch(e){o=compileFunction}return o(e,Object.keys(i),{filename:t})(...Object.values(i))}createErrorResult(e,t){e.stack=t.stack||"no stack",e.result=t.name||"no name",e.message=t.message||"no message"}deserialize(e,t){if(!e)return e;if(e[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.deserialize(o,t);return r}const{__remote_proxy_id:r,__remote_proxy_finalizer_id:i,__local_proxy_id:o,__remote_constructor_name:n,__serialized_value:s,__remote_proxy_props:a,__remote_proxy_oneway_methods:c}=e;if(r){let e=this.remoteWeakProxies[r]?.deref();return e||(e=this.newProxy(r,n,a,c)),e[RpcPeer.finalizerIdSymbol]=i,e}if(o){const e=this.localProxyMap[o];if(!e)throw new RPCResultError(this,`invalid local proxy id ${o}`);return e}const _=this.nameDeserializerMap.get(n);return _?_.deserialize(s,t):e}serialize(e,t){if(!0===e?.[RpcPeer.PROPERTY_JSON_COPY_SERIALIZE_CHILDREN]){const r={};for(const[i,o]of Object.entries(e))r[i]=this.serialize(o,t);return r}if(!e||!e[RpcPeer.PROPERTY_JSON_DISABLE_SERIALIZATION]&&this.transportSafeArgumentTypes.has(e.constructor?.name))return e;let r=e.__proxy_constructor||e.constructor?.name?.toString(),i=this.localProxied.get(e);if(i){const t=(this.proxyCounter++).toString();return i.finalizerId=t,{__remote_proxy_id:i.id,__remote_proxy_finalizer_id:t,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}const{__proxy_id:o,__proxy_peer:n}=e;if(o&&n===this)return{__local_proxy_id:o};const s=this.constructorSerializerMap.get(e.constructor);if(s){r=s;const i=this.nameDeserializerMap.get(s);if(!i)throw new Error("serializer not found for "+s);const o=i.serialize(e,t);return{__remote_proxy_id:void 0,__remote_proxy_finalizer_id:void 0,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS],__serialized_value:o}}const a=(this.proxyCounter++).toString();return i={id:a,finalizerId:a},this.localProxied.set(e,i),this.localProxyMap[a]=e,{__remote_proxy_id:a,__remote_proxy_finalizer_id:a,__remote_constructor_name:r,__remote_proxy_props:e?.[RpcPeer.PROPERTY_PROXY_PROPERTIES],__remote_proxy_oneway_methods:e?.[RpcPeer.PROPERTY_PROXY_ONEWAY_METHODS]}}newProxy(e,t,r,i){const o={id:e,finalizerId:void 0},n=new RpcProxy(this,o,t,r,i),s=new Proxy("Function"===t||"AsyncFunction"===t?function(){}:n,n),a=new WeakRef(s);return this.remoteWeakProxies[e]=a,this.finalizers.register(n,o),s}async handleMessage(e,t){try{switch(e.type){case"param":{const t=e,r={},i={type:"result",id:t.id,result:this.serialize(this.params[t.param],r)};this.send(i,void 0,r);break}case"apply":{const r=e,i={type:"result",id:r.id||""},o={};try{const e=this.localProxyMap[r.proxyId];if(!e)throw new Error(`proxy id ${r.proxyId} not found`);const n=[];for(const e of r.args||[])n.push(this.deserialize(e,t));let s;if(r.method){if(!e[r.method])throw new Error(`target ${e?.constructor?.name} does not have method ${r.method}`);s=await e[r.method](...n)}else s=await e(...n);i.result=this.serialize(s,o)}catch(e){this.createErrorResult(i,e)}r.oneway||this.send(i,void 0,o);break}case"result":{const r=e,i=this.pendingResults[r.id];if(delete this.pendingResults[r.id],!i)throw new Error(`unknown result ${r.id}`);if(r.message||r.stack){const e=new RPCResultError(this,r.message||"no message",void 0,{name:r.result,stack:r.stack});return void i.reject(e)}i.resolve(this.deserialize(r.result,t));break}case"finalize":{const t=e,r=this.localProxyMap[t.__local_proxy_id];if(r){const e=this.localProxied.get(r);if(t.__local_proxy_finalizer_id&&t.__local_proxy_finalizer_id!==e?.finalizerId)break;delete this.localProxyMap[t.__local_proxy_id],this.localProxied.delete(r)}break}default:throw new Error(`unknown rpc message type ${e.type}`)}}catch(e){return void console.error("unhandled rpc error",this.peerName,e)}}}function getEvalSource(){return`\n (() => {\n ${RpcProxy}\n\n ${RpcPeer}\n \n return {\n RpcPeer,\n RpcProxy,\n };\n })();\n `}}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var r=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](r,r.exports,__webpack_require__),r.loaded=!0,r.exports}__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=e=>((e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};(()=>{var e=__webpack_require__(636);class t{finished=!1;resolve;reject;promise=new Promise(((e,t)=>{this.resolve=t=>{this.finished=!0,e(t)},this.reject=e=>{this.finished=!0,t(e)}}))}function r(){try{return navigator.userAgent}catch(e){}}function i(e){return"disconnected"===e.iceConnectionState||"failed"===e.iceConnectionState||"closed"===e.iceConnectionState}class o{pc;pcDeferred=new t;dcDeferred=new t;options={userAgent:r(),capabilities:{audio:RTCRtpReceiver.getCapabilities?.("audio")||{codecs:void 0,headerExtensions:void 0},video:RTCRtpReceiver.getCapabilities?.("video")||{codecs:void 0,headerExtensions:void 0}},screen:{width:screen.width,height:screen.height}};constructor(){}async getOptions(){return this.options}close(){this.pcDeferred.promise.then((e=>{for(const t of e.getTransceivers()||[])try{t.sender?.track?.stop?.()}catch(e){}e.close()})).catch((()=>{})),this.pcDeferred.reject(new Error("iceConnectionState "+this.pc?.iceConnectionState))}async createPeerConnection(e){if(this.pc)return;const t=()=>{console.log("iceConnectionState",r.iceConnectionState),console.log("connectionState",r.connectionState),i(r)&&this.close()},r=this.pc=new RTCPeerConnection(e.configuration);if(this.pcDeferred.resolve(r),r.addEventListener("connectionstatechange",t),r.addEventListener("iceconnectionstatechange",t),r.addEventListener("icegatheringstatechange",(e=>console.log("iceGatheringState",r.iceGatheringState))),r.addEventListener("signalingstatechange",(e=>console.log("signalingState",r.signalingState))),r.addEventListener("icecandidateerror",(e=>console.log("icecandidateerror"))),e.datachannel){const t=r.createDataChannel(e.datachannel.label,e.datachannel.dict);t.binaryType="arraybuffer",this.dcDeferred.resolve(t)}if(e.audio)if("sendrecv"===e.audio.direction||"sendonly"===e.audio.direction)try{const e=await navigator.mediaDevices.getUserMedia({video:!1,audio:!0});for(const t of e.getTracks())r.addTrack(t)}catch(e){let t=()=>{let e=new AudioContext,t=e.createOscillator();const r=e.createMediaStreamDestination();return t.connect(r),t.start(),Object.assign(r.stream.getAudioTracks()[0],{enabled:!1})};r.addTrack(t())}else r.addTransceiver("audio",e.audio);if(e.video)if("sendrecv"===e.video.direction||"sendonly"===e.video.direction)try{const e=await navigator.mediaDevices.getUserMedia({video:!0});for(const t of e.getTracks())r.addTrack(t)}catch(e){}else r.addTransceiver("video",e.video)}async createLocalDescription(e,t,r){await this.createPeerConnection(t);const i=new Promise((e=>{this.pc.onicecandidate=t=>{t.candidate?(console.log("local candidate",t.candidate),r?.(JSON.parse(JSON.stringify(t.candidate)))):e(void 0)},this.pc.onicegatheringstatechange=()=>{"complete"===this.pc.iceGatheringState&&e(void 0)}})),o=e=>({type:e.type,sdp:e.sdp});if("offer"===e){let e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video});const n=this.pc.setLocalDescription(e);return r||(await n,await i,e=await this.pc.createOffer({offerToReceiveAudio:!!t.audio,offerToReceiveVideo:!!t.video})),o(e)}{let e=await this.pc.createAnswer();const t=this.pc.setLocalDescription(e);return r||(await t,await i,e=this.pc.currentLocalDescription||e),o(e)}}async setRemoteDescription(e,t){await this.createPeerConnection(t),await this.pc.setRemoteDescription(e)}async addIceCandidate(e){await this.pc.addIceCandidate(e)}async endSession(){}}document.addEventListener("DOMContentLoaded",(function(t){const r=new cast.framework.CastReceiverOptions;r.disableIdleTimeout=!0,cast.framework.CastReceiverContext.getInstance().start(r);const n=cast.framework.CastReceiverContext.getInstance().getPlayerManager(),s=document.getElementById("media");let a;n.setMessageInterceptor(cast.framework.messages.MessageType.LOAD,(t=>{console.log(t);const r=t.media.entity||t.media.contentId,n=t.credentials??t.media.customData.token,c=new URL(r),_=c.pathname,d={};for(const[e,t]of new URLSearchParams(c.search))d[e]=t;const l={path:_,query:d},p=eio(`wss://${c.host}`,l);return p.on("open",(async()=>{p.send(JSON.stringify({token:n}));const t=new e.uD("cast-receiver","host",((e,t)=>{try{p.send(JSON.stringify(e))}catch(e){t?.(e)}}));p.on("message",(e=>{t.handleMessage(JSON.parse(e))}));const r=new o,c=()=>{p.close(),r.pcDeferred.promise.then((e=>e.close()))};a?.(),a=c,p.on("close",c),r.pcDeferred.promise.then((e=>{(function(e){return new Promise((t=>{e.addEventListener("iceconnectionstatechange",(()=>{i(e)&&t(e.iceConnectionState)}))}))})(e).then(c);const t=new MediaStream(e.getReceivers().map((e=>e.track)));e.ontrack=e=>t.addTrack(e.track),s.srcObject=t})),t.params.session=r})),null}))}))})()})();
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEdBQUlnQixLQUFLMEcsR0FDckMsTUFBTUUsRUFBYyxJQUFJQyxZQUFZN0gsRUFBRzhILGVBQWVDLEtBQUt0UyxHQUFhQSxFQUFTMkwsU0FDakZwQixFQUFHZ0ksUUFBVXhULEdBQUtvVCxFQUFZakYsU0FBU25PLEVBQUU0TSxPQUN6Q1QsRUFBTXNILFVBQVlMLENBQVcsSUFFakNOLEVBQVEvTyxPQUFnQixRQUFJa1AsQ0FBTyxJQUVoQyxJQUFJLEdBR25CLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9kaXN0L3NlcnZlci9zcmMvcnBjLmpzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvaGFybW9ueSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovLy8uL2Rpc3QvY29tbW9uL3NyYy9kZWZlcnJlZC5qcyIsIndlYnBhY2s6Ly8vLi9kaXN0L2NvbW1vbi9zcmMvcnRjLXNpZ25hbGluZy5qcyIsIndlYnBhY2s6Ly8vLi9kaXN0L2RvY3MvcGx1Z2lucy9nb29nbGUtaG9tZS9jYXN0LXJlY2VpdmVyL3NyYy9jYXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBzdGFydFBlcmlvZGljR2FyYmFnZUNvbGxlY3Rpb24oKSB7XG4gICAgaWYgKCFnbG9iYWwuZ2MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdycGMgcGVlciBnYXJiYWdlIGNvbGxlY3Rpb24gbm90IGF2YWlsYWJsZTogZ2xvYmFsLmdjIGlzIG5vdCBleHBvc2VkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGcgPSBnbG9iYWw7XG4gICAgICAgIGlmIChnLmdjKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGcuZ2MoKTtcbiAgICAgICAgICAgIH0sIDEwMDAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgIH1cbn1cbmNsYXNzIFJwY1Byb3h5IHtcbiAgICBwZWVyO1xuICAgIGVudHJ5O1xuICAgIGNvbnN0cnVjdG9yTmFtZTtcbiAgICBwcm94eVByb3BzO1xuICAgIHByb3h5T25lV2F5TWV0aG9kcztcbiAgICBjb25zdHJ1Y3RvcihwZWVyLCBlbnRyeSwgY29uc3RydWN0b3JOYW1lLCBwcm94eVByb3BzLCBwcm94eU9uZVdheU1ldGhvZHMpIHtcbiAgICAgICAgdGhpcy5wZWVyID0gcGVlcjtcbiAgICAgICAgdGhpcy5lbnRyeSA9IGVudHJ5O1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yTmFtZSA9IGNvbnN0cnVjdG9yTmFtZTtcbiAgICAgICAgdGhpcy5wcm94eVByb3BzID0gcHJveHlQcm9wcztcbiAgICAgICAgdGhpcy5wcm94eU9uZVdheU1ldGhvZHMgPSBwcm94eU9uZVdheU1ldGhvZHM7XG4gICAgfVxuICAgIHRvUHJpbWl0aXZlKCkge1xuICAgICAgICBjb25zdCBwZWVyID0gdGhpcy5wZWVyO1xuICAgICAgICByZXR1cm4gYFJwY1Byb3h5LSR7cGVlci5zZWxmTmFtZX06JHtwZWVyLnBlZXJOYW1lfTogJHt0aGlzLmNvbnN0cnVjdG9yTmFtZX1gO1xuICAgIH1cbiAgICBnZXQodGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICBpZiAocCA9PT0gJ19fcHJveHlfaWQnKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cnkuaWQ7XG4gICAgICAgIGlmIChwID09PSAnX19wcm94eV9jb25zdHJ1Y3RvcicpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvck5hbWU7XG4gICAgICAgIGlmIChwID09PSAnX19wcm94eV9wZWVyJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlZXI7XG4gICAgICAgIGlmIChwID09PSBScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm94eVByb3BzO1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EUylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3h5T25lV2F5TWV0aG9kcztcbiAgICAgICAgaWYgKHAgPT09IFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04gfHwgcCA9PT0gUnBjUGVlci5QUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocCA9PT0gJ3RoZW4nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAocCA9PT0gJ2NvbnN0cnVjdG9yJylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucHJveHlQcm9wcz8uW3BdICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm94eVByb3BzPy5bcF07XG4gICAgICAgIGNvbnN0IGhhbmRsZWQgPSBScGNQZWVyLmhhbmRsZUZ1bmN0aW9uSW52b2NhdGlvbnModGhpcywgdGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgIGlmIChoYW5kbGVkKVxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoKCkgPT4gcCwgdGhpcyk7XG4gICAgfVxuICAgIHNldCh0YXJnZXQsIHAsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICBpZiAocCA9PT0gUnBjUGVlci5maW5hbGl6ZXJJZFN5bWJvbClcbiAgICAgICAgICAgIHRoaXMuZW50cnkuZmluYWxpemVySWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFwcGx5KHRhcmdldCwgdGhpc0FyZywgYXJnQXJyYXkpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbih0aGlzLnBlZXIucGVuZGluZ1Jlc3VsdHMpKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLnBlZXIsICdScGNQZWVyIGhhcyBiZWVuIGtpbGxlZCcpKTtcbiAgICAgICAgLy8gcnBjIG9iamVjdHMgY2FuIGJlIGZ1bmN0aW9ucy4gaWYgdGhlIGZ1bmN0aW9uIGlzIGEgb25ld2F5IG1ldGhvZCxcbiAgICAgICAgLy8gaXQgd2lsbCBoYXZlIGEgbnVsbCBpbiB0aGUgb25ld2F5IG1ldGhvZCBsaXN0LiB0aGlzIGlzIGJlY2F1c2VcbiAgICAgICAgLy8gdW5kZWZpbmVkIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZS5cbiAgICAgICAgY29uc3QgbWV0aG9kID0gdGFyZ2V0KCkgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uQ29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiAoYXJnQXJyYXkgfHwgW10pKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2godGhpcy5wZWVyLnNlcmlhbGl6ZShhcmcsIHNlcmlhbGl6YXRpb25Db250ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnBjQXBwbHkgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImFwcGx5XCIsXG4gICAgICAgICAgICBpZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJveHlJZDogdGhpcy5lbnRyeS5pZCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnByb3h5T25lV2F5TWV0aG9kcz8uaW5jbHVkZXM/LihtZXRob2QpKSB7XG4gICAgICAgICAgICBycGNBcHBseS5vbmV3YXkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wZWVyLnNlbmQocnBjQXBwbHksIHVuZGVmaW5lZCwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBlZXIuY3JlYXRlUGVuZGluZ1Jlc3VsdCgoaWQsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcnBjQXBwbHkuaWQgPSBpZDtcbiAgICAgICAgICAgIHRoaXMucGVlci5zZW5kKHJwY0FwcGx5LCByZWplY3QsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8gdG9kbzogZXJyb3IgY29uc3RydWN0b3IgYWRkcyBhIFwiY2F1c2VcIiB2YXJpYWJsZSBpbiBDaHJvbWUgOTMsIE5vZGUgdj8/XG5leHBvcnQgY2xhc3MgUlBDUmVzdWx0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY2F1c2U7XG4gICAgY29uc3RydWN0b3IocGVlciwgbWVzc2FnZSwgY2F1c2UsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoYCR7cGVlci5zZWxmTmFtZX06JHtwZWVyLnBlZXJOYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gICAgICAgIGlmIChvcHRpb25zPy5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zPy5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFjaykge1xuICAgICAgICAgICAgdGhpcy5zdGFjayA9IGAke3BlZXIucGVlck5hbWV9OiR7cGVlci5zZWxmTmFtZX1cXG4ke2NhdXNlPy5zdGFjayB8fCBvcHRpb25zLnN0YWNrfWA7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb21waWxlRnVuY3Rpb24oY29kZSwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IFtdO1xuICAgIGNvbnN0IGYgPSBgKGZ1bmN0aW9uKCR7cGFyYW1zLmpvaW4oJywnKX0pIHs7JHtjb2RlfTt9KWA7XG4gICAgcmV0dXJuIGV2YWwoZik7XG59XG50cnkge1xuICAgIGNvbnN0IGZyID0gRmluYWxpemF0aW9uUmVnaXN0cnk7XG59XG5jYXRjaCAoZSkge1xuICAgIHdpbmRvdy5XZWFrUmVmID0gY2xhc3MgV2Vha1JlZiB7XG4gICAgICAgIHRhcmdldDtcbiAgICAgICAgY29uc3RydWN0b3IodGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBkZXJlZigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgd2luZG93LkZpbmFsaXphdGlvblJlZ2lzdHJ5ID0gY2xhc3MgRmluYWxpemF0aW9uUmVnaXN0cnkge1xuICAgICAgICByZWdpc3RlcigpIHtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgY2xhc3MgUnBjUGVlciB7XG4gICAgc2VsZk5hbWU7XG4gICAgcGVlck5hbWU7XG4gICAgc2VuZDtcbiAgICBpZENvdW50ZXIgPSAxO1xuICAgIHBhcmFtcyA9IHt9O1xuICAgIHBlbmRpbmdSZXN1bHRzID0ge307XG4gICAgcHJveHlDb3VudGVyID0gMTtcbiAgICBsb2NhbFByb3hpZWQgPSBuZXcgTWFwKCk7XG4gICAgbG9jYWxQcm94eU1hcCA9IHt9O1xuICAgIHJlbW90ZVdlYWtQcm94aWVzID0ge307XG4gICAgZmluYWxpemVycyA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShlbnRyeSA9PiB0aGlzLmZpbmFsaXplKGVudHJ5KSk7XG4gICAgbmFtZURlc2VyaWFsaXplck1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAgPSBuZXcgTWFwKCk7XG4gICAgdHJhbnNwb3J0U2FmZUFyZ3VtZW50VHlwZXMgPSBScGNQZWVyLmdldERlZmF1bHRUcmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcygpO1xuICAgIHN0YXRpYyBmaW5hbGl6ZXJJZFN5bWJvbCA9IFN5bWJvbCgncnBjRmluYWxpemVySWQnKTtcbiAgICBzdGF0aWMgZ2V0RGVmYXVsdFRyYW5zcG9ydFNhZmVBcmd1bWVudFR5cGVzKCkge1xuICAgICAgICBjb25zdCBqc29uU2VyaWFsaXphYmxlID0gbmV3IFNldCgpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChOdW1iZXIubmFtZSk7XG4gICAgICAgIGpzb25TZXJpYWxpemFibGUuYWRkKFN0cmluZy5uYW1lKTtcbiAgICAgICAganNvblNlcmlhbGl6YWJsZS5hZGQoT2JqZWN0Lm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChCb29sZWFuLm5hbWUpO1xuICAgICAgICBqc29uU2VyaWFsaXphYmxlLmFkZChBcnJheS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIGpzb25TZXJpYWxpemFibGU7XG4gICAgfVxuICAgIHN0YXRpYyBoYW5kbGVGdW5jdGlvbkludm9jYXRpb25zKHRoaXosIHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHAgPT09ICdhcHBseScpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LmFwcGx5KHRhcmdldCwgdGhpeiwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAgPT09ICdjYWxsJykge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzQXJnLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXouYXBwbHkodGFyZ2V0LCB0aGl6LCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocCA9PT0gJ3RvU3RyaW5nJyB8fCBwID09PSBTeW1ib2wudG9QcmltaXRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpc0FyZywgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGl6LnRvUHJpbWl0aXZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBQUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EUyA9ICdfX3Byb3h5X29uZXdheV9tZXRob2RzJztcbiAgICBzdGF0aWMgUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04gPSAnX19qc29uX2Rpc2FibGVfc2VyaWFsaXphdGlvbic7XG4gICAgc3RhdGljIFBST1BFUlRZX1BST1hZX1BST1BFUlRJRVMgPSAnX19wcm94eV9wcm9wcyc7XG4gICAgc3RhdGljIFBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU4gPSAnX19qc29uX2NvcHlfc2VyaWFsaXplX2NoaWxkcmVuJztcbiAgICBzdGF0aWMgUFJPQkVEX1BST1BFUlRJRVMgPSBuZXcgU2V0KFtcbiAgICAgICAgJ3RoZW4nLFxuICAgICAgICAnY29uc3RydWN0b3InLFxuICAgICAgICAnX19wcm94eV9pZCcsXG4gICAgICAgICdfX3Byb3h5X2NvbnN0cnVjdG9yJyxcbiAgICAgICAgJ19fcHJveHlfcGVlcicsXG4gICAgICAgIFJwY1BlZXIuUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFMsXG4gICAgICAgIFJwY1BlZXIuUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04sXG4gICAgICAgIFJwY1BlZXIuUFJPUEVSVFlfUFJPWFlfUFJPUEVSVElFUyxcbiAgICAgICAgUnBjUGVlci5QUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOLFxuICAgIF0pO1xuICAgIGNvbnN0cnVjdG9yKHNlbGZOYW1lLCBwZWVyTmFtZSwgc2VuZCkge1xuICAgICAgICB0aGlzLnNlbGZOYW1lID0gc2VsZk5hbWU7XG4gICAgICAgIHRoaXMucGVlck5hbWUgPSBwZWVyTmFtZTtcbiAgICAgICAgdGhpcy5zZW5kID0gc2VuZDtcbiAgICB9XG4gICAgY3JlYXRlUGVuZGluZ1Jlc3VsdChjYikge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKHRoaXMucGVuZGluZ1Jlc3VsdHMpKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCAnUnBjUGVlciBoYXMgYmVlbiBraWxsZWQnKSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9ICh0aGlzLmlkQ291bnRlcisrKS50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVzdWx0c1tpZF0gPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICAgICAgY2IoaWQsIGUgPT4gcmVqZWN0KG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCBlLm1lc3NhZ2UsIGUpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0b2RvOiBtYWtlIHRoaXMgYW4gb3B0aW9uIHNvIHJwYyBkb2Vzbid0IG51a2UgdGhlIHByb2Nlc3MgaWYgdW5jYXVnaHQ/XG4gICAgICAgIHByb21pc2UuY2F0Y2goKCkgPT4geyB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIGtpbGwobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBSUENSZXN1bHRFcnJvcih0aGlzLCBtZXNzYWdlIHx8ICdwZWVyIHdhcyBraWxsZWQnKTtcbiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnBlbmRpbmdSZXN1bHRzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVzdWx0cyA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgICAgICB0aGlzLnJlbW90ZVdlYWtQcm94aWVzID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAgICAgIHRoaXMubG9jYWxQcm94eU1hcCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgICAgICB0aGlzLmxvY2FsUHJveGllZC5jbGVhcigpO1xuICAgIH1cbiAgICAvLyBuZWVkIGEgbmFtZS9jb25zdHJ1Y3RvciBtYXAgZHVlIHRvIGJhYmVsIG5hbWUgbWFuZ2xpbmc/IGZpeCBzb21laG93P1xuICAgIGFkZFNlcmlhbGl6ZXIoY3RyLCBuYW1lLCBzZXJpYWxpemVyKSB7XG4gICAgICAgIHRoaXMubmFtZURlc2VyaWFsaXplck1hcC5zZXQobmFtZSwgc2VyaWFsaXplcik7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3JTZXJpYWxpemVyTWFwLnNldChjdHIsIG5hbWUpO1xuICAgIH1cbiAgICBmaW5hbGl6ZShlbnRyeSkge1xuICAgICAgICBkZWxldGUgdGhpcy5yZW1vdGVXZWFrUHJveGllc1tlbnRyeS5pZF07XG4gICAgICAgIGNvbnN0IHJwY0ZpbmFsaXplID0ge1xuICAgICAgICAgICAgX19sb2NhbF9wcm94eV9pZDogZW50cnkuaWQsXG4gICAgICAgICAgICBfX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZDogZW50cnkuZmluYWxpemVySWQsXG4gICAgICAgICAgICB0eXBlOiAnZmluYWxpemUnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbmQocnBjRmluYWxpemUpO1xuICAgIH1cbiAgICBhc3luYyBnZXRQYXJhbShwYXJhbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQZW5kaW5nUmVzdWx0KChpZCwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbU1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3BhcmFtJyxcbiAgICAgICAgICAgICAgICBwYXJhbSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlbmQocGFyYW1NZXNzYWdlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXZhbExvY2FsKHNjcmlwdCwgZmlsZW5hbWUsIGNvZXJjZWRQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMsIGNvZXJjZWRQYXJhbXMpO1xuICAgICAgICBsZXQgY29tcGlsZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHByZXZlbnQgYnVuZGxlcnMgZnJvbSB0cnlpbmcgdG8gaW5jbHVkZSBub24tZXhpc3RlbnQgdm0gbW9kdWxlLlxuICAgICAgICAgICAgY29tcGlsZSA9IG1vZHVsZVtgcmVxdWlyZWBdKCd2bScpLmNvbXBpbGVGdW5jdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29tcGlsZSA9IGNvbXBpbGVGdW5jdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmID0gY29tcGlsZShzY3JpcHQsIE9iamVjdC5rZXlzKHBhcmFtcyksIHtcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmKC4uLk9iamVjdC52YWx1ZXMocGFyYW1zKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY3JlYXRlRXJyb3JSZXN1bHQocmVzdWx0LCBlKSB7XG4gICAgICAgIHJlc3VsdC5zdGFjayA9IGUuc3RhY2sgfHwgJ25vIHN0YWNrJztcbiAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGUubmFtZSB8fCAnbm8gbmFtZSc7XG4gICAgICAgIHJlc3VsdC5tZXNzYWdlID0gZS5tZXNzYWdlIHx8ICdubyBtZXNzYWdlJztcbiAgICB9XG4gICAgZGVzZXJpYWxpemUodmFsdWUsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgY29uc3QgY29weVNlcmlhbGl6ZUNoaWxkcmVuID0gdmFsdWVbUnBjUGVlci5QUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOXTtcbiAgICAgICAgaWYgKGNvcHlTZXJpYWxpemVDaGlsZHJlbikge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0W2tleV0gPSB0aGlzLmRlc2VyaWFsaXplKHZhbCwgZGVzZXJpYWxpemF0aW9uQ29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgX19yZW1vdGVfcHJveHlfaWQsIF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZCwgX19sb2NhbF9wcm94eV9pZCwgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSwgX19zZXJpYWxpemVkX3ZhbHVlLCBfX3JlbW90ZV9wcm94eV9wcm9wcywgX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHMgfSA9IHZhbHVlO1xuICAgICAgICBpZiAoX19yZW1vdGVfcHJveHlfaWQpIHtcbiAgICAgICAgICAgIGxldCBwcm94eSA9IHRoaXMucmVtb3RlV2Vha1Byb3hpZXNbX19yZW1vdGVfcHJveHlfaWRdPy5kZXJlZigpO1xuICAgICAgICAgICAgaWYgKCFwcm94eSlcbiAgICAgICAgICAgICAgICBwcm94eSA9IHRoaXMubmV3UHJveHkoX19yZW1vdGVfcHJveHlfaWQsIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsIF9fcmVtb3RlX3Byb3h5X3Byb3BzLCBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kcyk7XG4gICAgICAgICAgICBwcm94eVtScGNQZWVyLmZpbmFsaXplcklkU3ltYm9sXSA9IF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZDtcbiAgICAgICAgICAgIHJldHVybiBwcm94eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX19sb2NhbF9wcm94eV9pZCkge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5sb2NhbFByb3h5TWFwW19fbG9jYWxfcHJveHlfaWRdO1xuICAgICAgICAgICAgaWYgKCFyZXQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIGBpbnZhbGlkIGxvY2FsIHByb3h5IGlkICR7X19sb2NhbF9wcm94eV9pZH1gKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lKTtcbiAgICAgICAgaWYgKGRlc2VyaWFsaXplcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShfX3NlcmlhbGl6ZWRfdmFsdWUsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2VyaWFsaXplKHZhbHVlLCBzZXJpYWxpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAodmFsdWU/LltScGNQZWVyLlBST1BFUlRZX0pTT05fQ09QWV9TRVJJQUxJWkVfQ0hJTERSRU5dID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXRba2V5XSA9IHRoaXMuc2VyaWFsaXplKHZhbCwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlIHx8ICghdmFsdWVbUnBjUGVlci5QUk9QRVJUWV9KU09OX0RJU0FCTEVfU0VSSUFMSVpBVElPTl0gJiYgdGhpcy50cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcy5oYXModmFsdWUuY29uc3RydWN0b3I/Lm5hbWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lID0gdmFsdWUuX19wcm94eV9jb25zdHJ1Y3RvciB8fCB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZT8udG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IHByb3hpZWRFbnRyeSA9IHRoaXMubG9jYWxQcm94aWVkLmdldCh2YWx1ZSk7XG4gICAgICAgIGlmIChwcm94aWVkRW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IF9fcmVtb3RlX3Byb3h5X2ZpbmFsaXplcl9pZCA9ICh0aGlzLnByb3h5Q291bnRlcisrKS50b1N0cmluZygpO1xuICAgICAgICAgICAgcHJveGllZEVudHJ5LmZpbmFsaXplcklkID0gX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkOiBwcm94aWVkRW50cnkuaWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfcHJvcHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9QUk9QRVJUSUVTXSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9vbmV3YXlfbWV0aG9kczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgX19wcm94eV9pZCwgX19wcm94eV9wZWVyIH0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKF9fcHJveHlfaWQgJiYgX19wcm94eV9wZWVyID09PSB0aGlzKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgX19sb2NhbF9wcm94eV9pZDogX19wcm94eV9pZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZXJNYXBOYW1lID0gdGhpcy5jb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKHNlcmlhbGl6ZXJNYXBOYW1lKSB7XG4gICAgICAgICAgICBfX3JlbW90ZV9jb25zdHJ1Y3Rvcl9uYW1lID0gc2VyaWFsaXplck1hcE5hbWU7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gdGhpcy5uYW1lRGVzZXJpYWxpemVyTWFwLmdldChzZXJpYWxpemVyTWFwTmFtZSk7XG4gICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXJpYWxpemVyIG5vdCBmb3VuZCBmb3IgJyArIHNlcmlhbGl6ZXJNYXBOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSxcbiAgICAgICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9wcm9wczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVNdLFxuICAgICAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X29uZXdheV9tZXRob2RzOiB2YWx1ZT8uW1JwY1BlZXIuUFJPUEVSVFlfUFJPWFlfT05FV0FZX01FVEhPRFNdLFxuICAgICAgICAgICAgICAgIF9fc2VyaWFsaXplZF92YWx1ZTogc2VyaWFsaXplZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9fcmVtb3RlX3Byb3h5X2lkID0gKHRoaXMucHJveHlDb3VudGVyKyspLnRvU3RyaW5nKCk7XG4gICAgICAgIHByb3hpZWRFbnRyeSA9IHtcbiAgICAgICAgICAgIGlkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIGZpbmFsaXplcklkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuc2V0KHZhbHVlLCBwcm94aWVkRW50cnkpO1xuICAgICAgICB0aGlzLmxvY2FsUHJveHlNYXBbX19yZW1vdGVfcHJveHlfaWRdID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IHJldCA9IHtcbiAgICAgICAgICAgIF9fcmVtb3RlX3Byb3h5X2lkLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkOiBfX3JlbW90ZV9wcm94eV9pZCxcbiAgICAgICAgICAgIF9fcmVtb3RlX2NvbnN0cnVjdG9yX25hbWUsXG4gICAgICAgICAgICBfX3JlbW90ZV9wcm94eV9wcm9wczogdmFsdWU/LltScGNQZWVyLlBST1BFUlRZX1BST1hZX1BST1BFUlRJRVNdLFxuICAgICAgICAgICAgX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHM6IHZhbHVlPy5bUnBjUGVlci5QUk9QRVJUWV9QUk9YWV9PTkVXQVlfTUVUSE9EU10sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIG5ld1Byb3h5KHByb3h5SWQsIHByb3h5Q29uc3RydWN0b3JOYW1lLCBwcm94eVByb3BzLCBwcm94eU9uZVdheU1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgbG9jYWxQcm94aWVkRW50cnkgPSB7XG4gICAgICAgICAgICBpZDogcHJveHlJZCxcbiAgICAgICAgICAgIGZpbmFsaXplcklkOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJwYyA9IG5ldyBScGNQcm94eSh0aGlzLCBsb2NhbFByb3hpZWRFbnRyeSwgcHJveHlDb25zdHJ1Y3Rvck5hbWUsIHByb3h5UHJvcHMsIHByb3h5T25lV2F5TWV0aG9kcyk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByb3h5Q29uc3RydWN0b3JOYW1lID09PSAnRnVuY3Rpb24nIHx8IHByb3h5Q29uc3RydWN0b3JOYW1lID09PSAnQXN5bmNGdW5jdGlvbicgPyBmdW5jdGlvbiAoKSB7IH0gOiBycGM7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgcnBjKTtcbiAgICAgICAgY29uc3Qgd2Vha3JlZiA9IG5ldyBXZWFrUmVmKHByb3h5KTtcbiAgICAgICAgdGhpcy5yZW1vdGVXZWFrUHJveGllc1twcm94eUlkXSA9IHdlYWtyZWY7XG4gICAgICAgIHRoaXMuZmluYWxpemVycy5yZWdpc3RlcihycGMsIGxvY2FsUHJveGllZEVudHJ5KTtcbiAgICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH1cbiAgICBhc3luYyBoYW5kbGVNZXNzYWdlKG1lc3NhZ2UsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAncGFyYW0nOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJwY1BhcmFtID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbkNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3VsdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcnBjUGFyYW0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHRoaXMuc2VyaWFsaXplKHRoaXMucGFyYW1zW3JwY1BhcmFtLnBhcmFtXSwgc2VyaWFsaXphdGlvbkNvbnRleHQpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZChyZXN1bHQsIHVuZGVmaW5lZCwgc2VyaWFsaXphdGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnYXBwbHknOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJwY0FwcGx5ID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Jlc3VsdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcnBjQXBwbHkuaWQgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25Db250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmxvY2FsUHJveHlNYXBbcnBjQXBwbHkucHJveHlJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3h5IGlkICR7cnBjQXBwbHkucHJveHlJZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiAocnBjQXBwbHkuYXJncyB8fCBbXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2godGhpcy5kZXNlcmlhbGl6ZShhcmcsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycGNBcHBseS5tZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRob2QgPSB0YXJnZXRbcnBjQXBwbHkubWV0aG9kXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0YXJnZXQgJHt0YXJnZXQ/LmNvbnN0cnVjdG9yPy5uYW1lfSBkb2VzIG5vdCBoYXZlIG1ldGhvZCAke3JwY0FwcGx5Lm1ldGhvZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF3YWl0IHRhcmdldFtycGNBcHBseS5tZXRob2RdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0YXJnZXQoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gdGhpcy5zZXJpYWxpemUodmFsdWUsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignZmFpbHVyZScsIHJwY0FwcGx5Lm1ldGhvZCwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVycm9yUmVzdWx0KHJlc3VsdCwgZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFycGNBcHBseS5vbmV3YXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmQocmVzdWx0LCB1bmRlZmluZWQsIHNlcmlhbGl6YXRpb25Db250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc3VsdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnBjUmVzdWx0ID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSB0aGlzLnBlbmRpbmdSZXN1bHRzW3JwY1Jlc3VsdC5pZF07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXN1bHRzW3JwY1Jlc3VsdC5pZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVmZXJyZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gcmVzdWx0ICR7cnBjUmVzdWx0LmlkfWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAocnBjUmVzdWx0Lm1lc3NhZ2UgfHwgcnBjUmVzdWx0LnN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IFJQQ1Jlc3VsdEVycm9yKHRoaXMsIHJwY1Jlc3VsdC5tZXNzYWdlIHx8ICdubyBtZXNzYWdlJywgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcnBjUmVzdWx0LnJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjazogcnBjUmVzdWx0LnN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmRlc2VyaWFsaXplKHJwY1Jlc3VsdC5yZXN1bHQsIGRlc2VyaWFsaXphdGlvbkNvbnRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpbmFsaXplJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBycGNGaW5hbGl6ZSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsID0gdGhpcy5sb2NhbFByb3h5TWFwW3JwY0ZpbmFsaXplLl9fbG9jYWxfcHJveHlfaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsUHJveGllZEVudHJ5ID0gdGhpcy5sb2NhbFByb3hpZWQuZ2V0KGxvY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgZmluYWxpemVyIGlkIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBtYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZCAmJiBycGNGaW5hbGl6ZS5fX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZCAhPT0gbG9jYWxQcm94aWVkRW50cnk/LmZpbmFsaXplcklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sb2NhbFByb3h5TWFwW3JwY0ZpbmFsaXplLl9fbG9jYWxfcHJveHlfaWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFByb3hpZWQuZGVsZXRlKGxvY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHJwYyBtZXNzYWdlIHR5cGUgJHttZXNzYWdlLnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuaGFuZGxlZCBycGMgZXJyb3InLCB0aGlzLnBlZXJOYW1lLCBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRFdmFsU291cmNlKCkge1xuICAgIHJldHVybiBgXG4gICAgKCgpID0+IHtcbiAgICAgICAgJHtScGNQcm94eX1cblxuICAgICAgICAke1JwY1BlZXJ9XG4gICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBScGNQZWVyLFxuICAgICAgICAgICAgUnBjUHJveHksXG4gICAgICAgIH07XG4gICAgfSkoKTtcbiAgICBgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnBjLmpzLm1hcCIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5obWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZSA9IE9iamVjdC5jcmVhdGUobW9kdWxlKTtcblx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdHNldDogKCkgPT4ge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdFUyBNb2R1bGVzIG1heSBub3QgYXNzaWduIG1vZHVsZS5leHBvcnRzIG9yIGV4cG9ydHMuKiwgVXNlIEVTTSBleHBvcnQgc3ludGF4LCBpbnN0ZWFkOiAnICsgbW9kdWxlLmlkKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbW9kdWxlO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiZXhwb3J0IGNsYXNzIERlZmVycmVkIHtcbiAgICBmaW5pc2hlZCA9IGZhbHNlO1xuICAgIHJlc29sdmU7XG4gICAgcmVqZWN0O1xuICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZSA9IHYgPT4ge1xuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJlamVjdCA9IGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZlcnJlZC5qcy5tYXAiLCJpbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gXCIuL2RlZmVycmVkXCI7XG5mdW5jdGlvbiBnZXRVc2VyQWdlbnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgfVxufVxuLy8gY29ubmVjdGlvblN0YXRlIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBmaXJlZm94PyBzbyB3YXRjaCBpY2VDb25uZWN0aW9uU3RhdGUgaW5zdGVhZC4uLlxuZXhwb3J0IGZ1bmN0aW9uIHdhaXRQZWVyQ29ubmVjdGlvbkljZUNvbm5lY3RlZChwYykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGMuYWRkRXZlbnRMaXN0ZW5lcignaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBjLmljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2Nvbm5lY3RlZCcpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkKHBjKS50aGVuKHJlYXNvbiA9PiByZWplY3QobmV3IEVycm9yKHJlYXNvbikpKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3YWl0UGVlckljZUNvbm5lY3Rpb25DbG9zZWQocGMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc1BlZXJDb25uZWN0aW9uQ2xvc2VkKHBjKSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocGMuaWNlQ29ubmVjdGlvblN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQZWVyQ29ubmVjdGlvbkNsb3NlZChwYykge1xuICAgIHJldHVybiBwYy5pY2VDb25uZWN0aW9uU3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnXG4gICAgICAgIHx8IHBjLmljZUNvbm5lY3Rpb25TdGF0ZSA9PT0gJ2ZhaWxlZCdcbiAgICAgICAgfHwgcGMuaWNlQ29ubmVjdGlvblN0YXRlID09PSAnY2xvc2VkJztcbn1cbmV4cG9ydCBjbGFzcyBCcm93c2VyU2lnbmFsaW5nU2Vzc2lvbiB7XG4gICAgcGM7XG4gICAgcGNEZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIGRjRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBvcHRpb25zID0ge1xuICAgICAgICB1c2VyQWdlbnQ6IGdldFVzZXJBZ2VudCgpLFxuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgIGF1ZGlvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LignYXVkaW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvOiBSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXM/LigndmlkZW8nKSB8fCB7XG4gICAgICAgICAgICAgICAgY29kZWNzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaGVhZGVyRXh0ZW5zaW9uczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2NyZWVuOiB7XG4gICAgICAgICAgICB3aWR0aDogc2NyZWVuLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBzY3JlZW4uaGVpZ2h0LFxuICAgICAgICB9LFxuICAgIH07XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgfVxuICAgIGFzeW5jIGdldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLnBjRGVmZXJyZWQucHJvbWlzZS50aGVuKHBjID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBwYy5nZXRUcmFuc2NlaXZlcnMoKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHQuc2VuZGVyPy50cmFjaz8uc3RvcD8uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGMuY2xvc2UoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICB0aGlzLnBjRGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcignaWNlQ29ubmVjdGlvblN0YXRlICcgKyB0aGlzLnBjPy5pY2VDb25uZWN0aW9uU3RhdGUpKTtcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlUGVlckNvbm5lY3Rpb24oc2V0dXApIHtcbiAgICAgICAgaWYgKHRoaXMucGMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGNoZWNrQ29ubiA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdpY2VDb25uZWN0aW9uU3RhdGUnLCBwYy5pY2VDb25uZWN0aW9uU3RhdGUpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Nvbm5lY3Rpb25TdGF0ZScsIHBjLmNvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICBpZiAoaXNQZWVyQ29ubmVjdGlvbkNsb3NlZChwYykpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYyA9IHRoaXMucGMgPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24oc2V0dXAuY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMucGNEZWZlcnJlZC5yZXNvbHZlKHBjKTtcbiAgICAgICAgcGMuYWRkRXZlbnRMaXN0ZW5lcignY29ubmVjdGlvbnN0YXRlY2hhbmdlJywgY2hlY2tDb25uKTtcbiAgICAgICAgcGMuYWRkRXZlbnRMaXN0ZW5lcignaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlJywgY2hlY2tDb25uKTtcbiAgICAgICAgcGMuYWRkRXZlbnRMaXN0ZW5lcignaWNlZ2F0aGVyaW5nc3RhdGVjaGFuZ2UnLCBldiA9PiBjb25zb2xlLmxvZygnaWNlR2F0aGVyaW5nU3RhdGUnLCBwYy5pY2VHYXRoZXJpbmdTdGF0ZSkpO1xuICAgICAgICBwYy5hZGRFdmVudExpc3RlbmVyKCdzaWduYWxpbmdzdGF0ZWNoYW5nZScsIGV2ID0+IGNvbnNvbGUubG9nKCdzaWduYWxpbmdTdGF0ZScsIHBjLnNpZ25hbGluZ1N0YXRlKSk7XG4gICAgICAgIHBjLmFkZEV2ZW50TGlzdGVuZXIoJ2ljZWNhbmRpZGF0ZWVycm9yJywgZXYgPT4gY29uc29sZS5sb2coJ2ljZWNhbmRpZGF0ZWVycm9yJykpO1xuICAgICAgICBpZiAoc2V0dXAuZGF0YWNoYW5uZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRjID0gcGMuY3JlYXRlRGF0YUNoYW5uZWwoc2V0dXAuZGF0YWNoYW5uZWwubGFiZWwsIHNldHVwLmRhdGFjaGFubmVsLmRpY3QpO1xuICAgICAgICAgICAgZGMuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgICAgICB0aGlzLmRjRGVmZXJyZWQucmVzb2x2ZShkYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHVwLmF1ZGlvKSB7XG4gICAgICAgICAgICBpZiAoc2V0dXAuYXVkaW8uZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IHNldHVwLmF1ZGlvLmRpcmVjdGlvbiA9PT0gJ3NlbmRvbmx5Jykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvaW5nIHNlbmRyZWN2IG9uIHNhZmFyaSByZXF1aXJlcyBhIG1pYyBiZSBhdHRhY2hlZCwgb3IgaXQgZmFpbHMgdG8gY29ubmVjdC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWljID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyB2aWRlbzogZmFsc2UsIGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIG1pYy5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGMuYWRkVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWxlbmNlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN0eCA9IG5ldyBBdWRpb0NvbnRleHQoKSwgb3NjaWxsYXRvciA9IGN0eC5jcmVhdGVPc2NpbGxhdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0ID0gY3R4LmNyZWF0ZU1lZGlhU3RyZWFtRGVzdGluYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9zY2lsbGF0b3IuY29ubmVjdChkZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9zY2lsbGF0b3Iuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlc3Quc3RyZWFtLmdldEF1ZGlvVHJhY2tzKClbMF0sIHsgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBjLmFkZFRyYWNrKHNpbGVuY2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGMuYWRkVHJhbnNjZWl2ZXIoJ2F1ZGlvJywgc2V0dXAuYXVkaW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR1cC52aWRlbykge1xuICAgICAgICAgICAgaWYgKHNldHVwLnZpZGVvLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCBzZXR1cC52aWRlby5kaXJlY3Rpb24gPT09ICdzZW5kb25seScpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBkb2luZyBzZW5kcmVjdiBvbiBzYWZhcmkgcmVxdWlyZXMgYSBtaWMgYmUgYXR0YWNoZWQsIG9yIGl0IGZhaWxzIHRvIGNvbm5lY3QuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgdmlkZW86IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhY2sgb2YgY2FtZXJhLmdldFRyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYy5hZGRUcmFjayh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hhdCBub3dcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYy5hZGRUcmFuc2NlaXZlcigndmlkZW8nLCBzZXR1cC52aWRlbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlTG9jYWxEZXNjcmlwdGlvbih0eXBlLCBzZXR1cCwgc2VuZEljZUNhbmRpZGF0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVBlZXJDb25uZWN0aW9uKHNldHVwKTtcbiAgICAgICAgY29uc3QgZ2F0aGVyaW5nUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYy5vbmljZWNhbmRpZGF0ZSA9IGV2ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXYuY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibG9jYWwgY2FuZGlkYXRlXCIsIGV2LmNhbmRpZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRJY2VDYW5kaWRhdGU/LihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2LmNhbmRpZGF0ZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5wYy5vbmljZWdhdGhlcmluZ3N0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBjLmljZUdhdGhlcmluZ1N0YXRlID09PSAnY29tcGxldGUnKVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdG9EZXNjcmlwdGlvbiA9IChpbml0KSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbG9jYWwgZGVzY3JpcHRpb24nLCBpbml0LnNkcCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6IGluaXQudHlwZSxcbiAgICAgICAgICAgICAgICBzZHA6IGluaXQuc2RwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdvZmZlcicpIHtcbiAgICAgICAgICAgIGxldCBvZmZlciA9IGF3YWl0IHRoaXMucGMuY3JlYXRlT2ZmZXIoe1xuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlQXVkaW86ICEhc2V0dXAuYXVkaW8sXG4gICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVWaWRlbzogISFzZXR1cC52aWRlbyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2V0ID0gdGhpcy5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKG9mZmVyKTtcbiAgICAgICAgICAgIGlmIChzZW5kSWNlQ2FuZGlkYXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0b0Rlc2NyaXB0aW9uKG9mZmVyKTtcbiAgICAgICAgICAgIGF3YWl0IHNldDtcbiAgICAgICAgICAgIGF3YWl0IGdhdGhlcmluZ1Byb21pc2U7XG4gICAgICAgICAgICBvZmZlciA9IGF3YWl0IHRoaXMucGMuY3JlYXRlT2ZmZXIoe1xuICAgICAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlQXVkaW86ICEhc2V0dXAuYXVkaW8sXG4gICAgICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVWaWRlbzogISFzZXR1cC52aWRlbyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRvRGVzY3JpcHRpb24ob2ZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFuc3dlciA9IGF3YWl0IHRoaXMucGMuY3JlYXRlQW5zd2VyKCk7XG4gICAgICAgICAgICBjb25zdCBzZXQgPSB0aGlzLnBjLnNldExvY2FsRGVzY3JpcHRpb24oYW5zd2VyKTtcbiAgICAgICAgICAgIGlmIChzZW5kSWNlQ2FuZGlkYXRlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0b0Rlc2NyaXB0aW9uKGFuc3dlcik7XG4gICAgICAgICAgICBhd2FpdCBzZXQ7XG4gICAgICAgICAgICBhd2FpdCBnYXRoZXJpbmdQcm9taXNlO1xuICAgICAgICAgICAgYW5zd2VyID0gdGhpcy5wYy5jdXJyZW50TG9jYWxEZXNjcmlwdGlvbiB8fCBhbnN3ZXI7XG4gICAgICAgICAgICByZXR1cm4gdG9EZXNjcmlwdGlvbihhbnN3ZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldFJlbW90ZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBzZXR1cCkge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVBlZXJDb25uZWN0aW9uKHNldHVwKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZW1vdGUgZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbi5zZHApO1xuICAgIH1cbiAgICBhc3luYyBhZGRJY2VDYW5kaWRhdGUoY2FuZGlkYXRlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGMuYWRkSWNlQ2FuZGlkYXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVtb3RlIGNhbmRpZGF0ZVwiLCBjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBhc3luYyBlbmRTZXNzaW9uKCkge1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvZ1NlbmRDYW5kaWRhdGUoY29uc29sZSwgdHlwZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiBhc3luYyAoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGAke3R5cGV9IHRyaWNrbGVkIGNhbmRpZGF0ZTpgLCBjYW5kaWRhdGUuc2RwTUxpbmVJbmRleCwgY2FuZGlkYXRlLmNhbmRpZGF0ZSk7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLmFkZEljZUNhbmRpZGF0ZShjYW5kaWRhdGUpO1xuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDYW5kaWRhdGVRdWV1ZShjb25zb2xlLCB0eXBlLCBzZXNzaW9uKSB7XG4gICAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gICAgbGV0IGNhbmRpZGF0ZVF1ZXVlID0gW107XG4gICAgY29uc3QgbHMgPSBsb2dTZW5kQ2FuZGlkYXRlKGNvbnNvbGUsIHR5cGUsIHNlc3Npb24pO1xuICAgIGNvbnN0IHF1ZXVlU2VuZENhbmRpZGF0ZSA9IGFzeW5jIChjYW5kaWRhdGUpID0+IHtcbiAgICAgICAgaWYgKCFyZWFkeSlcbiAgICAgICAgICAgIGNhbmRpZGF0ZVF1ZXVlLnB1c2goY2FuZGlkYXRlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbHMoY2FuZGlkYXRlKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGZsdXNoKCkge1xuICAgICAgICAgICAgcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlUXVldWUpIHtcbiAgICAgICAgICAgICAgICBscyhjYW5kaWRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FuZGlkYXRlUXVldWUgPSBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgcXVldWVTZW5kQ2FuZGlkYXRlLFxuICAgIH07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdFJUQ1NpZ25hbGluZ0NsaWVudHMoY29uc29sZSwgb2ZmZXJDbGllbnQsIG9mZmVyU2V0dXAsIGFuc3dlckNsaWVudCwgYW5zd2VyU2V0dXApIHtcbiAgICBjb25zdCBvZmZlck9wdGlvbnMgPSBhd2FpdCBvZmZlckNsaWVudC5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgYW5zd2VyT3B0aW9ucyA9IGF3YWl0IGFuc3dlckNsaWVudC5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgZGlzYWJsZVRyaWNrbGUgPSBvZmZlck9wdGlvbnM/LmRpc2FibGVUcmlja2xlIHx8IGFuc3dlck9wdGlvbnM/LmRpc2FibGVUcmlja2xlO1xuICAgIGlmIChvZmZlck9wdGlvbnM/Lm9mZmVyICYmIGFuc3dlck9wdGlvbnM/Lm9mZmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggUlRDIGNsaWVudHMgaGF2ZSBvZmZlcnMgYW5kIGNhbiBub3QgbmVnb3RpYXRlLiBDb25zaWRlciBpbXBsZW1lbnRpbmcgdGhpcyBpbiBAc2NyeXB0ZWQvd2VicnRjLicpO1xuICAgIGlmIChvZmZlck9wdGlvbnM/LnJlcXVpcmVzT2ZmZXIgJiYgYW5zd2VyT3B0aW9ucy5yZXF1aXJlc09mZmVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggUlRDIGNsaWVudHMgcmVxdWlyZSBvZmZlcnMgYW5kIGNhbiBub3QgbmVnb3RpYXRlLicpO1xuICAgIG9mZmVyU2V0dXAudHlwZSA9ICdvZmZlcic7XG4gICAgYW5zd2VyU2V0dXAudHlwZSA9ICdhbnN3ZXInO1xuICAgIGNvbnN0IGFuc3dlclF1ZXVlID0gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgJ29mZmVyJywgYW5zd2VyQ2xpZW50KTtcbiAgICBjb25zdCBvZmZlclF1ZXVlID0gY3JlYXRlQ2FuZGlkYXRlUXVldWUoY29uc29sZSwgJ2Fuc3dlcicsIG9mZmVyQ2xpZW50KTtcbiAgICBjb25zdCBvZmZlciA9IGF3YWl0IG9mZmVyQ2xpZW50LmNyZWF0ZUxvY2FsRGVzY3JpcHRpb24oJ29mZmVyJywgb2ZmZXJTZXR1cCwgZGlzYWJsZVRyaWNrbGUgPyB1bmRlZmluZWQgOiBhbnN3ZXJRdWV1ZS5xdWV1ZVNlbmRDYW5kaWRhdGUpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdvZmZlciBzZHAnLCBvZmZlci5zZHApO1xuICAgIGF3YWl0IGFuc3dlckNsaWVudC5zZXRSZW1vdGVEZXNjcmlwdGlvbihvZmZlciwgYW5zd2VyU2V0dXApO1xuICAgIGFuc3dlclF1ZXVlLmZsdXNoKCk7XG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgYW5zd2VyQ2xpZW50LmNyZWF0ZUxvY2FsRGVzY3JpcHRpb24oJ2Fuc3dlcicsIGFuc3dlclNldHVwLCBkaXNhYmxlVHJpY2tsZSA/IHVuZGVmaW5lZCA6IG9mZmVyUXVldWUucXVldWVTZW5kQ2FuZGlkYXRlKTtcbiAgICAvLyBjb25zb2xlLmxvZygnYW5zd2VyIHNkcCcsIGFuc3dlci5zZHApO1xuICAgIGF3YWl0IG9mZmVyQ2xpZW50LnNldFJlbW90ZURlc2NyaXB0aW9uKGFuc3dlciwgb2ZmZXJTZXR1cCk7XG4gICAgb2ZmZXJRdWV1ZS5mbHVzaCgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnRjLXNpZ25hbGluZy5qcy5tYXAiLCJpbXBvcnQgeyBScGNQZWVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmVyL3NyYy9ycGMnO1xuaW1wb3J0IHsgQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24sIHdhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbW1vbi9zcmMvcnRjLXNpZ25hbGluZyc7XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gbmV3IGNhc3QuZnJhbWV3b3JrLkNhc3RSZWNlaXZlck9wdGlvbnMoKTtcbiAgICBvcHRpb25zLmRpc2FibGVJZGxlVGltZW91dCA9IHRydWU7XG4gICAgY2FzdC5mcmFtZXdvcmsuQ2FzdFJlY2VpdmVyQ29udGV4dC5nZXRJbnN0YW5jZSgpLnN0YXJ0KG9wdGlvbnMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYXN0LmZyYW1ld29yay5DYXN0UmVjZWl2ZXJDb250ZXh0LmdldEluc3RhbmNlKCk7XG4gICAgY29uc3QgcGxheWVyTWFuYWdlciA9IGNvbnRleHQuZ2V0UGxheWVyTWFuYWdlcigpO1xuICAgIGNvbnN0IHZpZGVvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhJyk7XG4gICAgbGV0IHByZXZpb3VzQ2xlYW51cDtcbiAgICAvLyBpbnRlcmNlcHQgdGhlIExPQUQgcmVxdWVzdCB0byBiZSBhYmxlIHRvIHJlYWQgaW4gYSBjb250ZW50SWQgYW5kIGdldCBkYXRhXG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSAobG9hZFJlcXVlc3REYXRhKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGxvYWRSZXF1ZXN0RGF0YSk7XG4gICAgICAgIGNvbnN0IGVpb1VybCA9IGxvYWRSZXF1ZXN0RGF0YS5tZWRpYS5lbnRpdHkgfHwgbG9hZFJlcXVlc3REYXRhLm1lZGlhLmNvbnRlbnRJZDtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBsb2FkUmVxdWVzdERhdGEuY3JlZGVudGlhbHMgPz8gbG9hZFJlcXVlc3REYXRhLm1lZGlhLmN1c3RvbURhdGEudG9rZW47XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoZWlvVXJsKTtcbiAgICAgICAgY29uc3QgZW5kcG9pbnRQYXRoID0gdXJsLnBhdGhuYW1lO1xuICAgICAgICBjb25zdCBxdWVyeSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpKSB7XG4gICAgICAgICAgICBxdWVyeVtrXSA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHBhdGg6IGVuZHBvaW50UGF0aCxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBlaW8oYHdzczovLyR7dXJsLmhvc3R9YCwgb3B0aW9ucyk7XG4gICAgICAgIHNvY2tldC5vbignb3BlbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHJwY1BlZXIgPSBuZXcgUnBjUGVlcignY2FzdC1yZWNlaXZlcicsICdob3N0JywgKG1lc3NhZ2UsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0Py4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzb2NrZXQub24oJ21lc3NhZ2UnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHJwY1BlZXIuaGFuZGxlTWVzc2FnZShKU09OLnBhcnNlKGRhdGEpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBCcm93c2VyU2lnbmFsaW5nU2Vzc2lvbigpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uLnBjRGVmZXJyZWQucHJvbWlzZS50aGVuKHBjID0+IHBjLmNsb3NlKCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHByZXZpb3VzQ2xlYW51cD8uKCk7XG4gICAgICAgICAgICBwcmV2aW91c0NsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICAgICAgc29ja2V0Lm9uKCdjbG9zZScsIGNsZWFudXApO1xuICAgICAgICAgICAgc2Vzc2lvbi5wY0RlZmVycmVkLnByb21pc2UudGhlbihwYyA9PiB7XG4gICAgICAgICAgICAgICAgd2FpdFBlZXJJY2VDb25uZWN0aW9uQ2xvc2VkKHBjKS50aGVuKGNsZWFudXApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhU3RyZWFtID0gbmV3IE1lZGlhU3RyZWFtKHBjLmdldFJlY2VpdmVycygpLm1hcCgocmVjZWl2ZXIpID0+IHJlY2VpdmVyLnRyYWNrKSk7XG4gICAgICAgICAgICAgICAgcGMub250cmFjayA9IGUgPT4gbWVkaWFTdHJlYW0uYWRkVHJhY2soZS50cmFjayk7XG4gICAgICAgICAgICAgICAgdmlkZW8uc3JjT2JqZWN0ID0gbWVkaWFTdHJlYW07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJwY1BlZXIucGFyYW1zWydzZXNzaW9uJ10gPSBzZXNzaW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBwbGF5ZXJNYW5hZ2VyLnNldE1lc3NhZ2VJbnRlcmNlcHRvcihjYXN0LmZyYW1ld29yay5tZXNzYWdlcy5NZXNzYWdlVHlwZS5MT0FELCBpbnRlcmNlcHRvcik7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhc3QuanMubWFwIl0sIm5hbWVzIjpbInN0YXJ0UGVyaW9kaWNHYXJiYWdlQ29sbGVjdGlvbiIsImciLCJnYyIsInNldEludGVydmFsIiwiZSIsImNvbnNvbGUiLCJ3YXJuIiwiUnBjUHJveHkiLCJwZWVyIiwiZW50cnkiLCJjb25zdHJ1Y3Rvck5hbWUiLCJwcm94eVByb3BzIiwicHJveHlPbmVXYXlNZXRob2RzIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwidG9QcmltaXRpdmUiLCJzZWxmTmFtZSIsInBlZXJOYW1lIiwiZ2V0IiwidGFyZ2V0IiwicCIsInJlY2VpdmVyIiwiaWQiLCJScGNQZWVyIiwiUFJPUEVSVFlfUFJPWFlfUFJPUEVSVElFUyIsIlBST1BFUlRZX1BST1hZX09ORVdBWV9NRVRIT0RTIiwiUFJPUEVSVFlfSlNPTl9ESVNBQkxFX1NFUklBTElaQVRJT04iLCJQUk9QRVJUWV9KU09OX0NPUFlfU0VSSUFMSVpFX0NISUxEUkVOIiwidW5kZWZpbmVkIiwiaGFuZGxlRnVuY3Rpb25JbnZvY2F0aW9ucyIsIlByb3h5Iiwic2V0IiwidmFsdWUiLCJmaW5hbGl6ZXJJZFN5bWJvbCIsImZpbmFsaXplcklkIiwiYXBwbHkiLCJ0aGlzQXJnIiwiYXJnQXJyYXkiLCJPYmplY3QiLCJpc0Zyb3plbiIsInBlbmRpbmdSZXN1bHRzIiwiUHJvbWlzZSIsInJlamVjdCIsIlJQQ1Jlc3VsdEVycm9yIiwibWV0aG9kIiwiYXJncyIsInNlcmlhbGl6YXRpb25Db250ZXh0IiwiYXJnIiwicHVzaCIsInNlcmlhbGl6ZSIsInJwY0FwcGx5IiwidHlwZSIsInByb3h5SWQiLCJpbmNsdWRlcyIsIm9uZXdheSIsInNlbmQiLCJyZXNvbHZlIiwiY3JlYXRlUGVuZGluZ1Jlc3VsdCIsIkVycm9yIiwiY2F1c2UiLCJtZXNzYWdlIiwib3B0aW9ucyIsInN1cGVyIiwibmFtZSIsInN0YWNrIiwiY29tcGlsZUZ1bmN0aW9uIiwiY29kZSIsInBhcmFtcyIsImYiLCJqb2luIiwiZXZhbCIsImZyIiwiRmluYWxpemF0aW9uUmVnaXN0cnkiLCJ3aW5kb3ciLCJXZWFrUmVmIiwiZGVyZWYiLCJyZWdpc3RlciIsImlkQ291bnRlciIsInByb3h5Q291bnRlciIsImxvY2FsUHJveGllZCIsIk1hcCIsImxvY2FsUHJveHlNYXAiLCJyZW1vdGVXZWFrUHJveGllcyIsImZpbmFsaXplcnMiLCJmaW5hbGl6ZSIsIm5hbWVEZXNlcmlhbGl6ZXJNYXAiLCJjb25zdHJ1Y3RvclNlcmlhbGl6ZXJNYXAiLCJ0cmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyIsImdldERlZmF1bHRUcmFuc3BvcnRTYWZlQXJndW1lbnRUeXBlcyIsInN0YXRpYyIsIlN5bWJvbCIsImpzb25TZXJpYWxpemFibGUiLCJTZXQiLCJhZGQiLCJOdW1iZXIiLCJTdHJpbmciLCJCb29sZWFuIiwiQXJyYXkiLCJ0aGl6IiwiY2IiLCJwcm9taXNlIiwidG9TdHJpbmciLCJjYXRjaCIsImtpbGwiLCJlcnJvciIsInJlc3VsdCIsInZhbHVlcyIsImZyZWV6ZSIsImNsZWFyIiwiYWRkU2VyaWFsaXplciIsImN0ciIsInNlcmlhbGl6ZXIiLCJycGNGaW5hbGl6ZSIsIl9fbG9jYWxfcHJveHlfaWQiLCJfX2xvY2FsX3Byb3h5X2ZpbmFsaXplcl9pZCIsImFzeW5jIiwicGFyYW0iLCJwYXJhbU1lc3NhZ2UiLCJldmFsTG9jYWwiLCJzY3JpcHQiLCJmaWxlbmFtZSIsImNvZXJjZWRQYXJhbXMiLCJhc3NpZ24iLCJjb21waWxlIiwibW9kdWxlIiwia2V5cyIsImNyZWF0ZUVycm9yUmVzdWx0IiwiZGVzZXJpYWxpemUiLCJkZXNlcmlhbGl6YXRpb25Db250ZXh0IiwicmV0Iiwia2V5IiwidmFsIiwiZW50cmllcyIsIl9fcmVtb3RlX3Byb3h5X2lkIiwiX19yZW1vdGVfcHJveHlfZmluYWxpemVyX2lkIiwiX19yZW1vdGVfY29uc3RydWN0b3JfbmFtZSIsIl9fc2VyaWFsaXplZF92YWx1ZSIsIl9fcmVtb3RlX3Byb3h5X3Byb3BzIiwiX19yZW1vdGVfcHJveHlfb25ld2F5X21ldGhvZHMiLCJwcm94eSIsIm5ld1Byb3h5IiwiZGVzZXJpYWxpemVyIiwiaGFzIiwiX19wcm94eV9jb25zdHJ1Y3RvciIsInByb3hpZWRFbnRyeSIsIl9fcHJveHlfaWQiLCJfX3Byb3h5X3BlZXIiLCJzZXJpYWxpemVyTWFwTmFtZSIsInNlcmlhbGl6ZWQiLCJwcm94eUNvbnN0cnVjdG9yTmFtZSIsImxvY2FsUHJveGllZEVudHJ5IiwicnBjIiwid2Vha3JlZiIsInJwY1BhcmFtIiwicnBjUmVzdWx0IiwiZGVmZXJyZWQiLCJsb2NhbCIsImRlbGV0ZSIsImdldEV2YWxTb3VyY2UiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJleHBvcnRzIiwibG9hZGVkIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImQiLCJkZWZpbml0aW9uIiwibyIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdsb2JhbFRoaXMiLCJGdW5jdGlvbiIsImhtZCIsImNyZWF0ZSIsImNoaWxkcmVuIiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIkRlZmVycmVkIiwiZmluaXNoZWQiLCJ2IiwiZ2V0VXNlckFnZW50IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiaXNQZWVyQ29ubmVjdGlvbkNsb3NlZCIsInBjIiwiaWNlQ29ubmVjdGlvblN0YXRlIiwiQnJvd3NlclNpZ25hbGluZ1Nlc3Npb24iLCJwY0RlZmVycmVkIiwiZGNEZWZlcnJlZCIsImNhcGFiaWxpdGllcyIsImF1ZGlvIiwiUlRDUnRwUmVjZWl2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjb2RlY3MiLCJoZWFkZXJFeHRlbnNpb25zIiwidmlkZW8iLCJzY3JlZW4iLCJ3aWR0aCIsImhlaWdodCIsImNsb3NlIiwidGhlbiIsInQiLCJnZXRUcmFuc2NlaXZlcnMiLCJzZW5kZXIiLCJ0cmFjayIsInN0b3AiLCJzZXR1cCIsImNoZWNrQ29ubiIsImxvZyIsImNvbm5lY3Rpb25TdGF0ZSIsIlJUQ1BlZXJDb25uZWN0aW9uIiwiY29uZmlndXJhdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJldiIsImljZUdhdGhlcmluZ1N0YXRlIiwic2lnbmFsaW5nU3RhdGUiLCJkYXRhY2hhbm5lbCIsImRjIiwiY3JlYXRlRGF0YUNoYW5uZWwiLCJsYWJlbCIsImRpY3QiLCJiaW5hcnlUeXBlIiwiZGlyZWN0aW9uIiwibWljIiwibWVkaWFEZXZpY2VzIiwiZ2V0VXNlck1lZGlhIiwiZ2V0VHJhY2tzIiwiYWRkVHJhY2siLCJzaWxlbmNlIiwiY3R4IiwiQXVkaW9Db250ZXh0Iiwib3NjaWxsYXRvciIsImNyZWF0ZU9zY2lsbGF0b3IiLCJkZXN0IiwiY3JlYXRlTWVkaWFTdHJlYW1EZXN0aW5hdGlvbiIsImNvbm5lY3QiLCJzdGFydCIsInN0cmVhbSIsImdldEF1ZGlvVHJhY2tzIiwiZW5hYmxlZCIsImFkZFRyYW5zY2VpdmVyIiwiY2FtZXJhIiwic2VuZEljZUNhbmRpZGF0ZSIsImNyZWF0ZVBlZXJDb25uZWN0aW9uIiwiZ2F0aGVyaW5nUHJvbWlzZSIsIm9uaWNlY2FuZGlkYXRlIiwiY2FuZGlkYXRlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5Iiwib25pY2VnYXRoZXJpbmdzdGF0ZWNoYW5nZSIsInRvRGVzY3JpcHRpb24iLCJpbml0Iiwic2RwIiwib2ZmZXIiLCJjcmVhdGVPZmZlciIsIm9mZmVyVG9SZWNlaXZlQXVkaW8iLCJvZmZlclRvUmVjZWl2ZVZpZGVvIiwic2V0TG9jYWxEZXNjcmlwdGlvbiIsImFuc3dlciIsImNyZWF0ZUFuc3dlciIsImN1cnJlbnRMb2NhbERlc2NyaXB0aW9uIiwiZGVzY3JpcHRpb24iLCJzZXRSZW1vdGVEZXNjcmlwdGlvbiIsImFkZEljZUNhbmRpZGF0ZSIsImRvY3VtZW50IiwiZXZlbnQiLCJjYXN0IiwiZnJhbWV3b3JrIiwiQ2FzdFJlY2VpdmVyT3B0aW9ucyIsImRpc2FibGVJZGxlVGltZW91dCIsIkNhc3RSZWNlaXZlckNvbnRleHQiLCJnZXRJbnN0YW5jZSIsInBsYXllck1hbmFnZXIiLCJnZXRQbGF5ZXJNYW5hZ2VyIiwiZ2V0RWxlbWVudEJ5SWQiLCJwcmV2aW91c0NsZWFudXAiLCJzZXRNZXNzYWdlSW50ZXJjZXB0b3IiLCJtZXNzYWdlcyIsIk1lc3NhZ2VUeXBlIiwiTE9BRCIsImxvYWRSZXF1ZXN0RGF0YSIsImVpb1VybCIsIm1lZGlhIiwiZW50aXR5IiwiY29udGVudElkIiwidG9rZW4iLCJjcmVkZW50aWFscyIsImN1c3RvbURhdGEiLCJ1cmwiLCJVUkwiLCJlbmRwb2ludFBhdGgiLCJwYXRobmFtZSIsInF1ZXJ5IiwiayIsIlVSTFNlYXJjaFBhcmFtcyIsInNlYXJjaCIsInBhdGgiLCJzb2NrZXQiLCJlaW8iLCJob3N0Iiwib24iLCJycGNQZWVyIiwiZGF0YSIsImhhbmRsZU1lc3NhZ2UiLCJzZXNzaW9uIiwiY2xlYW51cCIsIndhaXRQZWVySWNlQ29ubmVjdGlvbkNsb3NlZCIsIm1lZGlhU3RyZWFtIiwiTWVkaWFTdHJlYW0iLCJnZXRSZWNlaXZlcnMiLCJtYXAiLCJvbnRyYWNrIiwic3JjT2JqZWN0Il0sInNvdXJjZVJvb3QiOiIifQ==
|