From 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 13 Apr 2025 18:48:02 +0100 Subject: initial --- site/code/csound.js | 903 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 903 insertions(+) create mode 100644 site/code/csound.js (limited to 'site/code/csound.js') diff --git a/site/code/csound.js b/site/code/csound.js new file mode 100644 index 0000000..fc1706e --- /dev/null +++ b/site/code/csound.js @@ -0,0 +1,903 @@ +/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +var $jscomp=$jscomp||{};$jscomp.scope={};var COMPILED=!0,goog=goog||{};goog.global=this||self;goog.exportPath_=function(a,b,c,d){a=a.split(".");d=d||goog.global;a[0]in d||"undefined"==typeof d.execScript||d.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)if(a.length||void 0===b)d=d[e]&&d[e]!==Object.prototype[e]?d[e]:d[e]={};else if(!c&&goog.isObject(b)&&goog.isObject(d[e]))for(var f in b)b.hasOwnProperty(f)&&(d[e][f]=b[f]);else d[e]=b}; +goog.define=function(a,b){if(!COMPILED){var c=goog.global.CLOSURE_UNCOMPILED_DEFINES,d=goog.global.CLOSURE_DEFINES;c&&void 0===c.nodeType&&Object.prototype.hasOwnProperty.call(c,a)?b=c[a]:d&&void 0===d.nodeType&&Object.prototype.hasOwnProperty.call(d,a)&&(b=d[a])}return b};goog.FEATURESET_YEAR=2020;goog.DEBUG=!0;goog.LOCALE="en";goog.getLocale=function(){return goog.LOCALE};goog.TRUSTED_SITE=!0;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1; +goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b,c){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var d=a;(d=d.substring(0,d.lastIndexOf(".")))&&!goog.getObjectByName(d);)goog.implicitNamespaces_[d]=!0}goog.exportPath_(a,b,c)};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/; +goog.getScriptNonce_=function(a){a=(a||goog.global).document;return(a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:""};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; +goog.module=function(a){if("string"!==typeof a||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.");if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module."); +goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)};goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a].exports;if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null; +goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return!!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG};goog.isInEs6ModuleLoader_=function(){if(goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.ES6)return!0;var a=goog.global.$jscomp;return a?"function"!=typeof a.getCurrentModulePath?!1:!!a.getCurrentModulePath():!1}; +goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInGoogModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; +goog.declareModuleId=function(a){if(!COMPILED){if(!goog.isInEs6ModuleLoader_())throw Error("goog.declareModuleId may only be called from within an ES6 module");if(goog.moduleLoaderState_&&goog.moduleLoaderState_.moduleName)throw Error("goog.declareModuleId may only be called once per module.");if(a in goog.loadedModules_)throw Error('Module with namespace "'+a+'" already exists.');}if(goog.moduleLoaderState_)goog.moduleLoaderState_.moduleName=a;else{var b=goog.global.$jscomp;if(!b||"function"!=typeof b.getCurrentModulePath)throw Error('Module with namespace "'+ +a+'" has been loaded incorrectly.');b=b.require(b.getCurrentModulePath());goog.loadedModules_[a]={exports:b,type:goog.ModuleType.ES6,moduleId:a}}};goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){};COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&null!=goog.getObjectByName(a)},goog.implicitNamespaces_={"goog.module":!0}); +goog.getObjectByName=function(a,b){a=a.split(".");b=b||goog.global;for(var c=0;c>>0);goog.uidCounter_=0;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if("function"===typeof a.clone)return a.clone();if("undefined"!==typeof Map&&a instanceof Map)return new Map(a);if("undefined"!==typeof Set&&a instanceof Set)return new Set(a);b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; +goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2").replace(/'/g,"'").replace(/"/g,'"').replace(/&/g,"&"));b&&(a=a.replace(/\{\$([^}]+)}/g,function(d,e){return null!=b&&e in b?b[e]:d}));return a};goog.getMsgWithFallback=function(a,b){return a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,!0,c)};goog.exportProperty=function(a,b,c){a[b]=c}; +goog.inherits=function(a,b){function c(){}c.prototype=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.base=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h\x3c/script>';f+="";f=goog.Dependency.defer_?f+("document.getElementById('script-"+e+"').onload = function() {\n goog.Dependency.callback_('"+e+"', this);\n};\n"):f+("goog.Dependency.callback_('"+e+"', document.getElementById('script-"+e+"'));");f+="\x3c/script>";b.write(goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createHTML(f):f)}else{var g=b.createElement("script");g.defer=goog.Dependency.defer_;g.async=!1;c&&(g.nonce= +c);g.onload=function(){g.onload=null;a.loaded()};g.src=goog.TRUSTED_TYPES_POLICY_?goog.TRUSTED_TYPES_POLICY_.createScriptURL(this.path):this.path;b.head.appendChild(g)}}else goog.logToConsole_("Cannot use default debug loader outside of HTML documents."),"deps.js"==this.relativePath?(goog.logToConsole_("Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, or setting CLOSURE_NO_DEPS to true."),a.loaded()):a.pause()},goog.Es6ModuleDependency=function(a,b,c,d,e){goog.Dependency.call(this,a, +b,c,d,e)},goog.inherits(goog.Es6ModuleDependency,goog.Dependency),goog.Es6ModuleDependency.prototype.load=function(a){function b(n,m){var l="",p=goog.getScriptNonce_();p&&(l=' nonce="'+p+'"');n=m?'`,""].join("\n");b=new Blob([b],{type:"text/html"});this.iFrameElement=document.createElement("iframe");this.iFrameElement.src=URL.createObjectURL(b);this.iFrameElement.sandbox.add("allow-scripts","allow-same-origin");this.iFrameElement.style.cssText="position:absolute;left:0;top:-999px;width:1px;height:1px;"; +b=new Promise(c=>{this.iFrameElement.onload=()=>{c()}});a.body.append(this.iFrameElement);try{await b}catch(c){console.error(c)}spnWorker$$module$src$mains$old_spn_main=this.iFrameElement.contentWindow}async initialize(){if(!spnWorker$$module$src$mains$old_spn_main&&(await this.initIframe(),!spnWorker$$module$src$mains$old_spn_main)){console.error("SPN FATAL: Couldn't create iFrame");return}var a=`audioWorklet${UID$$module$src$mains$old_spn_main}`;this.contextUid=a;UID$$module$src$mains$old_spn_main+= +1;proxyPort$$module$src$mains$old_spn_main||(proxyPort$$module$src$mains$old_spn_main=wrap$$module$node_modules$comlink$dist$esm$comlink_mjs(windowEndpoint$$module$node_modules$comlink$dist$esm$comlink_mjs(spnWorker$$module$src$mains$old_spn_main)));this.audioContext||(this.audioContextIsProvided&&console.error("fatal: the provided AudioContext was undefined"),this.audioContext=new (WebkitAudioContext$$module$src$utils())({sampleRate:this.sampleRate}));"closed"===this.audioContext.state&&(this.audioContextIsProvided&& +console.error("fatal: the provided AudioContext was closed, falling back new AudioContext"),this.audioContext=new (WebkitAudioContext$$module$src$utils())({sampleRate:this.sampleRate}));this.audioContextIsProvided||this.sampleRate===this.audioContext.sampleRate||(this.audioContext=new (WebkitAudioContext$$module$src$utils())({sampleRate:this.sampleRate}));spnWorker$$module$src$mains$old_spn_main[a]=this.audioContext;window[`__csound_wasm_iframe_parent_${a}`]=this.audioContext;let b;this.isRequestingInput&& +await new Promise(c=>{requestMicrophoneNode$$module$src$mains$io_utils(d=>{d&&(b=this.audioContext.createMediaStreamSource(d));c()})});logOldSpnMain$$module$src$logger("initializing proxyPort")();await proxyPort$$module$src$mains$old_spn_main.initialize(transfer$$module$node_modules$comlink$dist$esm$comlink_mjs({contextUid:a,hardwareBufferSize:32768,softwareBufferSize:2048,inputsCount:this.inputsCount,outputsCount:this.outputsCount,sampleRate:this.sampleRate,audioInputPort:this.ipcMessagePorts.audioWorkerAudioInputPort, +messagePort:this.ipcMessagePorts.workerMessagePort2,requestPort:this.ipcMessagePorts.audioWorkerFrameRequestPort,audioContextIsProvided:this.audioContextIsProvided,autoConnect:this.autoConnect,initialPlayState:this.currentPlayState},[this.ipcMessagePorts.audioWorkerAudioInputPort,this.ipcMessagePorts.workerMessagePort2,this.ipcMessagePorts.audioWorkerFrameRequestPort]));logOldSpnMain$$module$src$logger("done initializing proxyPort")();(a=spnWorker$$module$src$mains$old_spn_main[`${a}Node`]||window[`__csound_wasm_iframe_parent_${a}Node`])&& +b&&b.connect(a);this.publicEvents.triggerOnAudioNodeCreated(a);this.isRequestingMidi&&this.csoundWorkerMain&&this.csoundWorkerMain.handleMidiInput&&(logOldSpnMain$$module$src$logger("requesting for web-midi connection")(),requestMidi$$module$src$utils$request_midi({onMidiMessage:this.csoundWorkerMain.handleMidiInput.bind(this.csoundWorkerMain)}))}}var $jscompDefaultExport$$module$src$mains$old_spn_main=ScriptProcessorNodeMainThread$$module$src$mains$old_spn_main,module$src$mains$old_spn_main={}; +module$src$mains$old_spn_main.default=$jscompDefaultExport$$module$src$mains$old_spn_main;const dlinit$$module$src$dlinit=(a,b,c,d)=>{if(b.exports.csoundModuleInit){var e=new WebAssembly.Global({value:"i32",mutable:!0},0),f=new WebAssembly.Global({value:"i32",mutable:!0},0),g=new WebAssembly.Global({value:"i32",mutable:!0},0);const h=new WebAssembly.Global({value:"i32",mutable:!0},0);let k=c.length;"function"===typeof b.exports.csoundModuleCreate&&(c.grow(1),e.value=k,c.set(k,b.exports.csoundModuleCreate),k+=1);"function"===typeof b.exports.csoundModuleInit&&(c.grow(1),f.value=k,c.set(k, +b.exports.csoundModuleInit),k+=1);"function"===typeof b.exports.csoundModuleDestroy&&(c.grow(1),g.value=k,c.set(k,b.exports.csoundModuleDestroy),k+=1);"function"===typeof b.exports.csoundModuleErrorCodeToString&&(c.grow(1),h.value=k,c.set(k,b.exports.csoundModuleErrorCodeToString));a.exports.csoundWasiLoadPlugin(d,e,f,g,h)}else b.exports.csound_opcode_init||b.exports.csound_fgen_init?(e=new WebAssembly.Global({value:"i32",mutable:!0},0),f=new WebAssembly.Global({value:"i32",mutable:!0},0),g=c.length, +"function"===typeof b.exports.csound_opcode_init&&(e.value=g,c.grow(1),c.set(g,b.exports.csound_opcode_init),g+=1),"function"===typeof b.exports.csound_fgen_init&&(f.value=g,c.grow(1),c.set(g,b.exports.csound_fgen_init)),a.exports.csoundWasiLoadOpcodeLibrary(d,f,e)):console.error("Plugin doesn't export nececcary functions to quality as csound plugin.")};var module$src$dlinit={};module$src$dlinit.dlinit=dlinit$$module$src$dlinit;void 0!==goog.global&&(goog.global={});goog.global.BigInt||(goog.global.BigInt=void 0===BigInt?Number:BigInt); +const WASI_ESUCCESS$$module$src$filesystem$constants=0,WASI_E2BIG$$module$src$filesystem$constants=1,WASI_EACCES$$module$src$filesystem$constants=2,WASI_EADDRINUSE$$module$src$filesystem$constants=3,WASI_EADDRNOTAVAIL$$module$src$filesystem$constants=4,WASI_EAFNOSUPPORT$$module$src$filesystem$constants=5,WASI_EAGAIN$$module$src$filesystem$constants=6,WASI_EALREADY$$module$src$filesystem$constants=7,WASI_EBADF$$module$src$filesystem$constants=8,WASI_EBADMSG$$module$src$filesystem$constants=9,WASI_EBUSY$$module$src$filesystem$constants= +10,WASI_ECANCELED$$module$src$filesystem$constants=11,WASI_ECHILD$$module$src$filesystem$constants=12,WASI_ECONNABORTED$$module$src$filesystem$constants=13,WASI_ECONNREFUSED$$module$src$filesystem$constants=14,WASI_ECONNRESET$$module$src$filesystem$constants=15,WASI_EDEADLK$$module$src$filesystem$constants=16,WASI_EDESTADDRREQ$$module$src$filesystem$constants=17,WASI_EDOM$$module$src$filesystem$constants=18,WASI_EDQUOT$$module$src$filesystem$constants=19,WASI_EEXIST$$module$src$filesystem$constants= +20,WASI_EFAULT$$module$src$filesystem$constants=21,WASI_EFBIG$$module$src$filesystem$constants=22,WASI_EHOSTUNREACH$$module$src$filesystem$constants=23,WASI_EIDRM$$module$src$filesystem$constants=24,WASI_EILSEQ$$module$src$filesystem$constants=25,WASI_EINPROGRESS$$module$src$filesystem$constants=26,WASI_EINTR$$module$src$filesystem$constants=27,WASI_EINVAL$$module$src$filesystem$constants=28,WASI_EIO$$module$src$filesystem$constants=29,WASI_EISCONN$$module$src$filesystem$constants=30,WASI_EISDIR$$module$src$filesystem$constants= +31,WASI_ELOOP$$module$src$filesystem$constants=32,WASI_EMFILE$$module$src$filesystem$constants=33,WASI_EMLINK$$module$src$filesystem$constants=34,WASI_EMSGSIZE$$module$src$filesystem$constants=35,WASI_EMULTIHOP$$module$src$filesystem$constants=36,WASI_ENAMETOOLONG$$module$src$filesystem$constants=37,WASI_ENETDOWN$$module$src$filesystem$constants=38,WASI_ENETRESET$$module$src$filesystem$constants=39,WASI_ENETUNREACH$$module$src$filesystem$constants=40,WASI_ENFILE$$module$src$filesystem$constants=41, +WASI_ENOBUFS$$module$src$filesystem$constants=42,WASI_ENODEV$$module$src$filesystem$constants=43,WASI_ENOENT$$module$src$filesystem$constants=44,WASI_ENOEXEC$$module$src$filesystem$constants=45,WASI_ENOLCK$$module$src$filesystem$constants=46,WASI_ENOLINK$$module$src$filesystem$constants=47,WASI_ENOMEM$$module$src$filesystem$constants=48,WASI_ENOMSG$$module$src$filesystem$constants=49,WASI_ENOPROTOOPT$$module$src$filesystem$constants=50,WASI_ENOSPC$$module$src$filesystem$constants=51,WASI_ENOSYS$$module$src$filesystem$constants= +52,WASI_ENOTCONN$$module$src$filesystem$constants=53,WASI_ENOTDIR$$module$src$filesystem$constants=54,WASI_ENOTEMPTY$$module$src$filesystem$constants=55,WASI_ENOTRECOVERABLE$$module$src$filesystem$constants=56,WASI_ENOTSOCK$$module$src$filesystem$constants=57,WASI_ENOTSUP$$module$src$filesystem$constants=58,WASI_ENOTTY$$module$src$filesystem$constants=59,WASI_ENXIO$$module$src$filesystem$constants=60,WASI_EOVERFLOW$$module$src$filesystem$constants=61,WASI_EOWNERDEAD$$module$src$filesystem$constants= +62,WASI_EPERM$$module$src$filesystem$constants=63,WASI_EPIPE$$module$src$filesystem$constants=64,WASI_EPROTO$$module$src$filesystem$constants=65,WASI_EPROTONOSUPPORT$$module$src$filesystem$constants=66,WASI_EPROTOTYPE$$module$src$filesystem$constants=67,WASI_ERANGE$$module$src$filesystem$constants=68,WASI_EROFS$$module$src$filesystem$constants=69,WASI_ESPIPE$$module$src$filesystem$constants=70,WASI_ESRCH$$module$src$filesystem$constants=71,WASI_ESTALE$$module$src$filesystem$constants=72,WASI_ETIMEDOUT$$module$src$filesystem$constants= +73,WASI_ETXTBSY$$module$src$filesystem$constants=74,WASI_EXDEV$$module$src$filesystem$constants=75,WASI_ENOTCAPABLE$$module$src$filesystem$constants=76,WASI_SIGABRT$$module$src$filesystem$constants=0,WASI_SIGALRM$$module$src$filesystem$constants=1,WASI_SIGBUS$$module$src$filesystem$constants=2,WASI_SIGCHLD$$module$src$filesystem$constants=3,WASI_SIGCONT$$module$src$filesystem$constants=4,WASI_SIGFPE$$module$src$filesystem$constants=5,WASI_SIGHUP$$module$src$filesystem$constants=6,WASI_SIGILL$$module$src$filesystem$constants= +7,WASI_SIGINT$$module$src$filesystem$constants=8,WASI_SIGKILL$$module$src$filesystem$constants=9,WASI_SIGPIPE$$module$src$filesystem$constants=10,WASI_SIGQUIT$$module$src$filesystem$constants=11,WASI_SIGSEGV$$module$src$filesystem$constants=12,WASI_SIGSTOP$$module$src$filesystem$constants=13,WASI_SIGTERM$$module$src$filesystem$constants=14,WASI_SIGTRAP$$module$src$filesystem$constants=15,WASI_SIGTSTP$$module$src$filesystem$constants=16,WASI_SIGTTIN$$module$src$filesystem$constants=17,WASI_SIGTTOU$$module$src$filesystem$constants= +18,WASI_SIGURG$$module$src$filesystem$constants=19,WASI_SIGUSR1$$module$src$filesystem$constants=20,WASI_SIGUSR2$$module$src$filesystem$constants=21,WASI_SIGVTALRM$$module$src$filesystem$constants=22,WASI_SIGXCPU$$module$src$filesystem$constants=23,WASI_SIGXFSZ$$module$src$filesystem$constants=24,WASI_FILETYPE_UNKNOWN$$module$src$filesystem$constants=0,WASI_FILETYPE_BLOCK_DEVICE$$module$src$filesystem$constants=1,WASI_FILETYPE_CHARACTER_DEVICE$$module$src$filesystem$constants=2,WASI_FILETYPE_DIRECTORY$$module$src$filesystem$constants= +3,WASI_FILETYPE_REGULAR_FILE$$module$src$filesystem$constants=4,WASI_FILETYPE_SOCKET_DGRAM$$module$src$filesystem$constants=5,WASI_FILETYPE_SOCKET_STREAM$$module$src$filesystem$constants=6,WASI_FILETYPE_SYMBOLIC_LINK$$module$src$filesystem$constants=7,WASI_FDFLAG_APPEND$$module$src$filesystem$constants=1,WASI_FDFLAG_DSYNC$$module$src$filesystem$constants=2,WASI_FDFLAG_NONBLOCK$$module$src$filesystem$constants=4,WASI_FDFLAG_RSYNC$$module$src$filesystem$constants=8,WASI_FDFLAG_SYNC$$module$src$filesystem$constants= +16,WASI_RIGHT_FD_DATASYNC$$module$src$filesystem$constants=goog.global.BigInt(1),WASI_RIGHT_FD_READ$$module$src$filesystem$constants=goog.global.BigInt(2),WASI_RIGHT_FD_SEEK$$module$src$filesystem$constants=goog.global.BigInt(4),WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants=goog.global.BigInt(8),WASI_RIGHT_FD_SYNC$$module$src$filesystem$constants=goog.global.BigInt(16),WASI_RIGHT_FD_TELL$$module$src$filesystem$constants=goog.global.BigInt(32),WASI_RIGHT_FD_WRITE$$module$src$filesystem$constants= +goog.global.BigInt(64),WASI_RIGHT_FD_ADVISE$$module$src$filesystem$constants=goog.global.BigInt(128),WASI_RIGHT_FD_ALLOCATE$$module$src$filesystem$constants=goog.global.BigInt(256),WASI_RIGHT_PATH_CREATE_DIRECTORY$$module$src$filesystem$constants=goog.global.BigInt(512),WASI_RIGHT_PATH_CREATE_FILE$$module$src$filesystem$constants=goog.global.BigInt(1024),WASI_RIGHT_PATH_LINK_SOURCE$$module$src$filesystem$constants=goog.global.BigInt(2048),WASI_RIGHT_PATH_LINK_TARGET$$module$src$filesystem$constants= +goog.global.BigInt(4096),WASI_RIGHT_PATH_OPEN$$module$src$filesystem$constants=goog.global.BigInt(8192),WASI_RIGHT_FD_READDIR$$module$src$filesystem$constants=goog.global.BigInt(16384),WASI_RIGHT_PATH_READLINK$$module$src$filesystem$constants=goog.global.BigInt(32768),WASI_RIGHT_PATH_RENAME_SOURCE$$module$src$filesystem$constants=goog.global.BigInt(65536),WASI_RIGHT_PATH_RENAME_TARGET$$module$src$filesystem$constants=goog.global.BigInt(131072),WASI_RIGHT_PATH_FILESTAT_GET$$module$src$filesystem$constants= +goog.global.BigInt(262144),WASI_RIGHT_PATH_FILESTAT_SET_SIZE$$module$src$filesystem$constants=goog.global.BigInt(524288),WASI_RIGHT_PATH_FILESTAT_SET_TIMES$$module$src$filesystem$constants=goog.global.BigInt(1048576),WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants=goog.global.BigInt(2097152),WASI_RIGHT_FD_FILESTAT_SET_SIZE$$module$src$filesystem$constants=goog.global.BigInt(4194304),WASI_RIGHT_FD_FILESTAT_SET_TIMES$$module$src$filesystem$constants=goog.global.BigInt(8388608),WASI_RIGHT_PATH_SYMLINK$$module$src$filesystem$constants= +goog.global.BigInt(16777216),WASI_RIGHT_PATH_REMOVE_DIRECTORY$$module$src$filesystem$constants=goog.global.BigInt(33554432),WASI_RIGHT_PATH_UNLINK_FILE$$module$src$filesystem$constants=goog.global.BigInt(67108864),WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants=goog.global.BigInt(134217728),WASI_RIGHT_SOCK_SHUTDOWN$$module$src$filesystem$constants=goog.global.BigInt(268435456),RIGHTS_ALL$$module$src$filesystem$constants=WASI_RIGHT_FD_DATASYNC$$module$src$filesystem$constants|WASI_RIGHT_FD_READ$$module$src$filesystem$constants| +WASI_RIGHT_FD_SEEK$$module$src$filesystem$constants|WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants|WASI_RIGHT_FD_SYNC$$module$src$filesystem$constants|WASI_RIGHT_FD_TELL$$module$src$filesystem$constants|WASI_RIGHT_FD_WRITE$$module$src$filesystem$constants|WASI_RIGHT_FD_ADVISE$$module$src$filesystem$constants|WASI_RIGHT_FD_ALLOCATE$$module$src$filesystem$constants|WASI_RIGHT_PATH_CREATE_DIRECTORY$$module$src$filesystem$constants|WASI_RIGHT_PATH_CREATE_FILE$$module$src$filesystem$constants| +WASI_RIGHT_PATH_LINK_SOURCE$$module$src$filesystem$constants|WASI_RIGHT_PATH_LINK_TARGET$$module$src$filesystem$constants|WASI_RIGHT_PATH_OPEN$$module$src$filesystem$constants|WASI_RIGHT_FD_READDIR$$module$src$filesystem$constants|WASI_RIGHT_PATH_READLINK$$module$src$filesystem$constants|WASI_RIGHT_PATH_RENAME_SOURCE$$module$src$filesystem$constants|WASI_RIGHT_PATH_RENAME_TARGET$$module$src$filesystem$constants|WASI_RIGHT_PATH_FILESTAT_GET$$module$src$filesystem$constants|WASI_RIGHT_PATH_FILESTAT_SET_SIZE$$module$src$filesystem$constants| +WASI_RIGHT_PATH_FILESTAT_SET_TIMES$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_SET_TIMES$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_SET_SIZE$$module$src$filesystem$constants|WASI_RIGHT_PATH_SYMLINK$$module$src$filesystem$constants|WASI_RIGHT_PATH_UNLINK_FILE$$module$src$filesystem$constants|WASI_RIGHT_PATH_REMOVE_DIRECTORY$$module$src$filesystem$constants|WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants| +WASI_RIGHT_SOCK_SHUTDOWN$$module$src$filesystem$constants,RIGHTS_BLOCK_DEVICE_BASE$$module$src$filesystem$constants=RIGHTS_ALL$$module$src$filesystem$constants,RIGHTS_BLOCK_DEVICE_INHERITING$$module$src$filesystem$constants=RIGHTS_ALL$$module$src$filesystem$constants,RIGHTS_CHARACTER_DEVICE_BASE$$module$src$filesystem$constants=RIGHTS_ALL$$module$src$filesystem$constants,RIGHTS_CHARACTER_DEVICE_INHERITING$$module$src$filesystem$constants=RIGHTS_ALL$$module$src$filesystem$constants,RIGHTS_REGULAR_FILE_BASE$$module$src$filesystem$constants= +WASI_RIGHT_FD_DATASYNC$$module$src$filesystem$constants|WASI_RIGHT_FD_READ$$module$src$filesystem$constants|WASI_RIGHT_FD_SEEK$$module$src$filesystem$constants|WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants|WASI_RIGHT_FD_SYNC$$module$src$filesystem$constants|WASI_RIGHT_FD_TELL$$module$src$filesystem$constants|WASI_RIGHT_FD_WRITE$$module$src$filesystem$constants|WASI_RIGHT_FD_ADVISE$$module$src$filesystem$constants|WASI_RIGHT_FD_ALLOCATE$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants| +WASI_RIGHT_FD_FILESTAT_SET_SIZE$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_SET_TIMES$$module$src$filesystem$constants|WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants,RIGHTS_REGULAR_FILE_INHERITING$$module$src$filesystem$constants=goog.global.BigInt(0),RIGHTS_DIRECTORY_BASE$$module$src$filesystem$constants=WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants|WASI_RIGHT_FD_SYNC$$module$src$filesystem$constants|WASI_RIGHT_FD_ADVISE$$module$src$filesystem$constants| +WASI_RIGHT_PATH_CREATE_DIRECTORY$$module$src$filesystem$constants|WASI_RIGHT_PATH_CREATE_FILE$$module$src$filesystem$constants|WASI_RIGHT_PATH_LINK_SOURCE$$module$src$filesystem$constants|WASI_RIGHT_PATH_LINK_TARGET$$module$src$filesystem$constants|WASI_RIGHT_PATH_OPEN$$module$src$filesystem$constants|WASI_RIGHT_FD_READDIR$$module$src$filesystem$constants|WASI_RIGHT_PATH_READLINK$$module$src$filesystem$constants|WASI_RIGHT_PATH_RENAME_SOURCE$$module$src$filesystem$constants|WASI_RIGHT_PATH_RENAME_TARGET$$module$src$filesystem$constants| +WASI_RIGHT_PATH_FILESTAT_GET$$module$src$filesystem$constants|WASI_RIGHT_PATH_FILESTAT_SET_SIZE$$module$src$filesystem$constants|WASI_RIGHT_PATH_FILESTAT_SET_TIMES$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_SET_TIMES$$module$src$filesystem$constants|WASI_RIGHT_PATH_SYMLINK$$module$src$filesystem$constants|WASI_RIGHT_PATH_UNLINK_FILE$$module$src$filesystem$constants|WASI_RIGHT_PATH_REMOVE_DIRECTORY$$module$src$filesystem$constants| +WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants,RIGHTS_DIRECTORY_INHERITING$$module$src$filesystem$constants=RIGHTS_DIRECTORY_BASE$$module$src$filesystem$constants|RIGHTS_REGULAR_FILE_BASE$$module$src$filesystem$constants,RIGHTS_SOCKET_BASE$$module$src$filesystem$constants=WASI_RIGHT_FD_READ$$module$src$filesystem$constants|WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants|WASI_RIGHT_FD_WRITE$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants| +WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants|WASI_RIGHT_SOCK_SHUTDOWN$$module$src$filesystem$constants,RIGHTS_SOCKET_INHERITING$$module$src$filesystem$constants=RIGHTS_ALL$$module$src$filesystem$constants,RIGHTS_TTY_BASE$$module$src$filesystem$constants=WASI_RIGHT_FD_READ$$module$src$filesystem$constants|WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants|WASI_RIGHT_FD_WRITE$$module$src$filesystem$constants|WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants|WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants, +RIGHTS_TTY_INHERITING$$module$src$filesystem$constants=goog.global.BigInt(0),WASI_CLOCK_REALTIME$$module$src$filesystem$constants=0,WASI_CLOCK_MONOTONIC$$module$src$filesystem$constants=1,WASI_CLOCK_PROCESS_CPUTIME_ID$$module$src$filesystem$constants=2,WASI_CLOCK_THREAD_CPUTIME_ID$$module$src$filesystem$constants=3,WASI_EVENTTYPE_CLOCK$$module$src$filesystem$constants=0,WASI_EVENTTYPE_FD_READ$$module$src$filesystem$constants=1,WASI_EVENTTYPE_FD_WRITE$$module$src$filesystem$constants=2,WASI_FILESTAT_SET_ATIM$$module$src$filesystem$constants= +1,WASI_FILESTAT_SET_ATIM_NOW$$module$src$filesystem$constants=2,WASI_FILESTAT_SET_MTIM$$module$src$filesystem$constants=4,WASI_FILESTAT_SET_MTIM_NOW$$module$src$filesystem$constants=8,WASI_O_CREAT$$module$src$filesystem$constants=1,WASI_O_DIRECTORY$$module$src$filesystem$constants=2,WASI_O_EXCL$$module$src$filesystem$constants=4,WASI_O_TRUNC$$module$src$filesystem$constants=8,WASI_PREOPENTYPE_DIR$$module$src$filesystem$constants=0,WASI_DIRCOOKIE_START$$module$src$filesystem$constants=0,WASI_STDIN_FILENO$$module$src$filesystem$constants= +0,WASI_STDOUT_FILENO$$module$src$filesystem$constants=1,WASI_STDERR_FILENO$$module$src$filesystem$constants=2,WASI_WHENCE_SET$$module$src$filesystem$constants=0,WASI_WHENCE_CUR$$module$src$filesystem$constants=1,WASI_WHENCE_END$$module$src$filesystem$constants=2;var module$src$filesystem$constants={};module$src$filesystem$constants.RIGHTS_ALL=RIGHTS_ALL$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_BLOCK_DEVICE_BASE=RIGHTS_ALL$$module$src$filesystem$constants; +module$src$filesystem$constants.RIGHTS_BLOCK_DEVICE_INHERITING=RIGHTS_ALL$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_CHARACTER_DEVICE_BASE=RIGHTS_ALL$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_CHARACTER_DEVICE_INHERITING=RIGHTS_ALL$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_DIRECTORY_BASE=RIGHTS_DIRECTORY_BASE$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_DIRECTORY_INHERITING=RIGHTS_DIRECTORY_INHERITING$$module$src$filesystem$constants; +module$src$filesystem$constants.RIGHTS_REGULAR_FILE_BASE=RIGHTS_REGULAR_FILE_BASE$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_REGULAR_FILE_INHERITING=RIGHTS_REGULAR_FILE_INHERITING$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_SOCKET_BASE=RIGHTS_SOCKET_BASE$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_SOCKET_INHERITING=RIGHTS_ALL$$module$src$filesystem$constants;module$src$filesystem$constants.RIGHTS_TTY_BASE=RIGHTS_TTY_BASE$$module$src$filesystem$constants; +module$src$filesystem$constants.RIGHTS_TTY_INHERITING=RIGHTS_TTY_INHERITING$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_CLOCK_MONOTONIC=WASI_CLOCK_MONOTONIC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_CLOCK_PROCESS_CPUTIME_ID=WASI_CLOCK_PROCESS_CPUTIME_ID$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_CLOCK_REALTIME=WASI_CLOCK_REALTIME$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_CLOCK_THREAD_CPUTIME_ID=WASI_CLOCK_THREAD_CPUTIME_ID$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_DIRCOOKIE_START=WASI_DIRCOOKIE_START$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_E2BIG=WASI_E2BIG$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EACCES=WASI_EACCES$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EADDRINUSE=WASI_EADDRINUSE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EADDRNOTAVAIL=WASI_EADDRNOTAVAIL$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EAFNOSUPPORT=WASI_EAFNOSUPPORT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EAGAIN=WASI_EAGAIN$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EALREADY=WASI_EALREADY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EBADF=WASI_EBADF$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EBADMSG=WASI_EBADMSG$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EBUSY=WASI_EBUSY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ECANCELED=WASI_ECANCELED$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ECHILD=WASI_ECHILD$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ECONNABORTED=WASI_ECONNABORTED$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ECONNREFUSED=WASI_ECONNREFUSED$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ECONNRESET=WASI_ECONNRESET$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EDEADLK=WASI_EDEADLK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EDESTADDRREQ=WASI_EDESTADDRREQ$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EDOM=WASI_EDOM$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EDQUOT=WASI_EDQUOT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EEXIST=WASI_EEXIST$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EFAULT=WASI_EFAULT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EFBIG=WASI_EFBIG$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EHOSTUNREACH=WASI_EHOSTUNREACH$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EIDRM=WASI_EIDRM$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EILSEQ=WASI_EILSEQ$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EINPROGRESS=WASI_EINPROGRESS$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EINTR=WASI_EINTR$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EINVAL=WASI_EINVAL$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EIO=WASI_EIO$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EISCONN=WASI_EISCONN$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EISDIR=WASI_EISDIR$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ELOOP=WASI_ELOOP$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EMFILE=WASI_EMFILE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EMLINK=WASI_EMLINK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EMSGSIZE=WASI_EMSGSIZE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EMULTIHOP=WASI_EMULTIHOP$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ENAMETOOLONG=WASI_ENAMETOOLONG$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENETDOWN=WASI_ENETDOWN$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENETRESET=WASI_ENETRESET$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENETUNREACH=WASI_ENETUNREACH$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENFILE=WASI_ENFILE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ENOBUFS=WASI_ENOBUFS$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENODEV=WASI_ENODEV$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOENT=WASI_ENOENT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOEXEC=WASI_ENOEXEC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOLCK=WASI_ENOLCK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOLINK=WASI_ENOLINK$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ENOMEM=WASI_ENOMEM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOMSG=WASI_ENOMSG$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOPROTOOPT=WASI_ENOPROTOOPT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOSPC=WASI_ENOSPC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOSYS=WASI_ENOSYS$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ENOTCAPABLE=WASI_ENOTCAPABLE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOTCONN=WASI_ENOTCONN$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOTDIR=WASI_ENOTDIR$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOTEMPTY=WASI_ENOTEMPTY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOTRECOVERABLE=WASI_ENOTRECOVERABLE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ENOTSOCK=WASI_ENOTSOCK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOTSUP=WASI_ENOTSUP$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENOTTY=WASI_ENOTTY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ENXIO=WASI_ENXIO$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EOVERFLOW=WASI_EOVERFLOW$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EOWNERDEAD=WASI_EOWNERDEAD$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EPERM=WASI_EPERM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EPIPE=WASI_EPIPE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EPROTO=WASI_EPROTO$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EPROTONOSUPPORT=WASI_EPROTONOSUPPORT$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EPROTOTYPE=WASI_EPROTOTYPE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ERANGE=WASI_ERANGE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EROFS=WASI_EROFS$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ESPIPE=WASI_ESPIPE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ESRCH=WASI_ESRCH$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ESTALE=WASI_ESTALE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_ESUCCESS=WASI_ESUCCESS$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ETIMEDOUT=WASI_ETIMEDOUT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_ETXTBSY=WASI_ETXTBSY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EVENTTYPE_CLOCK=WASI_EVENTTYPE_CLOCK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EVENTTYPE_FD_READ=WASI_EVENTTYPE_FD_READ$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_EVENTTYPE_FD_WRITE=WASI_EVENTTYPE_FD_WRITE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_EXDEV=WASI_EXDEV$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FDFLAG_APPEND=WASI_FDFLAG_APPEND$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FDFLAG_DSYNC=WASI_FDFLAG_DSYNC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FDFLAG_NONBLOCK=WASI_FDFLAG_NONBLOCK$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_FDFLAG_RSYNC=WASI_FDFLAG_RSYNC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FDFLAG_SYNC=WASI_FDFLAG_SYNC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILESTAT_SET_ATIM=WASI_FILESTAT_SET_ATIM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILESTAT_SET_ATIM_NOW=WASI_FILESTAT_SET_ATIM_NOW$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILESTAT_SET_MTIM=WASI_FILESTAT_SET_MTIM$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_FILESTAT_SET_MTIM_NOW=WASI_FILESTAT_SET_MTIM_NOW$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILETYPE_BLOCK_DEVICE=WASI_FILETYPE_BLOCK_DEVICE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILETYPE_CHARACTER_DEVICE=WASI_FILETYPE_CHARACTER_DEVICE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILETYPE_DIRECTORY=WASI_FILETYPE_DIRECTORY$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_FILETYPE_REGULAR_FILE=WASI_FILETYPE_REGULAR_FILE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILETYPE_SOCKET_DGRAM=WASI_FILETYPE_SOCKET_DGRAM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILETYPE_SOCKET_STREAM=WASI_FILETYPE_SOCKET_STREAM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_FILETYPE_SYMBOLIC_LINK=WASI_FILETYPE_SYMBOLIC_LINK$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_FILETYPE_UNKNOWN=WASI_FILETYPE_UNKNOWN$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_O_CREAT=WASI_O_CREAT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_O_DIRECTORY=WASI_O_DIRECTORY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_O_EXCL=WASI_O_EXCL$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_O_TRUNC=WASI_O_TRUNC$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_PREOPENTYPE_DIR=WASI_PREOPENTYPE_DIR$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_ADVISE=WASI_RIGHT_FD_ADVISE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_ALLOCATE=WASI_RIGHT_FD_ALLOCATE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_DATASYNC=WASI_RIGHT_FD_DATASYNC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_FDSTAT_SET_FLAGS=WASI_RIGHT_FD_FDSTAT_SET_FLAGS$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_RIGHT_FD_FILESTAT_GET=WASI_RIGHT_FD_FILESTAT_GET$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_FILESTAT_SET_SIZE=WASI_RIGHT_FD_FILESTAT_SET_SIZE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_FILESTAT_SET_TIMES=WASI_RIGHT_FD_FILESTAT_SET_TIMES$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_READ=WASI_RIGHT_FD_READ$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_RIGHT_FD_READDIR=WASI_RIGHT_FD_READDIR$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_SEEK=WASI_RIGHT_FD_SEEK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_SYNC=WASI_RIGHT_FD_SYNC$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_TELL=WASI_RIGHT_FD_TELL$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_FD_WRITE=WASI_RIGHT_FD_WRITE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_RIGHT_PATH_CREATE_DIRECTORY=WASI_RIGHT_PATH_CREATE_DIRECTORY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_CREATE_FILE=WASI_RIGHT_PATH_CREATE_FILE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_FILESTAT_GET=WASI_RIGHT_PATH_FILESTAT_GET$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_FILESTAT_SET_SIZE=WASI_RIGHT_PATH_FILESTAT_SET_SIZE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_RIGHT_PATH_FILESTAT_SET_TIMES=WASI_RIGHT_PATH_FILESTAT_SET_TIMES$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_LINK_SOURCE=WASI_RIGHT_PATH_LINK_SOURCE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_LINK_TARGET=WASI_RIGHT_PATH_LINK_TARGET$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_OPEN=WASI_RIGHT_PATH_OPEN$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_RIGHT_PATH_READLINK=WASI_RIGHT_PATH_READLINK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_REMOVE_DIRECTORY=WASI_RIGHT_PATH_REMOVE_DIRECTORY$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_RENAME_SOURCE=WASI_RIGHT_PATH_RENAME_SOURCE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_RENAME_TARGET=WASI_RIGHT_PATH_RENAME_TARGET$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_RIGHT_PATH_SYMLINK=WASI_RIGHT_PATH_SYMLINK$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_PATH_UNLINK_FILE=WASI_RIGHT_PATH_UNLINK_FILE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_POLL_FD_READWRITE=WASI_RIGHT_POLL_FD_READWRITE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_RIGHT_SOCK_SHUTDOWN=WASI_RIGHT_SOCK_SHUTDOWN$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_SIGABRT=WASI_SIGABRT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGALRM=WASI_SIGALRM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGBUS=WASI_SIGBUS$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGCHLD=WASI_SIGCHLD$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGCONT=WASI_SIGCONT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGFPE=WASI_SIGFPE$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_SIGHUP=WASI_SIGHUP$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGILL=WASI_SIGILL$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGINT=WASI_SIGINT$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGKILL=WASI_SIGKILL$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGPIPE=WASI_SIGPIPE$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGQUIT=WASI_SIGQUIT$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_SIGSEGV=WASI_SIGSEGV$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGSTOP=WASI_SIGSTOP$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGTERM=WASI_SIGTERM$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGTRAP=WASI_SIGTRAP$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGTSTP=WASI_SIGTSTP$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGTTIN=WASI_SIGTTIN$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_SIGTTOU=WASI_SIGTTOU$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGURG=WASI_SIGURG$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGUSR1=WASI_SIGUSR1$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGUSR2=WASI_SIGUSR2$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGVTALRM=WASI_SIGVTALRM$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_SIGXCPU=WASI_SIGXCPU$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_SIGXFSZ=WASI_SIGXFSZ$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_STDERR_FILENO=WASI_STDERR_FILENO$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_STDIN_FILENO=WASI_STDIN_FILENO$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_STDOUT_FILENO=WASI_STDOUT_FILENO$$module$src$filesystem$constants; +module$src$filesystem$constants.WASI_WHENCE_CUR=WASI_WHENCE_CUR$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_WHENCE_END=WASI_WHENCE_END$$module$src$filesystem$constants;module$src$filesystem$constants.WASI_WHENCE_SET=WASI_WHENCE_SET$$module$src$filesystem$constants;goog.debug={};function module$contents$goog$debug$Error_DebugError(a,b){if(Error.captureStackTrace)Error.captureStackTrace(this,module$contents$goog$debug$Error_DebugError);else{const c=Error().stack;c&&(this.stack=c)}a&&(this.message=String(a));void 0!==b&&(this.cause=b);this.reportErrorToServer=!0}goog.inherits(module$contents$goog$debug$Error_DebugError,Error);module$contents$goog$debug$Error_DebugError.prototype.name="CustomError";goog.debug.Error=module$contents$goog$debug$Error_DebugError;goog.dom={};goog.dom.NodeType={ELEMENT:1,ATTRIBUTE:2,TEXT:3,CDATA_SECTION:4,ENTITY_REFERENCE:5,ENTITY:6,PROCESSING_INSTRUCTION:7,COMMENT:8,DOCUMENT:9,DOCUMENT_TYPE:10,DOCUMENT_FRAGMENT:11,NOTATION:12};goog.asserts={};goog.asserts.ENABLE_ASSERTS=goog.DEBUG;function module$contents$goog$asserts_AssertionError(a,b){module$contents$goog$debug$Error_DebugError.call(this,module$contents$goog$asserts_subs(a,b));this.messagePattern=a}goog.inherits(module$contents$goog$asserts_AssertionError,module$contents$goog$debug$Error_DebugError);goog.asserts.AssertionError=module$contents$goog$asserts_AssertionError;module$contents$goog$asserts_AssertionError.prototype.name="AssertionError"; +goog.asserts.DEFAULT_ERROR_HANDLER=function(a){throw a;};let module$contents$goog$asserts_errorHandler_=goog.asserts.DEFAULT_ERROR_HANDLER;function module$contents$goog$asserts_subs(a,b){a=a.split("%s");let c="";const d=a.length-1;for(let e=0;ec?Math.max(0,a.length+c):c;if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,c);for(;cc&&(c=Math.max(0,a.length+c));if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.lastIndexOf(b,c);for(;0<=c;c--)if(c in a&&a[c]===b)return c;return-1}; +goog.array.lastIndexOf=module$contents$goog$array_lastIndexOf;const module$contents$goog$array_forEach=goog.NATIVE_ARRAY_PROTOTYPES&&(module$contents$goog$array_ASSUME_NATIVE_FUNCTIONS||Array.prototype.forEach)?function(a,b,c){goog.asserts.assert(null!=a.length);Array.prototype.forEach.call(a,b,c)}:function(a,b,c){const d=a.length,e="string"===typeof a?a.split(""):a;for(let f=0;fb?null:"string"===typeof a?a.charAt(b):a[b]}goog.array.find=module$contents$goog$array_find; +function module$contents$goog$array_findIndex(a,b,c){const d=a.length,e="string"===typeof a?a.split(""):a;for(let f=0;fb?null:"string"===typeof a?a.charAt(b):a[b]}goog.array.findRight=module$contents$goog$array_findRight; +function module$contents$goog$array_findIndexRight(a,b,c){var d=a.length;const e="string"===typeof a?a.split(""):a;for(--d;0<=d;d--)if(d in e&&b.call(c,e[d],d,a))return d;return-1}goog.array.findIndexRight=module$contents$goog$array_findIndexRight;function module$contents$goog$array_contains(a,b){return 0<=module$contents$goog$array_indexOf(a,b)}goog.array.contains=module$contents$goog$array_contains;function module$contents$goog$array_isEmpty(a){return 0==a.length}goog.array.isEmpty=module$contents$goog$array_isEmpty; +function module$contents$goog$array_clear(a){if(!Array.isArray(a))for(let b=a.length-1;0<=b;b--)delete a[b];a.length=0}goog.array.clear=module$contents$goog$array_clear;function module$contents$goog$array_insert(a,b){module$contents$goog$array_contains(a,b)||a.push(b)}goog.array.insert=module$contents$goog$array_insert;function module$contents$goog$array_insertAt(a,b,c){module$contents$goog$array_splice(a,c,0,b)}goog.array.insertAt=module$contents$goog$array_insertAt; +function module$contents$goog$array_insertArrayAt(a,b,c){goog.partial(module$contents$goog$array_splice,a,c,0).apply(null,b)}goog.array.insertArrayAt=module$contents$goog$array_insertArrayAt;function module$contents$goog$array_insertBefore(a,b,c){let d;2==arguments.length||0>(d=module$contents$goog$array_indexOf(a,c))?a.push(b):module$contents$goog$array_insertAt(a,b,d)}goog.array.insertBefore=module$contents$goog$array_insertBefore; +function module$contents$goog$array_remove(a,b){b=module$contents$goog$array_indexOf(a,b);let c;(c=0<=b)&&module$contents$goog$array_removeAt(a,b);return c}goog.array.remove=module$contents$goog$array_remove;function module$contents$goog$array_removeLast(a,b){b=module$contents$goog$array_lastIndexOf(a,b);return 0<=b?(module$contents$goog$array_removeAt(a,b),!0):!1}goog.array.removeLast=module$contents$goog$array_removeLast; +function module$contents$goog$array_removeAt(a,b){goog.asserts.assert(null!=a.length);return 1==Array.prototype.splice.call(a,b,1).length}goog.array.removeAt=module$contents$goog$array_removeAt;function module$contents$goog$array_removeIf(a,b,c){b=module$contents$goog$array_findIndex(a,b,c);return 0<=b?(module$contents$goog$array_removeAt(a,b),!0):!1}goog.array.removeIf=module$contents$goog$array_removeIf; +function module$contents$goog$array_removeAllIf(a,b,c){let d=0;module$contents$goog$array_forEachRight(a,function(e,f){b.call(c,e,f,a)&&module$contents$goog$array_removeAt(a,f)&&d++});return d}goog.array.removeAllIf=module$contents$goog$array_removeAllIf;function module$contents$goog$array_concat(a){return Array.prototype.concat.apply([],arguments)}goog.array.concat=module$contents$goog$array_concat;function module$contents$goog$array_join(a){return Array.prototype.concat.apply([],arguments)} +goog.array.join=module$contents$goog$array_join;function module$contents$goog$array_toArray(a){const b=a.length;if(0=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)}goog.array.slice=module$contents$goog$array_slice; +function module$contents$goog$array_removeDuplicates(a,b,c){b=b||a;var d=function(g){return goog.isObject(g)?"o"+goog.getUid(g):(typeof g).charAt(0)+g};c=c||d;let e=d=0;const f={};for(;e>>1);let n;n=c?b.call(e,a[k],k,a):b(d,a[k]);0b?1:ac?(module$contents$goog$array_insertAt(a,b,-(c+1)),!0):!1}goog.array.binaryInsert=module$contents$goog$array_binaryInsert;function module$contents$goog$array_binaryRemove(a,b,c){b=module$contents$goog$array_binarySearch(a,b,c);return 0<=b?module$contents$goog$array_removeAt(a,b):!1}goog.array.binaryRemove=module$contents$goog$array_binaryRemove; +function module$contents$goog$array_bucket(a,b,c){const d={};for(let e=0;ec*(f-e))return[];if(0f;a+=c)d.push(a);return d}goog.array.range=module$contents$goog$array_range;function module$contents$goog$array_repeat(a,b){const c=[];for(let d=0;db&&Array.prototype.push.apply(a,a.splice(0,-b)));return a}goog.array.rotate=module$contents$goog$array_rotate;function module$contents$goog$array_moveItem(a,b,c){goog.asserts.assert(0<=b&&b"}else return void 0===a?"undefined":null===a?"null":typeof a};goog.dom.asserts.getWindow_=function(a){try{var b=a&&a.ownerDocument,c=b&&(b.defaultView||b.parentWindow);c=c||goog.global;if(c.Element&&c.Location)return c}catch(d){}return null};goog.functions={};goog.functions.constant=function(a){return function(){return a}};goog.functions.FALSE=function(){return!1};goog.functions.TRUE=function(){return!0};goog.functions.NULL=function(){return null};goog.functions.UNDEFINED=function(){};goog.functions.EMPTY=goog.functions.UNDEFINED;goog.functions.identity=function(a,b){return a};goog.functions.error=function(a){return function(){throw Error(a);}};goog.functions.fail=function(a){return function(){throw a;}}; +goog.functions.lock=function(a,b){b=b||0;return function(){return a.apply(this,Array.prototype.slice.call(arguments,0,b))}};goog.functions.nth=function(a){return function(){return arguments[a]}};goog.functions.partialRight=function(a,b){const c=Array.prototype.slice.call(arguments,1);return function(){let d=this;d===goog.global&&(d=void 0);const e=Array.prototype.slice.call(arguments);e.push.apply(e,c);return a.apply(d,e)}}; +goog.functions.withReturnValue=function(a,b){return goog.functions.sequence(a,goog.functions.constant(b))};goog.functions.equalTo=function(a,b){return function(c){return b?a==c:a===c}};goog.functions.compose=function(a,b){const c=arguments,d=c.length;return function(){let e;d&&(e=c[d-1].apply(this,arguments));for(let f=d-2;0<=f;f--)e=c[f].call(this,e);return e}}; +goog.functions.sequence=function(a){const b=arguments,c=b.length;return function(){let d;for(let e=0;e"function"===typeof a;goog.string={};goog.string.TypedString=function(){};goog.string.Const=function(a,b){this.stringConstValueWithSecurityContract__googStringSecurityPrivate_=a===goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_&&b||"";this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_=goog.string.Const.TYPE_MARKER_};goog.string.Const.prototype.implementsGoogStringTypedString=!0;goog.string.Const.prototype.getTypedStringValue=function(){return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_}; +goog.DEBUG&&(goog.string.Const.prototype.toString=function(){return"Const{"+this.stringConstValueWithSecurityContract__googStringSecurityPrivate_+"}"});goog.string.Const.unwrap=function(a){if(a instanceof goog.string.Const&&a.constructor===goog.string.Const&&a.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_===goog.string.Const.TYPE_MARKER_)return a.stringConstValueWithSecurityContract__googStringSecurityPrivate_;goog.asserts.fail("expected object of type Const, got '"+a+"'");return"type_error:Const"}; +goog.string.Const.from=function(a){return new goog.string.Const(goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_,a)};goog.string.Const.TYPE_MARKER_={};goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_={};goog.string.Const.EMPTY=goog.string.Const.from("");goog.html={};goog.html.trustedtypes={};goog.html.trustedtypes.POLICY_NAME=goog.TRUSTED_TYPES_POLICY_NAME?goog.TRUSTED_TYPES_POLICY_NAME+"#html":"";goog.html.trustedtypes.getPolicyPrivateDoNotAccessOrElse=function(){if(!goog.html.trustedtypes.POLICY_NAME)return null;void 0===goog.html.trustedtypes.cachedPolicy_&&(goog.html.trustedtypes.cachedPolicy_=goog.createTrustedTypesPolicy(goog.html.trustedtypes.POLICY_NAME));return goog.html.trustedtypes.cachedPolicy_};const module$contents$goog$html$SafeScript_CONSTRUCTOR_TOKEN_PRIVATE={}; +class module$contents$goog$html$SafeScript_SafeScript{constructor(a,b){this.privateDoNotAccessOrElseSafeScriptWrappedValue_=b===module$contents$goog$html$SafeScript_CONSTRUCTOR_TOKEN_PRIVATE?a:"";this.implementsGoogStringTypedString=!0}toString(){return this.privateDoNotAccessOrElseSafeScriptWrappedValue_.toString()}static fromConstant(a){a=goog.string.Const.unwrap(a);return 0===a.length?module$contents$goog$html$SafeScript_SafeScript.EMPTY:module$contents$goog$html$SafeScript_SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(a)}static fromJson(a){return module$contents$goog$html$SafeScript_SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(module$contents$goog$html$SafeScript_SafeScript.stringify_(a))}getTypedStringValue(){return this.privateDoNotAccessOrElseSafeScriptWrappedValue_.toString()}static unwrap(a){return module$contents$goog$html$SafeScript_SafeScript.unwrapTrustedScript(a).toString()}static unwrapTrustedScript(a){if(a instanceof +module$contents$goog$html$SafeScript_SafeScript&&a.constructor===module$contents$goog$html$SafeScript_SafeScript)return a.privateDoNotAccessOrElseSafeScriptWrappedValue_;(0,goog.asserts.fail)("expected object of type SafeScript, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeScript"}static stringify_(a){return JSON.stringify(a).replace(/a.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)))}}return b};goog.string.internal={};goog.string.internal.startsWith=function(a,b){return 0==a.lastIndexOf(b,0)};goog.string.internal.endsWith=function(a,b){const c=a.length-b.length;return 0<=c&&a.indexOf(b,c)==c};goog.string.internal.caseInsensitiveStartsWith=function(a,b){return 0==goog.string.internal.caseInsensitiveCompare(b,a.slice(0,b.length))};goog.string.internal.caseInsensitiveEndsWith=function(a,b){return 0==goog.string.internal.caseInsensitiveCompare(b,a.slice(a.length-b.length))}; +goog.string.internal.caseInsensitiveEquals=function(a,b){return a.toLowerCase()==b.toLowerCase()};goog.string.internal.isEmptyOrWhitespace=function(a){return/^[\s\xa0]*$/.test(a)};goog.string.internal.trim=goog.TRUSTED_SITE&&String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};goog.string.internal.caseInsensitiveCompare=function(a,b){a=String(a).toLowerCase();b=String(b).toLowerCase();return a":"
")}; +goog.string.internal.htmlEscape=function(a,b){if(b)a=a.replace(goog.string.internal.AMP_RE_,"&").replace(goog.string.internal.LT_RE_,"<").replace(goog.string.internal.GT_RE_,">").replace(goog.string.internal.QUOT_RE_,""").replace(goog.string.internal.SINGLE_QUOTE_RE_,"'").replace(goog.string.internal.NULL_RE_,"�");else{if(!goog.string.internal.ALL_RE_.test(a))return a;-1!=a.indexOf("&")&&(a=a.replace(goog.string.internal.AMP_RE_,"&"));-1!=a.indexOf("<")&&(a=a.replace(goog.string.internal.LT_RE_, +"<"));-1!=a.indexOf(">")&&(a=a.replace(goog.string.internal.GT_RE_,">"));-1!=a.indexOf('"')&&(a=a.replace(goog.string.internal.QUOT_RE_,"""));-1!=a.indexOf("'")&&(a=a.replace(goog.string.internal.SINGLE_QUOTE_RE_,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(goog.string.internal.NULL_RE_,"�"))}return a};goog.string.internal.AMP_RE_=/&/g;goog.string.internal.LT_RE_=//g;goog.string.internal.QUOT_RE_=/"/g;goog.string.internal.SINGLE_QUOTE_RE_=/'/g; +goog.string.internal.NULL_RE_=/\x00/g;goog.string.internal.ALL_RE_=/[\x00&<>"']/;goog.string.internal.whitespaceEscape=function(a,b){return goog.string.internal.newLineToBr(a.replace(/ /g,"  "),b)};goog.string.internal.contains=function(a,b){return-1!=a.indexOf(b)};goog.string.internal.caseInsensitiveContains=function(a,b){return goog.string.internal.contains(a.toLowerCase(),b.toLowerCase())}; +goog.string.internal.compareVersions=function(a,b){var c=0;a=goog.string.internal.trim(String(a)).split(".");b=goog.string.internal.trim(String(b)).split(".");const d=Math.max(a.length,b.length);for(let g=0;0==c&&gb?1:0};goog.html.SafeUrl=class{constructor(a,b){this.privateDoNotAccessOrElseSafeUrlWrappedValue_=b===goog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_?a:""}toString(){return this.privateDoNotAccessOrElseSafeUrlWrappedValue_.toString()}};goog.html.SafeUrl.INNOCUOUS_STRING="about:invalid#zClosurez";goog.html.SafeUrl.prototype.implementsGoogStringTypedString=!0;goog.html.SafeUrl.prototype.getTypedStringValue=function(){return this.privateDoNotAccessOrElseSafeUrlWrappedValue_.toString()}; +goog.html.SafeUrl.unwrap=function(a){if(a instanceof goog.html.SafeUrl&&a.constructor===goog.html.SafeUrl)return a.privateDoNotAccessOrElseSafeUrlWrappedValue_;goog.asserts.fail("expected object of type SafeUrl, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeUrl"};goog.html.SafeUrl.fromConstant=function(a){return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))}; +goog.html.SAFE_MIME_TYPE_PATTERN_=RegExp('^(?:audio/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font/\\w+|image/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon|heic|heif)|video/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\\w+=(?:\\w+|"[\\w;,= ]+"))*$',"i");goog.html.SafeUrl.isSafeMimeType=function(a){return goog.html.SAFE_MIME_TYPE_PATTERN_.test(a)}; +goog.html.SafeUrl.fromBlob=function(a){a=goog.html.SafeUrl.isSafeMimeType(a.type)?goog.fs.url.createObjectUrl(a):goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.revokeObjectUrl=function(a){a=a.getTypedStringValue();a!==goog.html.SafeUrl.INNOCUOUS_STRING&&goog.fs.url.revokeObjectUrl(a)}; +goog.html.SafeUrl.fromMediaSource=function(a){goog.asserts.assert("MediaSource"in goog.global,"No support for MediaSource");a=a instanceof MediaSource?goog.fs.url.createObjectUrl(a):goog.html.SafeUrl.INNOCUOUS_STRING;return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.DATA_URL_PATTERN_=/^data:(.*);base64,[a-z0-9+\/]+=*$/i; +goog.html.SafeUrl.tryFromDataUrl=function(a){a=String(a);a=a.replace(/(%0A|%0D)/g,"");return a.match(goog.html.DATA_URL_PATTERN_)?goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a):null};goog.html.SafeUrl.fromDataUrl=function(a){return goog.html.SafeUrl.tryFromDataUrl(a)||goog.html.SafeUrl.INNOCUOUS_URL};goog.html.SafeUrl.fromTelUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"tel:")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)}; +goog.html.SIP_URL_PATTERN_=RegExp("^sip[s]?:[+a-z0-9_.!$%&'*\\/=^`{|}~-]+@([a-z0-9-]+\\.)+[a-z0-9]{2,63}$","i");goog.html.SafeUrl.fromSipUrl=function(a){goog.html.SIP_URL_PATTERN_.test(decodeURIComponent(a))||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.fromFacebookMessengerUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"fb-messenger://share")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)}; +goog.html.SafeUrl.fromWhatsAppUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"whatsapp://send")||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)};goog.html.SafeUrl.fromSmsUrl=function(a){goog.string.internal.caseInsensitiveStartsWith(a,"sms:")&&goog.html.SafeUrl.isSmsUrlBodyValid_(a)||(a=goog.html.SafeUrl.INNOCUOUS_STRING);return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)}; +goog.html.SafeUrl.isSmsUrlBodyValid_=function(a){var b=a.indexOf("#");0{Array.isArray(d)?d.forEach(c):b+=module$contents$goog$html$SafeStyle_SafeStyle.unwrap(d)};Array.prototype.forEach.call(arguments,c); +return b?module$contents$goog$html$SafeStyle_SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b):module$contents$goog$html$SafeStyle_SafeStyle.EMPTY}}module$contents$goog$html$SafeStyle_SafeStyle.EMPTY=module$contents$goog$html$SafeStyle_SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse("");module$contents$goog$html$SafeStyle_SafeStyle.INNOCUOUS_STRING="zClosurez"; +function module$contents$goog$html$SafeStyle_sanitizePropertyValue(a){if(a instanceof goog.html.SafeUrl)return'url("'+goog.html.SafeUrl.unwrap(a).replace(/{let f="";d=d.replace(/^(['"])(.*)\1$/,(g,h,k)=>{f=h;return k});b=goog.html.SafeUrl.sanitize(d).getTypedStringValue();return c+f+b+f+e})} +goog.html.SafeStyle=module$contents$goog$html$SafeStyle_SafeStyle;goog.object={};function module$contents$goog$object_forEach(a,b,c){for(const d in a)b.call(c,a[d],d,a)}function module$contents$goog$object_filter(a,b,c){const d={};for(const e in a)b.call(c,a[e],e,a)&&(d[e]=a[e]);return d}function module$contents$goog$object_map(a,b,c){const d={};for(const e in a)d[e]=b.call(c,a[e],e,a);return d}function module$contents$goog$object_some(a,b,c){for(const d in a)if(b.call(c,a[d],d,a))return!0;return!1} +function module$contents$goog$object_every(a,b,c){for(const d in a)if(!b.call(c,a[d],d,a))return!1;return!0}function module$contents$goog$object_getCount(a){let b=0;for(const c in a)b++;return b}function module$contents$goog$object_getAnyKey(a){for(const b in a)return b}function module$contents$goog$object_getAnyValue(a){for(const b in a)return a[b]}function module$contents$goog$object_contains(a,b){return module$contents$goog$object_containsValue(a,b)} +function module$contents$goog$object_getValues(a){const b=[];let c=0;for(const d in a)b[c++]=a[d];return b}function module$contents$goog$object_getKeys(a){const b=[];let c=0;for(const d in a)b[c++]=d;return b}function module$contents$goog$object_getValueByKeys(a,b){var c=goog.isArrayLike(b);const d=c?b:arguments;for(c=c?0:1;c+~[\]()=^$|]+$/.test(c))throw Error("Selector allows only [-_a-zA-Z0-9#.:* ,>+~[\\]()=^$|] and strings, got: "+a);if(!module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.hasBalancedBrackets_(c))throw Error("() and [] in selector must be balanced, got: "+a);b instanceof module$contents$goog$html$SafeStyle_SafeStyle||(b=module$contents$goog$html$SafeStyle_SafeStyle.create(b));a=`${a}{`+module$contents$goog$html$SafeStyle_SafeStyle.unwrap(b).replace(/{Array.isArray(d)?d.forEach(c):b+=module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.unwrap(d)};Array.prototype.forEach.call(arguments, +c);return module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)}static fromConstant(a){a=goog.string.Const.unwrap(a);if(0===a.length)return module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.EMPTY;(0,goog.asserts.assert)(!(0,goog.string.internal.contains)(a,"<"),`Forbidden '<' character in style sheet string: ${a}`);return module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)}getTypedStringValue(){return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_}static unwrap(a){if(a instanceof +module$contents$goog$html$SafeStyleSheet_SafeStyleSheet&&a.constructor===module$contents$goog$html$SafeStyleSheet_SafeStyleSheet)return a.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;(0,goog.asserts.fail)("expected object of type SafeStyleSheet, got '"+a+"' of type "+goog.typeOf(a));return"type_error:SafeStyleSheet"}static createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a){return new module$contents$goog$html$SafeStyleSheet_SafeStyleSheet(a,module$contents$goog$html$SafeStyleSheet_CONSTRUCTOR_TOKEN_PRIVATE)}} +module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.EMPTY=module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse("");goog.html.SafeStyleSheet=module$contents$goog$html$SafeStyleSheet_SafeStyleSheet;goog.dom.HtmlElement=function(){};goog.dom.TagName=class{static cast(a,b){return a}constructor(){}toString(){}};goog.dom.TagName.A="A";goog.dom.TagName.ABBR="ABBR";goog.dom.TagName.ACRONYM="ACRONYM";goog.dom.TagName.ADDRESS="ADDRESS";goog.dom.TagName.APPLET="APPLET";goog.dom.TagName.AREA="AREA";goog.dom.TagName.ARTICLE="ARTICLE";goog.dom.TagName.ASIDE="ASIDE";goog.dom.TagName.AUDIO="AUDIO";goog.dom.TagName.B="B";goog.dom.TagName.BASE="BASE";goog.dom.TagName.BASEFONT="BASEFONT";goog.dom.TagName.BDI="BDI";goog.dom.TagName.BDO="BDO"; +goog.dom.TagName.BIG="BIG";goog.dom.TagName.BLOCKQUOTE="BLOCKQUOTE";goog.dom.TagName.BODY="BODY";goog.dom.TagName.BR="BR";goog.dom.TagName.BUTTON="BUTTON";goog.dom.TagName.CANVAS="CANVAS";goog.dom.TagName.CAPTION="CAPTION";goog.dom.TagName.CENTER="CENTER";goog.dom.TagName.CITE="CITE";goog.dom.TagName.CODE="CODE";goog.dom.TagName.COL="COL";goog.dom.TagName.COLGROUP="COLGROUP";goog.dom.TagName.COMMAND="COMMAND";goog.dom.TagName.DATA="DATA";goog.dom.TagName.DATALIST="DATALIST";goog.dom.TagName.DD="DD"; +goog.dom.TagName.DEL="DEL";goog.dom.TagName.DETAILS="DETAILS";goog.dom.TagName.DFN="DFN";goog.dom.TagName.DIALOG="DIALOG";goog.dom.TagName.DIR="DIR";goog.dom.TagName.DIV="DIV";goog.dom.TagName.DL="DL";goog.dom.TagName.DT="DT";goog.dom.TagName.EM="EM";goog.dom.TagName.EMBED="EMBED";goog.dom.TagName.FIELDSET="FIELDSET";goog.dom.TagName.FIGCAPTION="FIGCAPTION";goog.dom.TagName.FIGURE="FIGURE";goog.dom.TagName.FONT="FONT";goog.dom.TagName.FOOTER="FOOTER";goog.dom.TagName.FORM="FORM"; +goog.dom.TagName.FRAME="FRAME";goog.dom.TagName.FRAMESET="FRAMESET";goog.dom.TagName.H1="H1";goog.dom.TagName.H2="H2";goog.dom.TagName.H3="H3";goog.dom.TagName.H4="H4";goog.dom.TagName.H5="H5";goog.dom.TagName.H6="H6";goog.dom.TagName.HEAD="HEAD";goog.dom.TagName.HEADER="HEADER";goog.dom.TagName.HGROUP="HGROUP";goog.dom.TagName.HR="HR";goog.dom.TagName.HTML="HTML";goog.dom.TagName.I="I";goog.dom.TagName.IFRAME="IFRAME";goog.dom.TagName.IMG="IMG";goog.dom.TagName.INPUT="INPUT"; +goog.dom.TagName.INS="INS";goog.dom.TagName.ISINDEX="ISINDEX";goog.dom.TagName.KBD="KBD";goog.dom.TagName.KEYGEN="KEYGEN";goog.dom.TagName.LABEL="LABEL";goog.dom.TagName.LEGEND="LEGEND";goog.dom.TagName.LI="LI";goog.dom.TagName.LINK="LINK";goog.dom.TagName.MAIN="MAIN";goog.dom.TagName.MAP="MAP";goog.dom.TagName.MARK="MARK";goog.dom.TagName.MATH="MATH";goog.dom.TagName.MENU="MENU";goog.dom.TagName.MENUITEM="MENUITEM";goog.dom.TagName.META="META";goog.dom.TagName.METER="METER"; +goog.dom.TagName.NAV="NAV";goog.dom.TagName.NOFRAMES="NOFRAMES";goog.dom.TagName.NOSCRIPT="NOSCRIPT";goog.dom.TagName.OBJECT="OBJECT";goog.dom.TagName.OL="OL";goog.dom.TagName.OPTGROUP="OPTGROUP";goog.dom.TagName.OPTION="OPTION";goog.dom.TagName.OUTPUT="OUTPUT";goog.dom.TagName.P="P";goog.dom.TagName.PARAM="PARAM";goog.dom.TagName.PICTURE="PICTURE";goog.dom.TagName.PRE="PRE";goog.dom.TagName.PROGRESS="PROGRESS";goog.dom.TagName.Q="Q";goog.dom.TagName.RP="RP";goog.dom.TagName.RT="RT"; +goog.dom.TagName.RTC="RTC";goog.dom.TagName.RUBY="RUBY";goog.dom.TagName.S="S";goog.dom.TagName.SAMP="SAMP";goog.dom.TagName.SCRIPT="SCRIPT";goog.dom.TagName.SECTION="SECTION";goog.dom.TagName.SELECT="SELECT";goog.dom.TagName.SMALL="SMALL";goog.dom.TagName.SOURCE="SOURCE";goog.dom.TagName.SPAN="SPAN";goog.dom.TagName.STRIKE="STRIKE";goog.dom.TagName.STRONG="STRONG";goog.dom.TagName.STYLE="STYLE";goog.dom.TagName.SUB="SUB";goog.dom.TagName.SUMMARY="SUMMARY";goog.dom.TagName.SUP="SUP"; +goog.dom.TagName.SVG="SVG";goog.dom.TagName.TABLE="TABLE";goog.dom.TagName.TBODY="TBODY";goog.dom.TagName.TD="TD";goog.dom.TagName.TEMPLATE="TEMPLATE";goog.dom.TagName.TEXTAREA="TEXTAREA";goog.dom.TagName.TFOOT="TFOOT";goog.dom.TagName.TH="TH";goog.dom.TagName.THEAD="THEAD";goog.dom.TagName.TIME="TIME";goog.dom.TagName.TITLE="TITLE";goog.dom.TagName.TR="TR";goog.dom.TagName.TRACK="TRACK";goog.dom.TagName.TT="TT";goog.dom.TagName.U="U";goog.dom.TagName.UL="UL";goog.dom.TagName.VAR="VAR"; +goog.dom.TagName.VIDEO="VIDEO";goog.dom.TagName.WBR="WBR";goog.labs={};goog.labs.userAgent={};const module$contents$goog$labs$userAgent_USE_CLIENT_HINTS_OVERRIDE="",module$contents$goog$labs$userAgent_USE_CLIENT_HINTS=!1;let module$contents$goog$labs$userAgent_forceClientHintsInTests=!1;goog.labs.userAgent.setUseClientHintsForTesting=a=>{module$contents$goog$labs$userAgent_forceClientHintsInTests=a}; +const module$contents$goog$labs$userAgent_useClientHintsRuntimeOverride=module$contents$goog$labs$userAgent_USE_CLIENT_HINTS_OVERRIDE?!!goog.getObjectByName(module$contents$goog$labs$userAgent_USE_CLIENT_HINTS_OVERRIDE):!1;goog.labs.userAgent.useClientHints=()=>module$contents$goog$labs$userAgent_USE_CLIENT_HINTS||module$contents$goog$labs$userAgent_useClientHintsRuntimeOverride||module$contents$goog$labs$userAgent_forceClientHintsInTests;goog.labs.userAgent.util={};const module$contents$goog$labs$userAgent$util_ASSUME_CLIENT_HINTS_SUPPORT=!1;function module$contents$goog$labs$userAgent$util_getNativeUserAgentString(){var a=module$contents$goog$labs$userAgent$util_getNavigator();return a&&(a=a.userAgent)?a:""}function module$contents$goog$labs$userAgent$util_getNativeUserAgentData(){const a=module$contents$goog$labs$userAgent$util_getNavigator();return a?a.userAgentData||null:null} +function module$contents$goog$labs$userAgent$util_getNavigator(){return goog.global.navigator}let module$contents$goog$labs$userAgent$util_userAgentInternal=null,module$contents$goog$labs$userAgent$util_userAgentDataInternal=module$contents$goog$labs$userAgent$util_getNativeUserAgentData(); +function module$contents$goog$labs$userAgent$util_setUserAgent(a){module$contents$goog$labs$userAgent$util_userAgentInternal="string"===typeof a?a:module$contents$goog$labs$userAgent$util_getNativeUserAgentString()}function module$contents$goog$labs$userAgent$util_getUserAgent(){return null==module$contents$goog$labs$userAgent$util_userAgentInternal?module$contents$goog$labs$userAgent$util_getNativeUserAgentString():module$contents$goog$labs$userAgent$util_userAgentInternal} +function module$contents$goog$labs$userAgent$util_setUserAgentData(a){module$contents$goog$labs$userAgent$util_userAgentDataInternal=a}function module$contents$goog$labs$userAgent$util_resetUserAgentData(){module$contents$goog$labs$userAgent$util_userAgentDataInternal=module$contents$goog$labs$userAgent$util_getNativeUserAgentData()}function module$contents$goog$labs$userAgent$util_getUserAgentData(){return module$contents$goog$labs$userAgent$util_userAgentDataInternal} +function module$contents$goog$labs$userAgent$util_matchUserAgentDataBrand(a){if(!(0,goog.labs.userAgent.useClientHints)())return!1;const b=module$contents$goog$labs$userAgent$util_getUserAgentData();return b?b.brands.some(({brand:c})=>c&&(0,goog.string.internal.contains)(c,a)):!1}function module$contents$goog$labs$userAgent$util_matchUserAgent(a){const b=module$contents$goog$labs$userAgent$util_getUserAgent();return(0,goog.string.internal.contains)(b,a)} +function module$contents$goog$labs$userAgent$util_matchUserAgentIgnoreCase(a){const b=module$contents$goog$labs$userAgent$util_getUserAgent();return(0,goog.string.internal.caseInsensitiveContains)(b,a)}function module$contents$goog$labs$userAgent$util_extractVersionTuples(a){const b=RegExp("([A-Z][\\w ]+)/([^\\s]+)\\s*(?:\\((.*?)\\))?","g"),c=[];let d;for(;d=b.exec(a);)c.push([d[1],d[2],d[3]||void 0]);return c}goog.labs.userAgent.util.ASSUME_CLIENT_HINTS_SUPPORT=module$contents$goog$labs$userAgent$util_ASSUME_CLIENT_HINTS_SUPPORT; +goog.labs.userAgent.util.extractVersionTuples=module$contents$goog$labs$userAgent$util_extractVersionTuples;goog.labs.userAgent.util.getNativeUserAgentString=module$contents$goog$labs$userAgent$util_getNativeUserAgentString;goog.labs.userAgent.util.getUserAgent=module$contents$goog$labs$userAgent$util_getUserAgent;goog.labs.userAgent.util.getUserAgentData=module$contents$goog$labs$userAgent$util_getUserAgentData;goog.labs.userAgent.util.matchUserAgent=module$contents$goog$labs$userAgent$util_matchUserAgent; +goog.labs.userAgent.util.matchUserAgentDataBrand=module$contents$goog$labs$userAgent$util_matchUserAgentDataBrand;goog.labs.userAgent.util.matchUserAgentIgnoreCase=module$contents$goog$labs$userAgent$util_matchUserAgentIgnoreCase;goog.labs.userAgent.util.resetUserAgentData=module$contents$goog$labs$userAgent$util_resetUserAgentData;goog.labs.userAgent.util.setUserAgent=module$contents$goog$labs$userAgent$util_setUserAgent;goog.labs.userAgent.util.setUserAgentData=module$contents$goog$labs$userAgent$util_setUserAgentData;var module$exports$goog$labs$userAgent$highEntropy$highEntropyValue={AsyncValue:class{getIfLoaded(){}load(){}},HighEntropyValue:class{constructor(a){this.key_=a;this.promise_=this.value_=void 0;this.pending_=!1}getIfLoaded(){if(module$contents$goog$labs$userAgent$util_getUserAgentData())return this.value_}async load(){const a=module$contents$goog$labs$userAgent$util_getUserAgentData();if(a)return this.promise_||(this.pending_=!0,this.promise_=(async()=>{try{return this.value_=(await a.getHighEntropyValues([this.key_]))[this.key_]}finally{this.pending_= +!1}})()),await this.promise_}resetForTesting(){if(this.pending_)throw Error("Unsafe call to resetForTesting");this.value_=this.promise_=void 0;this.pending_=!1}},Version:class{constructor(a){this.versionString_=a}toVersionStringForLogging(){return this.versionString_}isAtLeast(a){return 0<=(0,goog.string.internal.compareVersions)(this.versionString_,a)}}};var module$exports$goog$labs$userAgent$highEntropy$highEntropyData={};module$exports$goog$labs$userAgent$highEntropy$highEntropyData.fullVersionList=new module$exports$goog$labs$userAgent$highEntropy$highEntropyValue.HighEntropyValue("fullVersionList");module$exports$goog$labs$userAgent$highEntropy$highEntropyData.platformVersion=new module$exports$goog$labs$userAgent$highEntropy$highEntropyValue.HighEntropyValue("platformVersion");goog.labs.userAgent.browser={};const module$contents$goog$labs$userAgent$browser_Brand={ANDROID_BROWSER:"Android Browser",CHROMIUM:"Chromium",EDGE:"Microsoft Edge",FIREFOX:"Firefox",IE:"Internet Explorer",OPERA:"Opera",SAFARI:"Safari",SILK:"Silk"};goog.labs.userAgent.browser.Brand=module$contents$goog$labs$userAgent$browser_Brand; +function module$contents$goog$labs$userAgent$browser_useUserAgentDataBrand(a=!1){if(module$contents$goog$labs$userAgent$util_ASSUME_CLIENT_HINTS_SUPPORT)return!0;if(!a&&!(0,goog.labs.userAgent.useClientHints)())return!1;a=module$contents$goog$labs$userAgent$util_getUserAgentData();return!!a&&0{b[c[0]]=c[1]});return c=>b[c.find(d=>d in b)]||""} +function module$contents$goog$labs$userAgent$browser_getVersion(){var a=module$contents$goog$labs$userAgent$util_getUserAgent();if(module$contents$goog$labs$userAgent$browser_matchIE())return module$contents$goog$labs$userAgent$browser_getIEVersion(a);a=module$contents$goog$labs$userAgent$util_extractVersionTuples(a);const b=module$contents$goog$labs$userAgent$browser_createVersionMap(a);return module$contents$goog$labs$userAgent$browser_matchOpera()?b(["Version","Opera"]):module$contents$goog$labs$userAgent$browser_matchEdgeHtml()? +b(["Edge"]):module$contents$goog$labs$userAgent$browser_matchEdgeChromium()?b(["Edg"]):module$contents$goog$labs$userAgent$browser_isSilk()?b(["Silk"]):module$contents$goog$labs$userAgent$browser_matchChrome()?b(["Chrome","CriOS","HeadlessChrome"]):(a=a[2])&&a[1]||""}goog.labs.userAgent.browser.getVersion=module$contents$goog$labs$userAgent$browser_getVersion; +function module$contents$goog$labs$userAgent$browser_isVersionOrHigher(a){return 0<=(0,goog.string.internal.compareVersions)(module$contents$goog$labs$userAgent$browser_getVersion(),a)}goog.labs.userAgent.browser.isVersionOrHigher=module$contents$goog$labs$userAgent$browser_isVersionOrHigher; +function module$contents$goog$labs$userAgent$browser_getIEVersion(a){var b=/rv: *([\d\.]*)/.exec(a);if(b&&b[1])return b[1];b="";const c=/MSIE +([\d\.]+)/.exec(a);if(c&&c[1])if(a=/Trident\/(\d.\d)/.exec(a),"7.0"==c[1])if(a&&a[1])switch(a[1]){case "4.0":b="8.0";break;case "5.0":b="9.0";break;case "6.0":b="10.0";break;case "7.0":b="11.0"}else b="7.0";else b=c[1];return b} +function module$contents$goog$labs$userAgent$browser_getFullVersionFromUserAgentString(a){var b=module$contents$goog$labs$userAgent$util_getUserAgent();if(a===module$contents$goog$labs$userAgent$browser_Brand.IE)return module$contents$goog$labs$userAgent$browser_matchIE()?module$contents$goog$labs$userAgent$browser_getIEVersion(b):"";b=module$contents$goog$labs$userAgent$util_extractVersionTuples(b);const c=module$contents$goog$labs$userAgent$browser_createVersionMap(b);switch(a){case module$contents$goog$labs$userAgent$browser_Brand.OPERA:if(module$contents$goog$labs$userAgent$browser_matchOpera())return c(["Version", +"Opera"]);if(module$contents$goog$labs$userAgent$browser_matchOperaChromium())return c(["OPR"]);break;case module$contents$goog$labs$userAgent$browser_Brand.EDGE:if(module$contents$goog$labs$userAgent$browser_matchEdgeHtml())return c(["Edge"]);if(module$contents$goog$labs$userAgent$browser_matchEdgeChromium())return c(["Edg"]);break;case module$contents$goog$labs$userAgent$browser_Brand.CHROMIUM:if(module$contents$goog$labs$userAgent$browser_matchChrome())return c(["Chrome","CriOS","HeadlessChrome"])}return a=== +module$contents$goog$labs$userAgent$browser_Brand.FIREFOX&&module$contents$goog$labs$userAgent$browser_matchFirefox()||a===module$contents$goog$labs$userAgent$browser_Brand.SAFARI&&module$contents$goog$labs$userAgent$browser_matchSafari()||a===module$contents$goog$labs$userAgent$browser_Brand.ANDROID_BROWSER&&module$contents$goog$labs$userAgent$browser_matchAndroidBrowser()||a===module$contents$goog$labs$userAgent$browser_Brand.SILK&&module$contents$goog$labs$userAgent$browser_isSilk()?(a=b[2])&& +a[1]||"":""} +function module$contents$goog$labs$userAgent$browser_versionOf_(a){if(module$contents$goog$labs$userAgent$browser_useUserAgentDataBrand()&&a!==module$contents$goog$labs$userAgent$browser_Brand.SILK){var b=module$contents$goog$labs$userAgent$util_getUserAgentData().brands.find(({brand:c})=>c===a);if(!b||!b.version)return NaN;b=b.version.split(".")}else{b=module$contents$goog$labs$userAgent$browser_getFullVersionFromUserAgentString(a);if(""===b)return NaN;b=b.split(".")}return 0===b.length?NaN:Number(b[0])} +function module$contents$goog$labs$userAgent$browser_isAtLeast(a,b){(0,goog.asserts.assert)(Math.floor(b)===b,"Major version must be an integer");return module$contents$goog$labs$userAgent$browser_versionOf_(a)>=b}goog.labs.userAgent.browser.isAtLeast=module$contents$goog$labs$userAgent$browser_isAtLeast; +function module$contents$goog$labs$userAgent$browser_isAtMost(a,b){(0,goog.asserts.assert)(Math.floor(b)===b,"Major version must be an integer");return module$contents$goog$labs$userAgent$browser_versionOf_(a)<=b}goog.labs.userAgent.browser.isAtMost=module$contents$goog$labs$userAgent$browser_isAtMost; +class module$contents$goog$labs$userAgent$browser_HighEntropyBrandVersion{constructor(a,b,c){this.brand_=a;this.version_=new module$exports$goog$labs$userAgent$highEntropy$highEntropyValue.Version(c);this.useUach_=b}getIfLoaded(){if(this.useUach_){var a=module$exports$goog$labs$userAgent$highEntropy$highEntropyData.fullVersionList.getIfLoaded();if(void 0!==a)return a=a.find(({brand:b})=>this.brand_===b),(0,goog.asserts.assertExists)(a),new module$exports$goog$labs$userAgent$highEntropy$highEntropyValue.Version(a.version)}if(module$contents$goog$labs$userAgent$browser_preUachHasLoaded)return this.version_}async load(){if(this.useUach_){var a= +await module$exports$goog$labs$userAgent$highEntropy$highEntropyData.fullVersionList.load();if(void 0!==a)return a=a.find(({brand:b})=>this.brand_===b),(0,goog.asserts.assertExists)(a),new module$exports$goog$labs$userAgent$highEntropy$highEntropyValue.Version(a.version)}else await 0;module$contents$goog$labs$userAgent$browser_preUachHasLoaded=!0;return this.version_}}let module$contents$goog$labs$userAgent$browser_preUachHasLoaded=!1; +async function module$contents$goog$labs$userAgent$browser_loadFullVersions(){module$contents$goog$labs$userAgent$browser_useUserAgentDataBrand(!0)&&await module$exports$goog$labs$userAgent$highEntropy$highEntropyData.fullVersionList.load();module$contents$goog$labs$userAgent$browser_preUachHasLoaded=!0}goog.labs.userAgent.browser.loadFullVersions=module$contents$goog$labs$userAgent$browser_loadFullVersions; +goog.labs.userAgent.browser.resetForTesting=()=>{module$contents$goog$labs$userAgent$browser_preUachHasLoaded=!1;module$exports$goog$labs$userAgent$highEntropy$highEntropyData.fullVersionList.resetForTesting()}; +function module$contents$goog$labs$userAgent$browser_fullVersionOf(a){let b="";module$contents$goog$labs$userAgent$browser_hasFullVersionList()||(b=module$contents$goog$labs$userAgent$browser_getFullVersionFromUserAgentString(a));const c=a!==module$contents$goog$labs$userAgent$browser_Brand.SILK&&module$contents$goog$labs$userAgent$browser_useUserAgentDataBrand(!0);if(c){if(!module$contents$goog$labs$userAgent$util_getUserAgentData().brands.find(({brand:d})=>d===a))return}else if(""===b)return;return new module$contents$goog$labs$userAgent$browser_HighEntropyBrandVersion(a, +c,b)}goog.labs.userAgent.browser.fullVersionOf=module$contents$goog$labs$userAgent$browser_fullVersionOf; +function module$contents$goog$labs$userAgent$browser_getVersionStringForLogging(a){if(module$contents$goog$labs$userAgent$browser_useUserAgentDataBrand(!0)){var b=module$contents$goog$labs$userAgent$browser_fullVersionOf(a);if(b){if(b=b.getIfLoaded())return b.toVersionStringForLogging();b=module$contents$goog$labs$userAgent$util_getUserAgentData().brands.find(({brand:c})=>c===a);(0,goog.asserts.assertExists)(b);return b.version}return""}return module$contents$goog$labs$userAgent$browser_getFullVersionFromUserAgentString(a)} +goog.labs.userAgent.browser.getVersionStringForLogging=module$contents$goog$labs$userAgent$browser_getVersionStringForLogging;goog.dom.tags={};goog.dom.tags.VOID_TAGS_={area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0};goog.dom.tags.isVoidTag=function(a){return!0===goog.dom.tags.VOID_TAGS_[a]};const module$contents$goog$html$SafeHtml_CONSTRUCTOR_TOKEN_PRIVATE={}; +class module$contents$goog$html$SafeHtml_SafeHtml{constructor(a,b){this.privateDoNotAccessOrElseSafeHtmlWrappedValue_=b===module$contents$goog$html$SafeHtml_CONSTRUCTOR_TOKEN_PRIVATE?a:"";this.implementsGoogStringTypedString=!0}getTypedStringValue(){return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_.toString()}toString(){return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_.toString()}static unwrap(a){return module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(a).toString()}static unwrapTrustedHTML(a){if(a instanceof module$contents$goog$html$SafeHtml_SafeHtml&& +a.constructor===module$contents$goog$html$SafeHtml_SafeHtml)return a.privateDoNotAccessOrElseSafeHtmlWrappedValue_;goog.asserts.fail(`expected object of type SafeHtml, got '${a}' of type `+goog.typeOf(a));return"type_error:SafeHtml"}static htmlEscape(a){if(a instanceof module$contents$goog$html$SafeHtml_SafeHtml)return a;a="object"==typeof a&&a.implementsGoogStringTypedString?a.getTypedStringValue():String(a);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.htmlEscape(a))}static htmlEscapePreservingNewlines(a){if(a instanceof +module$contents$goog$html$SafeHtml_SafeHtml)return a;a=module$contents$goog$html$SafeHtml_SafeHtml.htmlEscape(a);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.newLineToBr(module$contents$goog$html$SafeHtml_SafeHtml.unwrap(a)))}static htmlEscapePreservingNewlinesAndSpaces(a){if(a instanceof module$contents$goog$html$SafeHtml_SafeHtml)return a;a=module$contents$goog$html$SafeHtml_SafeHtml.htmlEscape(a);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.whitespaceEscape(module$contents$goog$html$SafeHtml_SafeHtml.unwrap(a)))}static comment(a){return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("\x3c!--"+ +goog.string.internal.htmlEscape(a)+"--\x3e")}static create(a,b,c){module$contents$goog$html$SafeHtml_SafeHtml.verifyTagName(String(a));return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(String(a),b,c)}static verifyTagName(a){if(!module$contents$goog$html$SafeHtml_VALID_NAMES_IN_TAG.test(a))throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES?`Invalid tag name <${a}>.`:"");if(a.toUpperCase()in module$contents$goog$html$SafeHtml_NOT_ALLOWED_TAG_NAMES)throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES? +`Tag name <${a}> is not allowed for SafeHtml.`:"");}static createIframe(a,b,c,d){a&&goog.html.TrustedResourceUrl.unwrap(a);const e={};e.src=a||null;e.srcdoc=b&&module$contents$goog$html$SafeHtml_SafeHtml.unwrap(b);a=module$contents$goog$html$SafeHtml_SafeHtml.combineAttributes(e,{sandbox:""},c);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe",a,d)}static createSandboxIframe(a,b,c,d){if(!module$contents$goog$html$SafeHtml_SafeHtml.canUseSandboxIframe())throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES? +"The browser does not support sandboxed iframes.":"");const e={};e.src=a?goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a)):null;e.srcdoc=b||null;e.sandbox="";a=module$contents$goog$html$SafeHtml_SafeHtml.combineAttributes(e,{},c);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe",a,d)}static canUseSandboxIframe(){return goog.global.HTMLIFrameElement&&"sandbox"in goog.global.HTMLIFrameElement.prototype}static createScriptSrc(a,b){goog.html.TrustedResourceUrl.unwrap(a); +a=module$contents$goog$html$SafeHtml_SafeHtml.combineAttributes({src:a},{},b);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script",a)}static createScript(a,b){for(var c in b)if(Object.prototype.hasOwnProperty.call(b,c)){var d=c.toLowerCase();if("language"==d||"src"==d||"text"==d)throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES?`Cannot set "${d}" attribute`:"");}c="";a=module$contents$goog$array_concat(a);for(d=0;d< +a.length;d++)c+=module$contents$goog$html$SafeScript_SafeScript.unwrap(a[d]);a=module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c);return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script",b,a)}static createStyle(a,b){b=module$contents$goog$html$SafeHtml_SafeHtml.combineAttributes({type:"text/css"},{},b);let c="";a=module$contents$goog$array_concat(a);for(let d=0;d"):(c=module$contents$goog$html$SafeHtml_SafeHtml.concat(c),b+=">"+module$contents$goog$html$SafeHtml_SafeHtml.unwrap(c)+"");return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(b)}static stringifyAttributes(a,b){let c="";if(b)for(let d in b)if(Object.prototype.hasOwnProperty.call(b,d)){if(!module$contents$goog$html$SafeHtml_VALID_NAMES_IN_TAG.test(d))throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES? +`Invalid attribute name "${d}".`:"");const e=b[d];null!=e&&(c+=" "+module$contents$goog$html$SafeHtml_getAttrNameAndValue(a,d,e))}return c}static combineAttributes(a,b,c){const d={};for(var e in a)Object.prototype.hasOwnProperty.call(a,e)&&(goog.asserts.assert(e.toLowerCase()==e,"Must be lower case"),d[e]=a[e]);for(const f in b)Object.prototype.hasOwnProperty.call(b,f)&&(goog.asserts.assert(f.toLowerCase()==f,"Must be lower case"),d[f]=b[f]);if(c)for(const f in c)if(Object.prototype.hasOwnProperty.call(c, +f)){e=f.toLowerCase();if(e in a)throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES?`Cannot override "${e}" attribute, got "`+f+'" with value "'+c[f]+'"':"");e in b&&delete d[e];d[f]=c[f]}return d}}module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES=goog.DEBUG;module$contents$goog$html$SafeHtml_SafeHtml.SUPPORT_STYLE_ATTRIBUTE=!0;module$contents$goog$html$SafeHtml_SafeHtml.from=module$contents$goog$html$SafeHtml_SafeHtml.htmlEscape; +const module$contents$goog$html$SafeHtml_VALID_NAMES_IN_TAG=/^[a-zA-Z0-9-]+$/,module$contents$goog$html$SafeHtml_URL_ATTRIBUTES={action:!0,cite:!0,data:!0,formaction:!0,href:!0,manifest:!0,poster:!0,src:!0},module$contents$goog$html$SafeHtml_NOT_ALLOWED_TAG_NAMES={[goog.dom.TagName.APPLET]:!0,[goog.dom.TagName.BASE]:!0,[goog.dom.TagName.EMBED]:!0,[goog.dom.TagName.IFRAME]:!0,[goog.dom.TagName.LINK]:!0,[goog.dom.TagName.MATH]:!0,[goog.dom.TagName.META]:!0,[goog.dom.TagName.OBJECT]:!0,[goog.dom.TagName.SCRIPT]:!0, +[goog.dom.TagName.STYLE]:!0,[goog.dom.TagName.SVG]:!0,[goog.dom.TagName.TEMPLATE]:!0}; +function module$contents$goog$html$SafeHtml_getAttrNameAndValue(a,b,c){if(c instanceof goog.string.Const)c=goog.string.Const.unwrap(c);else if("style"==b.toLowerCase())if(module$contents$goog$html$SafeHtml_SafeHtml.SUPPORT_STYLE_ATTRIBUTE)c=module$contents$goog$html$SafeHtml_getStyleValue(c);else throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES?'Attribute "style" not supported.':"");else{if(/^on/i.test(b))throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES? +`Attribute "${b}`+'" requires goog.string.Const value, "'+c+'" given.':"");if(b.toLowerCase()in module$contents$goog$html$SafeHtml_URL_ATTRIBUTES)if(c instanceof goog.html.TrustedResourceUrl)c=goog.html.TrustedResourceUrl.unwrap(c);else if(c instanceof goog.html.SafeUrl)c=goog.html.SafeUrl.unwrap(c);else if("string"===typeof c)c=goog.html.SafeUrl.sanitize(c).getTypedStringValue();else throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES?`Attribute "${b}" on tag "${a}`+'" requires goog.html.SafeUrl, goog.string.Const, or string, value "'+ +c+'" given.':"");}c.implementsGoogStringTypedString&&(c=c.getTypedStringValue());goog.asserts.assert("string"===typeof c||"number"===typeof c,"String or number value expected, got "+typeof c+" with value: "+c);return`${b}="`+goog.string.internal.htmlEscape(String(c))+'"'} +function module$contents$goog$html$SafeHtml_getStyleValue(a){if(!goog.isObject(a))throw Error(module$contents$goog$html$SafeHtml_SafeHtml.ENABLE_ERROR_MESSAGES?'The "style" attribute requires goog.html.SafeStyle or map of style properties, '+typeof a+" given: "+a:"");a instanceof module$contents$goog$html$SafeStyle_SafeStyle||(a=module$contents$goog$html$SafeStyle_SafeStyle.create(a));return module$contents$goog$html$SafeStyle_SafeStyle.unwrap(a)} +module$contents$goog$html$SafeHtml_SafeHtml.DOCTYPE_HTML=function(){return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("")}();module$contents$goog$html$SafeHtml_SafeHtml.EMPTY=new module$contents$goog$html$SafeHtml_SafeHtml(goog.global.trustedTypes&&goog.global.trustedTypes.emptyHTML||"",module$contents$goog$html$SafeHtml_CONSTRUCTOR_TOKEN_PRIVATE);module$contents$goog$html$SafeHtml_SafeHtml.BR=function(){return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("
")}(); +goog.html.SafeHtml=module$contents$goog$html$SafeHtml_SafeHtml;goog.html.uncheckedconversions={};goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return module$contents$goog$html$SafeHtml_SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(b)}; +goog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return module$contents$goog$html$SafeScript_SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(b)}; +goog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return module$contents$goog$html$SafeStyle_SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b)}; +goog.html.uncheckedconversions.safeStyleSheetFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return module$contents$goog$html$SafeStyleSheet_SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)}; +goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)}; +goog.html.uncheckedconversions.trustedResourceUrlFromStringKnownToSatisfyTypeContract=function(a,b){goog.asserts.assertString(goog.string.Const.unwrap(a),"must provide justification");goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)),"must provide non-empty justification");return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)};goog.dom.safe={};goog.dom.safe.InsertAdjacentHtmlPosition={AFTERBEGIN:"afterbegin",AFTEREND:"afterend",BEFOREBEGIN:"beforebegin",BEFOREEND:"beforeend"};goog.dom.safe.insertAdjacentHtml=function(a,b,c){a.insertAdjacentHTML(b,module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(c))};goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_={MATH:!0,SCRIPT:!0,STYLE:!0,SVG:!0,TEMPLATE:!0}; +goog.dom.safe.isInnerHtmlCleanupRecursive_=goog.functions.cacheReturnValue(function(){if(goog.DEBUG&&"undefined"===typeof document)return!1;var a=document.createElement("div"),b=document.createElement("div");b.appendChild(document.createElement("div"));a.appendChild(b);if(goog.DEBUG&&!a.firstChild)return!1;b=a.firstChild.firstChild;a.innerHTML=module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(module$contents$goog$html$SafeHtml_SafeHtml.EMPTY);return!b.parentElement}); +goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse=function(a,b){if(goog.dom.safe.isInnerHtmlCleanupRecursive_())for(;a.lastChild;)a.removeChild(a.lastChild);a.innerHTML=module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(b)}; +goog.dom.safe.setInnerHtml=function(a,b){if(goog.asserts.ENABLE_ASSERTS&&a.tagName){var c=a.tagName.toUpperCase();if(goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[c])throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of "+a.tagName+".");}goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(a,b)}; +goog.dom.safe.setInnerHtmlFromConstant=function(a,b){goog.dom.safe.setInnerHtml(a,goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Constant HTML to be immediatelly used."),goog.string.Const.unwrap(b)))};goog.dom.safe.setOuterHtml=function(a,b){a.outerHTML=module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(b)}; +goog.dom.safe.setFormElementAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLFormElement(a).action=goog.html.SafeUrl.unwrap(b)};goog.dom.safe.setButtonFormAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLButtonElement(a).formAction=goog.html.SafeUrl.unwrap(b)}; +goog.dom.safe.setInputFormAction=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);goog.dom.asserts.assertIsHTMLInputElement(a).formAction=goog.html.SafeUrl.unwrap(b)};goog.dom.safe.setStyle=function(a,b){a.style.cssText=module$contents$goog$html$SafeStyle_SafeStyle.unwrap(b)};goog.dom.safe.documentWrite=function(a,b){a.write(module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(b))}; +goog.dom.safe.setAnchorHref=function(a,b){goog.dom.asserts.assertIsHTMLAnchorElement(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.href=goog.html.SafeUrl.unwrap(b)};goog.dom.safe.setAudioSrc=function(a,b){goog.dom.asserts.assertIsHTMLAudioElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:audio\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c)}a.src=goog.html.SafeUrl.unwrap(b)}; +goog.dom.safe.setVideoSrc=function(a,b){goog.dom.asserts.assertIsHTMLVideoElement(a);if(!(b instanceof goog.html.SafeUrl)){var c=/^data:video\//i.test(b);b=goog.html.SafeUrl.sanitizeAssertUnchanged(b,c)}a.src=goog.html.SafeUrl.unwrap(b)};goog.dom.safe.setEmbedSrc=function(a,b){goog.dom.asserts.assertIsHTMLEmbedElement(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b)};goog.dom.safe.setFrameSrc=function(a,b){goog.dom.asserts.assertIsHTMLFrameElement(a);a.src=goog.html.TrustedResourceUrl.unwrap(b)}; +goog.dom.safe.setIframeSrc=function(a,b){goog.dom.asserts.assertIsHTMLIFrameElement(a);a.src=goog.html.TrustedResourceUrl.unwrap(b)};goog.dom.safe.setIframeSrcdoc=function(a,b){goog.dom.asserts.assertIsHTMLIFrameElement(a);a.srcdoc=module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(b)}; +goog.dom.safe.setLinkHrefAndRel=function(a,b,c){goog.dom.asserts.assertIsHTMLLinkElement(a);a.rel=c;goog.string.internal.caseInsensitiveContains(c,"stylesheet")?(goog.asserts.assert(b instanceof goog.html.TrustedResourceUrl,'URL must be TrustedResourceUrl because "rel" contains "stylesheet"'),a.href=goog.html.TrustedResourceUrl.unwrap(b),(b=goog.dom.safe.getStyleNonce(a.ownerDocument&&a.ownerDocument.defaultView))&&a.setAttribute("nonce",b)):a.href=b instanceof goog.html.TrustedResourceUrl?goog.html.TrustedResourceUrl.unwrap(b): +b instanceof goog.html.SafeUrl?goog.html.SafeUrl.unwrap(b):goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitizeAssertUnchanged(b))};goog.dom.safe.setObjectData=function(a,b){goog.dom.asserts.assertIsHTMLObjectElement(a);a.data=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b)};goog.dom.safe.setScriptSrc=function(a,b){goog.dom.asserts.assertIsHTMLScriptElement(a);goog.dom.safe.setNonceForScriptElement_(a);a.src=goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b)}; +goog.dom.safe.setScriptContent=function(a,b){goog.dom.asserts.assertIsHTMLScriptElement(a);goog.dom.safe.setNonceForScriptElement_(a);a.textContent=module$contents$goog$html$SafeScript_SafeScript.unwrapTrustedScript(b)};goog.dom.safe.setNonceForScriptElement_=function(a){const b=goog.dom.safe.getScriptNonce(a.ownerDocument&&a.ownerDocument.defaultView);b&&a.setAttribute("nonce",b)}; +goog.dom.safe.setLocationHref=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.href=goog.html.SafeUrl.unwrap(b)};goog.dom.safe.assignLocation=function(a,b){goog.dom.asserts.assertIsLocation(a);b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.assign(goog.html.SafeUrl.unwrap(b))}; +goog.dom.safe.replaceLocation=function(a,b){b=b instanceof goog.html.SafeUrl?b:goog.html.SafeUrl.sanitizeAssertUnchanged(b);a.replace(goog.html.SafeUrl.unwrap(b))};goog.dom.safe.openInWindow=function(a,b,c,d){a=a instanceof goog.html.SafeUrl?a:goog.html.SafeUrl.sanitizeAssertUnchanged(a);b=b||goog.global;c=c instanceof goog.string.Const?goog.string.Const.unwrap(c):c||"";return void 0!==d?b.open(goog.html.SafeUrl.unwrap(a),c,d):b.open(goog.html.SafeUrl.unwrap(a),c)}; +goog.dom.safe.parseFromStringHtml=function(a,b){return goog.dom.safe.parseFromString(a,b,"text/html")};goog.dom.safe.parseFromString=function(a,b,c){return a.parseFromString(module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(b),c)}; +goog.dom.safe.createImageFromBlob=function(a){if(!/^image\/.*/g.test(a.type))throw Error("goog.dom.safe.createImageFromBlob only accepts MIME type image/.*.");var b=goog.global.URL.createObjectURL(a);a=new goog.global.Image;a.onload=function(){goog.global.URL.revokeObjectURL(b)};a.src=b;return a};goog.dom.safe.createContextualFragment=function(a,b){return a.createContextualFragment(module$contents$goog$html$SafeHtml_SafeHtml.unwrapTrustedHTML(b))}; +goog.dom.safe.getScriptNonce=function(a){return goog.dom.safe.getNonce_("script[nonce]",a)};goog.dom.safe.getStyleNonce=function(a){return goog.dom.safe.getNonce_('style[nonce],link[rel="stylesheet"][nonce]',a)};goog.dom.safe.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.dom.safe.getNonce_=function(a,b){b=(b||goog.global).document;return b.querySelector?(a=b.querySelector(a))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.dom.safe.NONCE_PATTERN_.test(a)?a:"":""};goog.string.DETECT_DOUBLE_ESCAPING=!1;goog.string.FORCE_NON_DOM_HTML_UNESCAPING=!1;goog.string.Unicode={NBSP:"\u00a0",ZERO_WIDTH_SPACE:"\u200b"};goog.string.startsWith=goog.string.internal.startsWith;goog.string.endsWith=goog.string.internal.endsWith;goog.string.caseInsensitiveStartsWith=goog.string.internal.caseInsensitiveStartsWith;goog.string.caseInsensitiveEndsWith=goog.string.internal.caseInsensitiveEndsWith;goog.string.caseInsensitiveEquals=goog.string.internal.caseInsensitiveEquals; +goog.string.subs=function(a,b){const c=a.split("%s");let d="";const e=Array.prototype.slice.call(arguments,1);for(;e.length&&1=a||"\u0080"<=a&&"\ufffd">=a};goog.string.stripNewlines=function(a){return a.replace(/(\r\n|\r|\n)+/g," ")};goog.string.canonicalizeNewlines=function(a){return a.replace(/(\r\n|\r|\n)/g,"\n")};goog.string.normalizeWhitespace=function(a){return a.replace(/\xa0|\s/g," ")};goog.string.normalizeSpaces=function(a){return a.replace(/\xa0|[ \t]+/g," ")}; +goog.string.collapseBreakingSpaces=function(a){return a.replace(/[\t\r\n ]+/g," ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g,"")};goog.string.trim=goog.string.internal.trim;goog.string.trimLeft=function(a){return a.replace(/^[\s\xa0]+/,"")};goog.string.trimRight=function(a){return a.replace(/[\s\xa0]+$/,"")};goog.string.caseInsensitiveCompare=goog.string.internal.caseInsensitiveCompare; +goog.string.numberAwareCompare_=function(a,b,c){if(a==b)return 0;if(!a)return-1;if(!b)return 1;const d=a.toLowerCase().match(c),e=b.toLowerCase().match(c),f=Math.min(d.length,e.length);for(let g=0;g",""":'"'};let d;d=b?b.createElement("div"):goog.global.document.createElement("div");return a.replace(goog.string.HTML_ENTITY_PATTERN_,function(e,f){let g=c[e];if(g)return g;"#"==f.charAt(0)&&(f=Number("0"+f.slice(1)),isNaN(f)||(g=String.fromCharCode(f)));g||(goog.dom.safe.setInnerHtml(d,goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Single HTML entity."), +e+" ")),g=d.firstChild.nodeValue.slice(0,-1));return c[e]=g})};goog.string.unescapePureXmlEntities_=function(a){return a.replace(/&([^;]+);/g,function(b,c){switch(c){case "amp":return"&";case "lt":return"<";case "gt":return">";case "quot":return'"';default:return"#"!=c.charAt(0)||(c=Number("0"+c.slice(1)),isNaN(c))?b:String.fromCharCode(c)}})};goog.string.HTML_ENTITY_PATTERN_=/&([^;\s<&]+);?/g;goog.string.whitespaceEscape=function(a,b){return goog.string.newLineToBr(a.replace(/ /g,"  "),b)}; +goog.string.preserveSpaces=function(a){return a.replace(/(^|[\n ]) /g,"$1"+goog.string.Unicode.NBSP)};goog.string.stripQuotes=function(a,b){const c=b.length;for(let d=0;db&&(a=a.substring(0,b-3)+"...");c&&(a=goog.string.htmlEscape(a));return a}; +goog.string.truncateMiddle=function(a,b,c,d){c&&(a=goog.string.unescapeEntities(a));if(d&&a.length>b){d>b&&(d=b);var e=a.length-d;a=a.substring(0,b-d)+"..."+a.substring(e)}else a.length>b&&(d=Math.floor(b/2),e=a.length-d,a=a.substring(0,d+b%2)+"..."+a.substring(e));c&&(a=goog.string.htmlEscape(a));return a};goog.string.specialEscapeChars_={"\x00":"\\0","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\x0B",'"':'\\"',"\\":"\\\\","<":"\\u003C"};goog.string.jsEscapeCache_={"'":"\\'"}; +goog.string.quote=function(a){a=String(a);const b=['"'];for(let c=0;ce?d:goog.string.escapeChar(d))}b.push('"');return b.join("")};goog.string.escapeString=function(a){const b=[];for(let c=0;cc)b=a;else{if(256>c){if(b="\\x",16>c||256c&&(b+="0");b+=c.toString(16).toUpperCase()}return goog.string.jsEscapeCache_[a]=b};goog.string.contains=goog.string.internal.contains; +goog.string.caseInsensitiveContains=goog.string.internal.caseInsensitiveContains;goog.string.countOf=function(a,b){return a&&b?a.split(b).length-1:0};goog.string.removeAt=function(a,b,c){let d=a;0<=b&&b>>0;return b};goog.string.uniqueStringCounter_=2147483648*Math.random()|0;goog.string.createUniqueString=function(){return"goog_"+goog.string.uniqueStringCounter_++};goog.string.toNumber=function(a){const b=Number(a);return 0==b&&goog.string.isEmptyOrWhitespace(a)?NaN:b};goog.string.isLowerCamelCase=function(a){return/^[a-z]+([A-Z][a-z]*)*$/.test(a)}; +goog.string.isUpperCamelCase=function(a){return/^([A-Z][a-z]*)+$/.test(a)};goog.string.toCamelCase=function(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})};goog.string.toSelectorCase=function(a){return String(a).replace(/([A-Z])/g,"-$1").toLowerCase()};goog.string.toTitleCase=function(a,b){b="string"===typeof b?goog.string.regExpEscape(b):"\\s";return a.replace(new RegExp("(^"+(b?"|["+b+"]+":"")+")([a-z])","g"),function(c,d,e){return d+e.toUpperCase()})}; +goog.string.capitalize=function(a){return String(a.charAt(0)).toUpperCase()+String(a.slice(1)).toLowerCase()};goog.string.parseInt=function(a){isFinite(a)&&(a=String(a));return"string"===typeof a?/^\s*-?0x/i.test(a)?parseInt(a,16):parseInt(a,10):NaN};goog.string.splitLimit=function(a,b,c){a=a.split(b);const d=[];for(;0c&&(c=e)}return-1==c?a:a.slice(c+1)}; +goog.string.editDistance=function(a,b){const c=[],d=[];if(a==b)return 0;if(!a.length||!b.length)return Math.max(a.length,b.length);for(var e=0;e=b?"":a.slice(b+1)}; +goog.string.path.join=function(a){let b=arguments[0];for(let c=1;cd+e.length,0);if(0!==a.length){b=new Uint8Array(b);var c=0;for(const d of a)b.set(d,c),c+=d.length;return b}} +const WASI$$module$src$filesystem$wasi=function({}){this.fd=Array.from({length:4});this.fd[0]={fd:0,path:"/dev/stdin",seekPos:goog.global.BigInt(0),buffers:[],open:!1};this.fd[1]={fd:1,path:"/dev/stdout",seekPos:goog.global.BigInt(0),buffers:[],open:!1};this.fd[2]={fd:2,path:"/dev/stderr",seekPos:goog.global.BigInt(0),buffers:[],open:!1};this.fd[3]={fd:3,path:"/",seekPos:goog.global.BigInt(0),buffers:[],open:!1};this.getMemory=this.getMemory.bind(this);this.CPUTIME_START=0}; +WASI$$module$src$filesystem$wasi.prototype.start=function(a){this.CPUTIME_START=performanceNowPoly$$module$src$filesystem$wasi();a.exports._start()};WASI$$module$src$filesystem$wasi.prototype.getImports=function(a){const b={};a=WebAssembly.Module.imports(a);for(const c of a)"function"===c.kind&&c.module.startsWith("wasi_")&&("object"!==typeof b[c.module]&&(b[c.module]={}),b[c.module][c.name]=this[c.name].bind(this));return b}; +WASI$$module$src$filesystem$wasi.prototype.setMemory=function(a){this.memory=a};WASI$$module$src$filesystem$wasi.prototype.getMemory=function(){this.view&&this.view.buffer&&this.view.buffer.byteLength||(this.view=new DataView(this.memory.buffer));return this.view};WASI$$module$src$filesystem$wasi.prototype.msToNs=function(a){const b=Math.trunc(a);a=goog.global.BigInt(Math.round(1E6*(a-b)));return goog.global.BigInt(b)*goog.global.BigInt(1E6)+a}; +WASI$$module$src$filesystem$wasi.prototype.now=function(a){switch(a){case WASI_CLOCK_MONOTONIC$$module$src$filesystem$constants:return Math.floor(performanceNowPoly$$module$src$filesystem$wasi());case WASI_CLOCK_REALTIME$$module$src$filesystem$constants:return this.msToNs(Date.now());case WASI_CLOCK_PROCESS_CPUTIME_ID$$module$src$filesystem$constants:case WASI_CLOCK_THREAD_CPUTIME_ID$$module$src$filesystem$constants:return Math.floor(performanceNowPoly$$module$src$filesystem$wasi()-this.CPUTIME_START); +default:return 0}};WASI$$module$src$filesystem$wasi.prototype.args_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("args_get",a,b,module$src$filesystem$constants);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.args_sizes_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("args_sizes_get",a,b,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.clock_res_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("args_get",a,b,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.clock_time_get=function(a,b,c){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("clock_time_get",a,b,c,arguments);const d=this.getMemory(),e=this.now(a);d.setBigUint64(c,goog.global.BigInt(e),!0);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.environ_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("environ_get",a,b,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.environ_sizes_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("environ_sizes_get",a,b,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_advise=function(a,b,c,d){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_advise",a,b,c,d,arguments);return WASI_ENOSYS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_allocate=function(a,b,c){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_allocate",a,b,c,arguments);return WASI_ENOSYS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_close=function(a){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_close",a,arguments);this.fd[a]&&(this.fd[a].open=!1);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_datasync=function(a){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_datasync",a,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_fdstat_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_fdstat_get",a,b,arguments);const c=this.getMemory();c.setUint8(b+4,WASI_FILETYPE_REGULAR_FILE$$module$src$filesystem$constants);c.setUint16(b+2,0,!0);c.setUint16(b+4,0,!0);c.setBigUint64(b+8,goog.global.BigInt(RIGHTS_REGULAR_FILE_BASE$$module$src$filesystem$constants),!0);c.setBigUint64(b+8+8,goog.global.BigInt(RIGHTS_REGULAR_FILE_INHERITING$$module$src$filesystem$constants), +!0);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_fdstat_set_flags=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_fdstat_set_flags",a,b,arguments);return WASI_ENOSYS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_fdstat_set_rights=function(a,b,c){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_fdstat_set_rights",a,b,c,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_filestat_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_filestat_get",a,b,arguments);let c=0;this.fd[a]&&(c=this.fd[a].buffers.reduce(function(e,f){return e+(null==f?void 0:f.byteLength)?null==f?void 0:f.byteLength:0},0));const d=this.getMemory();d.setBigUint64(b,goog.global.BigInt(a),!0);b+=8;d.setBigUint64(b,goog.global.BigInt(a),!0);b+=8;d.setUint8(b,WASI_FILETYPE_REGULAR_FILE$$module$src$filesystem$constants);b+=8;d.setBigUint64(b, +goog.global.BigInt(1),!0);b+=8;d.setBigUint64(b,goog.global.BigInt(c),!0);b+=8;d.setBigUint64(b,this.msToNs(this.CPUTIME_START),!0);b+=8;d.setBigUint64(b,this.msToNs(this.CPUTIME_START),!0);d.setBigUint64(b+8,this.msToNs(this.CPUTIME_START),!0);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_filestat_set_size=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_filestat_set_size",a,b,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_filestat_set_times=function(a,b,c,d){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_filestat_set_times",a,b,c,d,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_pread=function(a,b,c,d,e){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_pread",a,b,c,d,e,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_prestat_dir_name=function(a,b,c){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_prestat_dir_name",a,b,c,this.fd[a]);if(!this.fd[a]&&!this.fd[a-1])return WASI_EBADF$$module$src$filesystem$constants;({path:c}=this.fd[a]);a=this.getMemory();c=encoder$$module$src$utils$text_encoders.encode(c);(new Uint8Array(a.buffer)).set(c,b);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_prestat_get=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_prestat_get",a,b,this.fd[a]);if(!this.fd[a])return WASI_EBADF$$module$src$filesystem$constants;var {path:c}=this.fd[a];a=this.getMemory();c=encoder$$module$src$utils$text_encoders.encode(c);a.setUint8(b,WASI_PREOPENTYPE_DIR$$module$src$filesystem$constants);a.setUint32(b+4,c.byteLength,!0);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_pwrite=function(a,b,c,d,e){console.log("fd_pwrite",a,b,c,d,e,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_read=function(a,b,c,d){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_read",a,b,c,d,arguments);const e=this.fd[a]&&this.fd[a].buffers;var f=e.reduce((l,p)=>l+p.length,0);const g=this.getMemory();if(e&&0!==e.length){var h=Number(this.fd[a].seekPos),k=0,n=!1;if(h>=f)return k=g.getUint32(b,!0),g.setUint8(k,"\x00"),g.setUint32(d,0,!0),WASI_ESUCCESS$$module$src$filesystem$constants;for(f=0;fq).reduce((p,q)=>{if(n)return p;const [u,t]=p;let x=p=0,r=!1,y=0,v;if(0===q)for(;!r;)v=e[p]?e[p].byteLength:0,y<=h&&v+y>h?(r=!0,x=h-y):(y+=v,p+=1);else p=u,x=t;e[p]?(g.setUint8(l+q,e[p][x]),x+1>=e[p].byteLength?(p=u+1,x=0):x+=1):(g.setUint8(l+q,"\x00"),h+=q,n=!0);return[p,x]},[0,0]),n||(h+=m))}this.fd[a].seekPos=goog.global.BigInt(h);g.setUint32(d,k,!0);return WASI_ESUCCESS$$module$src$filesystem$constants}console.error("Reading non existent file",a,this.fd[a])}; +WASI$$module$src$filesystem$wasi.prototype.fd_readdir=function(a,b,c,d,e){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_readdir",a,b,c,d,e,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_renumber=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_renumber",a,b,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_seek=function(a,b,c,d){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_seek",a,b,c,d,arguments);const e=this.getMemory();switch(c){case WASI_WHENCE_CUR$$module$src$filesystem$constants:var f;this.fd[a].seekPos=(null!=(f=this.fd[a].seekPos)?f:goog.global.BigInt(0))+goog.global.BigInt(b);break;case WASI_WHENCE_END$$module$src$filesystem$constants:f=(this.fd[a].buffers||[]).reduce((g,h)=>g+h.length,0);this.fd[a].seekPos=BigInt(f)+BigInt(b);break; +case WASI_WHENCE_SET$$module$src$filesystem$constants:this.fd[a].seekPos=BigInt(b)}e.setBigUint64(d,this.fd[a].seekPos,!0);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.fd_sync=function(a){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_sync",a,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_tell=function(a,b){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_tell",a,b,arguments);const c=this.getMemory();this.fd[a].seekPos||(this.fd[a].seekPos=goog.global.BigInt(0));c.setBigUint64(b,this.fd[a].seekPos,!0);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.fd_write=function(a,b,c,d){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("fd_write",{fd:a,iovs:b,iovsLength:c,nwritten:d});const e=this.getMemory();this.fd[a].buffers=this.fd[a].buffers||[];this.fd[a].buffers=0{this.fd[a].buffers[0][n+l]=m})}else this.fd[a].buffers.push(h.slice(0,g))}this.fd[a].seekPos+=goog.global.BigInt(f);e.setUint32(d,f,!0);[1,2].includes(a)&&console.log(decoder$$module$src$utils$text_encoders.decode(concatUint8Arrays$$module$src$filesystem$wasi(this.fd[a].buffers)));return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.path_create_directory=function(a,b,c){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_create_directory",a,b,c,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.path_filestat_get=function(a,b,c,d,e){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_filestat_get",a,b,c,d,e,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.path_filestat_set_times=function(a,b,c,d,e,f,g){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_filestat_set_times",a,b,c,d,e,f,g,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.path_link=function(a,b,c,d,e,f,g){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_link",a,b,c,d,e,f,g,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.path_open=function(a,b,c,d,e,f,g,h,k){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_open",a,b,c,d,e,f,g,h,k,arguments);const n=this.getMemory();var m=(this.fd[a]||{path:"/"}).path,l=new Uint8Array(n.buffer,c,d);l=decoder$$module$src$utils$text_encoders.decode(l);const p=assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(goog.string.path.join(3===a?"":m,l)));DEBUG_WASI$$module$src$filesystem$wasi&&console.log(";; opening path", +p,"withREader",shouldOpenReader$$module$src$filesystem$wasi(f));if(p.startsWith("/..")||"/._"===p||"/.AppleDouble"===p)return WASI_EBADF$$module$src$filesystem$constants;(m=Object.values(this.fd).find(q=>q.path===p&&Array.isArray(q.buffers)))?l=m.fd:(l=this.fd.length,this.fd[l]={fd:l});this.fd[l]={...this.fd[l],path:p,type:"file",seekPos:goog.global.BigInt(0),buffers:m?this.fd[l].buffers:[],open:!0};shouldOpenReader$$module$src$filesystem$wasi(f)&&DEBUG_WASI$$module$src$filesystem$wasi&&console.log("should open a read handle for", +p);n.setUint32(k,l,!0);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.path_readlink=function(a,b,c,d,e,f){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_readlink",a,b,c,d,e,f,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.path_remove_directory=function(a,b,c){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_remove_directory",a,b,c);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.path_rename=function(a,b,c,d,e,f){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_rename",a,b,c,d,e,f,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants};WASI$$module$src$filesystem$wasi.prototype.path_symlink=function(a,b,c,d,e){DEBUG_WASI$$module$src$filesystem$wasi&&console.log("path_symlink",a,b,c,d,e,arguments);return WASI_ESUCCESS$$module$src$filesystem$constants}; +WASI$$module$src$filesystem$wasi.prototype.path_unlink_file=function(a,b,c){3c===a);return[b&&b.buffers,b.fd]}; +WASI$$module$src$filesystem$wasi.prototype.readdir=function(a){const b=(assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(a))+"/").replace("//","/"),c=[];Object.values(this.fd).forEach(({path:d})=>!/\//g.test(d.replace(b,""))&&c.push(d));return c.map(d=>removeLeadingSlash$$module$src$filesystem$wasi(d.replace(b,""))).filter(d=>!!d)}; +WASI$$module$src$filesystem$wasi.prototype.writeFile=function(a,b){const c=assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(a));a=Object.keys(this.fd).length;const d=Object.values(this.fd).find(({path:e})=>e===c);this.fd[a]={fd:a,path:c,seekPos:goog.global.BigInt(0),buffers:[b]};d&&delete this.fd[d]}; +WASI$$module$src$filesystem$wasi.prototype.appendFile=function(a,b){var c=assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(a));[c]=this.findBuffers(c);c?c.push(b):console.error(`Can't append to non-existing file ${a}`)}; +WASI$$module$src$filesystem$wasi.prototype.readFile=function(a){const b=assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(a)),[c,d]=this.findBuffers(b);this.fd[d]&&this.fd[d].open&&console.warn(`readFile: file ${a} hasn't been closed yet!`);if(c)return concatUint8Arrays$$module$src$filesystem$wasi(c)}; +WASI$$module$src$filesystem$wasi.prototype.readStdOut=function(){const a=Object.values(this.fd[0]);return concatUint8Arrays$$module$src$filesystem$wasi(a&&a.buffers||[])};WASI$$module$src$filesystem$wasi.prototype.unlink=function(a){const b=assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(a));(a=Object.values(this.fd).find(({path:c})=>c===b))?delete this.fd[a]:console.error(`While trying to unlink ${b}, path not found`)}; +WASI$$module$src$filesystem$wasi.prototype.mkdir=function(a){const b=assertLeadingSlash$$module$src$filesystem$wasi((0,goog.string.path.normalizePath)(a)),c=[];Object.values(this.fd).forEach(({path:d})=>d.startsWith(b)&&c.push(d));0c&&(c=a[k]),a[k]>=1;p=e<<16|k;for(n=h;n=b?8:255>=b?9:279>=b?7:8;return Huffman$$module$src$zlib$huffman(a)}());RawInflate$$module$src$zlib$rawinflate.FixedDistanceTable=function(a){return a}(function(){const a=new Uint8Array(30);let b,c;b=0;for(c=a.length;b>>=1;switch(a){case 0:this.parseUncompressedBlock();break;case 1:this.parseFixedHuffmanBlock();break;case 2:this.parseDynamicHuffmanBlock();break;default:throw Error("unknown BTYPE: "+a);}}; +RawInflate$$module$src$zlib$rawinflate.prototype.readBits=function(a){let b=this.bitsbuf,c=this.bitsbuflen;const d=this.input;let e=this.ip;if(e+(a-c+7>>3)>=d.length)throw Error("input buffer is broken");for(;c>>a;this.bitsbuflen=c-a;this.ip=e;return b&(1<=f);)b|=d[e++]<>>16;if(f>c)throw Error("invalid code length: "+f);this.bitsbuf=b>>f;this.bitsbuflen=c-f;this.ip=e;return d&65535}; +RawInflate$$module$src$zlib$rawinflate.prototype.parseUncompressedBlock=function(){const a=this.input;let b=this.ip,c=this.output,d=this.op;var e=a.length;let f;const g=c.length;this.bitsbuflen=this.bitsbuf=0;if(b+1>=e)throw Error("invalid uncompressed block header: LEN");f=a[b++]|a[b++]<<8;if(b+1>=e)throw Error("invalid uncompressed block header: NLEN");e=a[b++]|a[b++]<<8;if(f===~e)throw Error("invalid uncompressed block header: length verify");if(b+f>a.length)throw Error("input buffer is broken"); +switch(this.bufferType){case RawInflate$$module$src$zlib$rawinflate.BufferType.BLOCK:for(;d+f>c.length;)e=g-d,f-=e,c.set(a.subarray(b,b+e),d),d+=e,b+=e,this.op=d,c=this.expandBufferBlock(),d=this.op;break;case RawInflate$$module$src$zlib$rawinflate.BufferType.ADAPTIVE:for(;d+f>c.length;)c=this.expandBufferAdaptive({fixRatio:2});break;default:throw Error("invalid inflate mode");}c.set(a.subarray(b,b+f),d);this.ip=b+f;this.op=d+f;this.output=c}; +RawInflate$$module$src$zlib$rawinflate.prototype.parseFixedHuffmanBlock=function(){switch(this.bufferType){case RawInflate$$module$src$zlib$rawinflate.BufferType.ADAPTIVE:this.decodeHuffmanAdaptive(RawInflate$$module$src$zlib$rawinflate.FixedLiteralLengthTable,RawInflate$$module$src$zlib$rawinflate.FixedDistanceTable);break;case RawInflate$$module$src$zlib$rawinflate.BufferType.BLOCK:this.decodeHuffmanBlock(RawInflate$$module$src$zlib$rawinflate.FixedLiteralLengthTable,RawInflate$$module$src$zlib$rawinflate.FixedDistanceTable); +break;default:throw Error("invalid inflate mode");}}; +RawInflate$$module$src$zlib$rawinflate.prototype.parseDynamicHuffmanBlock=function(){var a=this.readBits(5)+257,b=this.readBits(5)+1,c=this.readBits(4)+4,d=new Uint8Array(RawInflate$$module$src$zlib$rawinflate.Order.length);let e;for(e=0;ef)d>= +e&&(this.op=d,c=this.expandBufferBlock(),d=this.op),c[d++]=f;else for(f-=257,h=k[f],0=e&&(this.op=d,c=this.expandBufferBlock(),d=this.op);h--;)c[d]=c[d++-g];for(;8<=this.bitsbuflen;)this.bitsbuflen-=8,this.ip--;this.op=d}; +RawInflate$$module$src$zlib$rawinflate.prototype.decodeHuffmanAdaptive=function(a,b){let c=this.output,d=this.op;this.currentLitlenTable=a;let e=c.length;var f;let g,h;const k=RawInflate$$module$src$zlib$rawinflate.LengthCodeTable,n=RawInflate$$module$src$zlib$rawinflate.LengthExtraTable,m=RawInflate$$module$src$zlib$rawinflate.DistCodeTable,l=RawInflate$$module$src$zlib$rawinflate.DistExtraTable;for(;256!==(f=this.readCodeByTable(a));)if(256>f)d>=e&&(c=this.expandBufferAdaptive(),e=c.length),c[d++]= +f;else for(f-=257,h=k[f],0e&&(c=this.expandBufferAdaptive(),e=c.length);h--;)c[d]=c[d++-g];for(;8<=this.bitsbuflen;)this.bitsbuflen-=8,this.ip--;this.op=d}; +RawInflate$$module$src$zlib$rawinflate.prototype.expandBufferBlock=function(a){a=new Uint8Array(this.op-RawInflate$$module$src$zlib$rawinflate.MaxBackwardLength);const b=this.op-RawInflate$$module$src$zlib$rawinflate.MaxBackwardLength,c=this.output;a.set(c.subarray(RawInflate$$module$src$zlib$rawinflate.MaxBackwardLength,a.length));this.blocks.push(a);this.totalpos+=a.length;c.set(c.subarray(b,b+RawInflate$$module$src$zlib$rawinflate.MaxBackwardLength));this.op=RawInflate$$module$src$zlib$rawinflate.MaxBackwardLength; +return c};RawInflate$$module$src$zlib$rawinflate.prototype.expandBufferAdaptive=function(a){let b=Math.trunc(this.input.length/this.ip+1);const c=this.input,d=this.output;a&&("number"===typeof a.fixRatio&&(b=a.fixRatio),"number"===typeof a.addRatio&&(b+=a.addRatio));2>b?(a=(c.length-this.ip)/this.currentLitlenTable[2],a=Math.trunc(a/2*258),a=a>>0;return new Uint8Array([a])};var module$src$zlib$util={};module$src$zlib$util.Util=Util$$module$src$zlib$util;function Adler32$$module$src$zlib$adler32(a){"string"===typeof a&&(a=Util$$module$src$zlib$util.stringToByteArray(a));return Adler32$$module$src$zlib$adler32.update(1,a)}Adler32$$module$src$zlib$adler32.update=function(a,b){let c=a&65535;a=a>>>16&65535;let d=b.length,e,f=0;for(;0Adler32$$module$src$zlib$adler32.OptimizationParameter?Adler32$$module$src$zlib$adler32.OptimizationParameter:d;d-=e;do c+=b[f++],a+=c;while(--e);c%=65521;a%=65521}return(a<<16|c)>>>0}; +Adler32$$module$src$zlib$adler32.OptimizationParameter=1024;var module$src$zlib$adler32={};module$src$zlib$adler32.Adler32=Adler32$$module$src$zlib$adler32;function Inflate$$module$src$zlib$inflate(a,b){this.input=a;this.ip=0;if(b||!(b={}))b.index&&(this.ip=b.index),b.verify&&(this.verify=b.verify);const c=a[this.ip++],d=a[this.ip++];switch(c&15){case CompressionMethod$$module$src$zlib$zlib.DEFLATE:this.method=CompressionMethod$$module$src$zlib$zlib.DEFLATE;break;default:throw Error("unsupported compression method");}if(0!==((c<<8)+d)%31)throw Error("invalid fcheck flag:"+((c<<8)+d)%31);if(d&32)throw Error("fdict flag is not supported");this.rawinflate= +new RawInflate$$module$src$zlib$rawinflate(a,{index:this.ip,bufferSize:b.bufferSize,bufferType:b.bufferType,resize:b.resize})}Inflate$$module$src$zlib$inflate.BufferType=RawInflate$$module$src$zlib$rawinflate.BufferType; +Inflate$$module$src$zlib$inflate.prototype.decompress=function(){var a=this.input;const b=this.rawinflate.decompress();this.ip=this.rawinflate.ip;if(this.verify&&(a=(a[this.ip++]<<24|a[this.ip++]<<16|a[this.ip++]<<8|a[this.ip++])>>>0,a!==Adler32$$module$src$zlib$adler32(b)))throw Error("invalid adler-32 checksum");return b};var module$src$zlib$inflate={};module$src$zlib$inflate.Inflate=Inflate$$module$src$zlib$inflate;const PAGE_SIZE$$module$src$module=65536,PAGES_PER_MB$$module$src$module=16,csoundWasiJsMessageCallback$$module$src$module=({memory:a,messagePort:b,streamBuffer:c})=>function(d,e,f,g){if(a){d=new Uint8Array(a.buffer,g,f);d=uint2String$$module$src$utils$text_encoders(d);var h=/\n$/g.test(d);e=/^\n/g.test(d);var k=d.split("\n").filter(m=>0{l+1===k.length?h?0===l?(n.push(c.join("")+m), +clearArray$$module$src$utils$clear_array(c)):n.push(m):c.push(m):0===l?(n.push(c.join("")+m),clearArray$$module$src$utils$clear_array(c)):n.push(m)});n.forEach(m=>{m.replace(/(\r\n|\n|\r)/gm,"")&&b.post({log:m})})}},assertPluginExports$$module$src$module=a=>{if(a&&"object"===typeof a&&"object"===typeof a.exports){if(a.exports.__wasm_call_ctors){if(a.exports.csoundModuleCreate||a.exports.csound_opcode_init||a.exports.csound_fgen_init)return!0;console.error(a.exports,"A csound plugin turns out to be neither a plugin, opcode or module.\nPerhaps csdl.h or module.h wasn't imported correctly?"); +return!1}console.error("A csound plugin didn't export __wasm_call_ctors.\nPlease re-run wasm-ld with either --export-all or include --export=__wasm_call_ctors");return!1}console.error("Error instantiating a csound plugin, instance and/or export is missing!");return!1},getBinaryHeaderData$$module$src$module=a=>{function b(){let n=0,m=1;for(;;){const l=a[c++];n+=(l&127)*m;m*=128;if(!(l&128))break}return n}1836278016!==(new Uint32Array((new Uint8Array(a.subarray(0,24))).buffer))[0]&&console.error("Wasm magic number is missing!"); +if(0!==a[8])return logWasmModule$$module$src$logger("Dylink section wasn't found in wasm binary, assuming static wasm."),"static";let c=9;const d=b();c++;(0,goog.asserts.assert)(a[c]==="d".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]==="y".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]==="l".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]==="i".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]==="n".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]==="k".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]=== +".".codePointAt(0));c++;(0,goog.asserts.assert)(a[c]==="0".codePointAt(0));c+=3;const e=b(),f=b(),g=b(),h=b(),k=b();return{sectionSize:d,memorySize:e,memoryAlign:f,neededDynlibsCount:k,tableSize:g,tableAlign:h}},loadStaticWasm$$module$src$module=async({wasmBytes:a,wasi:b,messagePort:c})=>{const d=await WebAssembly.compile(a);a=new WebAssembly.Memory({initial:16384});const e=b.getImports(d);e.env=e.env||{};e.env.csoundLoadModules=()=>0;e.env.memory=a;e.env.csoundWasiJsMessageCallback=csoundWasiJsMessageCallback$$module$src$module({memory:e.env.memory, +streamBuffer:[],messagePort:c});c=await WebAssembly.instantiate(d,e);b.setMemory(a);b.start(c);c.exports.__wasi_js_csoundSetMessageStringCallback();return[c,b]}; +var $jscompDefaultExport$$module$src$module=async function({wasmDataURI:a,withPlugins:b=[],messagePort:c}){var d={};const e=new WASI$$module$src$filesystem$wasi({preopens:{"/":"/"}});a=new Uint8Array(a);a=(new Inflate$$module$src$zlib$inflate(a)).decompress();var f=getBinaryHeaderData$$module$src$module(a);if("static"===f)return await loadStaticWasm$$module$src$module({messagePort:c,wasmBytes:a,wasmFs:d,wasi:e});const {memorySize:g,memoryAlign:h,tableSize:k}=f;b=await b.reduce(async(v,z)=>{v=await v; +let B,w;try{B=new Uint8Array(z),w=getBinaryHeaderData$$module$src$module(B)}catch(C){console.error("Error in plugin",C)}w&&v.push({headerData:w,wasmPluginBytes:B});return v},[]);var n=128*PAGES_PER_MB$$module$src$module;d=Math.ceil((g+h)/PAGE_SIZE$$module$src$module);f=Math.ceil(b.reduce((v,{headerData:z})=>"static"===z?0:v+(z.memorySize+h),0)/PAGE_SIZE$$module$src$module);f=d+f+n;const m=new WebAssembly.Memory({initial:f,maximum:1024*PAGES_PER_MB$$module$src$module}),l=new WebAssembly.Table({initial:k+ +1,element:"anyfunc"});e.setMemory(m);const p=new WebAssembly.Global({value:"i32",mutable:!0},f*PAGE_SIZE$$module$src$module);f=new WebAssembly.Global({value:"i32",mutable:!0},f*PAGE_SIZE$$module$src$module);n=new WebAssembly.Global({value:"i32",mutable:!1},n);const q=new WebAssembly.Global({value:"i32",mutable:!1},1),u=new WebAssembly.Global({value:"i32",mutable:!0},0);a=await WebAssembly.compile(a);const t=e.getImports(a);let x=[],r=d;t.env=t.env||{};t.env.memory=m;t.env.__indirect_function_table= +l;t.env.__stack_pointer=p;t.env.__memory_base=n;t.env.__table_base=q;t.env.csoundLoadModules=v=>{x.forEach(z=>{void 0===y?console.error("csound-wasm internal: timing problem detected!"):dlinit$$module$src$dlinit(y,z,l,v)});return 0};t.env._ZTH5errno=function(){};t.env.csoundWasiJsMessageCallback=csoundWasiJsMessageCallback$$module$src$module({memory:m,messagePort:c,streamBuffer:[]});t.env.printDebugCallback=(v,z)=>{v=new Uint8Array(m.buffer,v,z);v=uint2String$$module$src$utils$text_encoders(v);console.log(v)}; +t["GOT.mem"]=t["GOT.mem"]||{};t["GOT.mem"].__heap_base=f;t["GOT.func"]=t["GOT.func"]||{};const y=await WebAssembly.instantiate(a,t);c=Object.assign({},y.exports);a={};a.exports=Object.assign(c,{memory:m});x=await b.reduce(async(v,{headerData:z,wasmPluginBytes:B})=>{v=await v;try{const {memorySize:w,memoryAlign:C,tableSize:F}=z,E=await WebAssembly.compile(B),A=e.getImports(E),G=new WebAssembly.Global({value:"i32",mutable:!1},r*PAGE_SIZE$$module$src$module);l.grow(F);A.env=Object.assign({},A.env);A.env.memory= +m;A.env.__indirect_function_table=l;A.env.__memory_base=G;A.env.__stack_pointer=p;A.env.__table_base=q;A.env.csoundLoadModules=u;delete A.env.csoundWasiJsMessageCallback;r+=Math.ceil((w+C)/PAGE_SIZE$$module$src$module);const D=await WebAssembly.instantiate(E,A);assertPluginExports$$module$src$module(D)&&(D.exports.__wasm_call_ctors(),v.push(D))}catch(w){console.error("Error while compiling csound-plugin",w)}return v},[]);e.start(a);a.exports.__wasi_js_csoundSetMessageStringCallback();return[a,e]}, +module$src$module={};module$src$module.csoundWasiJsMessageCallback=csoundWasiJsMessageCallback$$module$src$module;module$src$module.default=$jscompDefaultExport$$module$src$module;function MessagePortState$$module$src$utils$message_port_state(){}MessagePortState$$module$src$utils$message_port_state.prototype.ready=!1;MessagePortState$$module$src$utils$message_port_state.prototype.port=void 0;MessagePortState$$module$src$utils$message_port_state.prototype.post=()=>{};MessagePortState$$module$src$utils$message_port_state.prototype.broadcastPlayState=()=>{};MessagePortState$$module$src$utils$message_port_state.prototype.workerState=void 0; +MessagePortState$$module$src$utils$message_port_state.prototype.vanillaWorkerState=void 0;var $jscompDefaultExport$$module$src$utils$message_port_state=MessagePortState$$module$src$utils$message_port_state,module$src$utils$message_port_state={};module$src$utils$message_port_state.MessagePortState=MessagePortState$$module$src$utils$message_port_state;module$src$utils$message_port_state.default=$jscompDefaultExport$$module$src$utils$message_port_state;class ScriptProcessorNodeSingleThread$$module$src$mains$spn_main{constructor({audioContext:a,inputChannelCount:b=1,outputChannelCount:c=2}){this.publicEvents=new PublicEventAPI$$module$src$events(this);this.eventPromises=new EventPromises$$module$src$utils$event_promises;this.audioContext=a;this.onaudioprocess=this.onaudioprocess.bind(this);this.currentPlayState=void 0;this.onPlayStateChange=this.onPlayStateChange.bind(this);this.start=this.start.bind(this);this.stop=this.stop.bind(this);this.pause= +this.pause.bind(this);this.resume=this.resume.bind(this);this.csoundApi=this.csoundInstance=this.wasm=void 0;this.exportApi={};this.spn=a.createScriptProcessor(0,b,c);this.spn.audioContext=a;this.spn.inputChannelCount=b;this.spn.outputChannelCount=c;this.spn.onaudioprocess=this.onaudioprocess;this.node=this.spn;this.exportApi.getNode=async()=>this.spn;this.sampleRate=a.sampleRate;this.messagePort=new $jscompDefaultExport$$module$src$utils$message_port_state;this.messagePort.post=d=>messageEventHandler$$module$src$mains$messages_main(this)({data:{log:d}}); +this.messagePort.ready=!0;this.started=this.running=!1}async terminateInstance(){this.spn&&(this.spn.disconnect(),delete this.spn);this.audioContext&&("closed"!==this.audioContext.state&&await this.audioContext.close(),delete this.audioContext);this.publicEvents&&(this.publicEvents.terminateInstance(),delete this.publicEvents);Object.keys(this.exportApi).forEach(a=>delete this.exportApi[a]);Object.keys(this).forEach(a=>delete this[a])}async onPlayStateChange(a){if(this.publicEvents&&this.currentPlayState!== +a)switch(this.currentPlayState=a,a){case "realtimePerformanceStarted":this.publicEvents.triggerRealtimePerformanceStarted(this);break;case "realtimePerformanceEnded":this.publicEvents.triggerRealtimePerformanceEnded(this);break;case "realtimePerformancePaused":this.publicEvents.triggerRealtimePerformancePaused(this);break;case "realtimePerformanceResumed":this.publicEvents.triggerRealtimePerformanceResumed(this);break;case "renderStarted":this.publicEvents.triggerRenderStarted(this);break;case "renderEnded":this.publicEvents.triggerRenderEnded(this)}}async pause(){this.started&& +this.running&&(this.running=!1,this.onPlayStateChange("realtimePerformancePaused"))}async resume(){this.started&&!this.running&&(this.running=!0,this.onPlayStateChange("realtimePerformanceResumed"))}async stop(){if(this.started){this.eventPromises.createStopPromise();const a=this.csoundApi.csoundStop(this.csoundInstance);await this.eventPromises.waitForStop();this.watcherStdOut&&(this.watcherStdOut.close(),delete this.watcherStdOut);this.watcherStdErr&&(this.watcherStdErr.close(),delete this.watcherStdErr); +delete this.csoundInputBuffer;delete this.csoundOutputBuffer;delete this.currentPlayState;return a}}async start(){if(this.csoundApi){var a=(this.csoundApi.csoundGetOutputName(this.csoundInstance)||"test.wav").includes("dac");if(a&&"realtimePerformanceStarted"!==this.currentPlayState){this.result=0;this.csoundApi.csoundSetOption(this.csoundInstance,"--sample-rate="+this.sampleRate);this.nchnls_i=this.nchnls=-1;this.cnt=this.ksmps=a=this.csoundApi.csoundGetKsmps(this.csoundInstance);this.nchnls=this.csoundApi.csoundGetNchnls(this.csoundInstance); +this.nchnls_i=this.csoundApi.csoundGetNchnlsInput(this.csoundInstance);var b=this.csoundApi.csoundGetSpout(this.csoundInstance);this.csoundOutputBuffer=new Float64Array(this.wasm.wasi.memory.buffer,b,a*this.nchnls);b=this.csoundApi.csoundGetSpin(this.csoundInstance);this.csoundInputBuffer=new Float64Array(this.wasm.wasi.memory.buffer,b,a*this.nchnls_i);this.zerodBFS=this.csoundApi.csoundGet0dBFS(this.csoundInstance);this.publicEvents.triggerOnAudioNodeCreated(this.spn);this.eventPromises.createStartPromise(); +a=this.csoundApi.csoundStart(this.csoundInstance);this.csoundApi._isRequestingRtMidiInput(this.csoundInstance)&&requestMidi$$module$src$utils$request_midi({onMidiMessage:({data:c})=>this.csoundApi.csoundPushMidiMessage(this.csoundInstance,c[0],c[1],c[2])});this.running=!0;await this.eventPromises.waitForStart();return a}if(!a&&"renderStarted"!==this.currentPlayState)return a=this.csoundApi.csoundStart(this.csoundInstance),this.onPlayStateChange("renderStarted"),setTimeout(()=>{let c=0;for(;0===c&& +this.csoundApi&&this.csoundInstance;)c=this.csoundApi.csoundPerformKsmps(this.csoundInstance);this.onPlayStateChange&&this.onPlayStateChange("renderEnded")},0),a}else console.error("starting csound failed because csound instance wasn't created")}async initialize({wasmDataURI:a,withPlugins:b,autoConnect:c}){this.plugins||!b||isEmpty$$module$node_modules$rambda$dist$rambda_mjs(b)||(b=await fetchPlugins$$module$src$utils(b));if(!this.wasm){const [f,g]=await $jscompDefaultExport$$module$src$module({wasmDataURI:a(), +withPlugins:b,messagePort:this.messagePort});this.wasm=f;this.wasi=g;f.wasi=g}const d=$jscompDefaultExport$$module$src$libcsound(this.wasm);this.csoundApi=d;const e=await d.csoundCreate(0);this.csoundInstance=e;c&&this.spn.connect(this.audioContext.destination);this.resetCsound(!1);Object.keys(d).reduce((f,g)=>{if(["mkdir","readdir","writeFile"].includes(g)){f.fs=f.fs||{};var h=async(...k)=>makeSingleThreadCallback$$module$src$utils(this.wasm,d[g]).apply({},k);h.toString=d[g].toString;f.fs[g]=h}else h= +csoundApiRename$$module$src$utils(g),f[h]=(...k)=>makeSingleThreadCallback$$module$src$utils(e,d[g]).apply({},k),f[h].toString=d[g].toString;return f},this.exportApi);this.exportApi.pause=this.pause.bind(this);this.exportApi.resume=this.resume.bind(this);this.exportApi.start=this.start.bind(this);this.exportApi.stop=this.stop.bind(this);this.exportApi.terminateInstance=this.terminateInstance.bind(this);this.exportApi.getAudioContext=async()=>this.audioContext;this.exportApi.name="Csound: ScriptProcessor Node, Single-threaded"; +this.exportApi=this.publicEvents.decorateAPI(this.exportApi);this.exportApi.reset=()=>this.resetCsound(!0);this.exportApi.addListener("message",console.log);return this.exportApi}async resetCsound(a){if(a&&"realtimePerformanceEnded"!==this.currentPlayState&&"realtimePerformanceStarted"!==this.currentPlayState)return-1;if("realtimePerformanceStarted"===this.currentPlayState)this.onPlayStateChange("realtimePerformanceEnded");this.started=this.running=!1;this.result=0;const b=this.csoundInstance,c=this.csoundApi; +a&&c.csoundReset(b);c.csoundSetOption(b,"--sample-rate="+this.sampleRate);this.nchnls_i=this.nchnls=-1;delete this.csoundOutputBuffer;delete this.csoundInputBuffer}onaudioprocess(a){if(this.csoundApi&&!["renderStarted","renderEnded"].includes(this.currentPlayState)){if(null===this.csoundOutputBuffer||!1===this.running){var b=a.outputBuffer,c=b.getChannelData(0);if(c){c=c.length;for(var d=0;d"data:application/javascript;base64,bGV0IHNlbGYgPSBBdWRpb1dvcmtsZXRHbG9iYWxTY29wZTsKLyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyICRqc2NvbXA9JGpzY29tcHx8e307JGpzY29tcC5zY29wZT17fTt2YXIgQ09NUElMRUQ9ITAsZ29vZz1nb29nfHx7fTtnb29nLmdsb2JhbD10aGlzfHxzZWxmO2dvb2cuZXhwb3J0UGF0aF89ZnVuY3Rpb24oYSxiLGMsZCl7YT1hLnNwbGl0KCIuIik7ZD1kfHxnb29nLmdsb2JhbDthWzBdaW4gZHx8InVuZGVmaW5lZCI9PXR5cGVvZiBkLmV4ZWNTY3JpcHR8fGQuZXhlY1NjcmlwdCgidmFyICIrYVswXSk7Zm9yKHZhciBlO2EubGVuZ3RoJiYoZT1hLnNoaWZ0KCkpOylpZihhLmxlbmd0aHx8dm9pZCAwPT09YilkPWRbZV0mJmRbZV0hPT1PYmplY3QucHJvdG90eXBlW2VdP2RbZV06ZFtlXT17fTtlbHNlIGlmKCFjJiZnb29nLmlzT2JqZWN0KGIpJiZnb29nLmlzT2JqZWN0KGRbZV0pKWZvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihkW2VdW2ZdPWJbZl0pO2Vsc2UgZFtlXT1ifTsKZ29vZy5kZWZpbmU9ZnVuY3Rpb24oYSxiKXtpZighQ09NUElMRUQpe3ZhciBjPWdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTLGQ9Z29vZy5nbG9iYWwuQ0xPU1VSRV9ERUZJTkVTO2MmJnZvaWQgMD09PWMubm9kZVR5cGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLGEpP2I9Y1thXTpkJiZ2b2lkIDA9PT1kLm5vZGVUeXBlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCxhKSYmKGI9ZFthXSl9cmV0dXJuIGJ9O2dvb2cuRkVBVFVSRVNFVF9ZRUFSPTIwMjA7Z29vZy5ERUJVRz0hMDtnb29nLkxPQ0FMRT0iZW4iO2dvb2cuZ2V0TG9jYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGdvb2cuTE9DQUxFfTtnb29nLlRSVVNURURfU0lURT0hMDtnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFPUNPTVBJTEVEJiYhZ29vZy5ERUJVRztnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkc9ITE7Cmdvb2cucHJvdmlkZT1mdW5jdGlvbihhKXtpZihnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpdGhyb3cgRXJyb3IoImdvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuIik7aWYoIUNPTVBJTEVEJiZnb29nLmlzUHJvdmlkZWRfKGEpKXRocm93IEVycm9yKCdOYW1lc3BhY2UgIicrYSsnIiBhbHJlYWR5IGRlY2xhcmVkLicpO2dvb2cuY29uc3RydWN0TmFtZXNwYWNlXyhhKX07Z29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfPWZ1bmN0aW9uKGEsYixjKXtpZighQ09NUElMRUQpe2RlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bYV07Zm9yKHZhciBkPWE7KGQ9ZC5zdWJzdHJpbmcoMCxkLmxhc3RJbmRleE9mKCIuIikpKSYmIWdvb2cuZ2V0T2JqZWN0QnlOYW1lKGQpOylnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bZF09ITB9Z29vZy5leHBvcnRQYXRoXyhhLGIsYyl9O2dvb2cuTk9OQ0VfUEFUVEVSTl89L15bXHcrL18tXStbPV17MCwyfSQvOwpnb29nLmdldFNjcmlwdE5vbmNlXz1mdW5jdGlvbihhKXthPShhfHxnb29nLmdsb2JhbCkuZG9jdW1lbnQ7cmV0dXJuKGE9YS5xdWVyeVNlbGVjdG9yJiZhLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtub25jZV0iKSkmJihhPWEubm9uY2V8fGEuZ2V0QXR0cmlidXRlKCJub25jZSIpKSYmZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KGEpP2E6IiJ9O2dvb2cuVkFMSURfTU9EVUxFX1JFXz0vXlthLXpBLVpfJF1bYS16QS1aMC05Ll8kXSokLzsKZ29vZy5tb2R1bGU9ZnVuY3Rpb24oYSl7aWYoInN0cmluZyIhPT10eXBlb2YgYXx8IWF8fC0xPT1hLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pKXRocm93IEVycm9yKCJJbnZhbGlkIG1vZHVsZSBpZGVudGlmaWVyIik7aWYoIWdvb2cuaXNJbkdvb2dNb2R1bGVMb2FkZXJfKCkpdGhyb3cgRXJyb3IoIk1vZHVsZSAiK2ErIiBoYXMgYmVlbiBsb2FkZWQgaW5jb3JyZWN0bHkuIE5vdGUsIG1vZHVsZXMgY2Fubm90IGJlIGxvYWRlZCBhcyBub3JtYWwgc2NyaXB0cy4gVGhleSByZXF1aXJlIHNvbWUga2luZCBvZiBwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3UncmUgbGlrZWx5IHRyeWluZyB0byBsb2FkIGEgbW9kdWxlIHZpYSBhIHNjcmlwdCB0YWcgb3IgYXMgYSBwYXJ0IG9mIGEgY29uY2F0ZW5hdGVkIGJ1bmRsZSB3aXRob3V0IHJld3JpdGluZyB0aGUgbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWxpYnJhcnkvd2lraS9nb29nLm1vZHVsZTotYW4tRVM2LW1vZHVsZS1saWtlLWFsdGVybmF0aXZlLXRvLWdvb2cucHJvdmlkZS4iKTtpZihnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKXRocm93IEVycm9yKCJnb29nLm1vZHVsZSBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLiIpOwpnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lPWE7aWYoIUNPTVBJTEVEKXtpZihnb29nLmlzUHJvdmlkZWRfKGEpKXRocm93IEVycm9yKCdOYW1lc3BhY2UgIicrYSsnIiBhbHJlYWR5IGRlY2xhcmVkLicpO2RlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bYV19fTtnb29nLm1vZHVsZS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cubW9kdWxlLmdldEludGVybmFsXyhhKX07Z29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfPWZ1bmN0aW9uKGEpe2lmKCFDT01QSUxFRCl7aWYoYSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKXJldHVybiBnb29nLmxvYWRlZE1vZHVsZXNfW2FdLmV4cG9ydHM7aWYoIWdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1thXSlyZXR1cm4gYT1nb29nLmdldE9iamVjdEJ5TmFtZShhKSxudWxsIT1hP2E6bnVsbH1yZXR1cm4gbnVsbH07Z29vZy5Nb2R1bGVUeXBlPXtFUzY6ImVzNiIsR09PRzoiZ29vZyJ9O2dvb2cubW9kdWxlTG9hZGVyU3RhdGVfPW51bGw7Cmdvb2cuaXNJbk1vZHVsZUxvYWRlcl89ZnVuY3Rpb24oKXtyZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKXx8Z29vZy5pc0luRXM2TW9kdWxlTG9hZGVyXygpfTtnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXz1mdW5jdGlvbigpe3JldHVybiEhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8mJmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGU9PWdvb2cuTW9kdWxlVHlwZS5HT09HfTtnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfPWZ1bmN0aW9uKCl7aWYoZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8mJmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGU9PWdvb2cuTW9kdWxlVHlwZS5FUzYpcmV0dXJuITA7dmFyIGE9Z29vZy5nbG9iYWwuJGpzY29tcDtyZXR1cm4gYT8iZnVuY3Rpb24iIT10eXBlb2YgYS5nZXRDdXJyZW50TW9kdWxlUGF0aD8hMTohIWEuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTohMX07Cmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2U9ZnVuY3Rpb24oKXtpZighQ09NUElMRUQmJiFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKXRocm93IEVycm9yKCJnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlIG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgZ29vZy5tb2R1bGUiKTtpZighQ09NUElMRUQmJiFnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKXRocm93IEVycm9yKCJnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlLiIpO2dvb2cubW9kdWxlTG9hZGVyU3RhdGVfLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2U9ITB9Owpnb29nLmRlY2xhcmVNb2R1bGVJZD1mdW5jdGlvbihhKXtpZighQ09NUElMRUQpe2lmKCFnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCkpdGhyb3cgRXJyb3IoImdvb2cuZGVjbGFyZU1vZHVsZUlkIG1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBFUzYgbW9kdWxlIik7aWYoZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8mJmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpdGhyb3cgRXJyb3IoImdvb2cuZGVjbGFyZU1vZHVsZUlkIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuIik7aWYoYSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKXRocm93IEVycm9yKCdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicrYSsnIiBhbHJlYWR5IGV4aXN0cy4nKTt9aWYoZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8pZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZT1hO2Vsc2V7dmFyIGI9Z29vZy5nbG9iYWwuJGpzY29tcDtpZighYnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGIuZ2V0Q3VycmVudE1vZHVsZVBhdGgpdGhyb3cgRXJyb3IoJ01vZHVsZSB3aXRoIG5hbWVzcGFjZSAiJysKYSsnIiBoYXMgYmVlbiBsb2FkZWQgaW5jb3JyZWN0bHkuJyk7Yj1iLnJlcXVpcmUoYi5nZXRDdXJyZW50TW9kdWxlUGF0aCgpKTtnb29nLmxvYWRlZE1vZHVsZXNfW2FdPXtleHBvcnRzOmIsdHlwZTpnb29nLk1vZHVsZVR5cGUuRVM2LG1vZHVsZUlkOmF9fX07Z29vZy5zZXRUZXN0T25seT1mdW5jdGlvbihhKXtpZihnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFKXRocm93IGE9YXx8IiIsRXJyb3IoIkltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCIrKGE/IjogIithOiIuIikpO307Z29vZy5mb3J3YXJkRGVjbGFyZT1mdW5jdGlvbihhKXt9O0NPTVBJTEVEfHwoZ29vZy5pc1Byb3ZpZGVkXz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbiBnb29nLmxvYWRlZE1vZHVsZXNffHwhZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW2FdJiZudWxsIT1nb29nLmdldE9iamVjdEJ5TmFtZShhKX0sZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfPXsiZ29vZy5tb2R1bGUiOiEwfSk7Cmdvb2cuZ2V0T2JqZWN0QnlOYW1lPWZ1bmN0aW9uKGEsYil7YT1hLnNwbGl0KCIuIik7Yj1ifHxnb29nLmdsb2JhbDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihiPWJbYVtjXV0sbnVsbD09YilyZXR1cm4gbnVsbDtyZXR1cm4gYn07Z29vZy5hZGREZXBlbmRlbmN5PWZ1bmN0aW9uKGEsYixjLGQpeyFDT01QSUxFRCYmZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCYmZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShhLGIsYyxkKX07Z29vZy5FTkFCTEVfREVCVUdfTE9BREVSPSEwO2dvb2cubG9nVG9Db25zb2xlXz1mdW5jdGlvbihhKXtnb29nLmdsb2JhbC5jb25zb2xlJiZnb29nLmdsb2JhbC5jb25zb2xlLmVycm9yKGEpfTsKZ29vZy5yZXF1aXJlPWZ1bmN0aW9uKGEpe2lmKCFDT01QSUxFRCl7Z29vZy5FTkFCTEVfREVCVUdfTE9BREVSJiZnb29nLmRlYnVnTG9hZGVyXy5yZXF1ZXN0ZWQoYSk7aWYoZ29vZy5pc1Byb3ZpZGVkXyhhKSl7aWYoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKXJldHVybiBnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8oYSl9ZWxzZSBpZihnb29nLkVOQUJMRV9ERUJVR19MT0FERVIpe3ZhciBiPWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfO2dvb2cubW9kdWxlTG9hZGVyU3RhdGVfPW51bGw7dHJ5e2dvb2cuZGVidWdMb2FkZXJfLmxvYWRfKGEpfWZpbmFsbHl7Z29vZy5tb2R1bGVMb2FkZXJTdGF0ZV89Yn19cmV0dXJuIG51bGx9fTtnb29nLnJlcXVpcmVUeXBlPWZ1bmN0aW9uKGEpe3JldHVybnt9fTtnb29nLmJhc2VQYXRoPSIiO2dvb2cuYWJzdHJhY3RNZXRob2Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigidW5pbXBsZW1lbnRlZCBhYnN0cmFjdCBtZXRob2QiKTt9Owpnb29nLmFkZFNpbmdsZXRvbkdldHRlcj1mdW5jdGlvbihhKXthLmluc3RhbmNlXz12b2lkIDA7YS5nZXRJbnN0YW5jZT1mdW5jdGlvbigpe2lmKGEuaW5zdGFuY2VfKXJldHVybiBhLmluc3RhbmNlXztnb29nLkRFQlVHJiYoZ29vZy5pbnN0YW50aWF0ZWRTaW5nbGV0b25zX1tnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfLmxlbmd0aF09YSk7cmV0dXJuIGEuaW5zdGFuY2VfPW5ldyBhfX07Z29vZy5pbnN0YW50aWF0ZWRTaW5nbGV0b25zXz1bXTtnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUw9ITA7Z29vZy5TRUFMX01PRFVMRV9FWFBPUlRTPWdvb2cuREVCVUc7Z29vZy5sb2FkZWRNb2R1bGVzXz17fTtnb29nLkRFUEVOREVOQ0lFU19FTkFCTEVEPSFDT01QSUxFRCYmZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSO2dvb2cuVFJBTlNQSUxFPSJkZXRlY3QiO2dvb2cuQVNTVU1FX0VTX01PRFVMRVNfVFJBTlNQSUxFRD0hMTtnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZX05BTUU9Imdvb2ciOwpnb29nLmhhc0JhZExldFNjb3Bpbmc9bnVsbDsKZ29vZy5sb2FkTW9kdWxlPWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfO3RyeXtnb29nLm1vZHVsZUxvYWRlclN0YXRlXz17bW9kdWxlTmFtZToiIixkZWNsYXJlTGVnYWN5TmFtZXNwYWNlOiExLHR5cGU6Z29vZy5Nb2R1bGVUeXBlLkdPT0d9O3ZhciBjPXt9LGQ9YztpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpZD1hLmNhbGwodm9pZCAwLGQpO2Vsc2UgaWYoInN0cmluZyI9PT10eXBlb2YgYSlkPWdvb2cubG9hZE1vZHVsZUZyb21Tb3VyY2VfLmNhbGwodm9pZCAwLGQsYSk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBtb2R1bGUgZGVmaW5pdGlvbiIpO3ZhciBlPWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7aWYoInN0cmluZyI9PT10eXBlb2YgZSYmZSlnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlP2dvb2cuY29uc3RydWN0TmFtZXNwYWNlXyhlLGQsYyE9PWQpOmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyYmCk9iamVjdC5zZWFsJiYib2JqZWN0Ij09dHlwZW9mIGQmJm51bGwhPWQmJk9iamVjdC5zZWFsKGQpLGdvb2cubG9hZGVkTW9kdWxlc19bZV09e2V4cG9ydHM6ZCx0eXBlOmdvb2cuTW9kdWxlVHlwZS5HT09HLG1vZHVsZUlkOmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWV9O2Vsc2UgdGhyb3cgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIG5hbWUgIicrZSsnIicpO31maW5hbGx5e2dvb2cubW9kdWxlTG9hZGVyU3RhdGVfPWJ9fTtnb29nLmxvYWRNb2R1bGVGcm9tU291cmNlXz1mdW5jdGlvbihhLGIpe2V2YWwoZ29vZy5DTE9TVVJFX0VWQUxfUFJFRklMVEVSXy5jcmVhdGVTY3JpcHQoYikpO3JldHVybiBhfTtnb29nLm5vcm1hbGl6ZVBhdGhfPWZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiLyIpO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KSIuIj09YVtiXT9hLnNwbGljZShiLDEpOmImJiIuLiI9PWFbYl0mJmFbYi0xXSYmIi4uIiE9YVtiLTFdP2Euc3BsaWNlKC0tYiwyKTpiKys7cmV0dXJuIGEuam9pbigiLyIpfTsKZ29vZy5sb2FkRmlsZVN5bmNfPWZ1bmN0aW9uKGEpe2lmKGdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkMpcmV0dXJuIGdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkMoYSk7dHJ5e3ZhciBiPW5ldyBnb29nLmdsb2JhbC5YTUxIdHRwUmVxdWVzdDtiLm9wZW4oImdldCIsYSwhMSk7Yi5zZW5kKCk7cmV0dXJuIDA9PWIuc3RhdHVzfHwyMDA9PWIuc3RhdHVzP2IucmVzcG9uc2VUZXh0Om51bGx9Y2F0Y2goYyl7cmV0dXJuIG51bGx9fTtnb29nLnR5cGVPZj1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4ib2JqZWN0IiE9Yj9iOmE/QXJyYXkuaXNBcnJheShhKT8iYXJyYXkiOmI6Im51bGwifTtnb29nLmlzQXJyYXlMaWtlPWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cudHlwZU9mKGEpO3JldHVybiJhcnJheSI9PWJ8fCJvYmplY3QiPT1iJiYibnVtYmVyIj09dHlwZW9mIGEubGVuZ3RofTsKZ29vZy5pc0RhdGVMaWtlPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmlzT2JqZWN0KGEpJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRGdWxsWWVhcn07Z29vZy5pc09iamVjdD1mdW5jdGlvbihhKXt2YXIgYj10eXBlb2YgYTtyZXR1cm4ib2JqZWN0Ij09YiYmbnVsbCE9YXx8ImZ1bmN0aW9uIj09Yn07Z29vZy5nZXRVaWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGdvb2cuVUlEX1BST1BFUlRZXykmJmFbZ29vZy5VSURfUFJPUEVSVFlfXXx8KGFbZ29vZy5VSURfUFJPUEVSVFlfXT0rK2dvb2cudWlkQ291bnRlcl8pfTtnb29nLmhhc1VpZD1mdW5jdGlvbihhKXtyZXR1cm4hIWFbZ29vZy5VSURfUFJPUEVSVFlfXX07Z29vZy5yZW1vdmVVaWQ9ZnVuY3Rpb24oYSl7bnVsbCE9PWEmJiJyZW1vdmVBdHRyaWJ1dGUiaW4gYSYmYS5yZW1vdmVBdHRyaWJ1dGUoZ29vZy5VSURfUFJPUEVSVFlfKTt0cnl7ZGVsZXRlIGFbZ29vZy5VSURfUFJPUEVSVFlfXX1jYXRjaChiKXt9fTsKZ29vZy5VSURfUFJPUEVSVFlfPSJjbG9zdXJlX3VpZF8iKygxRTkqTWF0aC5yYW5kb20oKT4+PjApO2dvb2cudWlkQ291bnRlcl89MDtnb29nLmNsb25lT2JqZWN0PWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cudHlwZU9mKGEpO2lmKCJvYmplY3QiPT1ifHwiYXJyYXkiPT1iKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEuY2xvbmUpcmV0dXJuIGEuY2xvbmUoKTtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiBNYXAmJmEgaW5zdGFuY2VvZiBNYXApcmV0dXJuIG5ldyBNYXAoYSk7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgU2V0JiZhIGluc3RhbmNlb2YgU2V0KXJldHVybiBuZXcgU2V0KGEpO2I9ImFycmF5Ij09Yj9bXTp7fTtmb3IodmFyIGMgaW4gYSliW2NdPWdvb2cuY2xvbmVPYmplY3QoYVtjXSk7cmV0dXJuIGJ9cmV0dXJuIGF9O2dvb2cuYmluZE5hdGl2ZV89ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmNhbGwuYXBwbHkoYS5iaW5kLGFyZ3VtZW50cyl9Owpnb29nLmJpbmRKc189ZnVuY3Rpb24oYSxiLGMpe2lmKCFhKXRocm93IEVycm9yKCk7aWYoMjxhcmd1bWVudHMubGVuZ3RoKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShlLGQpO3JldHVybiBhLmFwcGx5KGIsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19O2dvb2cuYmluZD1mdW5jdGlvbihhLGIsYyl7RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQmJi0xIT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIik/Z29vZy5iaW5kPWdvb2cuYmluZE5hdGl2ZV86Z29vZy5iaW5kPWdvb2cuYmluZEpzXztyZXR1cm4gZ29vZy5iaW5kLmFwcGx5KG51bGwsYXJndW1lbnRzKX07Cmdvb2cucGFydGlhbD1mdW5jdGlvbihhLGIpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLnNsaWNlKCk7ZC5wdXNoLmFwcGx5KGQsYXJndW1lbnRzKTtyZXR1cm4gYS5hcHBseSh0aGlzLGQpfX07Z29vZy5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07Z29vZy5nbG9iYWxFdmFsPWZ1bmN0aW9uKGEpeygwLGV2YWwpKGEpfTsKZ29vZy5nZXRDc3NOYW1lPWZ1bmN0aW9uKGEsYil7aWYoIi4iPT1TdHJpbmcoYSkuY2hhckF0KDApKXRocm93IEVycm9yKCdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4gWW91IHBhc3NlZDogJythKTt2YXIgYz1mdW5jdGlvbihlKXtyZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bZV18fGV9LGQ9ZnVuY3Rpb24oZSl7ZT1lLnNwbGl0KCItIik7Zm9yKHZhciBmPVtdLGc9MDtnPGUubGVuZ3RoO2crKylmLnB1c2goYyhlW2ddKSk7cmV0dXJuIGYuam9pbigiLSIpfTtkPWdvb2cuY3NzTmFtZU1hcHBpbmdfPyJCWV9XSE9MRSI9PWdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8/YzpkOmZ1bmN0aW9uKGUpe3JldHVybiBlfTthPWI/YSsiLSIrZChiKTpkKGEpO3JldHVybiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUF9GTj9nb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUF9GTihhKTphfTsKZ29vZy5zZXRDc3NOYW1lTWFwcGluZz1mdW5jdGlvbihhLGIpe2dvb2cuY3NzTmFtZU1hcHBpbmdfPWE7Z29vZy5jc3NOYW1lTWFwcGluZ1N0eWxlXz1ifTshQ09NUElMRUQmJmdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORyYmKGdvb2cuY3NzTmFtZU1hcHBpbmdfPWdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORyk7Z29vZy5HZXRNc2dPcHRpb25zPWZ1bmN0aW9uKCl7fTsKZ29vZy5nZXRNc2c9ZnVuY3Rpb24oYSxiLGMpe2MmJmMuaHRtbCYmKGE9YS5yZXBsYWNlKC88L2csIiZsdDsiKSk7YyYmYy51bmVzY2FwZUh0bWxFbnRpdGllcyYmKGE9YS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mYXBvczsvZywiJyIpLnJlcGxhY2UoLyZxdW90Oy9nLCciJykucmVwbGFjZSgvJmFtcDsvZywiJiIpKTtiJiYoYT1hLnJlcGxhY2UoL1x7XCQoW159XSspfS9nLGZ1bmN0aW9uKGQsZSl7cmV0dXJuIG51bGwhPWImJmUgaW4gYj9iW2VdOmR9KSk7cmV0dXJuIGF9O2dvb2cuZ2V0TXNnV2l0aEZhbGxiYWNrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGF9O2dvb2cuZXhwb3J0U3ltYm9sPWZ1bmN0aW9uKGEsYixjKXtnb29nLmV4cG9ydFBhdGhfKGEsYiwhMCxjKX07Z29vZy5leHBvcnRQcm9wZXJ0eT1mdW5jdGlvbihhLGIsYyl7YVtiXT1jfTsKZ29vZy5pbmhlcml0cz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt9Yy5wcm90b3R5cGU9Yi5wcm90b3R5cGU7YS5zdXBlckNsYXNzXz1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgYzthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EuYmFzZT1mdW5jdGlvbihkLGUsZil7Zm9yKHZhciBnPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMiksaD0yO2g8YXJndW1lbnRzLmxlbmd0aDtoKyspZ1toLTJdPWFyZ3VtZW50c1toXTtyZXR1cm4gYi5wcm90b3R5cGVbZV0uYXBwbHkoZCxnKX19O2dvb2cuc2NvcGU9ZnVuY3Rpb24oYSl7aWYoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKXRocm93IEVycm9yKCJnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLiIpO2EuY2FsbChnb29nLmdsb2JhbCl9O0NPTVBJTEVEfHwoZ29vZy5nbG9iYWwuQ09NUElMRUQ9Q09NUElMRUQpOwpnb29nLmRlZmluZUNsYXNzPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5jb25zdHJ1Y3RvcixkPWIuc3RhdGljcztjJiZjIT1PYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yfHwoYz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4iKTt9KTtjPWdvb2cuZGVmaW5lQ2xhc3MuY3JlYXRlU2VhbGluZ0NvbnN0cnVjdG9yXyhjLGEpO2EmJmdvb2cuaW5oZXJpdHMoYyxhKTtkZWxldGUgYi5jb25zdHJ1Y3RvcjtkZWxldGUgYi5zdGF0aWNzO2dvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjLnByb3RvdHlwZSxiKTtudWxsIT1kJiYoZCBpbnN0YW5jZW9mIEZ1bmN0aW9uP2QoYyk6Z29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGMsZCkpO3JldHVybiBjfTtnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTPWdvb2cuREVCVUc7Cmdvb2cuZGVmaW5lQ2xhc3MuY3JlYXRlU2VhbGluZ0NvbnN0cnVjdG9yXz1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTP2Z1bmN0aW9uKCl7dmFyIGM9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7Y1tnb29nLlVJRF9QUk9QRVJUWV9dPWNbZ29vZy5VSURfUFJPUEVSVFlfXTtyZXR1cm4gY306YX07Z29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU189ImNvbnN0cnVjdG9yIGhhc093blByb3BlcnR5IGlzUHJvdG90eXBlT2YgcHJvcGVydHlJc0VudW1lcmFibGUgdG9Mb2NhbGVTdHJpbmcgdG9TdHJpbmcgdmFsdWVPZiIuc3BsaXQoIiAiKTsKZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjIGluIGIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsYykmJihhW2NdPWJbY10pO2Zvcih2YXIgZD0wO2Q8Z29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoO2QrKyljPWdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2RdLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLGMpJiYoYVtjXT1iW2NdKX07Z29vZy5pZGVudGl0eV89ZnVuY3Rpb24oYSl7cmV0dXJuIGF9Owpnb29nLmNyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeT1mdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9Z29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzO2lmKCFjfHwhYy5jcmVhdGVQb2xpY3kpcmV0dXJuIGI7dHJ5e2I9Yy5jcmVhdGVQb2xpY3koYSx7Y3JlYXRlSFRNTDpnb29nLmlkZW50aXR5XyxjcmVhdGVTY3JpcHQ6Z29vZy5pZGVudGl0eV8sY3JlYXRlU2NyaXB0VVJMOmdvb2cuaWRlbnRpdHlffSl9Y2F0Y2goZCl7Z29vZy5sb2dUb0NvbnNvbGVfKGQubWVzc2FnZSl9cmV0dXJuIGJ9OwohQ09NUElMRUQmJmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQmJihnb29nLmlzRWRnZV89ZnVuY3Rpb24oKXtyZXR1cm4hIShnb29nLmdsb2JhbC5uYXZpZ2F0b3ImJmdvb2cuZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQ/Z29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudDoiIikubWF0Y2goL0VkZ2VcLyhcZCspKFwuXGQpKi9pKX0sZ29vZy5pbkh0bWxEb2N1bWVudF89ZnVuY3Rpb24oKXt2YXIgYT1nb29nLmdsb2JhbC5kb2N1bWVudDtyZXR1cm4gbnVsbCE9YSYmIndyaXRlImluIGF9LGdvb2cuaXNEb2N1bWVudExvYWRpbmdfPWZ1bmN0aW9uKCl7dmFyIGE9Z29vZy5nbG9iYWwuZG9jdW1lbnQ7cmV0dXJuIGEuYXR0YWNoRXZlbnQ/ImNvbXBsZXRlIiE9YS5yZWFkeVN0YXRlOiJsb2FkaW5nIj09YS5yZWFkeVN0YXRlfSxnb29nLmZpbmRCYXNlUGF0aF89ZnVuY3Rpb24oKXtpZih2b2lkIDAhPWdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIJiYic3RyaW5nIj09PXR5cGVvZiBnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSClnb29nLmJhc2VQYXRoPQpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDtlbHNlIGlmKGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpe3ZhciBhPWdvb2cuZ2xvYmFsLmRvY3VtZW50LGI9YS5jdXJyZW50U2NyaXB0O2E9Yj9bYl06YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU0NSSVBUIik7Zm9yKGI9YS5sZW5ndGgtMTswPD1iOy0tYil7dmFyIGM9YVtiXS5zcmMsZD1jLmxhc3RJbmRleE9mKCI/Iik7ZD0tMT09ZD9jLmxlbmd0aDpkO2lmKCJiYXNlLmpzIj09Yy5zbGljZShkLTcsZCkpe2dvb2cuYmFzZVBhdGg9Yy5zbGljZSgwLGQtNyk7YnJlYWt9fX19LGdvb2cuZmluZEJhc2VQYXRoXygpLGdvb2cucHJvdGVjdFNjcmlwdFRhZ189ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvPFwvKFNDUklQVCkvaWcsIlxceDNjLyQxIil9LGdvb2cuRGVidWdMb2FkZXJfPWZ1bmN0aW9uKCl7dGhpcy5kZXBlbmRlbmNpZXNfPXt9O3RoaXMuaWRUb1BhdGhfPXt9O3RoaXMud3JpdHRlbl89e307dGhpcy5sb2FkaW5nRGVwc189CltdO3RoaXMuZGVwc1RvTG9hZF89W107dGhpcy5wYXVzZWRfPSExO3RoaXMuZmFjdG9yeV89bmV3IGdvb2cuRGVwZW5kZW5jeUZhY3Rvcnk7dGhpcy5kZWZlcnJlZENhbGxiYWNrc189e307dGhpcy5kZWZlcnJlZFF1ZXVlXz1bXX0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcD1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXtkJiYoZ29vZy5nbG9iYWwuc2V0VGltZW91dChkLDApLGQ9bnVsbCl9dmFyIGQ9YjtpZihhLmxlbmd0aCl7Yj1bXTtmb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGY9dGhpcy5nZXRQYXRoRnJvbURlcHNfKGFbZV0pO2lmKCFmKXRocm93IEVycm9yKCJVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICIrYVtlXSk7Yi5wdXNoKHRoaXMuZGVwZW5kZW5jaWVzX1tmXSl9Zj1nb29nLnJlcXVpcmU7dmFyIGc9MDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWYoYVtlXSksYltlXS5vbkxvYWQoZnVuY3Rpb24oKXsrK2c9PWEubGVuZ3RoJiZjKCl9KX1lbHNlIGMoKX0sCmdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5sb2FkQ2xvc3VyZURlcHM9ZnVuY3Rpb24oKXt0aGlzLmRlcHNUb0xvYWRfLnB1c2godGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KGdvb2cubm9ybWFsaXplUGF0aF8oZ29vZy5iYXNlUGF0aCsiZGVwcy5qcyIpLCJkZXBzLmpzIixbXSxbXSx7fSkpO3RoaXMubG9hZERlcHNfKCl9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5yZXF1ZXN0ZWQ9ZnVuY3Rpb24oYSxiKXsoYT10aGlzLmdldFBhdGhGcm9tRGVwc18oYSkpJiYoYnx8dGhpcy5hcmVEZXBzTG9hZGVkXyh0aGlzLmRlcGVuZGVuY2llc19bYV0ucmVxdWlyZXMpKSYmKGI9dGhpcy5kZWZlcnJlZENhbGxiYWNrc19bYV0pJiYoZGVsZXRlIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2FdLGIoKSl9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5zZXREZXBlbmRlbmN5RmFjdG9yeT1mdW5jdGlvbihhKXt0aGlzLmZhY3RvcnlfPWF9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5sb2FkXz0KZnVuY3Rpb24oYSl7aWYodGhpcy5nZXRQYXRoRnJvbURlcHNfKGEpKXt2YXIgYj10aGlzLGM9W10sZD1mdW5jdGlvbihlKXt2YXIgZj1iLmdldFBhdGhGcm9tRGVwc18oZSk7aWYoIWYpdGhyb3cgRXJyb3IoIkJhZCBkZXBlbmRlbmN5IHBhdGggb3Igc3ltYm9sOiAiK2UpO2lmKCFiLndyaXR0ZW5fW2ZdKXtiLndyaXR0ZW5fW2ZdPSEwO2U9Yi5kZXBlbmRlbmNpZXNfW2ZdO2ZvcihmPTA7ZjxlLnJlcXVpcmVzLmxlbmd0aDtmKyspZ29vZy5pc1Byb3ZpZGVkXyhlLnJlcXVpcmVzW2ZdKXx8ZChlLnJlcXVpcmVzW2ZdKTtjLnB1c2goZSl9fTtkKGEpO2E9ISF0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aDt0aGlzLmRlcHNUb0xvYWRfPXRoaXMuZGVwc1RvTG9hZF8uY29uY2F0KGMpO3RoaXMucGF1c2VkX3x8YXx8dGhpcy5sb2FkRGVwc18oKX1lbHNlIGdvb2cubG9nVG9Db25zb2xlXygiZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAiK2EpfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZERlcHNfPQpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLGI9dGhpcy5wYXVzZWRfO3RoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoJiYhYjspKGZ1bmN0aW9uKCl7dmFyIGM9ITEsZD1hLmRlcHNUb0xvYWRfLnNoaWZ0KCksZT0hMTthLmxvYWRpbmdfKGQpO3ZhciBmPXtwYXVzZTpmdW5jdGlvbigpe2lmKGMpdGhyb3cgRXJyb3IoIkNhbm5vdCBjYWxsIHBhdXNlIGFmdGVyIHRoZSBjYWxsIHRvIGxvYWQuIik7Yj0hMH0scmVzdW1lOmZ1bmN0aW9uKCl7Yz9hLnJlc3VtZV8oKTpiPSExfSxsb2FkZWQ6ZnVuY3Rpb24oKXtpZihlKXRocm93IEVycm9yKCJEb3VibGUgY2FsbCB0byBsb2FkZWQuIik7ZT0hMDthLmxvYWRlZF8oZCl9LHBlbmRpbmc6ZnVuY3Rpb24oKXtmb3IodmFyIGc9W10saD0wO2g8YS5sb2FkaW5nRGVwc18ubGVuZ3RoO2grKylnLnB1c2goYS5sb2FkaW5nRGVwc19baF0pO3JldHVybiBnfSxzZXRNb2R1bGVTdGF0ZTpmdW5jdGlvbihnKXtnb29nLm1vZHVsZUxvYWRlclN0YXRlXz17dHlwZTpnLAptb2R1bGVOYW1lOiIiLGRlY2xhcmVMZWdhY3lOYW1lc3BhY2U6ITF9fSxyZWdpc3RlckVzNk1vZHVsZUV4cG9ydHM6ZnVuY3Rpb24oZyxoLGspe2smJihnb29nLmxvYWRlZE1vZHVsZXNfW2tdPXtleHBvcnRzOmgsdHlwZTpnb29nLk1vZHVsZVR5cGUuRVM2LG1vZHVsZUlkOmt8fCIifSl9LHJlZ2lzdGVyR29vZ01vZHVsZUV4cG9ydHM6ZnVuY3Rpb24oZyxoKXtnb29nLmxvYWRlZE1vZHVsZXNfW2ddPXtleHBvcnRzOmgsdHlwZTpnb29nLk1vZHVsZVR5cGUuR09PRyxtb2R1bGVJZDpnfX0sY2xlYXJNb2R1bGVTdGF0ZTpmdW5jdGlvbigpe2dvb2cubW9kdWxlTG9hZGVyU3RhdGVfPW51bGx9LGRlZmVyOmZ1bmN0aW9uKGcpe2lmKGMpdGhyb3cgRXJyb3IoIkNhbm5vdCByZWdpc3RlciB3aXRoIGRlZmVyIGFmdGVyIHRoZSBjYWxsIHRvIGxvYWQuIik7YS5kZWZlcl8oZCxnKX0sYXJlRGVwc0xvYWRlZDpmdW5jdGlvbigpe3JldHVybiBhLmFyZURlcHNMb2FkZWRfKGQucmVxdWlyZXMpfX07CnRyeXtkLmxvYWQoZil9ZmluYWxseXtjPSEwfX0pKCk7YiYmdGhpcy5wYXVzZV8oKX0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXz1mdW5jdGlvbigpe3RoaXMucGF1c2VkXz0hMH0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV89ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZF8mJih0aGlzLnBhdXNlZF89ITEsdGhpcy5sb2FkRGVwc18oKSl9LGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5sb2FkaW5nXz1mdW5jdGlvbihhKXt0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGEpfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubG9hZGluZ0RlcHNfLmxlbmd0aDtiKyspaWYodGhpcy5sb2FkaW5nRGVwc19bYl09PWEpe3RoaXMubG9hZGluZ0RlcHNfLnNwbGljZShiLDEpO2JyZWFrfWZvcihiPTA7Yjx0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDtiKyspaWYodGhpcy5kZWZlcnJlZFF1ZXVlX1tiXT09CmEucGF0aCl7dGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoYiwxKTticmVha31pZih0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg9PXRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoJiYhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGgpZm9yKDt0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDspdGhpcy5yZXF1ZXN0ZWQodGhpcy5kZWZlcnJlZFF1ZXVlXy5zaGlmdCgpLCEwKTthLmxvYWRlZCgpfSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuYXJlRGVwc0xvYWRlZF89ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhhW2JdKTtpZighY3x8IShjIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NffHxnb29nLmlzUHJvdmlkZWRfKGFbYl0pKSlyZXR1cm4hMX1yZXR1cm4hMH0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc189ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gdGhpcy5pZFRvUGF0aF8/CnRoaXMuaWRUb1BhdGhfW2FdOmEgaW4gdGhpcy5kZXBlbmRlbmNpZXNfP2E6bnVsbH0sZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmRlZmVyXz1mdW5jdGlvbihhLGIpe3RoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2EucGF0aF09Yjt0aGlzLmRlZmVycmVkUXVldWVfLnB1c2goYS5wYXRoKX0sZ29vZy5Mb2FkQ29udHJvbGxlcj1mdW5jdGlvbigpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt9LGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkPWZ1bmN0aW9uKCl7fSxnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5wZW5kaW5nPWZ1bmN0aW9uKCl7fSxnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZWdpc3RlckVzNk1vZHVsZUV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuc2V0TW9kdWxlU3RhdGU9CmZ1bmN0aW9uKGEpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuY2xlYXJNb2R1bGVTdGF0ZT1mdW5jdGlvbigpe30sZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXI9ZnVuY3Rpb24oYSl7fSxnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkPWZ1bmN0aW9uKCl7fSxnb29nLkRlcGVuZGVuY3k9ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLnBhdGg9YTt0aGlzLnJlbGF0aXZlUGF0aD1iO3RoaXMucHJvdmlkZXM9Yzt0aGlzLnJlcXVpcmVzPWQ7dGhpcy5sb2FkRmxhZ3M9ZTt0aGlzLmxvYWRlZF89ITE7dGhpcy5sb2FkQ2FsbGJhY2tzXz1bXX0sZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGF0aCxiPWEuaW5kZXhPZigiOi8vIik7MDw9YiYmKGE9YS5zdWJzdHJpbmcoYiszKSxiPWEuaW5kZXhPZigiLyIpLDA8PWImJihhPWEuc3Vic3RyaW5nKGIrMSkpKTtyZXR1cm4gYX0sCmdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUub25Mb2FkPWZ1bmN0aW9uKGEpe3RoaXMubG9hZGVkXz9hKCk6dGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGEpfSxnb29nLkRlcGVuZGVuY3kucHJvdG90eXBlLmxvYWRlZD1mdW5jdGlvbigpe3RoaXMubG9hZGVkXz0hMDt2YXIgYT10aGlzLmxvYWRDYWxsYmFja3NfO3RoaXMubG9hZENhbGxiYWNrc189W107Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSgpfSxnb29nLkRlcGVuZGVuY3kuZGVmZXJfPSExLGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF89e30sZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfPWZ1bmN0aW9uKGEpe3ZhciBiPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzIpO2dvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9bYl09YTtyZXR1cm4gYn0sZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja189ZnVuY3Rpb24oYSl7ZGVsZXRlIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9bYV19LApnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfPWZ1bmN0aW9uKGEsYil7aWYoYSBpbiBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfKXtmb3IodmFyIGM9Z29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1thXSxkPVtdLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKWQucHVzaChhcmd1bWVudHNbZV0pO2MuYXBwbHkodm9pZCAwLGQpfWVsc2UgdGhyb3cgRXJyb3IoIkNhbGxiYWNrIGtleSAiK2ErIiBkb2VzIG5vdCBleGlzdCAod2FzIGJhc2UuanMgbG9hZGVkIG1vcmUgdGhhbiBvbmNlPykuIik7fSxnb29nLkRlcGVuZGVuY3kucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7aWYoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKWdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpP2EubG9hZGVkKCk6YS5wYXVzZSgpO2Vsc2UgaWYoZ29vZy5pbkh0bWxEb2N1bWVudF8oKSl7dmFyIGI9Z29vZy5nbG9iYWwuZG9jdW1lbnQ7aWYoImNvbXBsZXRlIj09CmIucmVhZHlTdGF0ZSYmIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyl7aWYoL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKSl7YS5sb2FkZWQoKTtyZXR1cm59dGhyb3cgRXJyb3IoJ0Nhbm5vdCB3cml0ZSAiJyt0aGlzLnBhdGgrJyIgYWZ0ZXIgZG9jdW1lbnQgbG9hZCcpO312YXIgYz1nb29nLmdldFNjcmlwdE5vbmNlXygpO2lmKCFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcmJmdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpe3ZhciBkPWZ1bmN0aW9uKGgpe2gucmVhZHlTdGF0ZSYmImNvbXBsZXRlIiE9aC5yZWFkeVN0YXRlP2gub25sb2FkPWQ6KGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGUpLGEubG9hZGVkKCkpfTt2YXIgZT1nb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZCk7Yz1jPycgbm9uY2U9IicrYysnIic6IiI7dmFyIGY9JzxzY3JpcHQgc3JjPSInK3RoaXMucGF0aCsnIicrCmMrKGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8/IiBkZWZlciI6IiIpKycgaWQ9InNjcmlwdC0nK2UrJyI+XHgzYy9zY3JpcHQ+JztmKz0iPHNjcmlwdCIrYysiPiI7Zj1nb29nLkRlcGVuZGVuY3kuZGVmZXJfP2YrKCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NyaXB0LSIrZSsiJykub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18oJyIrZSsiJywgdGhpcyk7XG59O1xuIik6ZisoImdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18oJyIrZSsiJywgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjcmlwdC0iK2UrIicpKTsiKTtmKz0iXHgzYy9zY3JpcHQ+IjtiLndyaXRlKGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoZik6Zil9ZWxzZXt2YXIgZz1iLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2cuZGVmZXI9Z29vZy5EZXBlbmRlbmN5LmRlZmVyXztnLmFzeW5jPSExO2MmJihnLm5vbmNlPQpjKTtnLm9ubG9hZD1mdW5jdGlvbigpe2cub25sb2FkPW51bGw7YS5sb2FkZWQoKX07Zy5zcmM9Z29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8/Z29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHRoaXMucGF0aCk6dGhpcy5wYXRoO2IuaGVhZC5hcHBlbmRDaGlsZChnKX19ZWxzZSBnb29nLmxvZ1RvQ29uc29sZV8oIkNhbm5vdCB1c2UgZGVmYXVsdCBkZWJ1ZyBsb2FkZXIgb3V0c2lkZSBvZiBIVE1MIGRvY3VtZW50cy4iKSwiZGVwcy5qcyI9PXRoaXMucmVsYXRpdmVQYXRoPyhnb29nLmxvZ1RvQ29uc29sZV8oIkNvbnNpZGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBUIGJlZm9yZSBsb2FkaW5nIGJhc2UuanMsIG9yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuIiksYS5sb2FkZWQoKSk6YS5wYXVzZSgpfSxnb29nLkVzNk1vZHVsZURlcGVuZGVuY3k9ZnVuY3Rpb24oYSxiLGMsZCxlKXtnb29nLkRlcGVuZGVuY3kuY2FsbCh0aGlzLGEsCmIsYyxkLGUpfSxnb29nLmluaGVyaXRzKGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeSxnb29nLkRlcGVuZGVuY3kpLGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGwsbSl7dmFyIG49IiIscD1nb29nLmdldFNjcmlwdE5vbmNlXygpO3AmJihuPScgbm9uY2U9IicrcCsnIicpO2w9bT8nPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luJytuKyI+IittKyJceDNjL3NjcmlwdD4iOic8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInK2wrJyInK24rIj5ceDNjL3NjcmlwdD4iO2Qud3JpdGUoZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8/Z29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChsKTpsKX1mdW5jdGlvbiBjKGwsbSl7dmFyIG49ZC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtuLmRlZmVyPSEwO24uYXN5bmM9ITE7bi50eXBlPSJtb2R1bGUiO24uc2V0QXR0cmlidXRlKCJjcm9zc29yaWdpbiIsCiEwKTt2YXIgcD1nb29nLmdldFNjcmlwdE5vbmNlXygpO3AmJihuLm5vbmNlPXApO20/bi50ZXh0PWdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdChtKTptOm4uc3JjPWdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfP2dvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTChsKTpsO2QuaGVhZC5hcHBlbmRDaGlsZChuKX1pZihnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCk/YS5sb2FkZWQoKTphLnBhdXNlKCk7ZWxzZSBpZihnb29nLmluSHRtbERvY3VtZW50XygpKXt2YXIgZD1nb29nLmdsb2JhbC5kb2N1bWVudCxlPXRoaXM7aWYoZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSl7dmFyIGY9Yjtnb29nLkRlcGVuZGVuY3kuZGVmZXJfPSEwfWVsc2UgZj1jO3ZhciBnPWdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbigpe2dvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGcpOwphLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpfSk7Zih2b2lkIDAsJ2dvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18oIicrZysnIiknKTtmKHRoaXMucGF0aCx2b2lkIDApO3ZhciBoPWdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihsKXtnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhoKTthLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyhlLnBhdGgsbCxnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKX0pO2Yodm9pZCAwLCdpbXBvcnQgKiBhcyBtIGZyb20gIicrdGhpcy5wYXRoKyciOyBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInK2grJyIsIG0pJyk7dmFyIGs9Z29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCl7Z29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oayk7YS5jbGVhck1vZHVsZVN0YXRlKCk7YS5sb2FkZWQoKX0pO2Yodm9pZCAwLCdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInKwprKyciKScpfWVsc2UgZ29vZy5sb2dUb0NvbnNvbGVfKCJDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuIiksYS5wYXVzZSgpfSxnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkLGUpe2dvb2cuRGVwZW5kZW5jeS5jYWxsKHRoaXMsYSxiLGMsZCxlKTt0aGlzLmNvbnRlbnRzXz1udWxsO3RoaXMubGF6eUZldGNoXz0hZ29vZy5pbkh0bWxEb2N1bWVudF8oKXx8ISgibm9Nb2R1bGUiaW4gZ29vZy5nbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IikpfSxnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LGdvb2cuRGVwZW5kZW5jeSksZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe2UuY29udGVudHNfPWdvb2cubG9hZEZpbGVTeW5jXyhlLnBhdGgpO2UuY29udGVudHNfJiYoZS5jb250ZW50c189CmUudHJhbnNmb3JtKGUuY29udGVudHNfKSxlLmNvbnRlbnRzXyYmKGUuY29udGVudHNfKz0iXG4vLyMgc291cmNlVVJMPSIrZS5wYXRoKSl9ZnVuY3Rpb24gYygpe2UubGF6eUZldGNoXyYmYigpO2lmKGUuY29udGVudHNfKXtmJiZhLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpO3RyeXt2YXIgbD1lLmNvbnRlbnRzXztlLmNvbnRlbnRzXz1udWxsO2dvb2cuZ2xvYmFsRXZhbChnb29nLkNMT1NVUkVfRVZBTF9QUkVGSUxURVJfLmNyZWF0ZVNjcmlwdChsKSk7aWYoZil2YXIgbT1nb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lfWZpbmFsbHl7ZiYmYS5jbGVhck1vZHVsZVN0YXRlKCl9ZiYmZ29vZy5nbG9iYWwuJGpzY29tcC5yZXF1aXJlLmVuc3VyZShbZS5nZXRQYXRoTmFtZSgpXSxmdW5jdGlvbigpe2EucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKGUucGF0aCxnb29nLmdsb2JhbC4kanNjb21wLnJlcXVpcmUoZS5nZXRQYXRoTmFtZSgpKSxtKX0pO2EubG9hZGVkKCl9fQpmdW5jdGlvbiBkKCl7dmFyIGw9Z29vZy5nbG9iYWwuZG9jdW1lbnQsbT1nb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKXtnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhtKTtjKCl9KSxuPWdvb2cuZ2V0U2NyaXB0Tm9uY2VfKCk7bj0iPHNjcmlwdCIrKG4/JyBub25jZT0iJytuKyciJzoiIikrIj4iK2dvb2cucHJvdGVjdFNjcmlwdFRhZ18oJ2dvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18oIicrbSsnIik7JykrIlx4M2Mvc2NyaXB0PiI7bC53cml0ZShnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXz9nb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKG4pOm4pfXZhciBlPXRoaXM7aWYoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKWIoKSx0aGlzLmNvbnRlbnRzXyYmZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCIiLHRoaXMuY29udGVudHNfKT8odGhpcy5jb250ZW50c189bnVsbCxhLmxvYWRlZCgpKToKYS5wYXVzZSgpO2Vsc2V7dmFyIGY9dGhpcy5sb2FkRmxhZ3MubW9kdWxlPT1nb29nLk1vZHVsZVR5cGUuRVM2O3RoaXMubGF6eUZldGNoX3x8YigpO3ZhciBnPTE8YS5wZW5kaW5nKCkubGVuZ3RoO2lmKGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8mJihnfHxnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSlhLmRlZmVyKGZ1bmN0aW9uKCl7YygpfSk7ZWxzZXt2YXIgaD1nb29nLmdsb2JhbC5kb2N1bWVudDtnPWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkmJigiQWN0aXZlWE9iamVjdCJpbiBnb29nLmdsb2JhbHx8Z29vZy5pc0VkZ2VfKCkpO2lmKGYmJmdvb2cuaW5IdG1sRG9jdW1lbnRfKCkmJmdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkmJiFnKXtnb29nLkRlcGVuZGVuY3kuZGVmZXJfPSEwO2EucGF1c2UoKTt2YXIgaz1oLm9ucmVhZHlzdGF0ZWNoYW5nZTtoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyJpbnRlcmFjdGl2ZSI9PWgucmVhZHlTdGF0ZSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPQprLGMoKSxhLnJlc3VtZSgpKTsiZnVuY3Rpb24iPT09dHlwZW9mIGsmJmsuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyl9fWVsc2UgZ29vZy5pbkh0bWxEb2N1bWVudF8oKSYmZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKT9kKCk6YygpfX19LGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24oYSl7fSxnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5PWZ1bmN0aW9uKGEsYixjLGQsZSl7Z29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kuY2FsbCh0aGlzLGEsYixjLGQsZSl9LGdvb2cuaW5oZXJpdHMoZ29vZy5QcmVUcmFuc3BpbGVkRXM2TW9kdWxlRGVwZW5kZW5jeSxnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSksZ29vZy5QcmVUcmFuc3BpbGVkRXM2TW9kdWxlRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKGEpe3JldHVybiBhfSxnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5PWZ1bmN0aW9uKGEsYiwKYyxkLGUpe2dvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LmNhbGwodGhpcyxhLGIsYyxkLGUpfSxnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kpLGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJiZ2b2lkIDAhPT1nb29nLmdsb2JhbC5KU09OPyJnb29nLmxvYWRNb2R1bGUoIitnb29nLmdsb2JhbC5KU09OLnN0cmluZ2lmeShhKyJcbi8vIyBzb3VyY2VVUkw9Iit0aGlzLnBhdGgrIlxuIikrIik7IjonZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsidXNlIHN0cmljdCI7JythKyJcbjtyZXR1cm4gZXhwb3J0c30pO1xuLy8jIHNvdXJjZVVSTD0iK3RoaXMucGF0aCsiXG4ifSxnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuYWRkRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkKXtiPQpifHxbXTthPWEucmVwbGFjZSgvXFwvZywiLyIpO3ZhciBlPWdvb2cubm9ybWFsaXplUGF0aF8oZ29vZy5iYXNlUGF0aCthKTtkJiYiYm9vbGVhbiIhPT10eXBlb2YgZHx8KGQ9ZD97bW9kdWxlOmdvb2cuTW9kdWxlVHlwZS5HT09HfTp7fSk7Yz10aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koZSxhLGIsYyxkKTt0aGlzLmRlcGVuZGVuY2llc19bZV09Yztmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuaWRUb1BhdGhfW2JbY11dPWU7dGhpcy5pZFRvUGF0aF9bYV09ZX0sZ29vZy5EZXBlbmRlbmN5RmFjdG9yeT1mdW5jdGlvbigpe30sZ29vZy5EZXBlbmRlbmN5RmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlRGVwZW5kZW5jeT1mdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBlLm1vZHVsZT09Z29vZy5Nb2R1bGVUeXBlLkdPT0c/bmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koYSxiLGMsZCxlKTplLm1vZHVsZT09Z29vZy5Nb2R1bGVUeXBlLkVTNj9nb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQ/Cm5ldyBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5KGEsYixjLGQsZSk6bmV3IGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeShhLGIsYyxkLGUpOm5ldyBnb29nLkRlcGVuZGVuY3koYSxiLGMsZCxlKX0sZ29vZy5kZWJ1Z0xvYWRlcl89bmV3IGdvb2cuRGVidWdMb2FkZXJfLGdvb2cubG9hZENsb3N1cmVEZXBzPWZ1bmN0aW9uKCl7Z29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCl9LGdvb2cuc2V0RGVwZW5kZW5jeUZhY3Rvcnk9ZnVuY3Rpb24oYSl7Z29vZy5kZWJ1Z0xvYWRlcl8uc2V0RGVwZW5kZW5jeUZhY3RvcnkoYSl9LGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfPWdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRT9nb29nLmNyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeShnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZX05BTUUrIiNiYXNlIik6bnVsbCxnb29nLmdsb2JhbC5DTE9TVVJFX05PX0RFUFN8fGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpLApnb29nLmJvb3RzdHJhcD1mdW5jdGlvbihhLGIpe2dvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChhLGIpfSk7aWYoIUNPTVBJTEVEKXt2YXIgaXNDaHJvbWU4Nz0hMTt0cnl7aXNDaHJvbWU4Nz1ldmFsKGdvb2cuZ2xvYmFsLnRydXN0ZWRUeXBlcy5lbXB0eVNjcmlwdCkhPT1nb29nLmdsb2JhbC50cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHR9Y2F0Y2goYSl7fWdvb2cuQ0xPU1VSRV9FVkFMX1BSRUZJTFRFUl89Z29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzJiZpc0Nocm9tZTg3JiZnb29nLmNyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSgiZ29vZyNiYXNlI2Rldm9ubHkjZXZhbCIpfHx7Y3JlYXRlU2NyaXB0Omdvb2cuaWRlbnRpdHlffX07Y29uc3QgcHJveHlNYXJrZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcz1TeW1ib2woIkNvbWxpbmsucHJveHkiKSxjcmVhdGVFbmRwb2ludCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLHJlbGVhc2VQcm94eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSx0aHJvd01hcmtlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzPVN5bWJvbCgiQ29tbGluay50aHJvd24iKSxpc09iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzPWE9PiJvYmplY3QiPT09dHlwZW9mIGEmJm51bGwhPT1hfHwiZnVuY3Rpb24iPT09dHlwZW9mIGEscHJveHlUcmFuc2ZlckhhbmRsZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcz0Ke2NhbkhhbmRsZTphPT5pc09iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpJiZhW3Byb3h5TWFya2VyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanNdLHNlcmlhbGl6ZShhKXtjb25zdCB7cG9ydDE6Yixwb3J0MjpjfT1uZXcgTWVzc2FnZUNoYW5uZWw7ZXhwb3NlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSxiKTtyZXR1cm5bYyxbY11dfSxkZXNlcmlhbGl6ZShhKXthLnN0YXJ0KCk7cmV0dXJuIHdyYXAkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhKX19LHRocm93VHJhbnNmZXJIYW5kbGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanM9e2NhbkhhbmRsZTphPT5pc09iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpJiYKdGhyb3dNYXJrZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyBpbiBhLHNlcmlhbGl6ZSh7dmFsdWU6YX0pe3JldHVyblthIGluc3RhbmNlb2YgRXJyb3I/e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6YS5tZXNzYWdlLG5hbWU6YS5uYW1lLHN0YWNrOmEuc3RhY2t9fTp7aXNFcnJvcjohMSx2YWx1ZTphfSxbXV19LGRlc2VyaWFsaXplKGEpe2lmKGEuaXNFcnJvcil0aHJvdyBPYmplY3QuYXNzaWduKEVycm9yKGEudmFsdWUubWVzc2FnZSksYS52YWx1ZSk7dGhyb3cgYS52YWx1ZTt9fSx0cmFuc2ZlckhhbmRsZXJzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanM9bmV3IE1hcChbWyJwcm94eSIscHJveHlUcmFuc2ZlckhhbmRsZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qc10sWyJ0aHJvdyIsdGhyb3dUcmFuc2ZlckhhbmRsZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qc11dKTsKZnVuY3Rpb24gZXhwb3NlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSxiPXNlbGYpe2IuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24gZShkKXtpZihkJiZkLmRhdGEpe3ZhciB7aWQ6Zix0eXBlOmcscGF0aDpofT1PYmplY3QuYXNzaWduKHtwYXRoOltdfSxkLmRhdGEpLGs9KGQuZGF0YS5hcmd1bWVudExpc3R8fFtdKS5tYXAoZnJvbVdpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKTt0cnl7Y29uc3QgbT1oLnNsaWNlKDAsLTEpLnJlZHVjZSgocCxxKT0+cFtxXSxhKSxuPWgucmVkdWNlKChwLHEpPT5wW3FdLGEpO3N3aXRjaChnKXtjYXNlICJHRVQiOnZhciBsPW47YnJlYWs7Y2FzZSAiU0VUIjptW2guc2xpY2UoLTEpWzBdXT1mcm9tV2lyZVZhbHVlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoZC5kYXRhLnZhbHVlKTsKbD0hMDticmVhaztjYXNlICJBUFBMWSI6bD1uLmFwcGx5KG0sayk7YnJlYWs7Y2FzZSAiQ09OU1RSVUNUIjpjb25zdCBwPW5ldyBuKC4uLmspO2w9cHJveHkkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhwKTticmVhaztjYXNlICJFTkRQT0lOVCI6Y29uc3Qge3BvcnQxOnEscG9ydDI6dX09bmV3IE1lc3NhZ2VDaGFubmVsO2V4cG9zZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEsdSk7bD10cmFuc2ZlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKHEsW3FdKTticmVhaztjYXNlICJSRUxFQVNFIjpsPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2gobSl7bD17dmFsdWU6bSxbdGhyb3dNYXJrZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qc106MH19UHJvbWlzZS5yZXNvbHZlKGwpLmNhdGNoKG09Pgooe3ZhbHVlOm0sW3Rocm93TWFya2VyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanNdOjB9KSkudGhlbihtPT57Y29uc3QgW24scF09dG9XaXJlVmFsdWUkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhtKTtiLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7aWQ6Zn0pLHApOyJSRUxFQVNFIj09PWcmJihiLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGUpLGNsb3NlRW5kUG9pbnQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhiKSl9KX19KTtiLnN0YXJ0JiZiLnN0YXJ0KCl9ZnVuY3Rpb24gaXNNZXNzYWdlUG9ydCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpe3JldHVybiJNZXNzYWdlUG9ydCI9PT1hLmNvbnN0cnVjdG9yLm5hbWV9CmZ1bmN0aW9uIGNsb3NlRW5kUG9pbnQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhKXtpc01lc3NhZ2VQb3J0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSkmJmEuY2xvc2UoKX1mdW5jdGlvbiB3cmFwJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSxiKXtyZXR1cm4gY3JlYXRlUHJveHkkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhLFtdLGIpfWZ1bmN0aW9uIHRocm93SWZQcm94eVJlbGVhc2VkJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSl7aWYoYSl0aHJvdyBFcnJvcigiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlIik7fQpmdW5jdGlvbiBjcmVhdGVQcm94eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEsYj1bXSxjPWZ1bmN0aW9uKCl7fSl7bGV0IGQ9ITE7Y29uc3QgZT1uZXcgUHJveHkoYyx7Z2V0KGYsZyl7dGhyb3dJZlByb3h5UmVsZWFzZWQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhkKTtpZihnPT09cmVsZWFzZVByb3h5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMpcmV0dXJuKCk9PnJlcXVlc3RSZXNwb25zZU1lc3NhZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhLHt0eXBlOiJSRUxFQVNFIixwYXRoOmIubWFwKGg9PmgudG9TdHJpbmcoKSl9KS50aGVuKCgpPT57Y2xvc2VFbmRQb2ludCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpO2Q9ITB9KTtpZigidGhlbiI9PT0KZyl7aWYoMD09PWIubGVuZ3RoKXJldHVybnt0aGVuOigpPT5lfTtmPXJlcXVlc3RSZXNwb25zZU1lc3NhZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhLHt0eXBlOiJHRVQiLHBhdGg6Yi5tYXAoaD0+aC50b1N0cmluZygpKX0pLnRoZW4oZnJvbVdpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKTtyZXR1cm4gZi50aGVuLmJpbmQoZil9cmV0dXJuIGNyZWF0ZVByb3h5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSxbLi4uYixnXSl9LHNldChmLGcsaCl7dGhyb3dJZlByb3h5UmVsZWFzZWQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhkKTtjb25zdCBbayxsXT10b1dpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGgpO3JldHVybiByZXF1ZXN0UmVzcG9uc2VNZXNzYWdlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSwKe3R5cGU6IlNFVCIscGF0aDpbLi4uYixnXS5tYXAobT0+bS50b1N0cmluZygpKSx2YWx1ZTprfSxsKS50aGVuKGZyb21XaXJlVmFsdWUkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyl9LGFwcGx5KGYsZyxoKXt0aHJvd0lmUHJveHlSZWxlYXNlZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGQpO2Y9YltiLmxlbmd0aC0xXTtpZihmPT09Y3JlYXRlRW5kcG9pbnQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcylyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEse3R5cGU6IkVORFBPSU5UIn0pLnRoZW4oZnJvbVdpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKTtpZigiYmluZCI9PT1mKXJldHVybiBjcmVhdGVQcm94eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEsCmIuc2xpY2UoMCwtMSkpO2NvbnN0IFtrLGxdPXByb2Nlc3NBcmd1bWVudHMkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhoKTtyZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEse3R5cGU6IkFQUExZIixwYXRoOmIubWFwKG09Pm0udG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omt9LGwpLnRoZW4oZnJvbVdpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKX0sY29uc3RydWN0KGYsZyl7dGhyb3dJZlByb3h5UmVsZWFzZWQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhkKTtjb25zdCBbaCxrXT1wcm9jZXNzQXJndW1lbnRzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoZyk7cmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhLAp7dHlwZToiQ09OU1RSVUNUIixwYXRoOmIubWFwKGw9PmwudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omh9LGspLnRoZW4oZnJvbVdpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKX19KTtyZXR1cm4gZX1mdW5jdGlvbiBteUZsYXQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhKX0KZnVuY3Rpb24gcHJvY2Vzc0FyZ3VtZW50cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpe2E9YS5tYXAodG9XaXJlVmFsdWUkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyk7cmV0dXJuW2EubWFwKGI9PmJbMF0pLG15RmxhdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEubWFwKGI9PmJbMV0pKV19Y29uc3QgdHJhbnNmZXJDYWNoZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHRyYW5zZmVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSxiKXt0cmFuc2ZlckNhY2hlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMuc2V0KGEsYik7cmV0dXJuIGF9CmZ1bmN0aW9uIHByb3h5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoYSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oYSx7W3Byb3h5TWFya2VyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanNdOiEwfSl9ZnVuY3Rpb24gd2luZG93RW5kcG9pbnQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhLGI9c2VsZixjPSIqIil7cmV0dXJue3Bvc3RNZXNzYWdlOihkLGUpPT5hLnBvc3RNZXNzYWdlKGQsYyxlKSxhZGRFdmVudExpc3RlbmVyOmIuYWRkRXZlbnRMaXN0ZW5lci5iaW5kKGIpLHJlbW92ZUV2ZW50TGlzdGVuZXI6Yi5yZW1vdmVFdmVudExpc3RlbmVyLmJpbmQoYil9fQpmdW5jdGlvbiB0b1dpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpe2Zvcihjb25zdCBbYixjXW9mIHRyYW5zZmVySGFuZGxlcnMkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcylpZihjLmNhbkhhbmRsZShhKSl7Y29uc3QgW2QsZV09Yy5zZXJpYWxpemUoYSk7cmV0dXJuW3t0eXBlOiJIQU5ETEVSIixuYW1lOmIsdmFsdWU6ZH0sZV19cmV0dXJuW3t0eXBlOiJSQVciLHZhbHVlOmF9LHRyYW5zZmVyQ2FjaGUkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcy5nZXQoYSl8fFtdXX0KZnVuY3Rpb24gZnJvbVdpcmVWYWx1ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKGEpe3N3aXRjaChhLnR5cGUpe2Nhc2UgIkhBTkRMRVIiOnJldHVybiB0cmFuc2ZlckhhbmRsZXJzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMuZ2V0KGEubmFtZSkuZGVzZXJpYWxpemUoYS52YWx1ZSk7Y2FzZSAiUkFXIjpyZXR1cm4gYS52YWx1ZX19CmZ1bmN0aW9uIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcyhhLGIsYyl7cmV0dXJuIG5ldyBQcm9taXNlKGQ9Pntjb25zdCBlPWdlbmVyYXRlVVVJRCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzKCk7YS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbiBoKGcpe2cuZGF0YSYmZy5kYXRhLmlkJiZnLmRhdGEuaWQ9PT1lJiYoYS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixoKSxkKGcuZGF0YSkpfSk7YS5zdGFydCYmYS5zdGFydCgpO2EucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7aWQ6ZX0sYiksYyl9KX0KZnVuY3Rpb24gZ2VuZXJhdGVVVUlEJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMoKXtyZXR1cm4gQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikudG9TdHJpbmcoMTYpKS5qb2luKCItIil9dmFyIG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcz17fTttb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMuY3JlYXRlRW5kcG9pbnQ9Y3JlYXRlRW5kcG9pbnQkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMuZXhwb3NlPWV4cG9zZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMucHJveHk9cHJveHkkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMucHJveHlNYXJrZXI9cHJveHlNYXJrZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMucmVsZWFzZVByb3h5PXJlbGVhc2VQcm94eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkY29tbGluayRkaXN0JGVzbSRjb21saW5rX21qcy50cmFuc2Zlcj10cmFuc2ZlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanMudHJhbnNmZXJIYW5kbGVycz10cmFuc2ZlckhhbmRsZXJzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzLndpbmRvd0VuZHBvaW50PXdpbmRvd0VuZHBvaW50JCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzLndyYXA9d3JhcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRjb21saW5rJGRpc3QkZXNtJGNvbWxpbmtfbWpzO2Z1bmN0aW9uIE1lc3NhZ2VQb3J0U3RhdGUkJG1vZHVsZSRzcmMkdXRpbHMkbWVzc2FnZV9wb3J0X3N0YXRlKCl7fU1lc3NhZ2VQb3J0U3RhdGUkJG1vZHVsZSRzcmMkdXRpbHMkbWVzc2FnZV9wb3J0X3N0YXRlLnByb3RvdHlwZS5yZWFkeT0hMTtNZXNzYWdlUG9ydFN0YXRlJCRtb2R1bGUkc3JjJHV0aWxzJG1lc3NhZ2VfcG9ydF9zdGF0ZS5wcm90b3R5cGUucG9ydD12b2lkIDA7TWVzc2FnZVBvcnRTdGF0ZSQkbW9kdWxlJHNyYyR1dGlscyRtZXNzYWdlX3BvcnRfc3RhdGUucHJvdG90eXBlLnBvc3Q9KCk9Pnt9O01lc3NhZ2VQb3J0U3RhdGUkJG1vZHVsZSRzcmMkdXRpbHMkbWVzc2FnZV9wb3J0X3N0YXRlLnByb3RvdHlwZS5icm9hZGNhc3RQbGF5U3RhdGU9KCk9Pnt9O01lc3NhZ2VQb3J0U3RhdGUkJG1vZHVsZSRzcmMkdXRpbHMkbWVzc2FnZV9wb3J0X3N0YXRlLnByb3RvdHlwZS53b3JrZXJTdGF0ZT12b2lkIDA7Ck1lc3NhZ2VQb3J0U3RhdGUkJG1vZHVsZSRzcmMkdXRpbHMkbWVzc2FnZV9wb3J0X3N0YXRlLnByb3RvdHlwZS52YW5pbGxhV29ya2VyU3RhdGU9dm9pZCAwO3ZhciAkanNjb21wRGVmYXVsdEV4cG9ydCQkbW9kdWxlJHNyYyR1dGlscyRtZXNzYWdlX3BvcnRfc3RhdGU9TWVzc2FnZVBvcnRTdGF0ZSQkbW9kdWxlJHNyYyR1dGlscyRtZXNzYWdlX3BvcnRfc3RhdGUsbW9kdWxlJHNyYyR1dGlscyRtZXNzYWdlX3BvcnRfc3RhdGU9e307bW9kdWxlJHNyYyR1dGlscyRtZXNzYWdlX3BvcnRfc3RhdGUuTWVzc2FnZVBvcnRTdGF0ZT1NZXNzYWdlUG9ydFN0YXRlJCRtb2R1bGUkc3JjJHV0aWxzJG1lc3NhZ2VfcG9ydF9zdGF0ZTttb2R1bGUkc3JjJHV0aWxzJG1lc3NhZ2VfcG9ydF9zdGF0ZS5kZWZhdWx0PSRqc2NvbXBEZWZhdWx0RXhwb3J0JCRtb2R1bGUkc3JjJHV0aWxzJG1lc3NhZ2VfcG9ydF9zdGF0ZTtjb25zdCBjc291bmRDcmVhdGUkJG1vZHVsZSRzcmMkbW9kdWxlcyRpbnN0YW50aWF0aW9uPWE9PigpPT5hLmV4cG9ydHMuY3NvdW5kQ3JlYXRlV2FzaSgpO2Nzb3VuZENyZWF0ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24udG9TdHJpbmc9KCk9PiJjcmVhdGUgPSBhc3luYyAoKSA9PiB1bmRlZmluZWQ7Ijtjb25zdCBjc291bmREZXN0cm95JCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbj1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kRGVzdHJveShiKTtjc291bmREZXN0cm95JCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbi50b1N0cmluZz0oKT0+ImRlc3Ryb3kgPSBhc3luYyAoKSA9PiB1bmRlZmluZWQ7Ijtjb25zdCBjc291bmRHZXRBUElWZXJzaW9uJCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbj1hPT4oKT0+YS5leHBvcnRzLmNzb3VuZEdldEFQSVZlcnNpb24oKTsKY3NvdW5kR2V0QVBJVmVyc2lvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24udG9TdHJpbmc9KCk9PiJnZXRBUElWZXJzaW9uID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kR2V0VmVyc2lvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb249YT0+KCk9PmEuZXhwb3J0cy5jc291bmRHZXRWZXJzaW9uKCk7Y3NvdW5kR2V0VmVyc2lvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24udG9TdHJpbmc9KCk9PiJnZXRWZXJzaW9uID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kSW5pdGlhbGl6ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb249YT0+KGIsYyk9PmEuZXhwb3J0cy5jc291bmRJbml0aWFsaXplKGMpO2Nzb3VuZEluaXRpYWxpemUkJG1vZHVsZSRzcmMkbW9kdWxlcyRpbnN0YW50aWF0aW9uLnRvU3RyaW5nPSgpPT4iaW5pdGlhbGl6ZSA9IGFzeW5jICgpID0+IE51bWJlcjsiOwp2YXIgbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb249e307bW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24uY3NvdW5kQ3JlYXRlPWNzb3VuZENyZWF0ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb247bW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24uY3NvdW5kRGVzdHJveT1jc291bmREZXN0cm95JCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbjttb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbi5jc291bmRHZXRBUElWZXJzaW9uPWNzb3VuZEdldEFQSVZlcnNpb24kJG1vZHVsZSRzcmMkbW9kdWxlcyRpbnN0YW50aWF0aW9uO21vZHVsZSRzcmMkbW9kdWxlcyRpbnN0YW50aWF0aW9uLmNzb3VuZEdldFZlcnNpb249Y3NvdW5kR2V0VmVyc2lvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb247bW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24uY3NvdW5kSW5pdGlhbGl6ZT1jc291bmRJbml0aWFsaXplJCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbjtjb25zdCBXSVRIX1RFWFRfRU5DT0RFUl9QT0xZRklMTCQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzPTE7ZnVuY3Rpb24gVGV4dEVuY29kZXJQb2x5JCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMoKXt0aGlzLmVuY29kaW5nPSJ1dGY4IjtyZXR1cm4gdGhpc31UZXh0RW5jb2RlclBvbHkkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycy5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcigicGFzc2VkIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgIithKyIgIit0eXBlb2YgYSk7YT11bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYSkpO2NvbnN0IGI9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO1suLi5hXS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCl7YltkXT1jLmNvZGVQb2ludEF0KDApfSk7cmV0dXJuIGJ9OwpmdW5jdGlvbiBUZXh0RGVjb2RlclBvbHkkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycygpe3RoaXMuZW5jb2Rpbmc9InV0ZjgiO3RoaXMuaWdub3JlQk9NPSExO3RoaXMudHJpbU51bGw9YT0+e2NvbnN0IGI9YS5pbmRleE9mKCJceDAwIik7cmV0dXJuLTE8Yj9hLnNsaWNlKDAsTWF0aC5tYXgoMCxiKSk6YX07dGhpcy5kZWNvZGU9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hKXJldHVybiIiO2lmKCJib29sZWFuIiE9PXR5cGVvZih2b2lkIDAhPT1iJiYic3RyZWFtImluIGI/Yi5zdHJlYW06ITEpKXRocm93IG5ldyBUeXBlRXJyb3IoInN0cmVhbSBvcHRpb24gbXVzdCBiZSBib29sZWFuIik7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KGEpKXthPW5ldyBVaW50OEFycmF5KGEuYnVmZmVyLGEuYnl0ZU9mZnNldCxhLmJ5dGVMZW5ndGgpO2NvbnN0IGM9QXJyYXkuZnJvbSh7bGVuZ3RoOmEubGVuZ3RofSk7YS5mb3JFYWNoKGZ1bmN0aW9uKGQsZSl7Y1tlXT1TdHJpbmcuZnJvbUNvZGVQb2ludChkKX0pOwpyZXR1cm4gdGhpcy50cmltTnVsbChjLmpvaW4oIiIpKX10aHJvdyBuZXcgVHlwZUVycm9yKCJwYXNzZWQgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheSBidWZmZXIgdmlldyIpO319CmNvbnN0IGRlY29kZXIkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycz1XSVRIX1RFWFRfRU5DT0RFUl9QT0xZRklMTCQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzP25ldyBUZXh0RGVjb2RlclBvbHkkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVyczpuZXcgVGV4dERlY29kZXIoInV0ZjgiKSxlbmNvZGVyJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnM9V0lUSF9URVhUX0VOQ09ERVJfUE9MWUZJTEwkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycz9uZXcgVGV4dEVuY29kZXJQb2x5JCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnM6bmV3IFRleHRFbmNvZGVyKCJ1dGY4IiksdWludDJTdHJpbmckJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycz1hPT5kZWNvZGVyJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMuZGVjb2RlKGEpO3ZhciBtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnM9e307Cm1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycy5kZWNvZGVyPWRlY29kZXIkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVyczttb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMuZW5jb2Rlcj1lbmNvZGVyJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnM7bW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzLnVpbnQyU3RyaW5nPXVpbnQyU3RyaW5nJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnM7Y29uc3QgdHJpbU51bGwkJG1vZHVsZSRzcmMkdXRpbHMkdHJpbV9udWxsPWE9Pntjb25zdCBiPWEuaW5kZXhPZigiXHgwMCIpO3JldHVybi0xPGI/YS5zdWJzdHIoMCxiKTphfTt2YXIgbW9kdWxlJHNyYyR1dGlscyR0cmltX251bGw9e307bW9kdWxlJHNyYyR1dGlscyR0cmltX251bGwudHJpbU51bGw9dHJpbU51bGwkJG1vZHVsZSRzcmMkdXRpbHMkdHJpbV9udWxsO2NvbnN0IGZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzPShhLGIpPT57YS5leHBvcnRzLmZyZWVTdHJpbmdNZW0oYil9LHB0cjJzdHJpbmckJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzPShhLGIpPT57KHtidWZmZXI6YX09YS53YXNpLm1lbW9yeSk7Yj1uZXcgVWludDhBcnJheShhLGIpO2I9dWludDJTdHJpbmckJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycyhiKTtyZXR1cm4gdHJpbU51bGwkJG1vZHVsZSRzcmMkdXRpbHMkdHJpbV9udWxsKGIpfSxzdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycz0oYSxiKT0+e2lmKCJzdHJpbmciIT09dHlwZW9mIGIpY29uc29sZS5lcnJvcigiRXhwZWN0ZWQgc3RyaW5nIGJ1dCBnb3QiLHR5cGVvZiBiKTtlbHNle2I9ZW5jb2RlciQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzLmVuY29kZShiKTt2YXIgYz1hLmV4cG9ydHMuYWxsb2NTdHJpbmdNZW0oYi5sZW5ndGgpOwooe2J1ZmZlcjphfT1hLndhc2kubWVtb3J5KTsobmV3IFVpbnQ4QXJyYXkoYSxjLGIubGVuZ3RoKzEpKS5zZXQoYik7cmV0dXJuIGN9fTt2YXIgbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnM9e307bW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMuZnJlZVN0cmluZ1B0cj1mcmVlU3RyaW5nUHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVyczttb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycy5wdHIyc3RyaW5nPXB0cjJzdHJpbmckJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzO21vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzLnN0cmluZzJwdHI9c3RyaW5nMnB0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnM7Y29uc3QgY3NvdW5kUGFyc2VPcmMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZT1hPT4oYixjKT0+YS5leHBvcnRzLmNzb3VuZFBhcnNlT3JjKGIsYyk7Y3NvdW5kUGFyc2VPcmMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+InBhcnNlT3JjID0gYXN5bmMgKG9yY2hlc3RyYSkgPT4gT2JqZWN0OyI7Y29uc3QgY3NvdW5kQ29tcGlsZVRyZWUkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZT1hPT4oYixjKT0+YS5leHBvcnRzLmNzb3VuZENvbXBpbGVUcmVlKGIsYyk7Y3NvdW5kQ29tcGlsZVRyZWUkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+ImNvbXBpbGVUcmVlID0gYXN5bmMgKHRyZWUpID0+IE51bWJlcjsiOwpjb25zdCBjc291bmRDb21waWxlT3JjJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U9YT0+KGIsYyk9PntjPXN0cmluZzJwdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7Yj1hLmV4cG9ydHMuY3NvdW5kQ29tcGlsZU9yYyhiLGMpO2ZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7cmV0dXJuIGJ9O2Nzb3VuZENvbXBpbGVPcmMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+ImNvbXBpbGVPcmMgPSBhc3luYyAob3JjaGVzdHJhKSA9PiBOdW1iZXI7IjsKY29uc3QgY3NvdW5kRXZhbENvZGUkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZT1hPT4oYixjKT0+e2M9c3RyaW5nMnB0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxjKTtiPWEuZXhwb3J0cy5jc291bmRFdmFsQ29kZShiLGMpO2ZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7cmV0dXJuIGJ9O2Nzb3VuZEV2YWxDb2RlJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UudG9TdHJpbmc9KCk9PiJjc291bmRFdmFsQ29kZSA9IGFzeW5jIChvcmNoZXN0cmEpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZFN0YXJ0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZFN0YXJ0V2FzaShiKTtjc291bmRTdGFydCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLnRvU3RyaW5nPSgpPT4ic3RhcnQgPSBhc3luYyAoKSA9PiBOdW1iZXI7IjsKY29uc3QgY3NvdW5kQ29tcGlsZUNzZCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlPWE9PihiLGMpPT57Yz1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2xldCBkO3RyeXtkPWEuZXhwb3J0cy5jc291bmRDb21waWxlQ3NkKGIsYyl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX1mcmVlU3RyaW5nUHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO3JldHVybiBkfTtjc291bmRDb21waWxlQ3NkJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UudG9TdHJpbmc9KCk9PiJjb21waWxlQ3NkID0gYXN5bmMgKHBhdGgpID0+IE51bWJlcjsiOwpjb25zdCBjc291bmRDb21waWxlQ3NkVGV4dCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlPWE9PihiLGMpPT57Yz1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2I9YS5leHBvcnRzLmNzb3VuZENvbXBpbGVDc2RUZXh0KGIsYyk7ZnJlZVN0cmluZ1B0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxjKTtyZXR1cm4gYn07Y3NvdW5kQ29tcGlsZUNzZFRleHQkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+ImNvbXBpbGVDc2RUZXh0ID0gYXN5bmMgKGNzb3VuZERvY3VtZW50KSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRQZXJmb3JtJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZFBlcmZvcm0oYik7Y3NvdW5kUGVyZm9ybSQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLnRvU3RyaW5nPSgpPT4icGVyZm9ybSA9IGFzeW5jICgpID0+IE51bWJlcjsiOwpjb25zdCBjc291bmRQZXJmb3JtS3NtcHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZT1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kUGVyZm9ybUtzbXBzV2FzaShiKTtjc291bmRQZXJmb3JtS3NtcHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+InBlcmZvcm1Lc21wcyA9IGFzeW5jIChjc291bmQpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZFBlcmZvcm1CdWZmZXIkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZT1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kUGVyZm9ybUJ1ZmZlcihiKTtjc291bmRQZXJmb3JtQnVmZmVyJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UudG9TdHJpbmc9KCk9PiJwZXJmb3JtQnVmZmVyID0gYXN5bmMgKGNzb3VuZCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kU3RvcCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlPWE9PmI9PmEuZXhwb3J0cy5jc291bmRTdG9wKGIpOwpjc291bmRTdG9wJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UudG9TdHJpbmc9KCk9PiJzdG9wID0gYXN5bmMgKCkgPT4gdW5kZWZpbmVkOyI7Y29uc3QgY3NvdW5kQ2xlYW51cCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlPWE9PmI9PmEuZXhwb3J0cy5jc291bmRDbGVhbnVwKGIpO2Nzb3VuZENsZWFudXAkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+ImNsZWFudXAgPSBhc3luYyAoKSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRSZXNldCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlPWE9PmI9PmEuZXhwb3J0cy5jc291bmRSZXNldFdhc2koYik7Y3NvdW5kUmVzZXQkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS50b1N0cmluZz0oKT0+InJlc2V0ID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7dmFyIG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZT17fTsKbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLmNzb3VuZENsZWFudXA9Y3NvdW5kQ2xlYW51cCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlO21vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS5jc291bmRDb21waWxlQ3NkPWNzb3VuZENvbXBpbGVDc2QkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZTttb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UuY3NvdW5kQ29tcGlsZUNzZFRleHQ9Y3NvdW5kQ29tcGlsZUNzZFRleHQkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZTttb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UuY3NvdW5kQ29tcGlsZU9yYz1jc291bmRDb21waWxlT3JjJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U7bW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLmNzb3VuZENvbXBpbGVUcmVlPWNzb3VuZENvbXBpbGVUcmVlJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U7Cm1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS5jc291bmRFdmFsQ29kZT1jc291bmRFdmFsQ29kZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlO21vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS5jc291bmRQYXJzZU9yYz1jc291bmRQYXJzZU9yYyQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlO21vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZS5jc291bmRQZXJmb3JtPWNzb3VuZFBlcmZvcm0kJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZTttb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UuY3NvdW5kUGVyZm9ybUJ1ZmZlcj1jc291bmRQZXJmb3JtQnVmZmVyJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U7bW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLmNzb3VuZFBlcmZvcm1Lc21wcz1jc291bmRQZXJmb3JtS3NtcHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZTsKbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLmNzb3VuZFJlc2V0PWNzb3VuZFJlc2V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U7bW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLmNzb3VuZFN0YXJ0PWNzb3VuZFN0YXJ0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2U7bW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLmNzb3VuZFN0b3A9Y3NvdW5kU3RvcCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlO2NvbnN0IHNpemVPZlByaW1pdGl2ZSQkbW9kdWxlJHNyYyR1dGlscyRuYXRpdmVfc2l6ZXM9e2ludDo0LE1ZRkxUOjQsY2hhcjoxfSxzaXplb2ZTdHJ1Y3QkJG1vZHVsZSRzcmMkdXRpbHMkbmF0aXZlX3NpemVzPWE9PmEucmVkdWNlKChiLFssYywuLi5kXSk9PmIrKCJjaGFyIj09PWM/c2l6ZU9mUHJpbWl0aXZlJCRtb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplc1tjXSpkWzBdOnNpemVPZlByaW1pdGl2ZSQkbW9kdWxlJHNyYyR1dGlscyRuYXRpdmVfc2l6ZXNbY10pLDApO3ZhciBtb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplcz17fTttb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplcy5zaXplT2ZQcmltaXRpdmU9c2l6ZU9mUHJpbWl0aXZlJCRtb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplczttb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplcy5zaXplb2ZTdHJ1Y3Q9c2l6ZW9mU3RydWN0JCRtb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplcztjb25zdCBzdHJ1Y3RCdWZmZXJUb09iamVjdCQkbW9kdWxlJHNyYyR1dGlscyRzdHJ1Y3R1cmVfYnVmZmVyX3RvX29iamVjdD0oYSxiKT0+e1thXT1hLnJlZHVjZSgoW2MsZF0sW2UsZiwuLi5nXSk9PntnPSJjaGFyIj09PWY/c2l6ZU9mUHJpbWl0aXZlJCRtb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplc1tmXSpnWzBdOnNpemVPZlByaW1pdGl2ZSQkbW9kdWxlJHNyYyR1dGlscyRuYXRpdmVfc2l6ZXNbZl07Zj0iY2hhciI9PT1mP3RyaW1OdWxsJCRtb2R1bGUkc3JjJHV0aWxzJHRyaW1fbnVsbCh1aW50MlN0cmluZyQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzKGIuc3ViYXJyYXkoZCxnKSkpfHwiIjpiW2RdO2NbZV09ZjtyZXR1cm5bYyxkK2ddfSxbe30sMF0pO3JldHVybiBhfTt2YXIgbW9kdWxlJHNyYyR1dGlscyRzdHJ1Y3R1cmVfYnVmZmVyX3RvX29iamVjdD17fTsKbW9kdWxlJHNyYyR1dGlscyRzdHJ1Y3R1cmVfYnVmZmVyX3RvX29iamVjdC5zdHJ1Y3RCdWZmZXJUb09iamVjdD1zdHJ1Y3RCdWZmZXJUb09iamVjdCQkbW9kdWxlJHNyYyR1dGlscyRzdHJ1Y3R1cmVfYnVmZmVyX3RvX29iamVjdDtjb25zdCBDU09VTkRfUEFSQU1TJCRtb2R1bGUkc3JjJHN0cnVjdHVyZXM9W1siZGVidWdfbW9kZSIsImludCJdLFsiYnVmZmVyX2ZyYW1lcyIsImludCJdLFsiaGFyZHdhcmVfYnVmZmVyX2ZyYW1lcyIsImludCJdLFsiZGlzcGxheXMiLCJpbnQiXSxbImFzY2lpX2dyYXBocyIsImludCJdLFsicG9zdHNjcmlwdF9ncmFwaHMiLCJpbnQiXSxbIm1lc3NhZ2VfbGV2ZWwiLCJpbnQiXSxbInRlbXBvIiwiaW50Il0sWyJyaW5nX2JlbGwiLCJpbnQiXSxbInVzZV9jc2NvcmUiLCJpbnQiXSxbInRlcm1pbmF0ZV9vbl9taWRpIiwiaW50Il0sWyJoZWFydGJlYXQiLCJpbnQiXSxbImRlZmVyX2dlbjAxX2xvYWQiLCJpbnQiXSxbIm1pZGlfa2V5IiwiaW50Il0sWyJtaWRpX2tleV9jcHMiLCJpbnQiXSxbIm1pZGlfa2V5X29jdCIsImludCJdLFsibWlkaV9rZXlfcGNoIiwiaW50Il0sWyJtaWRpX3ZlbG9jaXR5IiwiaW50Il0sWyJtaWRpX3ZlbG9jaXR5X2FtcCIsImludCJdLFsibm9fZGVmYXVsdF9wYXRocyIsCiJpbnQiXSxbIm51bWJlcl9vZl90aHJlYWRzIiwiaW50Il0sWyJzeW50YXhfY2hlY2tfb25seSIsImludCJdLFsiY3NkX2xpbmVfY291bnRzIiwiaW50Il0sWyJjb21wdXRlX3dlaWdodHMiLCJpbnQiXSxbInJlYWx0aW1lX21vZGUiLCJpbnQiXSxbInNhbXBsZV9hY2N1cmF0ZSIsImludCJdLFsic2FtcGxlX3JhdGVfb3ZlcnJpZGUiLCJNWUZMVCJdLFsiY29udHJvbF9yYXRlX292ZXJyaWRlIiwiTVlGTFQiXSxbIm5jaG5sc19vdmVycmlkZSIsImludCJdLFsibmNobmxzX2lfb3ZlcnJpZGUiLCJpbnQiXSxbImUwZGJmc19vdmVycmlkZSIsIk1ZRkxUIl0sWyJkYWVtb24iLCJpbnQiXSxbImtzbXBzX292ZXJyaWRlIiwiaW50Il0sWyJGRlRfbGlicmFyeSIsImludCJdXSxDU19NSURJREVWSUNFJCRtb2R1bGUkc3JjJHN0cnVjdHVyZXM9W1siZGV2aWNlX25hbWUiLCJjaGFyIiw2NF0sWyJpbnRlcmZhY2VfbmFtZSIsImNoYXIiLDY0XSxbImRldmljZV9pZCIsImNoYXIiLDY0XSxbIm1pZGlfbW9kdWxlIiwKImNoYXIiLDY0XSxbImlzT3V0cHV0IiwiaW50Il1dO3ZhciBtb2R1bGUkc3JjJHN0cnVjdHVyZXM9e307Y29uc3QgY3NvdW5kR2V0U3IkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXRTcihiKTtjc291bmRHZXRTciQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMudG9TdHJpbmc9KCk9PiJnZXRTciA9IGFzeW5jICgpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZEdldEtyJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcz1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kR2V0S3IoYik7Y3NvdW5kR2V0S3IkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLnRvU3RyaW5nPSgpPT4iZ2V0S3IgPSBhc3luYyAoKSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRHZXRLc21wcyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldEtzbXBzKGIpO2Nzb3VuZEdldEtzbXBzJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy50b1N0cmluZz0oKT0+ImdldEtzbXBzID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZEdldE5jaG5scyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldE5jaG5scyhiKTtjc291bmRHZXROY2hubHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLnRvU3RyaW5nPSgpPT4iZ2V0TmNobmxzID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kR2V0TmNobmxzSW5wdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXROY2hubHNJbnB1dChiKTtjc291bmRHZXROY2hubHNJbnB1dCQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMudG9TdHJpbmc9KCk9PiJnZXROY2hubHNJbnB1dCA9IGFzeW5jICgpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZEdldDBkQkZTJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcz1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kR2V0MGRCRlMoYik7CmNzb3VuZEdldDBkQkZTJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy50b1N0cmluZz0oKT0+ImdldDBkQkZTID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kR2V0QTQkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXRBNChiKTtjc291bmRHZXRBNCQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMudG9TdHJpbmc9KCk9PiJnZXRBNCA9IGFzeW5jICgpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZEdldEN1cnJlbnRUaW1lU2FtcGxlcyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldEN1cnJlbnRUaW1lU2FtcGxlcyhiKTtjc291bmRHZXRDdXJyZW50VGltZVNhbXBsZXMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLnRvU3RyaW5nPSgpPT4iZ2V0Q3VycmVudFRpbWVTYW1wbGVzID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZEdldFNpemVPZk1ZRkxUJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcz1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kR2V0U2l6ZU9mTVlGTFQoYik7Y3NvdW5kR2V0U2l6ZU9mTVlGTFQkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLnRvU3RyaW5nPSgpPT4iZ2V0U2l6ZU9mTVlGTFQgPSBhc3luYyAoKSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRTZXRPcHRpb24kJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPWE9PihiLGMpPT57Yz1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2I9YS5leHBvcnRzLmNzb3VuZFNldE9wdGlvbihiLGMpO2ZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7cmV0dXJuIGJ9O2Nzb3VuZFNldE9wdGlvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMudG9TdHJpbmc9KCk9PiJzZXRPcHRpb24gPSBhc3luYyAob3B0aW9uKSA9PiBOdW1iZXI7IjsKY29uc3QgY3NvdW5kU2V0UGFyYW1zJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcz1hPT4oYixjKT0+e2EuZXhwb3J0cy5jc291bmRTZXRQYXJhbXMoYixjKX07Y3NvdW5kU2V0UGFyYW1zJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy50b1N0cmluZz0oKT0+InNldFBhcmFtcyA9IGFzeW5jIChjc291bmRQYXJhbXMpID0+IHVuZGVmaW5lZDsiOwpjb25zdCBjc291bmRHZXRQYXJhbXMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPWE9PmI9Pnt2YXIge2J1ZmZlcjpjfT1hLndhc2kubWVtb3J5O2NvbnN0IGQ9c2l6ZW9mU3RydWN0JCRtb2R1bGUkc3JjJHV0aWxzJG5hdGl2ZV9zaXplcyhDU09VTkRfUEFSQU1TJCRtb2R1bGUkc3JjJHN0cnVjdHVyZXMpLGU9YS5leHBvcnRzLmFsbG9jQ3NvdW5kUGFyYW1zU3RydWN0KCk7Yz1uZXcgVWludDhBcnJheShjLGUsZCk7YS5leHBvcnRzLmNzb3VuZEdldFBhcmFtcyhiLGUpO2I9c3RydWN0QnVmZmVyVG9PYmplY3QkJG1vZHVsZSRzcmMkdXRpbHMkc3RydWN0dXJlX2J1ZmZlcl90b19vYmplY3QoQ1NPVU5EX1BBUkFNUyQkbW9kdWxlJHNyYyRzdHJ1Y3R1cmVzLGMpO2EuZXhwb3J0cy5mcmVlQ3NvdW5kUGFyYW1zKGUpO3JldHVybiBifTtjc291bmRHZXRQYXJhbXMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLnRvU3RyaW5nPSgpPT4iZ2V0UGFyYW1zID0gYXN5bmMgKCkgPT4gQ1NPVU5EX1BBUkFNUzsiOwpjb25zdCBjc291bmRHZXREZWJ1ZyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldERlYnVnKGIpO2Nzb3VuZEdldERlYnVnJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy50b1N0cmluZz0oKT0+ImdldERlYnVnID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kU2V0RGVidWckJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPWE9PihiLGMpPT57YS5leHBvcnRzLmNzb3VuZFNldERlYnVnKGIsYyl9O2Nzb3VuZFNldERlYnVnJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy50b1N0cmluZz0oKT0+InNldERlYnVnID0gYXN5bmMgKG51bWJlcikgPT4gdW5kZWZpbmVkOyI7dmFyIG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzPXt9O21vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLmNzb3VuZEdldDBkQkZTPWNzb3VuZEdldDBkQkZTJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlczsKbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMuY3NvdW5kR2V0QTQ9Y3NvdW5kR2V0QTQkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzO21vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLmNzb3VuZEdldEN1cnJlbnRUaW1lU2FtcGxlcz1jc291bmRHZXRDdXJyZW50VGltZVNhbXBsZXMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzO21vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLmNzb3VuZEdldERlYnVnPWNzb3VuZEdldERlYnVnJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlczttb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy5jc291bmRHZXRLcj1jc291bmRHZXRLciQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM7bW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMuY3NvdW5kR2V0S3NtcHM9Y3NvdW5kR2V0S3NtcHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzOwptb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy5jc291bmRHZXROY2hubHM9Y3NvdW5kR2V0TmNobmxzJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlczttb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcy5jc291bmRHZXROY2hubHNJbnB1dD1jc291bmRHZXROY2hubHNJbnB1dCQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM7bW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMuY3NvdW5kR2V0UGFyYW1zPWNzb3VuZEdldFBhcmFtcyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXM7bW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMuY3NvdW5kR2V0U2l6ZU9mTVlGTFQ9Y3NvdW5kR2V0U2l6ZU9mTVlGTFQkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzO21vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLmNzb3VuZEdldFNyPWNzb3VuZEdldFNyJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlczsKbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMuY3NvdW5kU2V0RGVidWc9Y3NvdW5kU2V0RGVidWckJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzO21vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLmNzb3VuZFNldE9wdGlvbj1jc291bmRTZXRPcHRpb24kJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzO21vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLmNzb3VuZFNldFBhcmFtcz1jc291bmRTZXRQYXJhbXMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzO2NvbnN0IGNzb3VuZEdldElucHV0QnVmZmVyU2l6ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW89YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldElucHV0QnVmZmVyU2l6ZShiKTtjc291bmRHZXRJbnB1dEJ1ZmZlclNpemUkJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvLnRvU3RyaW5nPSgpPT4iZ2V0SW5wdXRCdWZmZXJTaXplID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kR2V0T3V0cHV0QnVmZmVyU2l6ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW89YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldE91dHB1dEJ1ZmZlclNpemUoYik7Y3NvdW5kR2V0T3V0cHV0QnVmZmVyU2l6ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW8udG9TdHJpbmc9KCk9PiJnZXRPdXRwdXRCdWZmZXJTaXplID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7Y29uc3QgY3NvdW5kR2V0SW5wdXRCdWZmZXIkJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXRJbnB1dEJ1ZmZlcihiKTsKY3NvdW5kR2V0SW5wdXRCdWZmZXIkJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvLnRvU3RyaW5nPSgpPT4iZ2V0SW5wdXRCdWZmZXIgPSBhc3luYyAoKSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRHZXRPdXRwdXRCdWZmZXIkJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXRPdXRwdXRCdWZmZXIoYik7Y3NvdW5kR2V0T3V0cHV0QnVmZmVyJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpby50b1N0cmluZz0oKT0+ImdldE91dHB1dEJ1ZmZlciA9IGFzeW5jICgpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZEdldFNwaW4kJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXRTcGluKGIpO2Nzb3VuZEdldFNwaW4kJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvLnRvU3RyaW5nPSgpPT4iZ2V0U3BpbiA9IGFzeW5jIChjc291bmQpID0+IE51bWJlcjsiOwpjb25zdCBjc291bmRHZXRTcG91dCQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW89YT0+Yj0+YS5leHBvcnRzLmNzb3VuZEdldFNwb3V0KGIpO2Nzb3VuZEdldFNwb3V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpby50b1N0cmluZz0oKT0+ImdldFNwb3V0ID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7dmFyIG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvPXt9O21vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvLmNzb3VuZEdldElucHV0QnVmZmVyPWNzb3VuZEdldElucHV0QnVmZmVyJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbzttb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpby5jc291bmRHZXRJbnB1dEJ1ZmZlclNpemU9Y3NvdW5kR2V0SW5wdXRCdWZmZXJTaXplJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbzttb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpby5jc291bmRHZXRPdXRwdXRCdWZmZXI9Y3NvdW5kR2V0T3V0cHV0QnVmZmVyJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbzsKbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW8uY3NvdW5kR2V0T3V0cHV0QnVmZmVyU2l6ZT1jc291bmRHZXRPdXRwdXRCdWZmZXJTaXplJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbzttb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpby5jc291bmRHZXRTcGluPWNzb3VuZEdldFNwaW4kJG1vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvO21vZHVsZSRzcmMkbW9kdWxlcyRydGF1ZGlvLmNzb3VuZEdldFNwb3V0PWNzb3VuZEdldFNwb3V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbztmdW5jdGlvbiBhZGQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5hZGQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOk51bWJlcihhKStOdW1iZXIoYil9Y29uc3QgY2xvbmVMaXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9YT0+QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7ZnVuY3Rpb24gY3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGI9W10pe3JldHVybiguLi5jKT0+e2M9Wy4uLmIsLi4uY107cmV0dXJuIGMubGVuZ3RoPj1hLmxlbmd0aD9hKC4uLmMpOmN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKX19CmZ1bmN0aW9uIGFkanVzdEZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe2NvbnN0IGQ9MD5hP2MubGVuZ3RoK2E6YTtpZihhPj1jLmxlbmd0aHx8MD5kKXJldHVybiBjO2E9Y2xvbmVMaXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYyk7YVtkXT1iKGFbZF0pO3JldHVybiBhfWNvbnN0IGFkanVzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYWRqdXN0Rm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7CmZ1bmN0aW9uIGFsbCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGM9PmFsbCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk7Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKyspaWYoIWEoYltjXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gYWxsUGFzcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiguLi5iKT0+e2xldCBjPTA7Zm9yKDtjPGEubGVuZ3RoOyl7aWYoIWFbY10oLi4uYikpcmV0dXJuITE7YysrfXJldHVybiEwfX1mdW5jdGlvbiBhbHdheXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gYj0+YX0KZnVuY3Rpb24gYW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+YW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTphJiZifWZ1bmN0aW9uIGFueSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PmFueSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7bGV0IGM9MDtmb3IoO2M8Yi5sZW5ndGg7KXtpZihhKGJbY10sYykpcmV0dXJuITA7YysrfXJldHVybiExfQpmdW5jdGlvbiBhbnlQYXNzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuKC4uLmIpPT57bGV0IGM9MDtmb3IoO2M8YS5sZW5ndGg7KXtpZihhW2NdKC4uLmIpKXJldHVybiEwO2MrK31yZXR1cm4hMX19ZnVuY3Rpb24gYXBwZW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD0+YXBwZW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxkKTtpZigic3RyaW5nIj09PXR5cGVvZiBiKXJldHVybiBiLnNwbGl0KCIiKS5jb25jYXQoYSk7Y29uc3QgYz1jbG9uZUxpc3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKTtjLnB1c2goYSk7cmV0dXJuIGN9CmZ1bmN0aW9uIGFwcGx5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+YXBwbHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmEuYXBwbHkodGhpcyxiKX1jb25zdCB7aXNBcnJheTppc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanN9PUFycmF5OwpmdW5jdGlvbiBfX2ZpbmRIaWdoZXN0QXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGI9MCl7Zm9yKGNvbnN0IGMgaW4gYSkhMSE9PWEuaGFzT3duUHJvcGVydHkoYykmJiJjb25zdHJ1Y3RvciIhPT1jJiYoIm9iamVjdCI9PT10eXBlb2YgYVtjXSYmKGI9TWF0aC5tYXgoYixfX2ZpbmRIaWdoZXN0QXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhW2NdKSkpLCJmdW5jdGlvbiI9PT10eXBlb2YgYVtjXSYmKGI9TWF0aC5tYXgoYixhW2NdLmxlbmd0aCkpKTtyZXR1cm4gYn0KZnVuY3Rpb24gX19maWx0ZXJVbmRlZmluZWQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygpe2NvbnN0IGE9W107bGV0IGI9MDtjb25zdCBjPWFyZ3VtZW50cy5sZW5ndGg7Zm9yKDtiPGMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGFyZ3VtZW50c1tiXTspYVtiXT1hcmd1bWVudHNbYl0sYisrO3JldHVybiBhfQpmdW5jdGlvbiBfX2FwcGx5U3BlY1dpdGhBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXt2YXIgZD1iLWMubGVuZ3RoO2lmKDE9PT1kKXJldHVybiBmPT5fX2FwcGx5U3BlY1dpdGhBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixfX2ZpbHRlclVuZGVmaW5lZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKC4uLmMsZikpO2lmKDI9PT1kKXJldHVybihmLGcpPT5fX2FwcGx5U3BlY1dpdGhBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixfX2ZpbHRlclVuZGVmaW5lZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKC4uLmMsZixnKSk7aWYoMz09PWQpcmV0dXJuKGYsZyxoKT0+X19hcHBseVNwZWNXaXRoQXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLApiLF9fZmlsdGVyVW5kZWZpbmVkJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoLi4uYyxmLGcsaCkpO2lmKDQ9PT1kKXJldHVybihmLGcsaCxrKT0+X19hcHBseVNwZWNXaXRoQXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsX19maWx0ZXJVbmRlZmluZWQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyguLi5jLGYsZyxoLGspKTtpZig0PGQpcmV0dXJuKC4uLmYpPT5fX2FwcGx5U3BlY1dpdGhBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixfX2ZpbHRlclVuZGVmaW5lZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKC4uLmMsLi4uZikpO2lmKGlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKSl7dmFyIGU9W107ZD0wO2NvbnN0IGY9YS5sZW5ndGg7CmZvcig7ZDxmO2QrKyl7aWYoIm9iamVjdCI9PT10eXBlb2YgYVtkXXx8aXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFbZF0pKWVbZF09X19hcHBseVNwZWNXaXRoQXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhW2RdLGIsYyk7ImZ1bmN0aW9uIj09PXR5cGVvZiBhW2RdJiYoZVtkXT1hW2RdKC4uLmMpKX1yZXR1cm4gZX1kPXt9O2ZvcihlIGluIGEpITEhPT1hLmhhc093blByb3BlcnR5KGUpJiYiY29uc3RydWN0b3IiIT09ZSYmKCJvYmplY3QiPT09dHlwZW9mIGFbZV0/ZFtlXT1fX2FwcGx5U3BlY1dpdGhBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFbZV0sYixjKToiZnVuY3Rpb24iPT09dHlwZW9mIGFbZV0mJihkW2VdPWFbZV0oLi4uYykpKTtyZXR1cm4gZH0KZnVuY3Rpb24gYXBwbHlTcGVjJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSwuLi5iKXtjb25zdCBjPV9fZmluZEhpZ2hlc3RBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpO3JldHVybiAwPT09Yz8oKT0+KHt9KTpfX2FwcGx5U3BlY1dpdGhBcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyxiKX1mdW5jdGlvbiBhc3NvY0ZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LGMse1thXTpifSl9Y29uc3QgYXNzb2MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFzc29jRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7CmZ1bmN0aW9uIF9pc0ludGVnZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gYTw8MD09PWF9Y29uc3QgaXNJbnRlZ2VyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9TnVtYmVyLmlzSW50ZWdlcnx8X2lzSW50ZWdlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwpmdW5jdGlvbiBhc3NvY1BhdGhGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtjb25zdCBkPSJzdHJpbmciPT09dHlwZW9mIGE/YS5zcGxpdCgiLiIpLm1hcChlPT5pc0ludGVnZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhOdW1iZXIoZSkpP051bWJlcihlKTplKTphO2lmKDA9PT1kLmxlbmd0aClyZXR1cm4gYjthPWRbMF07aWYoMTxkLmxlbmd0aCl7Y29uc3QgZT0ib2JqZWN0Ij09PXR5cGVvZiBjJiZudWxsIT09YyYmYy5oYXNPd25Qcm9wZXJ0eShhKT9jW2FdOmlzSW50ZWdlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGRbMV0pP1tdOnt9O2I9YXNzb2NQYXRoRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkLDEpLGIsZSl9cmV0dXJuIGlzSW50ZWdlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpJiYKaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMpPyhjPWNsb25lTGlzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMpLGNbYV09YixjKTphc3NvYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKX1jb25zdCBhc3NvY1BhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFzc29jUGF0aEZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBfY3VycnlOJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBkPTA7bGV0IGU9MDtjb25zdCBmPWIubGVuZ3RoLGc9YXJndW1lbnRzLmxlbmd0aCxoPUFycmF5KGYrZyk7Zm9yKDtkPGY7KWhbZF09YltkXSxkKys7Zm9yKDtlPGc7KWhbZitlXT1hcmd1bWVudHNbZV0sZSsrO2Q9YS1oLmxlbmd0aDtyZXR1cm4gaC5sZW5ndGg+PWE/Yy5hcHBseSh0aGlzLGgpOl9hcml0eSQxJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoZCxfY3VycnlOJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxoLGMpKX19CmZ1bmN0aW9uIF9hcml0eSQxJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oYyxkKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSA0OnJldHVybiBmdW5jdGlvbihjLGQsZSxmKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgNTpyZXR1cm4gZnVuY3Rpb24oYyxkLGUsZixnKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgNjpyZXR1cm4gZnVuY3Rpb24oYyxkLGUsZixnLGgpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07CmNhc2UgNzpyZXR1cm4gZnVuY3Rpb24oYyxkLGUsZixnLGgsayl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDg6cmV0dXJuIGZ1bmN0aW9uKGMsZCxlLGYsZyxoLGssbCl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDk6cmV0dXJuIGZ1bmN0aW9uKGMsZCxlLGYsZyxoLGssbCxtKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGMsZCxlLGYsZyxoLGssbCxtLG4pe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fQpmdW5jdGlvbiBjdXJyeU4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBjPT5jdXJyeU4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpO2lmKDEwPGEpdGhyb3cgRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIF9hcml0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIHRlbiIpO3JldHVybiBfYXJpdHkkMSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsX2N1cnJ5TiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsW10sYikpfQpmdW5jdGlvbiBiaW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+YmluZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6Y3VycnlOJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYS5sZW5ndGgsKC4uLmMpPT5hLmFwcGx5KGIsYykpfWZ1bmN0aW9uIGJvdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5ib3RoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTooLi4uYyk9PmEoLi4uYykmJmIoLi4uYyl9CmZ1bmN0aW9uIGNoYWluJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+Y2hhaW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOltdLmNvbmNhdCguLi5iLm1hcChhKSl9ZnVuY3Rpb24gY2xhbXBGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtpZihhPmIpdGhyb3cgRXJyb3IoIm1pbiBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gbWF4IGluIGNsYW1wKG1pbiwgbWF4LCB2YWx1ZSkiKTtpZihjPj1hJiZjPD1iKXJldHVybiBjO2lmKGM+YilyZXR1cm4gYjtpZihjPGEpcmV0dXJuIGF9Y29uc3QgY2xhbXAkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGNsYW1wRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7CmZ1bmN0aW9uIGNsb25lJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7Y29uc3QgYj1pc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk/QXJyYXkoYS5sZW5ndGgpOnt9O2lmKGEmJmEuZ2V0VGltZSlyZXR1cm4gbmV3IERhdGUoYS5nZXRUaW1lKCkpO2Zvcihjb25zdCBjIGluIGEpe2NvbnN0IGQ9YVtjXTtiW2NdPSJvYmplY3QiPT09dHlwZW9mIGQmJm51bGwhPT1kP2QuZ2V0VGltZT9uZXcgRGF0ZShkLmdldFRpbWUoKSk6Y2xvbmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhkKTpkfXJldHVybiBifWZ1bmN0aW9uIGNvbXBsZW1lbnQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4oLi4uYik9PiFhKC4uLmIpfQpjbGFzcyBSZWR1Y2VTdG9wcGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanN7Y29uc3RydWN0b3IoYSl7dGhpcy52YWx1ZT1hfX1mdW5jdGlvbiByZWR1Y2VGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtpZighaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZTogbGlzdCBtdXN0IGJlIGFycmF5IG9yIGl0ZXJhYmxlIik7bGV0IGQ9MDtjb25zdCBlPWMubGVuZ3RoO2Zvcig7ZDxlOyl7Yj1hKGIsY1tkXSxkLGMpO2lmKGIgaW5zdGFuY2VvZiBSZWR1Y2VTdG9wcGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpcmV0dXJuIGIudmFsdWU7ZCsrfXJldHVybiBifQpjb25zdCByZWR1Y2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHJlZHVjZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpLHJlZHVjZVN0b3BwZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1hPT5uZXcgUmVkdWNlU3RvcHBlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpOwpmdW5jdGlvbiBfYXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihjLGQpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihjLGQsZSl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKGMsZCxlLGYpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSA1OnJldHVybiBmdW5jdGlvbihjLGQsZSxmLGcpe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSA2OnJldHVybiBmdW5jdGlvbihjLGQsZSxmLGcsaCl7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTsKY2FzZSA3OnJldHVybiBmdW5jdGlvbihjLGQsZSxmLGcsaCxrKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgODpyZXR1cm4gZnVuY3Rpb24oYyxkLGUsZixnLGgsayxsKXtyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgOTpyZXR1cm4gZnVuY3Rpb24oYyxkLGUsZixnLGgsayxsLG0pe3JldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Y2FzZSAxMDpyZXR1cm4gZnVuY3Rpb24oYyxkLGUsZixnLGgsayxsLG0sbil7cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtkZWZhdWx0OnRocm93IEVycm9yKCJGaXJzdCBhcmd1bWVudCB0byBfYXJpdHkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG5vIGdyZWF0ZXIgdGhhbiB0ZW4iKTt9fQpmdW5jdGlvbiBfcGlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGIuY2FsbCh0aGlzLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19CmZ1bmN0aW9uIHBpcGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRocm93IEVycm9yKCJwaXBlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIpO3JldHVybiBfYXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhcmd1bWVudHNbMF0ubGVuZ3RoLHJlZHVjZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoX3BpcGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyxhcmd1bWVudHNbMF0sQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEsSW5maW5pdHkpKSl9CmZ1bmN0aW9uIGNvbXBvc2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRocm93IEVycm9yKCJjb21wb3NlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIpO3JldHVybiBwaXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkucmV2ZXJzZSgpKX1mdW5jdGlvbiBjb25jYXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5jb25jYXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOiJzdHJpbmciPT09dHlwZW9mIGE/YCR7YX0ke2J9YDpbLi4uYSwuLi5iXX0KZnVuY3Rpb24gY29uZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiBiPT57bGV0IGM9ITEsZDthLmZvckVhY2goKFtlLGZdKT0+eyFjJiZlKGIpJiYoYz0hMCxkPWYoYikpfSk7cmV0dXJuIGR9fWNvbnN0IHtrZXlzOmtleXMkMSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzfT1PYmplY3Q7ZnVuY3Rpb24gbWFwQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYz0hMSl7bGV0IGQ9MDtjb25zdCBlPUFycmF5KGIubGVuZ3RoKTtmb3IoO2Q8Yi5sZW5ndGg7KWVbZF09Yz9hKGJbZF0sZCk6YShiW2RdKSxkKys7cmV0dXJuIGV9CmZ1bmN0aW9uIG1hcE9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGc9Pm1hcE9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZyk7bGV0IGM9MDtjb25zdCBkPWtleXMkMSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpLGU9ZC5sZW5ndGgsZj17fTtmb3IoO2M8ZTspe2NvbnN0IGc9ZFtjXTtmW2ddPWEoYltnXSxnLGIpO2MrK31yZXR1cm4gZn1jb25zdCBtYXBPYmpJbmRleGVkJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9bWFwT2JqZWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7CmZ1bmN0aW9uIG1hcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGM9Pm1hcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk7aWYoIWIpdGhyb3cgRXJyb3IoSU5DT1JSRUNUX0lURVJBQkxFX0lOUFVUKTtyZXR1cm4gaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpP21hcEFycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKTptYXBPYmplY3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpfQpmdW5jdGlvbiBtYXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5tYXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmI+YT9iOmF9CmZ1bmN0aW9uIGNvbnZlcmdlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD0+Y29udmVyZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2NvbnN0IGM9cmVkdWNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoKGQsZSk9Pm1heCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGQsZS5sZW5ndGgpLDAsYik7cmV0dXJuIGN1cnJ5TiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMsZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseSh0aGlzLG1hcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGQ9PmQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGIpKX0pfQpmdW5jdGlvbiBjb3VudCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PmNvdW50JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTppc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYik/Yi5maWx0ZXIoYz0+YShjKSkubGVuZ3RoOjB9ZnVuY3Rpb24gY291bnRCeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PmNvdW50QnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2NvbnN0IGM9e307Yi5mb3JFYWNoKGQ9PntkPWEoZCk7Y1tkXT9jW2RdKys6Y1tkXT0xfSk7cmV0dXJuIGN9CmNvbnN0IGRlYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWE9PmEtMTtmdW5jdGlvbiBpc0ZhbHN5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHwhMD09PU51bWJlci5pc05hTihhKX1mdW5jdGlvbiBkZWZhdWx0VG8kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5kZWZhdWx0VG8kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmlzRmFsc3kkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKT9hOmJ9CmZ1bmN0aW9uIHR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtpZihudWxsPT09YSlyZXR1cm4iTnVsbCI7aWYodm9pZCAwPT09YSlyZXR1cm4iVW5kZWZpbmVkIjtpZihOdW1iZXIuaXNOYU4oYSkpcmV0dXJuIk5hTiI7YT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkuc2xpY2UoOCwtMSk7cmV0dXJuIkFzeW5jRnVuY3Rpb24iPT09YT8iUHJvbWlzZSI6YX0KZnVuY3Rpb24gX2xhc3RJbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZighaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpKXRocm93IEVycm9yKGBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAnaW5kZXhPZicgb2YgJHtifWApO3ZhciBjPXR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKTtpZighWyJPYmplY3QiLCJBcnJheSIsIk5hTiIsIlJlZ0V4cCJdLmluY2x1ZGVzKGMpKXJldHVybiBiLmxhc3RJbmRleE9mKGEpOyh7bGVuZ3RoOmN9PWIpO2xldCBkPS0xO2Zvcig7LTE8LS1jJiYtMT09PWQ7KWVxdWFscyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGJbY10sYSkmJihkPWMpO3JldHVybiBkfQpmdW5jdGlvbiBfaW5kZXhPZiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoIWlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKSl0aHJvdyBFcnJvcihgQ2Fubm90IHJlYWQgcHJvcGVydHkgJ2luZGV4T2YnIG9mICR7Yn1gKTt2YXIgYz10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7aWYoIVsiT2JqZWN0IiwiQXJyYXkiLCJOYU4iLCJSZWdFeHAiXS5pbmNsdWRlcyhjKSlyZXR1cm4gYi5pbmRleE9mKGEpO2xldCBkPWM9LTE7Y29uc3Qge2xlbmd0aDplfT1iO2Zvcig7KytjPGUmJi0xPT09ZDspZXF1YWxzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYltjXSxhKSYmKGQ9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIF9hcnJheUZyb21JdGVyYXRvciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe2NvbnN0IGI9W107bGV0IGM7Zm9yKDshKGM9YS5uZXh0KCkpLmRvbmU7KWIucHVzaChjLnZhbHVlKTtyZXR1cm4gYn1mdW5jdGlvbiBfZXF1YWxzU2V0cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoYS5zaXplIT09Yi5zaXplKXJldHVybiExO2E9X2FycmF5RnJvbUl0ZXJhdG9yJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYS52YWx1ZXMoKSk7Y29uc3QgYz1fYXJyYXlGcm9tSXRlcmF0b3IkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiLnZhbHVlcygpKTtyZXR1cm4gMD09PWEuZmlsdGVyKGQ9Pi0xPT09X2luZGV4T2YkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhkLGMpKS5sZW5ndGh9CmZ1bmN0aW9uIHBhcnNlRXJyb3IkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtjb25zdCBiPWEuX19wcm90b19fLnRvU3RyaW5nKCk7cmV0dXJuWyJFcnJvciIsIlR5cGVFcnJvciJdLmluY2x1ZGVzKGIpP1tiLGEubWVzc2FnZV06W119ZnVuY3Rpb24gcGFyc2VEYXRlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGEudG9EYXRlU3RyaW5nP1shMCxhLmdldFRpbWUoKV06WyExXX1mdW5jdGlvbiBwYXJzZVJlZ2V4JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGEuY29uc3RydWN0b3IhPT1SZWdFeHA/WyExXTpbITAsYS50b1N0cmluZygpXX0KZnVuY3Rpb24gZXF1YWxzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZj0+ZXF1YWxzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxmKTt2YXIgYz10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7aWYoYyE9PXR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKSlyZXR1cm4hMTtpZigiRnVuY3Rpb24iPT09YylyZXR1cm4gdm9pZCAwPT09YS5uYW1lPyExOmEubmFtZT09PWIubmFtZTtpZihbIk5hTiIsIlVuZGVmaW5lZCIsIk51bGwiXS5pbmNsdWRlcyhjKSlyZXR1cm4hMDtpZigiTnVtYmVyIj09PWMpcmV0dXJuIE9iamVjdC5pcygtMCxhKSE9PU9iamVjdC5pcygtMCxiKT8hMTphLnRvU3RyaW5nKCk9PT1iLnRvU3RyaW5nKCk7aWYoWyJTdHJpbmciLCJCb29sZWFuIl0uaW5jbHVkZXMoYykpcmV0dXJuIGEudG9TdHJpbmcoKT09PQpiLnRvU3RyaW5nKCk7aWYoIkFycmF5Ij09PWMpe2M9QXJyYXkuZnJvbShhKTtjb25zdCBmPUFycmF5LmZyb20oYik7aWYoYy50b1N0cmluZygpIT09Zi50b1N0cmluZygpKXJldHVybiExO2xldCBnPSEwO2MuZm9yRWFjaCgoaCxrKT0+e2cmJihoPT09ZltrXXx8ZXF1YWxzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoaCxmW2tdKXx8KGc9ITEpKX0pO3JldHVybiBnfXZhciBkPXBhcnNlUmVnZXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKSxlPXBhcnNlUmVnZXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKTtpZihkWzBdKXJldHVybiBlWzBdP2RbMV09PT1lWzFdOiExO2lmKGVbMF0pcmV0dXJuITE7ZD1wYXJzZURhdGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKTtlPXBhcnNlRGF0ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpOwppZihkWzBdKXJldHVybiBlWzBdP2RbMV09PT1lWzFdOiExO2lmKGVbMF0pcmV0dXJuITE7ZD1wYXJzZUVycm9yJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7ZT1wYXJzZUVycm9yJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYik7aWYoZFswXSlyZXR1cm4gZVswXT9kWzBdPT09ZVswXSYmZFsxXT09PWVbMV06ITE7aWYoIlNldCI9PT1jKXJldHVybiBfZXF1YWxzU2V0cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYik7aWYoIk9iamVjdCI9PT1jKXtjPU9iamVjdC5rZXlzKGEpO2lmKGMubGVuZ3RoIT09T2JqZWN0LmtleXMoYikubGVuZ3RoKXJldHVybiExO2xldCBmPSEwO2MuZm9yRWFjaChnPT57aWYoZil7Y29uc3QgaD1hW2ddO2c9YltnXTtoPT09Z3x8ZXF1YWxzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoaCxnKXx8KGY9ITEpfX0pOwpyZXR1cm4gZn1yZXR1cm4hMX1mdW5jdGlvbiBpbmNsdWRlcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGM9PmluY2x1ZGVzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTtpZigic3RyaW5nIj09PXR5cGVvZiBiKXJldHVybiBiLmluY2x1ZGVzKGEpO2lmKCFiKXRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCByZWFkIHByb3BlcnR5IFwnaW5kZXhPZlwnIG9mICR7Yn1gKTtyZXR1cm4gaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpPy0xPF9pbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKTohMX0KY2xhc3MgX1NldCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpze2NvbnN0cnVjdG9yKCl7dGhpcy5zZXQ9bmV3IFNldDt0aGlzLml0ZW1zPXt9fWNoZWNrVW5pcXVlbmVzcyhhKXt2YXIgYj10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7cmV0dXJuWyJOdWxsIiwiVW5kZWZpbmVkIiwiTmFOIl0uaW5jbHVkZXMoYik/YiBpbiB0aGlzLml0ZW1zPyExOnRoaXMuaXRlbXNbYl09ITA6WyJPYmplY3QiLCJBcnJheSJdLmluY2x1ZGVzKGIpP2IgaW4gdGhpcy5pdGVtcz8tMT09PV9pbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSx0aGlzLml0ZW1zW2JdKT8odGhpcy5pdGVtc1tiXS5wdXNoKGEpLCEwKTohMToodGhpcy5pdGVtc1tiXT1bYV0sITApOihiPXRoaXMuc2V0LnNpemUsdGhpcy5zZXQuYWRkKGEpLHRoaXMuc2V0LnNpemUhPT1iKX19CmZ1bmN0aW9uIHVuaXEkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtjb25zdCBiPW5ldyBfU2V0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMsYz1bXTthLmZvckVhY2goZD0+e2IuY2hlY2tVbmlxdWVuZXNzKGQpJiZjLnB1c2goZCl9KTtyZXR1cm4gY31mdW5jdGlvbiBkaWZmZXJlbmNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+ZGlmZmVyZW5jZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6dW5pcSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpLmZpbHRlcihjPT4haW5jbHVkZXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjLGIpKX0KZnVuY3Rpb24gZGlzc29jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD0+ZGlzc29jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxkKTtpZihudWxsPT09Ynx8dm9pZCAwPT09YilyZXR1cm57fTtjb25zdCBjPXt9O2Zvcihjb25zdCBkIGluIGIpY1tkXT1iW2RdO2RlbGV0ZSBjW2FdO3JldHVybiBjfWZ1bmN0aW9uIGRpdmlkZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PmRpdmlkZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6YS9ifQpmdW5jdGlvbiBkcm9wJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+ZHJvcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6Yi5zbGljZSgwPGE/YTowKX1mdW5jdGlvbiBkcm9wTGFzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PmRyb3BMYXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTowPGE/Yi5zbGljZSgwLC1hKTpiLnNsaWNlKCl9CmZ1bmN0aW9uIGRyb3BMYXN0V2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBnPT5kcm9wTGFzdFdoaWxlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxnKTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7Y29uc3QgYz1pc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYik7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBhKXRocm93IEVycm9yKGAncHJlZGljYXRlJyBpcyBmcm9tIHdyb25nIHR5cGUgJHt0eXBlb2YgYX1gKTtpZighYyYmInN0cmluZyIhPT10eXBlb2YgYil0aHJvdyBFcnJvcihgJ2l0ZXJhYmxlJyBpcyBmcm9tIHdyb25nIHR5cGUgJHt0eXBlb2YgYn1gKTtsZXQgZD0hMTtjb25zdCBlPVtdO2xldCBmPWIubGVuZ3RoO2Zvcig7MDxmOylmLS0sZHx8ITEhPT1hKGJbZl0pP2QmJmUucHVzaChiW2ZdKToKKGQ9ITAsZS5wdXNoKGJbZl0pKTtyZXR1cm4gYz9lLnJldmVyc2UoKTplLnJldmVyc2UoKS5qb2luKCIiKX1mdW5jdGlvbiBkcm9wUmVwZWF0cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe2lmKCFpc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSkpdGhyb3cgRXJyb3IoYCR7YX0gaXMgbm90IGEgbGlzdGApO2NvbnN0IGI9W107YS5yZWR1Y2UoKGMsZCk9PntlcXVhbHMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjLGQpfHxiLnB1c2goZCk7cmV0dXJuIGR9LHZvaWQgMCk7cmV0dXJuIGJ9CmZ1bmN0aW9uIGRyb3BSZXBlYXRzV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PmRyb3BSZXBlYXRzV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7aWYoIWlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKSl0aHJvdyBFcnJvcihgJHtifSBpcyBub3QgYSBsaXN0YCk7Y29uc3QgYz1bXTtiLnJlZHVjZSgoZCxlKT0+e2lmKHZvaWQgMD09PWQpcmV0dXJuIGMucHVzaChlKSxlO2EoZCxlKXx8Yy5wdXNoKGUpO3JldHVybiBlfSx2b2lkIDApO3JldHVybiBjfQpmdW5jdGlvbiBkcm9wV2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBnPT5kcm9wV2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGcpO2NvbnN0IGM9aXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpO2lmKCFjJiYic3RyaW5nIiE9PXR5cGVvZiBiKXRocm93IEVycm9yKCJgaXRlcmFibGVgIGlzIG5laXRoZXIgbGlzdCBub3IgYSBzdHJpbmciKTtsZXQgZD0hMTtjb25zdCBlPVtdO2xldCBmPS0xO2Zvcig7ZisrPGIubGVuZ3RoLTE7KWQ/ZS5wdXNoKGJbZl0pOmEoYltmXSl8fChkfHwoZD0hMCksZS5wdXNoKGJbZl0pKTtyZXR1cm4gYz9lOmUuam9pbigiIil9CmZ1bmN0aW9uIGVpdGhlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PmVpdGhlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6KC4uLmMpPT4hKCFhKC4uLmMpJiYhYiguLi5jKSl9CmZ1bmN0aW9uIGVuZHNXaXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT0+ZW5kc1dpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGUpO2lmKCJzdHJpbmciPT09dHlwZW9mIGIpcmV0dXJuIGIuZW5kc1dpdGgoYSk7aWYoIWlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKSlyZXR1cm4hMTtjb25zdCBjPWIubGVuZ3RoLWEubGVuZ3RoO2xldCBkPSEwO3JldHVybiBhLmZpbHRlcigoZSxmKT0+e2lmKCFkKXJldHVybiExOyhlPWVxdWFscyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGUsYltmK2NdKSl8fChkPSExKTtyZXR1cm4gZX0pLmxlbmd0aD09PWEubGVuZ3RofQpmdW5jdGlvbiBwcm9wJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYz0+cHJvcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk7aWYoYilyZXR1cm4gYlthXX1mdW5jdGlvbiBlcVByb3BzRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7cmV0dXJuIGVxdWFscyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHByb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpLHByb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpKX1jb25zdCBlcVByb3BzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9Y3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhlcVByb3BzRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7CmZ1bmN0aW9uIGV2b2x2ZUFycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gbWFwQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygoYyxkKT0+IkZ1bmN0aW9uIj09PXR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhW2RdKT9hW2RdKGMpOmMsYiwhMCl9CmZ1bmN0aW9uIGV2b2x2ZU9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIG1hcE9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKChjLGQpPT57aWYoIk9iamVjdCI9PT10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYykpe2NvbnN0IGU9dHlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFbZF0pO3JldHVybiJGdW5jdGlvbiI9PT1lP2FbZF0oYyk6Ik9iamVjdCI9PT1lP2V2b2x2ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFbZF0sYyk6Y31yZXR1cm4iRnVuY3Rpb24iPT09dHlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFbZF0pP2FbZF0oYyk6Y30sYil9CmZ1bmN0aW9uIGV2b2x2ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PmV2b2x2ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZSk7Y29uc3QgYz10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSksZD10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYik7aWYoZCE9PWMpdGhyb3cgRXJyb3IoIml0ZXJhYmxlVHlwZSAhPT0gcnVsZXNUeXBlIik7aWYoIVsiT2JqZWN0IiwiQXJyYXkiXS5pbmNsdWRlcyhjKSl0aHJvdyBFcnJvcihgJ2l0ZXJhYmxlJyBhbmQgJ3J1bGVzJyBhcmUgZnJvbSB3cm9uZyB0eXBlICR7Y31gKTtyZXR1cm4iT2JqZWN0Ij09PWQ/ZXZvbHZlT2JqZWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKTpldm9sdmVBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsCmIpfWZ1bmN0aW9uIEYkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygpe3JldHVybiExfWZ1bmN0aW9uIGZpbHRlck9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7Y29uc3QgYz17fTtmb3IoY29uc3QgZCBpbiBiKWEoYltkXSxkLGIpJiYoY1tkXT1iW2RdKTtyZXR1cm4gY31mdW5jdGlvbiBmaWx0ZXJBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjPSExKXtsZXQgZD0wO2NvbnN0IGU9Yi5sZW5ndGgsZj1bXTtmb3IoO2Q8ZTspKGM/YShiW2RdLGQpOmEoYltkXSkpJiZmLnB1c2goYltkXSksZCsrO3JldHVybiBmfQpmdW5jdGlvbiBmaWx0ZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBjPT5maWx0ZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpO2lmKCFiKXRocm93IEVycm9yKCJJbmNvcnJlY3QgaXRlcmFibGUgaW5wdXQiKTtyZXR1cm4gaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpP2ZpbHRlckFycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLCExKTpmaWx0ZXJPYmplY3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpfQpmdW5jdGlvbiBmaW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT0+ZmluZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZSk7bGV0IGM9MDtjb25zdCBkPWIubGVuZ3RoO2Zvcig7YzxkOyl7Y29uc3QgZT1iW2NdO2lmKGEoZSkpcmV0dXJuIGU7YysrfX1mdW5jdGlvbiBmaW5kSW5kZXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT5maW5kSW5kZXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGUpO2NvbnN0IGM9Yi5sZW5ndGg7bGV0IGQ9LTE7Zm9yKDsrK2Q8YzspaWYoYShiW2RdKSlyZXR1cm4gZDtyZXR1cm4tMX0KZnVuY3Rpb24gZmluZExhc3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPT5maW5kTGFzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7bGV0IGM9Yi5sZW5ndGg7Zm9yKDswPD0tLWM7KWlmKGEoYltjXSkpcmV0dXJuIGJbY119ZnVuY3Rpb24gZmluZExhc3RJbmRleCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PmZpbmRMYXN0SW5kZXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2xldCBjPWIubGVuZ3RoO2Zvcig7MDw9LS1jOylpZihhKGJbY10pKXJldHVybiBjO3JldHVybi0xfQpmdW5jdGlvbiBmbGF0dGVuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYVtjXSk/ZmxhdHRlbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGFbY10sYik6Yi5wdXNoKGFbY10pO3JldHVybiBifQpmdW5jdGlvbiBmbGlwRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4oLi4uYik9PntpZigxPT09Yi5sZW5ndGgpcmV0dXJuIGM9PmEoYyxiWzBdKTtpZigyPT09Yi5sZW5ndGgpcmV0dXJuIGEoYlsxXSxiWzBdKTtpZigzPT09Yi5sZW5ndGgpcmV0dXJuIGEoYlsxXSxiWzBdLGJbMl0pO2lmKDQ9PT1iLmxlbmd0aClyZXR1cm4gYShiWzFdLGJbMF0sYlsyXSxiWzNdKTt0aHJvdyBFcnJvcigiUi5mbGlwIGRvZXNuJ3Qgd29yayB3aXRoIGFyaXR5ID4gNCIpO319ZnVuY3Rpb24gZmxpcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiBmbGlwRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKX0KZnVuY3Rpb24gZm9yRWFjaCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PmZvckVhY2gkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGUpO2lmKHZvaWQgMCE9PWIpe2lmKGlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKSlmb3IodmFyIGM9MCxkPWIubGVuZ3RoO2M8ZDspYShiW2NdKSxjKys7ZWxzZXtjPTA7ZD1rZXlzJDEkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKTtjb25zdCBlPWQubGVuZ3RoO2Zvcig7YzxlOyl7Y29uc3QgZj1kW2NdO2EoYltmXSxmLGIpO2MrK319cmV0dXJuIGJ9fQpmdW5jdGlvbiBmcm9tUGFpcnMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtjb25zdCBiPXt9O2EuZm9yRWFjaCgoW2MsZF0pPT5iW2NdPWQpO3JldHVybiBifWZ1bmN0aW9uIGdyb3VwQnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPT5ncm91cEJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxkKTtjb25zdCBjPXt9O2ZvcihsZXQgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtjb25zdCBlPWJbZF0sZj1hKGUpO2NbZl18fChjW2ZdPVtdKTtjW2ZdLnB1c2goZSl9cmV0dXJuIGN9CmZ1bmN0aW9uIGdyb3VwV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoIWlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJsaXN0LnJlZHVjZSBpcyBub3QgYSBmdW5jdGlvbiIpO2NvbnN0IGM9Y2xvbmVMaXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYik7aWYoMT09PWIubGVuZ3RoKXJldHVybltjXTtjb25zdCBkPVtdO2xldCBlPVtdO2MucmVkdWNlKChmLGcsaCk9PntpZigwPT09aClyZXR1cm4gZztjb25zdCBrPWEoZixnKSxsPTA9PT1lLmxlbmd0aDtoPWg9PT1iLmxlbmd0aC0xO2lmKGspcmV0dXJuIGwmJmUucHVzaChmKSxlLnB1c2goZyksaCYmZC5wdXNoKGUpLGc7aWYobClyZXR1cm4gZC5wdXNoKFtmXSksaCYmZC5wdXNoKFtnXSksZztkLnB1c2goZSk7aCYmZC5wdXNoKFtnXSk7ZT1bXTtyZXR1cm4gZ30sCnZvaWQgMCk7cmV0dXJuIGR9ZnVuY3Rpb24gaGFzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+aGFzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTpiP2IuaGFzT3duUHJvcGVydHkoYSk6ITF9ZnVuY3Rpb24gY3JlYXRlUGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYj0iLiIpe3JldHVybiJzdHJpbmciPT09dHlwZW9mIGE/YS5zcGxpdChiKTphfQpmdW5jdGlvbiBwYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZj0+cGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZik7aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpe2Zvcih2YXIgYz1iLGQ9MCxlPWNyZWF0ZVBhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKTtkPGUubGVuZ3RoOyl7aWYobnVsbD09PWN8fHZvaWQgMD09PWN8fG51bGw9PT1jW2VbZF1dKXJldHVybjtjPWNbZVtkXV07ZCsrfXJldHVybiBjfX0KZnVuY3Rpb24gaGFzUGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9Pmhhc1BhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOnZvaWQgMCE9PXBhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpfWZ1bmN0aW9uIGhlYWQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP2FbMF18fCIiOmFbMF19ZnVuY3Rpb24gX29iamVjdElzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gYT09PWI/MCE9PWF8fDEvYT09PTEvYjphIT09YSYmYiE9PWJ9Y29uc3Qgb2JqZWN0SXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1PYmplY3QuaXN8fF9vYmplY3RJcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwpmdW5jdGlvbiBpZGVudGljYWwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5pZGVudGljYWwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOm9iamVjdElzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKX1mdW5jdGlvbiBpZGVudGl0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiBhfWZ1bmN0aW9uIGlmRWxzZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe3JldHVybiguLi5kKT0+ITA9PT0oImJvb2xlYW4iPT09dHlwZW9mIGE/YTphKC4uLmQpKT9iKC4uLmQpOmMoLi4uZCl9CmNvbnN0IGlmRWxzZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoaWZFbHNlRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyksaW5jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9YT0+YSsxO2Z1bmN0aW9uIGluZGV4QnlQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtjb25zdCBjPXt9O2ZvcihsZXQgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtjb25zdCBlPWJbZF07Y1twYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxlKV09ZX1yZXR1cm4gY30KZnVuY3Rpb24gaW5kZXhCeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PmluZGV4QnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuIGluZGV4QnlQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKTtjb25zdCBjPXt9O2ZvcihsZXQgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtjb25zdCBlPWJbZF07Y1thKGUpXT1lfXJldHVybiBjfQpmdW5jdGlvbiBpbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+X2luZGV4T2YkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOl9pbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKX1mdW5jdGlvbiBiYXNlU2xpY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7bGV0IGQ9LTEse2xlbmd0aDplfT1hO2M9Yz5lP2U6YzswPmMmJihjKz1lKTtlPWI+Yz8wOmMtYj4+PjA7Yj4+Pj0wO2ZvcihjPUFycmF5KGUpOysrZDxlOyljW2RdPWFbZCtiXTtyZXR1cm4gY30KZnVuY3Rpb24gaW5pdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiJzdHJpbmciPT09dHlwZW9mIGE/YS5zbGljZSgwLC0xKTphLmxlbmd0aD9iYXNlU2xpY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLDAsLTEpOltdfWZ1bmN0aW9uIGludGVyc2VjdGlvbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PmludGVyc2VjdGlvbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6ZmlsdGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYz0+aW5jbHVkZXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjLGEpLGIpfQpmdW5jdGlvbiBpbnRlcnNwZXJzZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGY9PmludGVyc3BlcnNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxmKTtsZXQgYz0tMTtjb25zdCBkPWIubGVuZ3RoLGU9W107Zm9yKDsrK2M8ZDspYz09PWQtMT9lLnB1c2goYltjXSk6ZS5wdXNoKGJbY10sYSk7cmV0dXJuIGV9ZnVuY3Rpb24gaXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5pcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6bnVsbCE9YiYmYi5jb25zdHJ1Y3Rvcj09PWF8fGIgaW5zdGFuY2VvZiBhfQpmdW5jdGlvbiBpc0VtcHR5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7Y29uc3QgYj10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7cmV0dXJuWyJVbmRlZmluZWQiLCJOYU4iLCJOdW1iZXIiLCJOdWxsIl0uaW5jbHVkZXMoYik/ITE6YT8iT2JqZWN0Ij09PWI/MD09PU9iamVjdC5rZXlzKGEpLmxlbmd0aDoiQXJyYXkiPT09Yj8wPT09YS5sZW5ndGg6ITE6ITB9ZnVuY3Rpb24gaXNOaWwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09PWF9CmZ1bmN0aW9uIGpvaW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5qb2luJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTpiLmpvaW4oYSl9ZnVuY3Rpb24ganV4dCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiguLi5iKT0+YS5tYXAoYz0+YyguLi5iKSl9ZnVuY3Rpb24ga2V5cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKX1mdW5jdGlvbiBsYXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYT9hW2EubGVuZ3RoLTFdfHwiIjphW2EubGVuZ3RoLTFdfQpmdW5jdGlvbiBsYXN0SW5kZXhPZiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9Pl9sYXN0SW5kZXhPZiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6X2xhc3RJbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKX1mdW5jdGlvbiBsZW5ndGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpfHwic3RyaW5nIj09PXR5cGVvZiBhP2EubGVuZ3RoOk5hTn0KZnVuY3Rpb24gbGVucyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gYyhhKGQpKS5tYXAoZT0+YihlLGQpKX19fWZ1bmN0aW9uIG50aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9Pm50aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7Y29uc3QgYz0wPmE/Yi5sZW5ndGgrYTphO3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIpP2IuY2hhckF0KGMpOmJbY119CmZ1bmN0aW9uIHVwZGF0ZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe2M9Y2xvbmVMaXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYyk7cmV0dXJuLTE9PT1hP2MuZmlsbChiLGEpOmMuZmlsbChiLGEsYSsxKX1jb25zdCB1cGRhdGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHVwZGF0ZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBsZW5zSW5kZXgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gbGVucyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKG50aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpLHVwZGF0ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpKX1mdW5jdGlvbiBsZW5zUGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiBsZW5zJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMocGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpLGFzc29jUGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpKX0KZnVuY3Rpb24gbGVuc1Byb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gbGVucyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHByb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKSxhc3NvYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpKX1mdW5jdGlvbiBtYXRjaCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9Pm1hdGNoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxkKTtjb25zdCBjPWIubWF0Y2goYSk7cmV0dXJuIG51bGw9PT1jP1tdOmN9CmZ1bmN0aW9uIG1hdGhNb2QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5tYXRoTW9kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTohaXNJbnRlZ2VyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl8fCFpc0ludGVnZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKXx8MT5iP05hTjooYSViK2IpJWJ9ZnVuY3Rpb24gbWF4QnlGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gYShjKT5hKGIpP2M6Yn1jb25zdCBtYXhCeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMobWF4QnlGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKTsKZnVuY3Rpb24gc3VtJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGEucmVkdWNlKChiLGMpPT5iK2MsMCl9ZnVuY3Rpb24gbWVhbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiBzdW0kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKS9hLmxlbmd0aH1mdW5jdGlvbiBtZWRpYW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXt2YXIgYj1hLmxlbmd0aDtpZigwPT09YilyZXR1cm4gTmFOO2NvbnN0IGM9Mi1iJTI7Yj0oYi1jKS8yO3JldHVybiBtZWFuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKS5zb3J0KChkLGUpPT5kPT09ZT8wOmQ8ZT8tMToxKS5zbGljZShiLGIrYykpfQpmdW5jdGlvbiBtZXJnZVJpZ2h0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+bWVyZ2VSaWdodCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6T2JqZWN0LmFzc2lnbih7fSxhfHx7fSxifHx7fSl9ZnVuY3Rpb24gbWVyZ2VBbGwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtsZXQgYj17fTttYXAkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjPT57Yj1tZXJnZVJpZ2h0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYixjKX0sYSk7cmV0dXJuIGJ9CmZ1bmN0aW9uIG1lcmdlRGVlcFJpZ2h0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD0+bWVyZ2VEZWVwUmlnaHQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2NvbnN0IGM9Y2xvbmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGQ9PnsiT2JqZWN0Ij09PXR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiW2RdKT8iT2JqZWN0Ij09PXR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhW2RdKT9jW2RdPW1lcmdlRGVlcFJpZ2h0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYVtkXSxiW2RdKTpjW2RdPWJbZF06Y1tkXT1iW2RdfSk7cmV0dXJuIGN9CmZ1bmN0aW9uIG1lcmdlTGVmdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9Pm1lcmdlTGVmdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6bWVyZ2VSaWdodCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIsYSl9ZnVuY3Rpb24gbWVyZ2VXaXRoRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7Y29uc3QgZD17fTtPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGU9PntkW2VdPXZvaWQgMD09PWNbZV0/YltlXTphKGJbZV0sY1tlXSl9KTtPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGU9Pnt2b2lkIDA9PT1kW2VdJiYoZFtlXT12b2lkIDA9PT1iW2VdP2NbZV06YShiW2VdLGNbZV0pKX0pO3JldHVybiBkfQpjb25zdCBtZXJnZVdpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKG1lcmdlV2l0aEZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpO2Z1bmN0aW9uIG1pbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9Pm1pbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6YjxhP2I6YX1mdW5jdGlvbiBtaW5CeUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe3JldHVybiBhKGMpPGEoYik/YzpifWNvbnN0IG1pbkJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9Y3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhtaW5CeUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBvd25LZXlzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXt2YXIgYz1PYmplY3Qua2V5cyhhKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgZD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGEpO2ImJihkPWQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsZSkuZW51bWVyYWJsZX0pKTtjLnB1c2guYXBwbHkoYyxkKX1yZXR1cm4gY30KZnVuY3Rpb24gX29iamVjdFNwcmVhZDIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtmb3IodmFyIGI9MTtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKXt2YXIgYz1udWxsIT1hcmd1bWVudHNbYl0/YXJndW1lbnRzW2JdOnt9O2IlMj9vd25LZXlzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoT2JqZWN0KGMpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe19kZWZpbmVQcm9wZXJ0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCxjW2RdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYykpOm93bktleXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhPYmplY3QoYykpLmZvckVhY2goZnVuY3Rpb24oZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsCmQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjLGQpKX0pfXJldHVybiBhfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtiIGluIGE/T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7dmFsdWU6YyxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmFbYl09YztyZXR1cm4gYX1mdW5jdGlvbiBpc0l0ZXJhYmxlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSl8fCJPYmplY3QiPT09dHlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpfQpmdW5jdGlvbiBtb2RpZnlGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gaXNJdGVyYWJsZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMpJiZ2b2lkIDAhPT1jW2FdP2lzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjKT91cGRhdGVGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYihjW2FdKSxjKTpfb2JqZWN0U3ByZWFkMiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKF9vYmplY3RTcHJlYWQyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoe30sYykse30se1thXTpiKGNbYV0pfSk6Y31jb25zdCBtb2RpZnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKG1vZGlmeUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBtb2RpZnlQYXRoRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7YT1jcmVhdGVQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7aWYoMT09PWEubGVuZ3RoKXJldHVybiBfb2JqZWN0U3ByZWFkMiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKF9vYmplY3RTcHJlYWQyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoe30sYykse30se1thWzBdXTpiKGNbYVswXV0pfSk7aWYodm9pZCAwPT09cGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYykpcmV0dXJuIGM7Yj1tb2RpZnlQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwxKSxiLGNbYVswXV0pO3JldHVybiBiPT09Y1thWzBdXT9jOmFzc29jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYVswXSwKYixjKX1jb25zdCBtb2RpZnlQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9Y3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhtb2RpZnlQYXRoRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7ZnVuY3Rpb24gbW9kdWxvJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+bW9kdWxvJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTphJWJ9CmZ1bmN0aW9uIG1vdmVGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtpZigwPmF8fDA+Yil0aHJvdyBFcnJvcigiUmFtYmRhLm1vdmUgZG9lcyBub3Qgc3VwcG9ydCBuZWdhdGl2ZSBpbmRleGVzIik7aWYoYT5jLmxlbmd0aC0xfHxiPmMubGVuZ3RoLTEpcmV0dXJuIGM7Y29uc3QgZD1jbG9uZUxpc3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjKTtkW2FdPWNbYl07ZFtiXT1jW2FdO3JldHVybiBkfWNvbnN0IG1vdmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKG1vdmVGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKTsKZnVuY3Rpb24gbXVsdGlwbHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5tdWx0aXBseSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6YSpifWZ1bmN0aW9uIG5lZ2F0ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybi1hfWZ1bmN0aW9uIG5vbmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBjPT5ub25lJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylpZihhKGJbY10pKXJldHVybiExO3JldHVybiEwfQpmdW5jdGlvbiBub3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4hYX1mdW5jdGlvbiBvYmpPZiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9Pm9iak9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTp7W2FdOmJ9fWZ1bmN0aW9uIG9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuW2FdfQpmdW5jdGlvbiBvbWl0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT0+b21pdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZSk7aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpe3ZhciBjPWNyZWF0ZVBhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLCIsIiksZD17fTtmb3IoY29uc3QgZSBpbiBiKWMuaW5jbHVkZXMoZSl8fChkW2VdPWJbZV0pO3JldHVybiBkfX0KZnVuY3Rpb24gb24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyxkKXtyZXR1cm4gMz09PWFyZ3VtZW50cy5sZW5ndGg/ZT0+b24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyxlKToyPT09YXJndW1lbnRzLmxlbmd0aD8oZSxmKT0+b24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsZSxmKTphKGIoYyksYihkKSl9ZnVuY3Rpb24gb25jZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtsZXQgYztyZXR1cm4gZnVuY3Rpb24oKXthJiYoYz1hLmFwcGx5KGJ8fHRoaXMsYXJndW1lbnRzKSxhPW51bGwpO3JldHVybiBjfX0KZnVuY3Rpb24gb25jZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2NvbnN0IGM9b25jZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKTtyZXR1cm4gY3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjKX1yZXR1cm4gb25jZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKX1mdW5jdGlvbiBvciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9Pm9yJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTphfHxifWNvbnN0IElkZW50aXR5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9YT0+KHt4OmEsbWFwOmI9PklkZW50aXR5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYihhKSl9KTsKZnVuY3Rpb24gb3ZlckZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe3JldHVybiBhKGQ9PklkZW50aXR5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYihkKSkpKGMpLnh9Y29uc3Qgb3ZlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMob3ZlckZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBwYXJ0aWFsJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSwuLi5iKXtjb25zdCBjPWEubGVuZ3RoO3JldHVybiguLi5kKT0+Yi5sZW5ndGgrZC5sZW5ndGg+PWM/YSguLi5iLC4uLmQpOnBhcnRpYWwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLC4uLlsuLi5iLC4uLmRdKX1mdW5jdGlvbiBwYXJ0aWFsT2JqZWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gYz0+YShtZXJnZURlZXBSaWdodCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMsYikpfQpmdW5jdGlvbiBwYXJ0aXRpb25PYmplY3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2NvbnN0IGM9e30sZD17fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbZSxmXSk9PnthKGYsZSk/Y1tlXT1mOmRbZV09Zn0pO3JldHVybltjLGRdfWZ1bmN0aW9uIHBhcnRpdGlvbkFycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGM9ITEpe2NvbnN0IGQ9W10sZT1bXTtsZXQgZj0tMTtmb3IoO2YrKzxiLmxlbmd0aC0xOykoYz9hKGJbZl0sZik6YShiW2ZdKSk/ZC5wdXNoKGJbZl0pOmUucHVzaChiW2ZdKTtyZXR1cm5bZCxlXX0KZnVuY3Rpb24gcGFydGl0aW9uJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+cGFydGl0aW9uJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTppc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYik/cGFydGl0aW9uQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpOnBhcnRpdGlvbk9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil9CmZ1bmN0aW9uIHBhdGhFcUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe3JldHVybiBlcXVhbHMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhwYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKSxiKX1jb25zdCBwYXRoRXEkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHBhdGhFcUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBwYXRoT3JGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gZGVmYXVsdFRvJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxwYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYixjKSl9Y29uc3QgcGF0aE9yJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9Y3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhwYXRoT3JGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKTsKZnVuY3Rpb24gcGF0aHMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5wYXRocyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6YS5tYXAoYz0+cGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMsYikpfQpmdW5jdGlvbiBwaWNrJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZj0+cGljayQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZik7aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpe2Zvcih2YXIgYz1jcmVhdGVQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSwiLCIpLGQ9e30sZT0wO2U8Yy5sZW5ndGg7KWNbZV1pbiBiJiYoZFtjW2VdXT1iW2NbZV1dKSxlKys7cmV0dXJuIGR9fQpmdW5jdGlvbiBwaWNrQWxsJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZj0+cGlja0FsbCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZik7aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpe2Zvcih2YXIgYz1jcmVhdGVQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSwiLCIpLGQ9e30sZT0wO2U8Yy5sZW5ndGg7KWRbY1tlXV09Y1tlXWluIGI/YltjW2VdXTp2b2lkIDAsZSsrO3JldHVybiBkfX0KZnVuY3Rpb24gcGx1Y2skJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPT5wbHVjayQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7Y29uc3QgYz1bXTttYXAkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhkPT57dm9pZCAwIT09ZFthXSYmYy5wdXNoKGRbYV0pfSxiKTtyZXR1cm4gY31mdW5jdGlvbiBwcmVwZW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+cHJlcGVuZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6InN0cmluZyI9PT10eXBlb2YgYj9bYV0uY29uY2F0KGIuc3BsaXQoIiIpKTpbYV0uY29uY2F0KGIpfQpjb25zdCBwcm9kdWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9cmVkdWNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMobXVsdGlwbHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcywxKTtmdW5jdGlvbiBwcm9wRXFGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gYz9lcXVhbHMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiLHByb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpKTohMX1jb25zdCBwcm9wRXEkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHByb3BFcUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBwcm9wSXNGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gaXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGNbYl0pfWNvbnN0IHByb3BJcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMocHJvcElzRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7ZnVuY3Rpb24gcHJvcE9yRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7cmV0dXJuIGM/ZGVmYXVsdFRvJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjW2JdKTphfWNvbnN0IHByb3BPciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMocHJvcE9yRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7CmZ1bmN0aW9uIHByb3BzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYz0+cHJvcHMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpO2lmKCFpc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSkpdGhyb3cgRXJyb3IoInByb3BzVG9QaWNrIGlzIG5vdCBhIGxpc3QiKTtyZXR1cm4gbWFwQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjPT5iW2NdLGEpfWZ1bmN0aW9uIHByb3BTYXRpc2ZpZXNGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gYShwcm9wJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYixjKSl9CmNvbnN0IHByb3BTYXRpc2ZpZXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHByb3BTYXRpc2ZpZXNGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKTsKZnVuY3Rpb24gcmFuZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT5yYW5nZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZSk7aWYoTnVtYmVyLmlzTmFOKE51bWJlcihhKSl8fE51bWJlci5pc05hTihOdW1iZXIoYikpKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvdGggYXJndW1lbnRzIHRvIHJhbmdlIG11c3QgYmUgbnVtYmVycyIpO2lmKGI8YSlyZXR1cm5bXTtjb25zdCBjPWItYSxkPUFycmF5KGMpO2ZvcihsZXQgZT0wO2U8YztlKyspZFtlXT1hK2U7cmV0dXJuIGR9CmZ1bmN0aW9uIHJlamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PnJlamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6ZmlsdGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYz0+IWEoYyksYil9ZnVuY3Rpb24gcmVwZWF0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+cmVwZWF0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTpBcnJheShiKS5maWxsKGEpfWZ1bmN0aW9uIHJlcGxhY2VGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gYy5yZXBsYWNlKGEsYil9CmNvbnN0IHJlcGxhY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKHJlcGxhY2VGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKTtmdW5jdGlvbiByZXZlcnNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik6YS5zbGljZSgpLnJldmVyc2UoKX1mdW5jdGlvbiBzZXRGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gb3ZlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYWx3YXlzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYiksYyl9CmNvbnN0IHNldCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoc2V0Rm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyk7ZnVuY3Rpb24gc2xpY2VGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gYy5zbGljZShhLGIpfWNvbnN0IHNsaWNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9Y3VycnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhzbGljZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpOwpmdW5jdGlvbiBzb3J0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+c29ydCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6Y2xvbmVMaXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYikuc29ydChhKX1mdW5jdGlvbiBzb3J0QnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5zb3J0QnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmNsb25lTGlzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpLnNvcnQoKGMsZCk9PntjPWEoYyk7ZD1hKGQpO3JldHVybiBjPT09ZD8wOmM8ZD8tMToxfSl9CmZ1bmN0aW9uIHNwbGl0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yz0+c3BsaXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmIuc3BsaXQoYSl9ZnVuY3Rpb24gbWF5YmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7Yj1hJiYiRnVuY3Rpb24iPT09dHlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpP2IoKTpiO2M9YXx8IkZ1bmN0aW9uIiE9PXR5cGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjKT9jOmMoKTtyZXR1cm4gYT9iOmN9CmZ1bmN0aW9uIHRha2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT50YWtlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTowPmE/Yi5zbGljZSgpOiJzdHJpbmciPT09dHlwZW9mIGI/Yi5zbGljZSgwLGEpOmJhc2VTbGljZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIsMCxhKX0KZnVuY3Rpb24gc3BsaXRBdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PnNwbGl0QXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2lmKCFiKXRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCByZWFkIHByb3BlcnR5ICdzbGljZScgb2YgJHtifWApO2lmKCFpc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYikmJiJzdHJpbmciIT09dHlwZW9mIGIpcmV0dXJuW1tdLFtdXTtjb25zdCBjPW1heWJlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoMD5hLDA+Yi5sZW5ndGgrYT8wOmIubGVuZ3RoK2EsYSk7cmV0dXJuW3Rha2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjLGIpLGRyb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjLApiKV19ZnVuY3Rpb24gc3BsaXRFdmVyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PnNwbGl0RXZlcnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGUpO2lmKDE+YSl0aHJvdyBFcnJvcigiRmlyc3QgYXJndW1lbnQgdG8gc3BsaXRFdmVyeSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2NvbnN0IGM9W107bGV0IGQ9MDtmb3IoO2Q8Yi5sZW5ndGg7KWMucHVzaChiLnNsaWNlKGQsZCs9YSkpO3JldHVybiBjfQpmdW5jdGlvbiBzcGxpdFdoZW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBnPT5zcGxpdFdoZW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGcpO2lmKCFiKXRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCByZWFkIHByb3BlcnR5ICdsZW5ndGgnIG9mICR7Yn1gKTtjb25zdCBjPVtdLGQ9W107bGV0IGU9ITEsZj0tMTtmb3IoO2YrKzxiLmxlbmd0aC0xOyllP2QucHVzaChiW2ZdKTphKGJbZl0pPyhkLnB1c2goYltmXSksZT0hMCk6Yy5wdXNoKGJbZl0pO3JldHVybltjLGRdfQpmdW5jdGlvbiBzdGFydHNXaXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD0+c3RhcnRzV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7aWYoInN0cmluZyI9PT10eXBlb2YgYilyZXR1cm4gYi5zdGFydHNXaXRoKGEpO2lmKCFpc0FycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSkpcmV0dXJuITE7bGV0IGM9ITA7cmV0dXJuIGEuZmlsdGVyKChkLGUpPT57aWYoIWMpcmV0dXJuITE7KGQ9ZXF1YWxzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoZCxiW2VdKSl8fChjPSExKTtyZXR1cm4gZH0pLmxlbmd0aD09PWEubGVuZ3RofQpmdW5jdGlvbiBzdWJ0cmFjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PnN1YnRyYWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTphLWJ9CmZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT5zeW1tZXRyaWNEaWZmZXJlbmNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTpjb25jYXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhmaWx0ZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjPT4haW5jbHVkZXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhjLGIpLGEpLGZpbHRlciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGM9PiFpbmNsdWRlcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMsYSksYikpfQpmdW5jdGlvbiBUJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoKXtyZXR1cm4hMH1mdW5jdGlvbiB0YWlsJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGRyb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygxLGEpfQpmdW5jdGlvbiB0YWtlTGFzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PnRha2VMYXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxlKTtjb25zdCBjPWIubGVuZ3RoO2lmKDA+YSlyZXR1cm4gYi5zbGljZSgpO2xldCBkPWE+Yz9jOmE7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYj9iLnNsaWNlKGMtZCk6YmFzZVNsaWNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYixjLWQsYyl9CmZ1bmN0aW9uIHRha2VMYXN0V2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBmPT50YWtlTGFzdFdoaWxlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxmKTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7bGV0IGM9ITE7Y29uc3QgZD1bXTtsZXQgZT1iLmxlbmd0aDtmb3IoOyFjfHwwPT09ZTspZS0tLCExPT09YShiW2VdKT9jPSEwOmN8fGQucHVzaChiW2VdKTtyZXR1cm4gaXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpP2QucmV2ZXJzZSgpOmQucmV2ZXJzZSgpLmpvaW4oIiIpfQpmdW5jdGlvbiB0YWtlV2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBnPT50YWtlV2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGcpO2NvbnN0IGM9aXNBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGIpO2lmKCFjJiYic3RyaW5nIiE9PXR5cGVvZiBiKXRocm93IEVycm9yKCJgaXRlcmFibGVgIGlzIG5laXRoZXIgbGlzdCBub3IgYSBzdHJpbmciKTtsZXQgZD0hMDtjb25zdCBlPVtdO2xldCBmPS0xO2Zvcig7ZisrPGIubGVuZ3RoLTE7KWEoYltmXSk/ZCYmZS5wdXNoKGJbZl0pOmQmJihkPSExKTtyZXR1cm4gYz9lOmUuam9pbigiIil9CmZ1bmN0aW9uIHRhcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGM9PnRhcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk7YShiKTtyZXR1cm4gYn1mdW5jdGlvbiB0ZXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYz0+dGVzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk7aWYoInN0cmluZyI9PT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKGBcdTIwMTh0ZXN0XHUyMDE5IHJlcXVpcmVzIGEgdmFsdWUgb2YgdHlwZSBSZWdFeHAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50OyByZWNlaXZlZCAiJHthfSJgKTtyZXR1cm4tMSE9PWIuc2VhcmNoKGEpfQpmdW5jdGlvbiB0aW1lcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGM9PnRpbWVzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTtpZighaXNJbnRlZ2VyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYil8fDA+Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcigibiBtdXN0IGJlIGFuIGludGVnZXIiKTtyZXR1cm4gbWFwJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxyYW5nZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKDAsYikpfWZ1bmN0aW9uIHRvTG93ZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpfQpmdW5jdGlvbiB0b1BhaXJzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGEpfWZ1bmN0aW9uIHRvU3RyaW5nJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGEudG9TdHJpbmcoKX1mdW5jdGlvbiB0b1VwcGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGEudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmFuc3Bvc2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gYS5yZWR1Y2UoKGIsYyk9PntjLmZvckVhY2goKGQsZSk9PmlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiW2VdKT9iW2VdLnB1c2goZCk6Yi5wdXNoKFtkXSkpO3JldHVybiBifSxbXSl9CmZ1bmN0aW9uIHRyaW0kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKXtyZXR1cm4gYS50cmltKCl9Y29uc3QgaXNGdW5jdGlvbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWE9PlsiUHJvbWlzZSIsIkZ1bmN0aW9uIl0uaW5jbHVkZXModHlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpKTsKZnVuY3Rpb24gdHJ5Q2F0Y2gkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKCFpc0Z1bmN0aW9uJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSkpdGhyb3cgRXJyb3IoYFIudHJ5Q2F0Y2ggfCBmbiAnJHthfSdgKTtjb25zdCBjPWlzRnVuY3Rpb24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiKTtyZXR1cm4oLi4uZCk9Pnt0cnl7cmV0dXJuIGEoLi4uZCl9Y2F0Y2goZSl7cmV0dXJuIGM/YihlLC4uLmQpOmJ9fX1mdW5jdGlvbiB1bmFwcGx5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSl7cmV0dXJuIGZ1bmN0aW9uKC4uLmIpe3JldHVybiBhLmNhbGwodGhpcyxiKX19CmZ1bmN0aW9uIHVuaW9uJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD0+dW5pb24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2NvbnN0IGM9Y2xvbmVMaXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSk7Yi5mb3JFYWNoKGQ9PntpbmNsdWRlcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGQsYSl8fGMucHVzaChkKX0pO3JldHVybiBjfQpmdW5jdGlvbiB1bmlxQnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPT51bmlxQnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2NvbnN0IGM9bmV3IFNldDtyZXR1cm4gYi5maWx0ZXIoZD0+e2lmKGMuaGFzKGEoZCkpKXJldHVybiExO2MuYWRkKGEoZCkpO3JldHVybiEwfSl9ZnVuY3Rpb24gaW5jbHVkZXNXaXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiLGMpe2xldCBkPSExLGU9LTE7Zm9yKDsrK2U8Yy5sZW5ndGgmJiFkOylhKGIsY1tlXSkmJihkPSEwKTtyZXR1cm4gZH0KZnVuY3Rpb24gdW5pcVdpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT51bmlxV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZSk7bGV0IGM9LTE7Y29uc3QgZD1bXTtmb3IoOysrYzxiLmxlbmd0aDspe2NvbnN0IGU9YltjXTtpbmNsdWRlc1dpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGUsZCl8fGQucHVzaChlKX1yZXR1cm4gZH1mdW5jdGlvbiB1bmxlc3MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT51bmxlc3MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmM9PmEoYyk/YzpiKGMpfQpmdW5jdGlvbiB1bndpbmQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT51bndpbmQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOmlzQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiW2FdKT9tYXBBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGM9Pl9vYmplY3RTcHJlYWQyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoX29iamVjdFNwcmVhZDIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyh7fSxiKSx7fSx7W2FdOmN9KSxiW2FdKTpbYl19CmZ1bmN0aW9uIHZhbHVlcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpe3JldHVybiJPYmplY3QiIT09dHlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEpP1tdOk9iamVjdC52YWx1ZXMoYSl9Y29uc3QgQ29uc3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcz1hPT4oe3g6YSxtYXA6Yj0+Q29uc3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhKX0pO2Z1bmN0aW9uIHZpZXckJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT52aWV3JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxjKTphKENvbnN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpKGIpLnh9CmZ1bmN0aW9uIHdoZW5GbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYixjKXtyZXR1cm4gYShjKT9iKGMpOmN9Y29uc3Qgd2hlbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMod2hlbkZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpO2Z1bmN0aW9uIHdoZXJlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZih2b2lkIDA9PT1iKXJldHVybiBkPT53aGVyZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsZCk7bGV0IGM9ITA7Zm9yKGNvbnN0IGQgaW4gYSl7aWYoIWMpY29udGludWU7Y29uc3QgZT1hW2RdKGJbZF0pO2MmJiExPT09ZSYmKGM9ITEpfXJldHVybiBjfQpmdW5jdGlvbiB3aGVyZUFueSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYodm9pZCAwPT09YilyZXR1cm4gYz0+d2hlcmVBbnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpO2Zvcihjb25zdCBjIGluIGEpaWYoYVtjXShiW2NdKSlyZXR1cm4hMDtyZXR1cm4hMX0KZnVuY3Rpb24gd2hlcmVFcSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9PndoZXJlRXEkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGQpO2NvbnN0IGM9ZmlsdGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoKGQsZSk9PmVxdWFscyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGQsYltlXSksYSk7cmV0dXJuIE9iamVjdC5rZXlzKGMpLmxlbmd0aD09PU9iamVjdC5rZXlzKGEpLmxlbmd0aH0KZnVuY3Rpb24gd2l0aG91dCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIHZvaWQgMD09PWI/Yz0+d2l0aG91dCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6cmVkdWNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoKGMsZCk9Pi0xPF9pbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoZCxhKT9jOmMuY29uY2F0KGQpLFtdLGIpfWZ1bmN0aW9uIHhvciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M9PnhvciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGEsYyk6ISFhJiYhYnx8ISFiJiYhYX0KZnVuY3Rpb24gemlwJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxiKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT0+emlwJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYSxlKTtjb25zdCBjPVtdLGQ9TWF0aC5taW4oYS5sZW5ndGgsYi5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8ZDtlKyspY1tlXT1bYVtlXSxiW2VdXTtyZXR1cm4gY31mdW5jdGlvbiB6aXBPYmokJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9jPT56aXBPYmokJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGMpOnRha2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiLmxlbmd0aCxhKS5yZWR1Y2UoKGMsZCxlKT0+e2NbZF09YltlXTtyZXR1cm4gY30se30pfQpmdW5jdGlvbiB6aXBXaXRoRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhLGIsYyl7cmV0dXJuIHRha2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhiLmxlbmd0aD5jLmxlbmd0aD9jLmxlbmd0aDpiLmxlbmd0aCxiKS5tYXAoKGQsZSk9PmEoZCxjW2VdKSl9Y29uc3QgemlwV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzPWN1cnJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoemlwV2l0aEZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMpO3ZhciBtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM9e307bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLkY9RiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuVD1UJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLl9fZmluZEhpZ2hlc3RBcml0eT1fX2ZpbmRIaWdoZXN0QXJpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuX2FyaXR5PV9hcml0eSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5faW5kZXhPZj1faW5kZXhPZiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5fbGFzdEluZGV4T2Y9X2xhc3RJbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5fcGlwZT1fcGlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5hZGQ9YWRkJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmFkanVzdD1hZGp1c3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuYWxsPWFsbCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5hbGxQYXNzPWFsbFBhc3MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmFsd2F5cz1hbHdheXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuYW5kPWFuZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5hbnk9YW55JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmFueVBhc3M9YW55UGFzcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5hcHBlbmQ9YXBwZW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5hcHBseT1hcHBseSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5hcHBseVNwZWM9YXBwbHlTcGVjJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmFzc29jPWFzc29jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmFzc29jUGF0aD1hc3NvY1BhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuYmluZD1iaW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5ib3RoPWJvdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY2hhaW49Y2hhaW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY2xhbXA9Y2xhbXAkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY2xvbmU9Y2xvbmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY29tcGxlbWVudD1jb21wbGVtZW50JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5jb21wb3NlPWNvbXBvc2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY29uY2F0PWNvbmNhdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5jb25kPWNvbmQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY29udmVyZ2U9Y29udmVyZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuY291bnQ9Y291bnQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmNvdW50Qnk9Y291bnRCeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5jdXJyeT1jdXJyeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5jdXJyeU49Y3VycnlOJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmRlYz1kZWMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZGVmYXVsdFRvPWRlZmF1bHRUbyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZGlmZmVyZW5jZT1kaWZmZXJlbmNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmRpc3NvYz1kaXNzb2MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZGl2aWRlPWRpdmlkZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5kcm9wPWRyb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZHJvcExhc3Q9ZHJvcExhc3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmRyb3BMYXN0V2hpbGU9ZHJvcExhc3RXaGlsZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5kcm9wUmVwZWF0cz1kcm9wUmVwZWF0cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5kcm9wUmVwZWF0c1dpdGg9ZHJvcFJlcGVhdHNXaXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmRyb3BXaGlsZT1kcm9wV2hpbGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmVpdGhlcj1laXRoZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZW5kc1dpdGg9ZW5kc1dpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZXFQcm9wcz1lcVByb3BzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmVxdWFscz1lcXVhbHMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZXZvbHZlPWV2b2x2ZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZXZvbHZlQXJyYXk9ZXZvbHZlQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZXZvbHZlT2JqZWN0PWV2b2x2ZU9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5maWx0ZXI9ZmlsdGVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmZpbHRlckFycmF5PWZpbHRlckFycmF5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmZpbHRlck9iamVjdD1maWx0ZXJPYmplY3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmZpbmQ9ZmluZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5maW5kSW5kZXg9ZmluZEluZGV4JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmZpbmRMYXN0PWZpbmRMYXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmZpbmRMYXN0SW5kZXg9ZmluZExhc3RJbmRleCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5mbGF0dGVuPWZsYXR0ZW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmZsaXA9ZmxpcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5mb3JFYWNoPWZvckVhY2gkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZnJvbVBhaXJzPWZyb21QYWlycyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5ncm91cEJ5PWdyb3VwQnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuZ3JvdXBXaXRoPWdyb3VwV2l0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuaGFzPWhhcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5oYXNQYXRoPWhhc1BhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuaGVhZD1oZWFkJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmlkZW50aWNhbD1pZGVudGljYWwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuaWRlbnRpdHk9aWRlbnRpdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmlmRWxzZT1pZkVsc2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuaW5jPWluYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5pbmNsdWRlcz1pbmNsdWRlcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5pbmRleEJ5PWluZGV4QnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuaW5kZXhPZj1pbmRleE9mJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5pbml0PWluaXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuaW50ZXJzZWN0aW9uPWludGVyc2VjdGlvbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5pbnRlcnNwZXJzZT1pbnRlcnNwZXJzZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5pcz1pcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5pc0VtcHR5PWlzRW1wdHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmlzTmlsPWlzTmlsJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmpvaW49am9pbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5qdXh0PWp1eHQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMua2V5cz1rZXlzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLmxhc3Q9bGFzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubGFzdEluZGV4T2Y9bGFzdEluZGV4T2YkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubGVuZ3RoPWxlbmd0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5sZW5zPWxlbnMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubGVuc0luZGV4PWxlbnNJbmRleCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5sZW5zUGF0aD1sZW5zUGF0aCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubGVuc1Byb3A9bGVuc1Byb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWFwPW1hcCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXBBcnJheT1tYXBBcnJheSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXBPYmpJbmRleGVkPW1hcE9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXBPYmplY3Q9bWFwT2JqZWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXRjaD1tYXRjaCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXRoTW9kPW1hdGhNb2QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWF4PW1heCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXhCeT1tYXhCeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tYXhCeUZuPW1heEJ5Rm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm1lYW49bWVhbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5tZWRpYW49bWVkaWFuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm1lcmdlPW1lcmdlUmlnaHQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWVyZ2VBbGw9bWVyZ2VBbGwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWVyZ2VEZWVwUmlnaHQ9bWVyZ2VEZWVwUmlnaHQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm1lcmdlTGVmdD1tZXJnZUxlZnQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWVyZ2VSaWdodD1tZXJnZVJpZ2h0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm1lcmdlV2l0aD1tZXJnZVdpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWluPW1pbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5taW5CeT1taW5CeSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubWluQnlGbj1taW5CeUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm1vZGlmeT1tb2RpZnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubW9kaWZ5UGF0aD1tb2RpZnlQYXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm1vZGlmeVBhdGhGbj1tb2RpZnlQYXRoRm4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubW9kdWxvPW1vZHVsbyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubW92ZT1tb3ZlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm11bHRpcGx5PW11bHRpcGx5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm5lZ2F0ZT1uZWdhdGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMubm9uZT1ub25lJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm5vdD1ub3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm50aD1udGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMub2JqT2Y9b2JqT2YkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMub2Y9b2YkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMub21pdD1vbWl0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLm9uPW9uJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5vbmNlPW9uY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMub3I9b3IkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMub3Zlcj1vdmVyJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnBhcnRpYWw9cGFydGlhbCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5wYXJ0aWFsT2JqZWN0PXBhcnRpYWxPYmplY3QkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnBhcnRpdGlvbj1wYXJ0aXRpb24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucGFydGl0aW9uQXJyYXk9cGFydGl0aW9uQXJyYXkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucGFydGl0aW9uT2JqZWN0PXBhcnRpdGlvbk9iamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5wYXRoPXBhdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucGF0aEVxPXBhdGhFcSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucGF0aE9yPXBhdGhPciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5wYXRocz1wYXRocyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5waWNrPXBpY2skJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucGlja0FsbD1waWNrQWxsJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnBpcGU9cGlwZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucGx1Y2s9cGx1Y2skJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucHJlcGVuZD1wcmVwZW5kJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnByb2R1Y3Q9cHJvZHVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5wcm9wPXByb3AkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucHJvcEVxPXByb3BFcSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucHJvcElzPXByb3BJcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5wcm9wT3I9cHJvcE9yJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnByb3BTYXRpc2ZpZXM9cHJvcFNhdGlzZmllcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5wcm9wcz1wcm9wcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5yYW5nZT1yYW5nZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucmVkdWNlPXJlZHVjZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5yZWR1Y2VGbj1yZWR1Y2VGbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5yZWR1Y2VTdG9wcGVyPXJlZHVjZVN0b3BwZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucmVqZWN0PXJlamVjdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5yZXBlYXQ9cmVwZWF0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5yZXBsYWNlPXJlcGxhY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMucmV2ZXJzZT1yZXZlcnNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnNldD1zZXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuc2xpY2U9c2xpY2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuc29ydD1zb3J0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5zb3J0Qnk9c29ydEJ5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnNwbGl0PXNwbGl0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnNwbGl0QXQ9c3BsaXRBdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy5zcGxpdEV2ZXJ5PXNwbGl0RXZlcnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuc3BsaXRXaGVuPXNwbGl0V2hlbiQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuc3RhcnRzV2l0aD1zdGFydHNXaXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnN1YnRyYWN0PXN1YnRyYWN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnN1bT1zdW0kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuc3ltbWV0cmljRGlmZmVyZW5jZT1zeW1tZXRyaWNEaWZmZXJlbmNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnRhaWw9dGFpbCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzOwptb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudGFrZT10YWtlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnRha2VMYXN0PXRha2VMYXN0JCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnRha2VMYXN0V2hpbGU9dGFrZUxhc3RXaGlsZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy50YWtlV2hpbGU9dGFrZVdoaWxlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnRhcD10YXAkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnRlc3Q9dGVzdCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy50aW1lcz10aW1lcyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy50b0xvd2VyPXRvTG93ZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudG9QYWlycz10b1BhaXJzJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnRvU3RyaW5nPXRvU3RyaW5nJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy50b1VwcGVyPXRvVXBwZXIkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudHJhbnNwb3NlPXRyYW5zcG9zZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy50cmltPXRyaW0kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudHJ5Q2F0Y2g9dHJ5Q2F0Y2gkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudHlwZT10eXBlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy51bmFwcGx5PXVuYXBwbHkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudW5pb249dW5pb24kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudW5pcT11bmlxJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnVuaXFCeT11bmlxQnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudW5pcVdpdGg9dW5pcVdpdGgkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnVubGVzcz11bmxlc3MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMudW53aW5kPXVud2luZCQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy51cGRhdGU9dXBkYXRlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnVwZGF0ZUZuPXVwZGF0ZUZuJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnZhbHVlcz12YWx1ZXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczsKbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnZpZXc9dmlldyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy53aGVuPXdoZW4kJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMud2hlcmU9d2hlcmUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMud2hlcmVBbnk9d2hlcmVBbnkkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMud2hlcmVFcT13aGVyZUVxJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Cm1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy53aXRob3V0PXdpdGhvdXQkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMueG9yPXhvciQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzO21vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcy56aXA9emlwJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7bW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzLnppcE9iaj16aXBPYmokJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qczttb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMuemlwV2l0aD16aXBXaXRoJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanM7Y29uc3QgY3NvdW5kU2V0TWlkaUNhbGxiYWNrcyQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaT1hPT5iPT57YS5leHBvcnRzLmNzb3VuZFNldE1pZGlDYWxsYmFja3MoYil9LGNzb3VuZEdldE1JRElEZXZMaXN0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpPWE9PihiLGMpPT57Y29uc3Qge2J1ZmZlcjpkfT1hLndhc2kubWVtb3J5LGU9YS5leHBvcnRzLmNzb3VuZEdldE1JRElEZXZMaXN0KGIsdm9pZCAwLGM/MTowKTtpZigwPT09ZSlyZXR1cm5bXTtjb25zdCBmPXNpemVvZlN0cnVjdCQkbW9kdWxlJHNyYyR1dGlscyRuYXRpdmVfc2l6ZXMoQ1NfTUlESURFVklDRSQkbW9kdWxlJHNyYyRzdHJ1Y3R1cmVzKSxnPWEuZXhwb3J0cy5hbGxvY0NzTWlkaURldmljZVN0cnVjdChlKTthLmV4cG9ydHMuY3NvdW5kR2V0TUlESURldkxpc3QoYixnLGM/MTowKTtjb25zdCBoPW5ldyBVaW50OEFycmF5KGQsZyxmKmUpO2I9cmFuZ2UkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygwLAplKS5tYXAoaz0+c3RydWN0QnVmZmVyVG9PYmplY3QkJG1vZHVsZSRzcmMkdXRpbHMkc3RydWN0dXJlX2J1ZmZlcl90b19vYmplY3QoQ1NfTUlESURFVklDRSQkbW9kdWxlJHNyYyRzdHJ1Y3R1cmVzLGguc3ViYXJyYXkoaypmLGYpKSk7YS5leHBvcnRzLmZyZWVDc01pZGlEZXZpY2VTdHJ1Y3QoZyk7cmV0dXJuIGJ9O2Nzb3VuZEdldE1JRElEZXZMaXN0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpLnRvU3RyaW5nPSgpPT4iZ2V0TUlESURldkxpc3QgPSBhc3luYyAoaXNPdXRwdXQpID0+IE9iamVjdDsiOwpjb25zdCBjc291bmRHZXRSdE1pZGlOYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpPWE9PmI9Pnt2YXIge2J1ZmZlcjpjfT1hLndhc2kubWVtb3J5O2I9YS5leHBvcnRzLmdldFJ0TWlkaU5hbWUoYik7Yz1uZXcgVWludDhBcnJheShjLGIsMTI4KTtyZXR1cm4gdHJpbU51bGwkJG1vZHVsZSRzcmMkdXRpbHMkdHJpbV9udWxsKHVpbnQyU3RyaW5nJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMoYykpfHwiIn07Y3NvdW5kR2V0UnRNaWRpTmFtZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaS50b1N0cmluZz0oKT0+ImdldFJ0TWlkaU5hbWUgPSBhc3luYyAoKSA9PiBTdHJpbmc7IjsKY29uc3QgY3NvdW5kR2V0TWlkaU91dEZpbGVOYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpPWE9PmI9Pnt2YXIge2J1ZmZlcjpjfT1hLndhc2kubWVtb3J5O2I9YS5leHBvcnRzLmdldE1pZGlPdXRGaWxlTmFtZShiKTtjPW5ldyBVaW50OEFycmF5KGMsYiwxMjgpO2ImJjA8Yi5sZW5ndGgmJmZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYik7cmV0dXJuIHRyaW1OdWxsJCRtb2R1bGUkc3JjJHV0aWxzJHRyaW1fbnVsbCh1aW50MlN0cmluZyQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzKGMpKXx8IiJ9LF9pc1JlcXVlc3RpbmdSdE1pZGlJbnB1dCQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaT1hPT5iPT5hLmV4cG9ydHMuaXNSZXF1ZXN0aW5nUnRNaWRpSW5wdXQoYiksY3NvdW5kUHVzaE1pZGlNZXNzYWdlJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpPWE9PihiLGMsZCxlKT0+e2EuZXhwb3J0cy5wdXNoTWlkaU1lc3NhZ2UoYiwKYyxkLGUpfTtjc291bmRQdXNoTWlkaU1lc3NhZ2UkJG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGkudG9TdHJpbmc9KCk9PiJtaWRpTWVzc2FnZSA9IGFzeW5jIChzdGF0dXMsIGRhdGExLCBkYXRhMikgPT4gdW5kZWZpbmVkOyI7dmFyIG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGk9e307bW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaS5faXNSZXF1ZXN0aW5nUnRNaWRpSW5wdXQ9X2lzUmVxdWVzdGluZ1J0TWlkaUlucHV0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpO21vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGkuY3NvdW5kR2V0TUlESURldkxpc3Q9Y3NvdW5kR2V0TUlESURldkxpc3QkJG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGk7bW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaS5jc291bmRHZXRNaWRpT3V0RmlsZU5hbWU9Y3NvdW5kR2V0TWlkaU91dEZpbGVOYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpOwptb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpLmNzb3VuZEdldFJ0TWlkaU5hbWU9Y3NvdW5kR2V0UnRNaWRpTmFtZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaTttb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpLmNzb3VuZFB1c2hNaWRpTWVzc2FnZT1jc291bmRQdXNoTWlkaU1lc3NhZ2UkJG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGk7bW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaS5jc291bmRTZXRNaWRpQ2FsbGJhY2tzPWNzb3VuZFNldE1pZGlDYWxsYmFja3MkJG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGk7Y29uc3QgY3NvdW5kSW5wdXRNZXNzYWdlJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM9YT0+KGIsYyk9PntjPXN0cmluZzJwdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7Yj1hLmV4cG9ydHMuY3NvdW5kSW5wdXRNZXNzYWdlKGIsYyk7ZnJlZVN0cmluZ1B0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxjKTtyZXR1cm4gYn07Y3NvdW5kSW5wdXRNZXNzYWdlJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHMudG9TdHJpbmc9KCk9PiJpbnB1dE1lc3NhZ2UgPSBhc3luYyAoc2NvcmVFdmVudCkgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZElucHV0TWVzc2FnZUFzeW5jJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM9YT0+KGIsYyk9PntjPXN0cmluZzJwdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7Yj1hLmV4cG9ydHMuY3NvdW5kSW5wdXRNZXNzYWdlQXN5bmMoYixjKTtmcmVlU3RyaW5nUHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO3JldHVybiBifTtjc291bmRJbnB1dE1lc3NhZ2VBc3luYyQkbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzLnRvU3RyaW5nPSgpPT4iaW5wdXRNZXNzYWdlQXN5bmMgPSBhc3luYyAoc2NvcmVFdmVudCkgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZEdldENvbnRyb2xDaGFubmVsJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM9YT0+KGIsYyk9PntjPXN0cmluZzJwdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7Yj1hLmV4cG9ydHMuY3NvdW5kR2V0Q29udHJvbENoYW5uZWxXYXNpKGIsYyk7ZnJlZVN0cmluZ1B0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxjKTtyZXR1cm4gYn07Y3NvdW5kR2V0Q29udHJvbENoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cy50b1N0cmluZz0oKT0+ImdldENvbnRyb2xDaGFubmVsID0gYXN5bmMgKGNoYW5uZWxOYW1lKSA9PiBOdW1iZXI7IjsKY29uc3QgY3NvdW5kU2V0Q29udHJvbENoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cz1hPT4oYixjLGQpPT57Yz1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2EuZXhwb3J0cy5jc291bmRTZXRDb250cm9sQ2hhbm5lbChiLGMsZCk7ZnJlZVN0cmluZ1B0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxjKX07Y3NvdW5kU2V0Q29udHJvbENoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cy50b1N0cmluZz0oKT0+InNldENvbnRyb2xDaGFubmVsID0gYXN5bmMgKGNoYW5uZWxOYW1lLCB2YWx1ZSkgPT4gdm9pZDsiOwpjb25zdCBjc291bmRHZXRTdHJpbmdDaGFubmVsJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM9YT0+KGIsYyk9PntjPXN0cmluZzJwdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7Yj1hLmV4cG9ydHMuY3NvdW5kR2V0U3RyaW5nQ2hhbm5lbFdhc2koYixjKTtjb25zdCBkPXB0cjJzdHJpbmckJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYik7ZnJlZVN0cmluZ1B0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxjKTtmcmVlU3RyaW5nUHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGIpO3JldHVybiBkfTtjc291bmRHZXRTdHJpbmdDaGFubmVsJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHMudG9TdHJpbmc9KCk9PiJnZXRTdHJpbmdDaGFubmVsID0gYXN5bmMgKGNoYW5uZWxOYW1lKSA9PiBTdHJpbmc7IjsKY29uc3QgY3NvdW5kU2V0U3RyaW5nQ2hhbm5lbCQkbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzPWE9PihiLGMsZCk9PntjPXN0cmluZzJwdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7ZD1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGQpO2EuZXhwb3J0cy5jc291bmRTZXRTdHJpbmdDaGFubmVsKGIsYyxkKTtmcmVlU3RyaW5nUHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2ZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsZCl9O2Nzb3VuZFNldFN0cmluZ0NoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cy50b1N0cmluZz0oKT0+InNldFN0cmluZ0NoYW5uZWwgPSBhc3luYyAoY2hhbm5lbE5hbWUsIHZhbHVlKSA9PiB2b2lkOyI7dmFyIG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cz17fTsKbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzLmNzb3VuZEdldENvbnRyb2xDaGFubmVsPWNzb3VuZEdldENvbnRyb2xDaGFubmVsJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM7bW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzLmNzb3VuZEdldFN0cmluZ0NoYW5uZWw9Y3NvdW5kR2V0U3RyaW5nQ2hhbm5lbCQkbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzO21vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cy5jc291bmRJbnB1dE1lc3NhZ2U9Y3NvdW5kSW5wdXRNZXNzYWdlJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM7bW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzLmNzb3VuZElucHV0TWVzc2FnZUFzeW5jPWNzb3VuZElucHV0TWVzc2FnZUFzeW5jJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHM7Cm1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cy5jc291bmRTZXRDb250cm9sQ2hhbm5lbD1jc291bmRTZXRDb250cm9sQ2hhbm5lbCQkbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzO21vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cy5jc291bmRTZXRTdHJpbmdDaGFubmVsPWNzb3VuZFNldFN0cmluZ0NoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cztjb25zdCBjc291bmRHZXRPdXRwdXROYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pbz1hPT5iPT57dmFyIHtidWZmZXI6Y309YS53YXNpLm1lbW9yeTtiPWEuZXhwb3J0cy5jc291bmRHZXRPdXRwdXROYW1lKGIpO2M9bmV3IFVpbnQ4QXJyYXkoYyxiLDY0KTtyZXR1cm4gdHJpbU51bGwkJG1vZHVsZSRzcmMkdXRpbHMkdHJpbV9udWxsKHVpbnQyU3RyaW5nJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMoYykpfHwiIn07Y3NvdW5kR2V0T3V0cHV0TmFtZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGdlbmVyYWxfaW8udG9TdHJpbmc9KCk9PiJnZXRPdXRwdXROYW1lID0gYXN5bmMgKCkgPT4gU3RyaW5nOyI7CmNvbnN0IGNzb3VuZEdldElucHV0TmFtZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGdlbmVyYWxfaW89YT0+Yj0+e3ZhciB7YnVmZmVyOmN9PWEud2FzaS5tZW1vcnk7Yj1hLmV4cG9ydHMuY3NvdW5kR2V0SW5wdXROYW1lKGIpO2M9bmV3IFVpbnQ4QXJyYXkoYyxiLDY0KTtyZXR1cm4gdHJpbU51bGwkJG1vZHVsZSRzcmMkdXRpbHMkdHJpbV9udWxsKHVpbnQyU3RyaW5nJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMoYykpfHwiIn07Y3NvdW5kR2V0SW5wdXROYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pby50b1N0cmluZz0oKT0+ImdldElucHV0TmFtZSA9IGFzeW5jIChjc291bmQpID0+IFN0cmluZzsiO3ZhciBtb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pbz17fTttb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pby5jc291bmRHZXRJbnB1dE5hbWU9Y3NvdW5kR2V0SW5wdXROYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pbzsKbW9kdWxlJHNyYyRtb2R1bGVzJGdlbmVyYWxfaW8uY3NvdW5kR2V0T3V0cHV0TmFtZT1jc291bmRHZXRPdXRwdXROYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pbztjb25zdCBjc291bmRBcHBlbmRFbnYkJG1vZHVsZSRzcmMkbW9kdWxlcyRleHRyYT1hPT4oYixjLGQpPT57Yz1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2Q9c3RyaW5nMnB0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxkKTtiPWEuZXhwb3J0cy5jc291bmRBcHBlbmRFbnYoYixjLGQpO2ZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7ZnJlZVN0cmluZ1B0ciQkbW9kdWxlJHNyYyR1dGlscyRzdHJpbmdfcG9pbnRlcnMoYSxkKTtyZXR1cm4gYn07Y3NvdW5kQXBwZW5kRW52JCRtb2R1bGUkc3JjJG1vZHVsZXMkZXh0cmEudG9TdHJpbmc9KCk9PiJhcHBlbmRFbnYgPSBhc3luYyAoY3NvdW5kLCB2YXJpYWJsZSwgdmFsdWUpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZFNob3VsZERhZW1vbml6ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGV4dHJhPWE9PmI9PmEuZXhwb3J0cy5jc291bmRTaG91bGREYWVtb25pemUoYik7CnZhciBtb2R1bGUkc3JjJG1vZHVsZXMkZXh0cmE9e307bW9kdWxlJHNyYyRtb2R1bGVzJGV4dHJhLmNzb3VuZEFwcGVuZEVudj1jc291bmRBcHBlbmRFbnYkJG1vZHVsZSRzcmMkbW9kdWxlcyRleHRyYTttb2R1bGUkc3JjJG1vZHVsZXMkZXh0cmEuY3NvdW5kU2hvdWxkRGFlbW9uaXplPWNzb3VuZFNob3VsZERhZW1vbml6ZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGV4dHJhO2NvbnN0IGNzb3VuZElzU2NvcmVQZW5kaW5nJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmc9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZElzU2NvcmVQZW5kaW5nKGIpO2Nzb3VuZElzU2NvcmVQZW5kaW5nJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcudG9TdHJpbmc9KCk9PiJpc1Njb3JlUGVuZGluZyA9IGFzeW5jICgpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZFNldFNjb3JlUGVuZGluZyQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nPWE9PihiLGMpPT5hLmV4cG9ydHMuY3NvdW5kU2V0U2NvcmVQZW5kaW5nKGIsYyk7Y3NvdW5kU2V0U2NvcmVQZW5kaW5nJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcudG9TdHJpbmc9KCk9PiJzZXRTY29yZVBlbmRpbmcgPSBhc3luYyAocGVuZGluZykgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZFJlYWRTY29yZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nPWE9PihiLGMpPT57Yz1zdHJpbmcycHRyJCRtb2R1bGUkc3JjJHV0aWxzJHN0cmluZ19wb2ludGVycyhhLGMpO2I9YS5leHBvcnRzLmNzb3VuZFJlYWRTY29yZShiLGMpO2ZyZWVTdHJpbmdQdHIkJG1vZHVsZSRzcmMkdXRpbHMkc3RyaW5nX3BvaW50ZXJzKGEsYyk7cmV0dXJuIGJ9O2Nzb3VuZFJlYWRTY29yZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLnRvU3RyaW5nPSgpPT4icmVhZFNjb3JlID0gYXN5bmMgKHNjb3JlKSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRHZXRTY29yZVRpbWUkJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZz1hPT5iPT5hLmV4cG9ydHMuY3NvdW5kR2V0U2NvcmVUaW1lKGIpO2Nzb3VuZEdldFNjb3JlVGltZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLnRvU3RyaW5nPSgpPT4iZ2V0U2NvcmVUaW1lID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZEdldFNjb3JlT2Zmc2V0U2Vjb25kcyQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nPWE9PmI9PmEuZXhwb3J0cy5jc291bmRHZXRTY29yZU9mZnNldFNlY29uZHMoYik7Y3NvdW5kR2V0U2NvcmVPZmZzZXRTZWNvbmRzJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcudG9TdHJpbmc9KCk9PiJnZXRTY29yZU9mZnNldFNlY29uZHMgPSBhc3luYyAoKSA9PiBOdW1iZXI7Ijtjb25zdCBjc291bmRTZXRTY29yZU9mZnNldFNlY29uZHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZz1hPT4oYixjKT0+YS5leHBvcnRzLmNzb3VuZFNldFNjb3JlT2Zmc2V0U2Vjb25kcyhiLGMpO2Nzb3VuZFNldFNjb3JlT2Zmc2V0U2Vjb25kcyQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLnRvU3RyaW5nPSgpPT4ic2V0U2NvcmVPZmZzZXRTZWNvbmRzID0gYXN5bmMgKCkgPT4gTnVtYmVyOyI7CmNvbnN0IGNzb3VuZFJld2luZFNjb3JlJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmc9YT0+Yj0+YS5leHBvcnRzLmNzb3VuZFJld2luZFNjb3JlKGIpO2Nzb3VuZFJld2luZFNjb3JlJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcudG9TdHJpbmc9KCk9PiJyZXdpbmRTY29yZSA9IGFzeW5jICgpID0+IHVuZGVmaW5lZDsiO3ZhciBtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmc9e307bW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLmNzb3VuZEdldFNjb3JlT2Zmc2V0U2Vjb25kcz1jc291bmRHZXRTY29yZU9mZnNldFNlY29uZHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZzttb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcuY3NvdW5kR2V0U2NvcmVUaW1lPWNzb3VuZEdldFNjb3JlVGltZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nOwptb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcuY3NvdW5kSXNTY29yZVBlbmRpbmc9Y3NvdW5kSXNTY29yZVBlbmRpbmckJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZzttb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcuY3NvdW5kUmVhZFNjb3JlPWNzb3VuZFJlYWRTY29yZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nO21vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZy5jc291bmRSZXdpbmRTY29yZT1jc291bmRSZXdpbmRTY29yZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nO21vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZy5jc291bmRTZXRTY29yZU9mZnNldFNlY29uZHM9Y3NvdW5kU2V0U2NvcmVPZmZzZXRTZWNvbmRzJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmc7bW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLmNzb3VuZFNldFNjb3JlUGVuZGluZz1jc291bmRTZXRTY29yZVBlbmRpbmckJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZztjb25zdCBjc291bmRUYWJsZUxlbmd0aCQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlPWE9PihiLGMpPT5hLmV4cG9ydHMuY3NvdW5kVGFibGVMZW5ndGgoYixjKTtjc291bmRUYWJsZUxlbmd0aCQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLnRvU3RyaW5nPSgpPT4idGFibGVMZW5ndGggPSBhc3luYyAodGFibGVOdW0pID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZFRhYmxlR2V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGU9YT0+KGIsYyxkKT0+YS5leHBvcnRzLmNzb3VuZFRhYmxlR2V0KGIsYyxkKTtjc291bmRUYWJsZUdldCQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLnRvU3RyaW5nPSgpPT4idGFibGVHZXQgPSBhc3luYyAodGFibGVOdW0sIHRhYmxlSW5kZXgpID0+IE51bWJlcjsiO2NvbnN0IGNzb3VuZFRhYmxlU2V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGU9YT0+KGIsYyxkLGUpPT5hLmV4cG9ydHMuY3NvdW5kVGFibGVTZXQoYixjLGQsZSk7CmNzb3VuZFRhYmxlU2V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUudG9TdHJpbmc9KCk9PiJ0YWJsZVNldCA9IGFzeW5jICh0YWJsZU51bSwgdGFibGVJbmRleCwgdmFsdWUpID0+IHVuZGVmaW5lZDsiO2NvbnN0IGNzb3VuZFRhYmxlQ29weUluJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGU9YT0+KGIsYyxkKT0+e2NvbnN0IGU9YS5leHBvcnRzLmFsbG9jRmxvYXRBcnJheShkLmxlbmd0aCk7KG5ldyBGbG9hdDY0QXJyYXkoYS53YXNpLm1lbW9yeS5idWZmZXIsZSxkLmxlbmd0aCkpLnNldChkKTthLmV4cG9ydHMuY3NvdW5kVGFibGVDb3B5SW4oYixjLGUpO2EuZXhwb3J0cy5mcmVlRmxvYXRBcnJheU1lbShlKX07Y3NvdW5kVGFibGVDb3B5SW4kJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZS50b1N0cmluZz0oKT0+InRhYmxlQ29weUluID0gYXN5bmMgKHRhYmxlTnVtLCBmbG9hdDY0QXJyYXkpID0+IHVuZGVmaW5lZDsiOwpjb25zdCBjc291bmRUYWJsZUNvcHlPdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZT1hPT4oYixjKT0+e3ZhciBkPWEuZXhwb3J0cy5jc291bmRUYWJsZUxlbmd0aChiLGMpO2lmKDA8ZCl7Y29uc3QgZT1hLmV4cG9ydHMuYWxsb2NGbG9hdEFycmF5KGQpO2EuZXhwb3J0cy5jc291bmRUYWJsZUNvcHlPdXQoYixjLGUpOyh7YnVmZmVyOmJ9PWEud2FzaS5tZW1vcnkpO2Q9bmV3IEZsb2F0NjRBcnJheShiLGUsZCk7YS5leHBvcnRzLmZyZWVGbG9hdEFycmF5TWVtKGUpO3JldHVybiBGbG9hdDY0QXJyYXkuZnJvbShkKX19O2Nzb3VuZFRhYmxlQ29weU91dCQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLnRvU3RyaW5nPSgpPT4idGFibGVDb3B5T3V0ID0gYXN5bmMgKHRhYmxlTnVtKSA9PiA/RmxvYXQ2NEFycmF5OyI7Y29uc3QgY3NvdW5kR2V0VGFibGUkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZT1jc291bmRUYWJsZUNvcHlPdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTsKY3NvdW5kVGFibGVDb3B5T3V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUudG9TdHJpbmc9Y3NvdW5kVGFibGVDb3B5T3V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUudG9TdHJpbmc7Y29uc3QgY3NvdW5kR2V0VGFibGVBcmdzJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGU9YT0+KGIsYyk9Pntjb25zdCBkPWEuZXhwb3J0cy5hbGxvY0Zsb2F0QXJyYXkoMTAyNCk7YS5leHBvcnRzLmNzb3VuZEdldFRhYmxlQXJncyhiLGQsYyk7KHtidWZmZXI6Yn09YS53YXNpLm1lbW9yeSk7Yj1uZXcgRmxvYXQ2NEFycmF5KGIsZCwxMDI0KTthLmV4cG9ydHMuZnJlZUZsb2F0QXJyYXlNZW0oZCk7cmV0dXJuIGJ9O2Nzb3VuZEdldFRhYmxlQXJncyQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLnRvU3RyaW5nPSgpPT4iZ2V0VGFibGVBcmdzID0gYXN5bmMgKHRhYmxlTnVtKSA9PiA/RmxvYXQ2NEFycmF5OyI7CmNvbnN0IGNzb3VuZElzTmFtZWRHRU4kJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZT1hPT4oYixjKT0+YS5leHBvcnRzLmNzb3VuZElzTmFtZWRHRU4oYixjKTtjc291bmRJc05hbWVkR0VOJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUudG9TdHJpbmc9KCk9PiJpc05hbWVkR0VOID0gYXN5bmMgKHRhYmxlTnVtKSA9PiBudW1iZXI7Ijtjb25zdCBjc291bmRHZXROYW1lZEdFTiQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlPWE9PihiLGMpPT57dmFyIGQ9YS5leHBvcnRzLmNzb3VuZElzTmFtZWRHRU4oYixjKTtpZigwPGQpe2NvbnN0IGU9YS5leHBvcnRzLmFsbG9jU3RyaW5nTWVtKGQpO2EuZXhwb3J0cy5jc291bmRHZXROYW1lZEdFTihiLGUsYyxkKTsoe2J1ZmZlcjpifT1hLndhc2kubWVtb3J5KTtkPW5ldyBVaW50OEFycmF5KGIsZSxkKTtyZXR1cm4gdWludDJTdHJpbmckJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycyhkKX19Owpjc291bmRHZXROYW1lZEdFTiQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLnRvU3RyaW5nPSgpPT4iZ2V0TmFtZWRHRU4gPSBhc3luYyAodGFibGVOdW0pID0+ID9zdHJpbmc7Ijt2YXIgbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlPXt9O21vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZS5jc291bmRHZXROYW1lZEdFTj1jc291bmRHZXROYW1lZEdFTiQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlO21vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZS5jc291bmRHZXRUYWJsZT1jc291bmRUYWJsZUNvcHlPdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTttb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUuY3NvdW5kR2V0VGFibGVBcmdzPWNzb3VuZEdldFRhYmxlQXJncyQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlO21vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZS5jc291bmRJc05hbWVkR0VOPWNzb3VuZElzTmFtZWRHRU4kJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTsKbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLmNzb3VuZFRhYmxlQ29weUluPWNzb3VuZFRhYmxlQ29weUluJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGU7bW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLmNzb3VuZFRhYmxlQ29weU91dD1jc291bmRUYWJsZUNvcHlPdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTttb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUuY3NvdW5kVGFibGVHZXQ9Y3NvdW5kVGFibGVHZXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTttb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUuY3NvdW5kVGFibGVMZW5ndGg9Y3NvdW5kVGFibGVMZW5ndGgkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTttb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUuY3NvdW5kVGFibGVTZXQ9Y3NvdW5kVGFibGVTZXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZTtmdW5jdGlvbiB3cml0ZUZpbGUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMoYSl7cmV0dXJuKGIsYyxkKT0+e2I9InN0cmluZyI9PT10eXBlb2YgZD9lbmNvZGVyJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMuZW5jb2RlKGQpOmQ7YS53YXNpLndyaXRlRmlsZShjLGIpfX13cml0ZUZpbGUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMudG9TdHJpbmc9KCk9PiJhc3luYyAocGF0aCwgZGF0YSkgPT4gdm9pZCI7ZnVuY3Rpb24gYXBwZW5kRmlsZSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mcyhhKXtyZXR1cm4oYixjLGQpPT57Yj0ic3RyaW5nIj09PXR5cGVvZiBkP2VuY29kZXIkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycy5lbmNvZGUoZCk6ZDthLndhc2kuYXBwZW5kRmlsZShjLGIpfX1hcHBlbmRGaWxlJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzLnRvU3RyaW5nPSgpPT4iYXN5bmMgKHBhdGgsIGRhdGEpID0+IHZvaWQiOwpmdW5jdGlvbiByZWFkRmlsZSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mcyhhKXtyZXR1cm4oYixjKT0+YS53YXNpLnJlYWRGaWxlKGMpfXJlYWRGaWxlJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzLnRvU3RyaW5nPSgpPT4iYXN5bmMgKHBhdGgpID0+ID9VaW50OEFycmF5IjtmdW5jdGlvbiB1bmxpbmskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMoYSl7cmV0dXJuKGIsYyk9PmEud2FzaS51bmxpbmsoYyl9dW5saW5rJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzLnRvU3RyaW5nPSgpPT4iYXN5bmMgKHBhdGgpID0+IHZvaWQiO2Z1bmN0aW9uIHJlYWRkaXIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMoYSl7cmV0dXJuKGIsYyk9PmEud2FzaS5yZWFkZGlyKGMpfXJlYWRkaXIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMudG9TdHJpbmc9KCk9PiJhc3luYyAocGF0aCkgPT4gc3RyaW5nW10iOwpmdW5jdGlvbiBta2RpciQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mcyhhKXtyZXR1cm4oYixjKT0+YS53YXNpLm1rZGlyKGMpfW1rZGlyJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzLnRvU3RyaW5nPSgpPT4iYXN5bmMgKHBhdGgpID0+IHZvaWQiO3ZhciBtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzPXt9O21vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMuYXBwZW5kRmlsZT1hcHBlbmRGaWxlJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMubWtkaXI9bWtkaXIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mcy5yZWFkRmlsZT1yZWFkRmlsZSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mczttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzLnJlYWRkaXI9cmVhZGRpciQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mczsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mcy51bmxpbms9dW5saW5rJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMud3JpdGVGaWxlPXdyaXRlRmlsZSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdvcmtlcl9mcztjb25zdCBhcGkkJG1vZHVsZSRzcmMkbGliY3NvdW5kPXtjc291bmRDcmVhdGU6Y3NvdW5kQ3JlYXRlJCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbixjc291bmREZXN0cm95OmNzb3VuZERlc3Ryb3kkJG1vZHVsZSRzcmMkbW9kdWxlcyRpbnN0YW50aWF0aW9uLGNzb3VuZEdldEFQSVZlcnNpb246Y3NvdW5kR2V0QVBJVmVyc2lvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGluc3RhbnRpYXRpb24sY3NvdW5kR2V0VmVyc2lvbjpjc291bmRHZXRWZXJzaW9uJCRtb2R1bGUkc3JjJG1vZHVsZXMkaW5zdGFudGlhdGlvbixjc291bmRJbml0aWFsaXplOmNzb3VuZEluaXRpYWxpemUkJG1vZHVsZSRzcmMkbW9kdWxlcyRpbnN0YW50aWF0aW9uLGNzb3VuZFBhcnNlT3JjOmNzb3VuZFBhcnNlT3JjJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UsY3NvdW5kQ29tcGlsZVRyZWU6Y3NvdW5kQ29tcGlsZVRyZWUkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZSxjc291bmRDb21waWxlT3JjOmNzb3VuZENvbXBpbGVPcmMkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZSwKY3NvdW5kRXZhbENvZGU6Y3NvdW5kRXZhbENvZGUkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZSxjc291bmRTdGFydDpjc291bmRTdGFydCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLGNzb3VuZENvbXBpbGVDc2Q6Y3NvdW5kQ29tcGlsZUNzZCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLGNzb3VuZENvbXBpbGVDc2RUZXh0OmNzb3VuZENvbXBpbGVDc2RUZXh0JCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UsY3NvdW5kUGVyZm9ybTpjc291bmRQZXJmb3JtJCRtb2R1bGUkc3JjJG1vZHVsZXMkcGVyZm9ybWFuY2UsY3NvdW5kUGVyZm9ybUtzbXBzOmNzb3VuZFBlcmZvcm1Lc21wcyQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLGNzb3VuZFBlcmZvcm1CdWZmZXI6Y3NvdW5kUGVyZm9ybUJ1ZmZlciQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLGNzb3VuZFN0b3A6Y3NvdW5kU3RvcCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLApjc291bmRDbGVhbnVwOmNzb3VuZENsZWFudXAkJG1vZHVsZSRzcmMkbW9kdWxlcyRwZXJmb3JtYW5jZSxjc291bmRSZXNldDpjc291bmRSZXNldCQkbW9kdWxlJHNyYyRtb2R1bGVzJHBlcmZvcm1hbmNlLGNzb3VuZEdldFNyOmNzb3VuZEdldFNyJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcyxjc291bmRHZXRLcjpjc291bmRHZXRLciQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMsY3NvdW5kR2V0S3NtcHM6Y3NvdW5kR2V0S3NtcHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLGNzb3VuZEdldE5jaG5sczpjc291bmRHZXROY2hubHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLGNzb3VuZEdldE5jaG5sc0lucHV0OmNzb3VuZEdldE5jaG5sc0lucHV0JCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcyxjc291bmRHZXQwZEJGUzpjc291bmRHZXQwZEJGUyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMsY3NvdW5kR2V0QTQ6Y3NvdW5kR2V0QTQkJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLApjc291bmRHZXRDdXJyZW50VGltZVNhbXBsZXM6Y3NvdW5kR2V0Q3VycmVudFRpbWVTYW1wbGVzJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcyxjc291bmRHZXRTaXplT2ZNWUZMVDpjc291bmRHZXRTaXplT2ZNWUZMVCQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMsY3NvdW5kU2V0T3B0aW9uOmNzb3VuZFNldE9wdGlvbiQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMsY3NvdW5kU2V0UGFyYW1zOmNzb3VuZFNldFBhcmFtcyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMsY3NvdW5kR2V0UGFyYW1zOmNzb3VuZEdldFBhcmFtcyQkbW9kdWxlJHNyYyRtb2R1bGVzJGF0dHJpYnV0ZXMsY3NvdW5kR2V0RGVidWc6Y3NvdW5kR2V0RGVidWckJG1vZHVsZSRzcmMkbW9kdWxlcyRhdHRyaWJ1dGVzLGNzb3VuZFNldERlYnVnOmNzb3VuZFNldERlYnVnJCRtb2R1bGUkc3JjJG1vZHVsZXMkYXR0cmlidXRlcyxjc291bmRHZXRJbnB1dEJ1ZmZlclNpemU6Y3NvdW5kR2V0SW5wdXRCdWZmZXJTaXplJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbywKY3NvdW5kR2V0T3V0cHV0QnVmZmVyU2l6ZTpjc291bmRHZXRPdXRwdXRCdWZmZXJTaXplJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbyxjc291bmRHZXRJbnB1dEJ1ZmZlcjpjc291bmRHZXRJbnB1dEJ1ZmZlciQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW8sY3NvdW5kR2V0T3V0cHV0QnVmZmVyOmNzb3VuZEdldE91dHB1dEJ1ZmZlciQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW8sY3NvdW5kR2V0U3Bpbjpjc291bmRHZXRTcGluJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRhdWRpbyxjc291bmRHZXRTcG91dDpjc291bmRHZXRTcG91dCQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0YXVkaW8sY3NvdW5kR2V0TUlESURldkxpc3Q6Y3NvdW5kR2V0TUlESURldkxpc3QkJG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGksY3NvdW5kU2V0TWlkaUNhbGxiYWNrczpjc291bmRTZXRNaWRpQ2FsbGJhY2tzJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpLGNzb3VuZEdldFJ0TWlkaU5hbWU6Y3NvdW5kR2V0UnRNaWRpTmFtZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaSwKY3NvdW5kR2V0TWlkaU91dEZpbGVOYW1lOmNzb3VuZEdldE1pZGlPdXRGaWxlTmFtZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHJ0bWlkaSxjc291bmRQdXNoTWlkaU1lc3NhZ2U6Y3NvdW5kUHVzaE1pZGlNZXNzYWdlJCRtb2R1bGUkc3JjJG1vZHVsZXMkcnRtaWRpLF9pc1JlcXVlc3RpbmdSdE1pZGlJbnB1dDpfaXNSZXF1ZXN0aW5nUnRNaWRpSW5wdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyRydG1pZGksY3NvdW5kSW5wdXRNZXNzYWdlOmNzb3VuZElucHV0TWVzc2FnZSQkbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzLGNzb3VuZElucHV0TWVzc2FnZUFzeW5jOmNzb3VuZElucHV0TWVzc2FnZUFzeW5jJCRtb2R1bGUkc3JjJG1vZHVsZXMkY29udHJvbF9ldmVudHMsY3NvdW5kR2V0Q29udHJvbENoYW5uZWw6Y3NvdW5kR2V0Q29udHJvbENoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cyxjc291bmRTZXRDb250cm9sQ2hhbm5lbDpjc291bmRTZXRDb250cm9sQ2hhbm5lbCQkbW9kdWxlJHNyYyRtb2R1bGVzJGNvbnRyb2xfZXZlbnRzLApjc291bmRHZXRTdHJpbmdDaGFubmVsOmNzb3VuZEdldFN0cmluZ0NoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cyxjc291bmRTZXRTdHJpbmdDaGFubmVsOmNzb3VuZFNldFN0cmluZ0NoYW5uZWwkJG1vZHVsZSRzcmMkbW9kdWxlcyRjb250cm9sX2V2ZW50cyxjc291bmRHZXRJbnB1dE5hbWU6Y3NvdW5kR2V0SW5wdXROYW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkZ2VuZXJhbF9pbyxjc291bmRHZXRPdXRwdXROYW1lOmNzb3VuZEdldE91dHB1dE5hbWUkJG1vZHVsZSRzcmMkbW9kdWxlcyRnZW5lcmFsX2lvLGNzb3VuZEFwcGVuZEVudjpjc291bmRBcHBlbmRFbnYkJG1vZHVsZSRzcmMkbW9kdWxlcyRleHRyYSxjc291bmRTaG91bGREYWVtb25pemU6Y3NvdW5kU2hvdWxkRGFlbW9uaXplJCRtb2R1bGUkc3JjJG1vZHVsZXMkZXh0cmEsY3NvdW5kSXNTY29yZVBlbmRpbmc6Y3NvdW5kSXNTY29yZVBlbmRpbmckJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZywKY3NvdW5kU2V0U2NvcmVQZW5kaW5nOmNzb3VuZFNldFNjb3JlUGVuZGluZyQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLGNzb3VuZFJlYWRTY29yZTpjc291bmRSZWFkU2NvcmUkJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZyxjc291bmRHZXRTY29yZVRpbWU6Y3NvdW5kR2V0U2NvcmVUaW1lJCRtb2R1bGUkc3JjJG1vZHVsZXMkc2NvcmVfaGFuZGxpbmcsY3NvdW5kR2V0U2NvcmVPZmZzZXRTZWNvbmRzOmNzb3VuZEdldFNjb3JlT2Zmc2V0U2Vjb25kcyQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLGNzb3VuZFNldFNjb3JlT2Zmc2V0U2Vjb25kczpjc291bmRTZXRTY29yZU9mZnNldFNlY29uZHMkJG1vZHVsZSRzcmMkbW9kdWxlcyRzY29yZV9oYW5kbGluZyxjc291bmRSZXdpbmRTY29yZTpjc291bmRSZXdpbmRTY29yZSQkbW9kdWxlJHNyYyRtb2R1bGVzJHNjb3JlX2hhbmRsaW5nLGNzb3VuZFRhYmxlTGVuZ3RoOmNzb3VuZFRhYmxlTGVuZ3RoJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUsCmNzb3VuZFRhYmxlR2V0OmNzb3VuZFRhYmxlR2V0JCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUsY3NvdW5kVGFibGVTZXQ6Y3NvdW5kVGFibGVTZXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZSxjc291bmRUYWJsZUNvcHlJbjpjc291bmRUYWJsZUNvcHlJbiQkbW9kdWxlJHNyYyRtb2R1bGVzJHRhYmxlLGNzb3VuZFRhYmxlQ29weU91dDpjc291bmRUYWJsZUNvcHlPdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZSxjc291bmRHZXRUYWJsZTpjc291bmRUYWJsZUNvcHlPdXQkJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZSxjc291bmRHZXRUYWJsZUFyZ3M6Y3NvdW5kR2V0VGFibGVBcmdzJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUsY3NvdW5kSXNOYW1lZEdFTjpjc291bmRJc05hbWVkR0VOJCRtb2R1bGUkc3JjJG1vZHVsZXMkdGFibGUsY3NvdW5kR2V0TmFtZWRHRU46Y3NvdW5kR2V0TmFtZWRHRU4kJG1vZHVsZSRzcmMkbW9kdWxlcyR0YWJsZSxmczptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd29ya2VyX2ZzfTsKdmFyICRqc2NvbXBEZWZhdWx0RXhwb3J0JCRtb2R1bGUkc3JjJGxpYmNzb3VuZD1mdW5jdGlvbihhKXtyZXR1cm4gbWVyZ2VBbGwkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhbcmVkdWNlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoKGIsYyk9PmFzc29jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoYyxhcGkkJG1vZHVsZSRzcmMkbGliY3NvdW5kW2NdKGEpLGIpLHt9LGtleXMkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhkaXNzb2MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygiZnMiKShhcGkkJG1vZHVsZSRzcmMkbGliY3NvdW5kKSkpLHJlZHVjZSQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKChiLGMpPT5hc3NvYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKGMsCmFwaSQkbW9kdWxlJHNyYyRsaWJjc291bmQuZnNbY10oYSksYikse30sa2V5cyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3b3JrZXJfZnMpKV0pfSxtb2R1bGUkc3JjJGxpYmNzb3VuZD17fTttb2R1bGUkc3JjJGxpYmNzb3VuZC5hcGk9YXBpJCRtb2R1bGUkc3JjJGxpYmNzb3VuZDttb2R1bGUkc3JjJGxpYmNzb3VuZC5kZWZhdWx0PSRqc2NvbXBEZWZhdWx0RXhwb3J0JCRtb2R1bGUkc3JjJGxpYmNzb3VuZDtjb25zdCBkbGluaXQkJG1vZHVsZSRzcmMkZGxpbml0PShhLGIsYyxkKT0+e2lmKGIuZXhwb3J0cy5jc291bmRNb2R1bGVJbml0KXt2YXIgZT1uZXcgV2ViQXNzZW1ibHkuR2xvYmFsKHt2YWx1ZToiaTMyIixtdXRhYmxlOiEwfSwwKSxmPW5ldyBXZWJBc3NlbWJseS5HbG9iYWwoe3ZhbHVlOiJpMzIiLG11dGFibGU6ITB9LDApLGc9bmV3IFdlYkFzc2VtYmx5Lkdsb2JhbCh7dmFsdWU6ImkzMiIsbXV0YWJsZTohMH0sMCk7Y29uc3QgaD1uZXcgV2ViQXNzZW1ibHkuR2xvYmFsKHt2YWx1ZToiaTMyIixtdXRhYmxlOiEwfSwwKTtsZXQgaz1jLmxlbmd0aDsiZnVuY3Rpb24iPT09dHlwZW9mIGIuZXhwb3J0cy5jc291bmRNb2R1bGVDcmVhdGUmJihjLmdyb3coMSksZS52YWx1ZT1rLGMuc2V0KGssYi5leHBvcnRzLmNzb3VuZE1vZHVsZUNyZWF0ZSksays9MSk7ImZ1bmN0aW9uIj09PXR5cGVvZiBiLmV4cG9ydHMuY3NvdW5kTW9kdWxlSW5pdCYmKGMuZ3JvdygxKSxmLnZhbHVlPWssYy5zZXQoaywKYi5leHBvcnRzLmNzb3VuZE1vZHVsZUluaXQpLGsrPTEpOyJmdW5jdGlvbiI9PT10eXBlb2YgYi5leHBvcnRzLmNzb3VuZE1vZHVsZURlc3Ryb3kmJihjLmdyb3coMSksZy52YWx1ZT1rLGMuc2V0KGssYi5leHBvcnRzLmNzb3VuZE1vZHVsZURlc3Ryb3kpLGsrPTEpOyJmdW5jdGlvbiI9PT10eXBlb2YgYi5leHBvcnRzLmNzb3VuZE1vZHVsZUVycm9yQ29kZVRvU3RyaW5nJiYoYy5ncm93KDEpLGgudmFsdWU9ayxjLnNldChrLGIuZXhwb3J0cy5jc291bmRNb2R1bGVFcnJvckNvZGVUb1N0cmluZykpO2EuZXhwb3J0cy5jc291bmRXYXNpTG9hZFBsdWdpbihkLGUsZixnLGgpfWVsc2UgYi5leHBvcnRzLmNzb3VuZF9vcGNvZGVfaW5pdHx8Yi5leHBvcnRzLmNzb3VuZF9mZ2VuX2luaXQ/KGU9bmV3IFdlYkFzc2VtYmx5Lkdsb2JhbCh7dmFsdWU6ImkzMiIsbXV0YWJsZTohMH0sMCksZj1uZXcgV2ViQXNzZW1ibHkuR2xvYmFsKHt2YWx1ZToiaTMyIixtdXRhYmxlOiEwfSwwKSxnPWMubGVuZ3RoLAoiZnVuY3Rpb24iPT09dHlwZW9mIGIuZXhwb3J0cy5jc291bmRfb3Bjb2RlX2luaXQmJihlLnZhbHVlPWcsYy5ncm93KDEpLGMuc2V0KGcsYi5leHBvcnRzLmNzb3VuZF9vcGNvZGVfaW5pdCksZys9MSksImZ1bmN0aW9uIj09PXR5cGVvZiBiLmV4cG9ydHMuY3NvdW5kX2ZnZW5faW5pdCYmKGYudmFsdWU9ZyxjLmdyb3coMSksYy5zZXQoZyxiLmV4cG9ydHMuY3NvdW5kX2ZnZW5faW5pdCkpLGEuZXhwb3J0cy5jc291bmRXYXNpTG9hZE9wY29kZUxpYnJhcnkoZCxmLGUpKTpjb25zb2xlLmVycm9yKCJQbHVnaW4gZG9lc24ndCBleHBvcnQgbmVjZWNjYXJ5IGZ1bmN0aW9ucyB0byBxdWFsaXR5IGFzIGNzb3VuZCBwbHVnaW4uIil9O3ZhciBtb2R1bGUkc3JjJGRsaW5pdD17fTttb2R1bGUkc3JjJGRsaW5pdC5kbGluaXQ9ZGxpbml0JCRtb2R1bGUkc3JjJGRsaW5pdDt2b2lkIDAhPT1nb29nLmdsb2JhbCYmKGdvb2cuZ2xvYmFsPXt9KTtnb29nLmdsb2JhbC5CaWdJbnR8fChnb29nLmdsb2JhbC5CaWdJbnQ9dm9pZCAwPT09QmlnSW50P051bWJlcjpCaWdJbnQpOwpjb25zdCBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTAsV0FTSV9FMkJJRyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0xLFdBU0lfRUFDQ0VTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIsV0FTSV9FQUREUklOVVNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTMsV0FTSV9FQUREUk5PVEFWQUlMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTQsV0FTSV9FQUZOT1NVUFBPUlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NSxXQVNJX0VBR0FJTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz02LFdBU0lfRUFMUkVBRFkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NyxXQVNJX0VCQURGJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTgsV0FTSV9FQkFETVNHJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTksV0FTSV9FQlVTWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0KMTAsV0FTSV9FQ0FOQ0VMRUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTEsV0FTSV9FQ0hJTEQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTIsV0FTSV9FQ09OTkFCT1JURUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTMsV0FTSV9FQ09OTlJFRlVTRUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTQsV0FTSV9FQ09OTlJFU0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTE1LFdBU0lfRURFQURMSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0xNixXQVNJX0VERVNUQUREUlJFUSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0xNyxXQVNJX0VET00kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTgsV0FTSV9FRFFVT1QkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTksV0FTSV9FRVhJU1QkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjIwLFdBU0lfRUZBVUxUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIxLFdBU0lfRUZCSUckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MjIsV0FTSV9FSE9TVFVOUkVBQ0gkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MjMsV0FTSV9FSURSTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0yNCxXQVNJX0VJTFNFUSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0yNSxXQVNJX0VJTlBST0dSRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTI2LFdBU0lfRUlOVFIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MjcsV0FTSV9FSU5WQUwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MjgsV0FTSV9FSU8kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MjksV0FTSV9FSVNDT05OJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTMwLFdBU0lfRUlTRElSJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPQozMSxXQVNJX0VMT09QJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTMyLFdBU0lfRU1GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTMzLFdBU0lfRU1MSU5LJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTM0LFdBU0lfRU1TR1NJWkUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MzUsV0FTSV9FTVVMVElIT1AkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MzYsV0FTSV9FTkFNRVRPT0xPTkckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MzcsV0FTSV9FTkVURE9XTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0zOCxXQVNJX0VORVRSRVNFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0zOSxXQVNJX0VORVRVTlJFQUNIJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTQwLFdBU0lfRU5GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTQxLApXQVNJX0VOT0JVRlMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NDIsV0FTSV9FTk9ERVYkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NDMsV0FTSV9FTk9FTlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NDQsV0FTSV9FTk9FWEVDJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTQ1LFdBU0lfRU5PTENLJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTQ2LFdBU0lfRU5PTElOSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz00NyxXQVNJX0VOT01FTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz00OCxXQVNJX0VOT01TRyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz00OSxXQVNJX0VOT1BST1RPT1BUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTUwLFdBU0lfRU5PU1BDJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTUxLFdBU0lfRU5PU1lTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPQo1MixXQVNJX0VOT1RDT05OJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTUzLFdBU0lfRU5PVERJUiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01NCxXQVNJX0VOT1RFTVBUWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01NSxXQVNJX0VOT1RSRUNPVkVSQUJMRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01NixXQVNJX0VOT1RTT0NLJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTU3LFdBU0lfRU5PVFNVUCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01OCxXQVNJX0VOT1RUWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01OSxXQVNJX0VOWElPJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTYwLFdBU0lfRU9WRVJGTE9XJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTYxLFdBU0lfRU9XTkVSREVBRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0KNjIsV0FTSV9FUEVSTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz02MyxXQVNJX0VQSVBFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTY0LFdBU0lfRVBST1RPJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTY1LFdBU0lfRVBST1RPTk9TVVBQT1JUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTY2LFdBU0lfRVBST1RPVFlQRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz02NyxXQVNJX0VSQU5HRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz02OCxXQVNJX0VST0ZTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTY5LFdBU0lfRVNQSVBFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTcwLFdBU0lfRVNSQ0gkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NzEsV0FTSV9FU1RBTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NzIsV0FTSV9FVElNRURPVVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjczLFdBU0lfRVRYVEJTWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz03NCxXQVNJX0VYREVWJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTc1LFdBU0lfRU5PVENBUEFCTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NzYsV0FTSV9TSUdBQlJUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTAsV0FTSV9TSUdBTFJNJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTEsV0FTSV9TSUdCVVMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MixXQVNJX1NJR0NITEQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MyxXQVNJX1NJR0NPTlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NCxXQVNJX1NJR0ZQRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01LFdBU0lfU0lHSFVQJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTYsV0FTSV9TSUdJTEwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjcsV0FTSV9TSUdJTlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9OCxXQVNJX1NJR0tJTEwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9OSxXQVNJX1NJR1BJUEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTAsV0FTSV9TSUdRVUlUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTExLFdBU0lfU0lHU0VHViQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0xMixXQVNJX1NJR1NUT1AkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTMsV0FTSV9TSUdURVJNJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTE0LFdBU0lfU0lHVFJBUCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0xNSxXQVNJX1NJR1RTVFAkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTYsV0FTSV9TSUdUVElOJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTE3LFdBU0lfU0lHVFRPVSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0KMTgsV0FTSV9TSUdVUkckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MTksV0FTSV9TSUdVU1IxJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIwLFdBU0lfU0lHVVNSMiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0yMSxXQVNJX1NJR1ZUQUxSTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0yMixXQVNJX1NJR1hDUFUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MjMsV0FTSV9TSUdYRlNaJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTI0LFdBU0lfRklMRVRZUEVfVU5LTk9XTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0wLFdBU0lfRklMRVRZUEVfQkxPQ0tfREVWSUNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTEsV0FTSV9GSUxFVFlQRV9DSEFSQUNURVJfREVWSUNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIsV0FTSV9GSUxFVFlQRV9ESVJFQ1RPUlkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjMsV0FTSV9GSUxFVFlQRV9SRUdVTEFSX0ZJTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NCxXQVNJX0ZJTEVUWVBFX1NPQ0tFVF9ER1JBTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz01LFdBU0lfRklMRVRZUEVfU09DS0VUX1NUUkVBTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz02LFdBU0lfRklMRVRZUEVfU1lNQk9MSUNfTElOSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz03LFdBU0lfRkRGTEFHX0FQUEVORCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0xLFdBU0lfRkRGTEFHX0RTWU5DJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIsV0FTSV9GREZMQUdfTk9OQkxPQ0skJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NCxXQVNJX0ZERkxBR19SU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz04LFdBU0lfRkRGTEFHX1NZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjE2LFdBU0lfUklHSFRfRkRfREFUQVNZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDEpLFdBU0lfUklHSFRfRkRfUkVBRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMiksV0FTSV9SSUdIVF9GRF9TRUVLJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCg0KSxXQVNJX1JJR0hUX0ZEX0ZEU1RBVF9TRVRfRkxBR1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDgpLFdBU0lfUklHSFRfRkRfU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMTYpLFdBU0lfUklHSFRfRkRfVEVMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMzIpLFdBU0lfUklHSFRfRkRfV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Cmdvb2cuZ2xvYmFsLkJpZ0ludCg2NCksV0FTSV9SSUdIVF9GRF9BRFZJU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDEyOCksV0FTSV9SSUdIVF9GRF9BTExPQ0FURSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMjU2KSxXQVNJX1JJR0hUX1BBVEhfQ1JFQVRFX0RJUkVDVE9SWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoNTEyKSxXQVNJX1JJR0hUX1BBVEhfQ1JFQVRFX0ZJTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDEwMjQpLFdBU0lfUklHSFRfUEFUSF9MSU5LX1NPVVJDRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMjA0OCksV0FTSV9SSUdIVF9QQVRIX0xJTktfVEFSR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPQpnb29nLmdsb2JhbC5CaWdJbnQoNDA5NiksV0FTSV9SSUdIVF9QQVRIX09QRU4kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDgxOTIpLFdBU0lfUklHSFRfRkRfUkVBRERJUiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMTYzODQpLFdBU0lfUklHSFRfUEFUSF9SRUFETElOSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMzI3NjgpLFdBU0lfUklHSFRfUEFUSF9SRU5BTUVfU09VUkNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCg2NTUzNiksV0FTSV9SSUdIVF9QQVRIX1JFTkFNRV9UQVJHRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDEzMTA3MiksV0FTSV9SSUdIVF9QQVRIX0ZJTEVTVEFUX0dFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0KZ29vZy5nbG9iYWwuQmlnSW50KDI2MjE0NCksV0FTSV9SSUdIVF9QQVRIX0ZJTEVTVEFUX1NFVF9TSVpFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCg1MjQyODgpLFdBU0lfUklHSFRfUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDEwNDg1NzYpLFdBU0lfUklHSFRfRkRfRklMRVNUQVRfR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCgyMDk3MTUyKSxXQVNJX1JJR0hUX0ZEX0ZJTEVTVEFUX1NFVF9TSVpFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCg0MTk0MzA0KSxXQVNJX1JJR0hUX0ZEX0ZJTEVTVEFUX1NFVF9USU1FUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoODM4ODYwOCksV0FTSV9SSUdIVF9QQVRIX1NZTUxJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Cmdvb2cuZ2xvYmFsLkJpZ0ludCgxNjc3NzIxNiksV0FTSV9SSUdIVF9QQVRIX1JFTU9WRV9ESVJFQ1RPUlkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDMzNTU0NDMyKSxXQVNJX1JJR0hUX1BBVEhfVU5MSU5LX0ZJTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9Z29vZy5nbG9iYWwuQmlnSW50KDY3MTA4ODY0KSxXQVNJX1JJR0hUX1BPTExfRkRfUkVBRFdSSVRFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCgxMzQyMTc3MjgpLFdBU0lfUklHSFRfU09DS19TSFVURE9XTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMjY4NDM1NDU2KSxSSUdIVFNfQUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPVdBU0lfUklHSFRfRkRfREFUQVNZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9SRUFEJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfApXQVNJX1JJR0hUX0ZEX1NFRUskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GRFNUQVRfU0VUX0ZMQUdTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX1RFTEwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9XUklURSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX0FEVklTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX0FMTE9DQVRFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9DUkVBVEVfRElSRUNUT1JZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9DUkVBVEVfRklMRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3wKV0FTSV9SSUdIVF9QQVRIX0xJTktfU09VUkNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9MSU5LX1RBUkdFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX1BBVEhfT1BFTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX1JFQURESVIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1JFQURMSU5LJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9SRU5BTUVfU09VUkNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9SRU5BTUVfVEFSR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9GSUxFU1RBVF9HRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX0ZJTEVTVEFUX1NFVF9TSVpFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfApXQVNJX1JJR0hUX1BBVEhfRklMRVNUQVRfU0VUX1RJTUVTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfRklMRVNUQVRfR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfRklMRVNUQVRfU0VUX1RJTUVTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfRklMRVNUQVRfU0VUX1NJWkUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1NZTUxJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1VOTElOS19GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9SRU1PVkVfRElSRUNUT1JZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUE9MTF9GRF9SRUFEV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8CldBU0lfUklHSFRfU09DS19TSFVURE9XTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cyxSSUdIVFNfQkxPQ0tfREVWSUNFX0JBU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9UklHSFRTX0FMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cyxSSUdIVFNfQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9UklHSFRTX0FMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cyxSSUdIVFNfQ0hBUkFDVEVSX0RFVklDRV9CQVNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPVJJR0hUU19BTEwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMsUklHSFRTX0NIQVJBQ1RFUl9ERVZJQ0VfSU5IRVJJVElORyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1SSUdIVFNfQUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLFJJR0hUU19SRUdVTEFSX0ZJTEVfQkFTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0KV0FTSV9SSUdIVF9GRF9EQVRBU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX1JFQUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9TRUVLJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfRkRTVEFUX1NFVF9GTEFHUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX1NZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9URUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9BRFZJU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9BTExPQ0FURSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX0ZJTEVTVEFUX0dFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3wKV0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9TRVRfU0laRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX0ZJTEVTVEFUX1NFVF9USU1FUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX1BPTExfRkRfUkVBRFdSSVRFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLFJJR0hUU19SRUdVTEFSX0ZJTEVfSU5IRVJJVElORyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1nb29nLmdsb2JhbC5CaWdJbnQoMCksUklHSFRTX0RJUkVDVE9SWV9CQVNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPVdBU0lfUklHSFRfRkRfRkRTVEFUX1NFVF9GTEFHUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX1NZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9BRFZJU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8CldBU0lfUklHSFRfUEFUSF9DUkVBVEVfRElSRUNUT1JZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9DUkVBVEVfRklMRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX1BBVEhfTElOS19TT1VSQ0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX0xJTktfVEFSR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9PUEVOJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfUkVBRERJUiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX1BBVEhfUkVBRExJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1JFTkFNRV9TT1VSQ0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1JFTkFNRV9UQVJHRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8CldBU0lfUklHSFRfUEFUSF9GSUxFU1RBVF9HRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX0ZJTEVTVEFUX1NFVF9TSVpFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9HRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9TRVRfVElNRVMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1NZTUxJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QQVRIX1VOTElOS19GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfUEFUSF9SRU1PVkVfRElSRUNUT1JZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfApXQVNJX1JJR0hUX1BPTExfRkRfUkVBRFdSSVRFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLFJJR0hUU19ESVJFQ1RPUllfSU5IRVJJVElORyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1SSUdIVFNfRElSRUNUT1JZX0JBU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8UklHSFRTX1JFR1VMQVJfRklMRV9CQVNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLFJJR0hUU19TT0NLRVRfQkFTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1XQVNJX1JJR0hUX0ZEX1JFQUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GRFNUQVRfU0VUX0ZMQUdTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9HRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8CldBU0lfUklHSFRfUE9MTF9GRF9SRUFEV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9TT0NLX1NIVVRET1dOJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLFJJR0hUU19TT0NLRVRfSU5IRVJJVElORyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1SSUdIVFNfQUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLFJJR0hUU19UVFlfQkFTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz1XQVNJX1JJR0hUX0ZEX1JFQUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GRFNUQVRfU0VUX0ZMQUdTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfFdBU0lfUklHSFRfRkRfV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9HRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN8V0FTSV9SSUdIVF9QT0xMX0ZEX1JFQURXUklURSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cywKUklHSFRTX1RUWV9JTkhFUklUSU5HJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPWdvb2cuZ2xvYmFsLkJpZ0ludCgwKSxXQVNJX0NMT0NLX1JFQUxUSU1FJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTAsV0FTSV9DTE9DS19NT05PVE9OSUMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MSxXQVNJX0NMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0yLFdBU0lfQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MyxXQVNJX0VWRU5UVFlQRV9DTE9DSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0wLFdBU0lfRVZFTlRUWVBFX0ZEX1JFQUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MSxXQVNJX0VWRU5UVFlQRV9GRF9XUklURSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0yLFdBU0lfRklMRVNUQVRfU0VUX0FUSU0kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjEsV0FTSV9GSUxFU1RBVF9TRVRfQVRJTV9OT1ckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MixXQVNJX0ZJTEVTVEFUX1NFVF9NVElNJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTQsV0FTSV9GSUxFU1RBVF9TRVRfTVRJTV9OT1ckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9OCxXQVNJX09fQ1JFQVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9MSxXQVNJX09fRElSRUNUT1JZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIsV0FTSV9PX0VYQ0wkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9NCxXQVNJX09fVFJVTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9OCxXQVNJX1BSRU9QRU5UWVBFX0RJUiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cz0wLFdBU0lfRElSQ09PS0lFX1NUQVJUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTAsV0FTSV9TVERJTl9GSUxFTk8kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9CjAsV0FTSV9TVERPVVRfRklMRU5PJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTEsV0FTSV9TVERFUlJfRklMRU5PJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTIsV0FTSV9XSEVOQ0VfU0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTAsV0FTSV9XSEVOQ0VfQ1VSJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTEsV0FTSV9XSEVOQ0VfRU5EJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzPTI7dmFyIG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM9e307bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5SSUdIVFNfQUxMPVJJR0hUU19BTEwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5SSUdIVFNfQkxPQ0tfREVWSUNFX0JBU0U9UklHSFRTX0FMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5SSUdIVFNfQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkc9UklHSFRTX0FMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLlJJR0hUU19DSEFSQUNURVJfREVWSUNFX0JBU0U9UklHSFRTX0FMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLlJJR0hUU19DSEFSQUNURVJfREVWSUNFX0lOSEVSSVRJTkc9UklHSFRTX0FMTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLlJJR0hUU19ESVJFQ1RPUllfQkFTRT1SSUdIVFNfRElSRUNUT1JZX0JBU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5SSUdIVFNfRElSRUNUT1JZX0lOSEVSSVRJTkc9UklHSFRTX0RJUkVDVE9SWV9JTkhFUklUSU5HJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLlJJR0hUU19SRUdVTEFSX0ZJTEVfQkFTRT1SSUdIVFNfUkVHVUxBUl9GSUxFX0JBU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5SSUdIVFNfUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkc9UklHSFRTX1JFR1VMQVJfRklMRV9JTkhFUklUSU5HJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuUklHSFRTX1NPQ0tFVF9CQVNFPVJJR0hUU19TT0NLRVRfQkFTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLlJJR0hUU19TT0NLRVRfSU5IRVJJVElORz1SSUdIVFNfQUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuUklHSFRTX1RUWV9CQVNFPVJJR0hUU19UVFlfQkFTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5SSUdIVFNfVFRZX0lOSEVSSVRJTkc9UklHSFRTX1RUWV9JTkhFUklUSU5HJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9DTE9DS19NT05PVE9OSUM9V0FTSV9DTE9DS19NT05PVE9OSUMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0NMT0NLX1BST0NFU1NfQ1BVVElNRV9JRD1XQVNJX0NMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfQ0xPQ0tfUkVBTFRJTUU9V0FTSV9DTE9DS19SRUFMVElNRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0NMT0NLX1RIUkVBRF9DUFVUSU1FX0lEPVdBU0lfQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0RJUkNPT0tJRV9TVEFSVD1XQVNJX0RJUkNPT0tJRV9TVEFSVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRTJCSUc9V0FTSV9FMkJJRyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUFDQ0VTPVdBU0lfRUFDQ0VTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FQUREUklOVVNFPVdBU0lfRUFERFJJTlVTRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VBRERSTk9UQVZBSUw9V0FTSV9FQUREUk5PVEFWQUlMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FQUZOT1NVUFBPUlQ9V0FTSV9FQUZOT1NVUFBPUlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VBR0FJTj1XQVNJX0VBR0FJTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUFMUkVBRFk9V0FTSV9FQUxSRUFEWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUJBREY9V0FTSV9FQkFERiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VCQURNU0c9V0FTSV9FQkFETVNHJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FQlVTWT1XQVNJX0VCVVNZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FQ0FOQ0VMRUQ9V0FTSV9FQ0FOQ0VMRUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VDSElMRD1XQVNJX0VDSElMRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUNPTk5BQk9SVEVEPVdBU0lfRUNPTk5BQk9SVEVEJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUNPTk5SRUZVU0VEPVdBU0lfRUNPTk5SRUZVU0VEJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FQ09OTlJFU0VUPVdBU0lfRUNPTk5SRVNFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRURFQURMSz1XQVNJX0VERUFETEskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VERVNUQUREUlJFUT1XQVNJX0VERVNUQUREUlJFUSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRURPTT1XQVNJX0VET00kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FRFFVT1Q9V0FTSV9FRFFVT1QkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VFWElTVD1XQVNJX0VFWElTVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUZBVUxUPVdBU0lfRUZBVUxUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FRkJJRz1XQVNJX0VGQklHJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FSE9TVFVOUkVBQ0g9V0FTSV9FSE9TVFVOUkVBQ0gkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VJRFJNPVdBU0lfRUlEUk0kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FSUxTRVE9V0FTSV9FSUxTRVEkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VJTlBST0dSRVNTPVdBU0lfRUlOUFJPR1JFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VJTlRSPVdBU0lfRUlOVFIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VJTlZBTD1XQVNJX0VJTlZBTCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUlPPVdBU0lfRUlPJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FSVNDT05OPVdBU0lfRUlTQ09OTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VJU0RJUj1XQVNJX0VJU0RJUiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRUxPT1A9V0FTSV9FTE9PUCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU1GSUxFPVdBU0lfRU1GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTUxJTks9V0FTSV9FTUxJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VNU0dTSVpFPVdBU0lfRU1TR1NJWkUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VNVUxUSUhPUD1XQVNJX0VNVUxUSUhPUCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOQU1FVE9PTE9ORz1XQVNJX0VOQU1FVE9PTE9ORyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5FVERPV049V0FTSV9FTkVURE9XTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5FVFJFU0VUPVdBU0lfRU5FVFJFU0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTkVUVU5SRUFDSD1XQVNJX0VORVRVTlJFQUNIJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTkZJTEU9V0FTSV9FTkZJTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTk9CVUZTPVdBU0lfRU5PQlVGUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PREVWPVdBU0lfRU5PREVWJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTk9FTlQ9V0FTSV9FTk9FTlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOT0VYRUM9V0FTSV9FTk9FWEVDJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTk9MQ0s9V0FTSV9FTk9MQ0skJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOT0xJTks9V0FTSV9FTk9MSU5LJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PTUVNPVdBU0lfRU5PTUVNJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FTk9NU0c9V0FTSV9FTk9NU0ckJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOT1BST1RPT1BUPVdBU0lfRU5PUFJPVE9PUFQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOT1NQQz1XQVNJX0VOT1NQQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PU1lTPVdBU0lfRU5PU1lTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PVENBUEFCTEU9V0FTSV9FTk9UQ0FQQUJMRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PVENPTk49V0FTSV9FTk9UQ09OTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PVERJUj1XQVNJX0VOT1RESVIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOT1RFTVBUWT1XQVNJX0VOT1RFTVBUWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PVFJFQ09WRVJBQkxFPVdBU0lfRU5PVFJFQ09WRVJBQkxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PVFNPQ0s9V0FTSV9FTk9UU09DSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5PVFNVUD1XQVNJX0VOT1RTVVAkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VOT1RUWT1XQVNJX0VOT1RUWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU5YSU89V0FTSV9FTlhJTyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU9WRVJGTE9XPVdBU0lfRU9WRVJGTE9XJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRU9XTkVSREVBRD1XQVNJX0VPV05FUkRFQUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VQRVJNPVdBU0lfRVBFUk0kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VQSVBFPVdBU0lfRVBJUEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VQUk9UTz1XQVNJX0VQUk9UTyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRVBST1RPTk9TVVBQT1JUPVdBU0lfRVBST1RPTk9TVVBQT1JUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRVBST1RPVFlQRT1XQVNJX0VQUk9UT1RZUEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VSQU5HRT1XQVNJX0VSQU5HRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRVJPRlM9V0FTSV9FUk9GUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRVNQSVBFPVdBU0lfRVNQSVBFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FU1JDSD1XQVNJX0VTUkNIJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FU1RBTEU9V0FTSV9FU1RBTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FU1VDQ0VTUz1XQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FVElNRURPVVQ9V0FTSV9FVElNRURPVVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VUWFRCU1k9V0FTSV9FVFhUQlNZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FVkVOVFRZUEVfQ0xPQ0s9V0FTSV9FVkVOVFRZUEVfQ0xPQ0skJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VWRU5UVFlQRV9GRF9SRUFEPVdBU0lfRVZFTlRUWVBFX0ZEX1JFQUQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9FVkVOVFRZUEVfRkRfV1JJVEU9V0FTSV9FVkVOVFRZUEVfRkRfV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0VYREVWPVdBU0lfRVhERVYkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0ZERkxBR19BUFBFTkQ9V0FTSV9GREZMQUdfQVBQRU5EJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9GREZMQUdfRFNZTkM9V0FTSV9GREZMQUdfRFNZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0ZERkxBR19OT05CTE9DSz1XQVNJX0ZERkxBR19OT05CTE9DSyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0ZERkxBR19SU1lOQz1XQVNJX0ZERkxBR19SU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRkRGTEFHX1NZTkM9V0FTSV9GREZMQUdfU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRklMRVNUQVRfU0VUX0FUSU09V0FTSV9GSUxFU1RBVF9TRVRfQVRJTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRklMRVNUQVRfU0VUX0FUSU1fTk9XPVdBU0lfRklMRVNUQVRfU0VUX0FUSU1fTk9XJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9GSUxFU1RBVF9TRVRfTVRJTT1XQVNJX0ZJTEVTVEFUX1NFVF9NVElNJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRklMRVNUQVRfU0VUX01USU1fTk9XPVdBU0lfRklMRVNUQVRfU0VUX01USU1fTk9XJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9GSUxFVFlQRV9CTE9DS19ERVZJQ0U9V0FTSV9GSUxFVFlQRV9CTE9DS19ERVZJQ0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0ZJTEVUWVBFX0NIQVJBQ1RFUl9ERVZJQ0U9V0FTSV9GSUxFVFlQRV9DSEFSQUNURVJfREVWSUNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9GSUxFVFlQRV9ESVJFQ1RPUlk9V0FTSV9GSUxFVFlQRV9ESVJFQ1RPUlkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9GSUxFVFlQRV9SRUdVTEFSX0ZJTEU9V0FTSV9GSUxFVFlQRV9SRUdVTEFSX0ZJTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0ZJTEVUWVBFX1NPQ0tFVF9ER1JBTT1XQVNJX0ZJTEVUWVBFX1NPQ0tFVF9ER1JBTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRklMRVRZUEVfU09DS0VUX1NUUkVBTT1XQVNJX0ZJTEVUWVBFX1NPQ0tFVF9TVFJFQU0kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX0ZJTEVUWVBFX1NZTUJPTElDX0xJTks9V0FTSV9GSUxFVFlQRV9TWU1CT0xJQ19MSU5LJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfRklMRVRZUEVfVU5LTk9XTj1XQVNJX0ZJTEVUWVBFX1VOS05PV04kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX09fQ1JFQVQ9V0FTSV9PX0NSRUFUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9PX0RJUkVDVE9SWT1XQVNJX09fRElSRUNUT1JZJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9PX0VYQ0w9V0FTSV9PX0VYQ0wkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX09fVFJVTkM9V0FTSV9PX1RSVU5DJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUFJFT1BFTlRZUEVfRElSPVdBU0lfUFJFT1BFTlRZUEVfRElSJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9GRF9BRFZJU0U9V0FTSV9SSUdIVF9GRF9BRFZJU0UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX0ZEX0FMTE9DQVRFPVdBU0lfUklHSFRfRkRfQUxMT0NBVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX0ZEX0RBVEFTWU5DPVdBU0lfUklHSFRfRkRfREFUQVNZTkMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX0ZEX0ZEU1RBVF9TRVRfRkxBR1M9V0FTSV9SSUdIVF9GRF9GRFNUQVRfU0VUX0ZMQUdTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUklHSFRfRkRfRklMRVNUQVRfR0VUPVdBU0lfUklHSFRfRkRfRklMRVNUQVRfR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9TRVRfU0laRT1XQVNJX1JJR0hUX0ZEX0ZJTEVTVEFUX1NFVF9TSVpFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9TRVRfVElNRVM9V0FTSV9SSUdIVF9GRF9GSUxFU1RBVF9TRVRfVElNRVMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX0ZEX1JFQUQ9V0FTSV9SSUdIVF9GRF9SRUFEJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUklHSFRfRkRfUkVBRERJUj1XQVNJX1JJR0hUX0ZEX1JFQURESVIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX0ZEX1NFRUs9V0FTSV9SSUdIVF9GRF9TRUVLJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9GRF9TWU5DPVdBU0lfUklHSFRfRkRfU1lOQyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUklHSFRfRkRfVEVMTD1XQVNJX1JJR0hUX0ZEX1RFTEwkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX0ZEX1dSSVRFPVdBU0lfUklHSFRfRkRfV1JJVEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QQVRIX0NSRUFURV9ESVJFQ1RPUlk9V0FTSV9SSUdIVF9QQVRIX0NSRUFURV9ESVJFQ1RPUlkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX1BBVEhfQ1JFQVRFX0ZJTEU9V0FTSV9SSUdIVF9QQVRIX0NSRUFURV9GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QQVRIX0ZJTEVTVEFUX0dFVD1XQVNJX1JJR0hUX1BBVEhfRklMRVNUQVRfR0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QQVRIX0ZJTEVTVEFUX1NFVF9TSVpFPVdBU0lfUklHSFRfUEFUSF9GSUxFU1RBVF9TRVRfU0laRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX1BBVEhfRklMRVNUQVRfU0VUX1RJTUVTPVdBU0lfUklHSFRfUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX1BBVEhfTElOS19TT1VSQ0U9V0FTSV9SSUdIVF9QQVRIX0xJTktfU09VUkNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QQVRIX0xJTktfVEFSR0VUPVdBU0lfUklHSFRfUEFUSF9MSU5LX1RBUkdFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUklHSFRfUEFUSF9PUEVOPVdBU0lfUklHSFRfUEFUSF9PUEVOJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUklHSFRfUEFUSF9SRUFETElOSz1XQVNJX1JJR0hUX1BBVEhfUkVBRExJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX1BBVEhfUkVNT1ZFX0RJUkVDVE9SWT1XQVNJX1JJR0hUX1BBVEhfUkVNT1ZFX0RJUkVDVE9SWSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfUklHSFRfUEFUSF9SRU5BTUVfU09VUkNFPVdBU0lfUklHSFRfUEFUSF9SRU5BTUVfU09VUkNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QQVRIX1JFTkFNRV9UQVJHRVQ9V0FTSV9SSUdIVF9QQVRIX1JFTkFNRV9UQVJHRVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QQVRIX1NZTUxJTks9V0FTSV9SSUdIVF9QQVRIX1NZTUxJTkskJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1JJR0hUX1BBVEhfVU5MSU5LX0ZJTEU9V0FTSV9SSUdIVF9QQVRIX1VOTElOS19GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9QT0xMX0ZEX1JFQURXUklURT1XQVNJX1JJR0hUX1BPTExfRkRfUkVBRFdSSVRFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9SSUdIVF9TT0NLX1NIVVRET1dOPVdBU0lfUklHSFRfU09DS19TSFVURE9XTiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR0FCUlQ9V0FTSV9TSUdBQlJUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdBTFJNPVdBU0lfU0lHQUxSTSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHQlVTPVdBU0lfU0lHQlVTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdDSExEPVdBU0lfU0lHQ0hMRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHQ09OVD1XQVNJX1NJR0NPTlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR0ZQRT1XQVNJX1NJR0ZQRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czsKbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR0hVUD1XQVNJX1NJR0hVUCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHSUxMPVdBU0lfU0lHSUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdJTlQ9V0FTSV9TSUdJTlQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR0tJTEw9V0FTSV9TSUdLSUxMJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdQSVBFPVdBU0lfU0lHUElQRSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHUVVJVD1XQVNJX1NJR1FVSVQkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdTRUdWPVdBU0lfU0lHU0VHViQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHU1RPUD1XQVNJX1NJR1NUT1AkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR1RFUk09V0FTSV9TSUdURVJNJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdUUkFQPVdBU0lfU0lHVFJBUCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHVFNUUD1XQVNJX1NJR1RTVFAkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR1RUSU49V0FTSV9TSUdUVElOJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHVFRPVT1XQVNJX1NJR1RUT1UkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR1VSRz1XQVNJX1NJR1VSRyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHVVNSMT1XQVNJX1NJR1VTUjEkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NJR1VTUjI9V0FTSV9TSUdVU1IyJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdWVEFMUk09V0FTSV9TSUdWVEFMUk0kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Cm1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TSUdYQ1BVPVdBU0lfU0lHWENQVSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfU0lHWEZTWj1XQVNJX1NJR1hGU1okJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NUREVSUl9GSUxFTk89V0FTSV9TVERFUlJfRklMRU5PJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9TVERJTl9GSUxFTk89V0FTSV9TVERJTl9GSUxFTk8kJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1NURE9VVF9GSUxFTk89V0FTSV9TVERPVVRfRklMRU5PJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOwptb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzLldBU0lfV0hFTkNFX0NVUj1XQVNJX1dIRU5DRV9DVVIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7bW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cy5XQVNJX1dIRU5DRV9FTkQ9V0FTSV9XSEVOQ0VfRU5EJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzO21vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMuV0FTSV9XSEVOQ0VfU0VUPVdBU0lfV0hFTkNFX1NFVCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cztnb29nLmRlYnVnPXt9O2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGRlYnVnJEVycm9yX0RlYnVnRXJyb3IoYSxiKXtpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLG1vZHVsZSRjb250ZW50cyRnb29nJGRlYnVnJEVycm9yX0RlYnVnRXJyb3IpO2Vsc2V7Y29uc3QgYz1FcnJvcigpLnN0YWNrO2MmJih0aGlzLnN0YWNrPWMpfWEmJih0aGlzLm1lc3NhZ2U9U3RyaW5nKGEpKTt2b2lkIDAhPT1iJiYodGhpcy5jYXVzZT1iKTt0aGlzLnJlcG9ydEVycm9yVG9TZXJ2ZXI9ITB9Z29vZy5pbmhlcml0cyhtb2R1bGUkY29udGVudHMkZ29vZyRkZWJ1ZyRFcnJvcl9EZWJ1Z0Vycm9yLEVycm9yKTttb2R1bGUkY29udGVudHMkZ29vZyRkZWJ1ZyRFcnJvcl9EZWJ1Z0Vycm9yLnByb3RvdHlwZS5uYW1lPSJDdXN0b21FcnJvciI7Z29vZy5kZWJ1Zy5FcnJvcj1tb2R1bGUkY29udGVudHMkZ29vZyRkZWJ1ZyRFcnJvcl9EZWJ1Z0Vycm9yO2dvb2cuZG9tPXt9O2dvb2cuZG9tLk5vZGVUeXBlPXtFTEVNRU5UOjEsQVRUUklCVVRFOjIsVEVYVDozLENEQVRBX1NFQ1RJT046NCxFTlRJVFlfUkVGRVJFTkNFOjUsRU5USVRZOjYsUFJPQ0VTU0lOR19JTlNUUlVDVElPTjo3LENPTU1FTlQ6OCxET0NVTUVOVDo5LERPQ1VNRU5UX1RZUEU6MTAsRE9DVU1FTlRfRlJBR01FTlQ6MTEsTk9UQVRJT046MTJ9O2dvb2cuYXNzZXJ0cz17fTtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFM9Z29vZy5ERUJVRztmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX0Fzc2VydGlvbkVycm9yKGEsYil7bW9kdWxlJGNvbnRlbnRzJGdvb2ckZGVidWckRXJyb3JfRGVidWdFcnJvci5jYWxsKHRoaXMsbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19zdWJzKGEsYikpO3RoaXMubWVzc2FnZVBhdHRlcm49YX1nb29nLmluaGVyaXRzKG1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfQXNzZXJ0aW9uRXJyb3IsbW9kdWxlJGNvbnRlbnRzJGdvb2ckZGVidWckRXJyb3JfRGVidWdFcnJvcik7Z29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yPW1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfQXNzZXJ0aW9uRXJyb3I7bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19Bc3NlcnRpb25FcnJvci5wcm90b3R5cGUubmFtZT0iQXNzZXJ0aW9uRXJyb3IiOwpnb29nLmFzc2VydHMuREVGQVVMVF9FUlJPUl9IQU5ETEVSPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtsZXQgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19lcnJvckhhbmRsZXJfPWdvb2cuYXNzZXJ0cy5ERUZBVUxUX0VSUk9SX0hBTkRMRVI7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19zdWJzKGEsYil7YT1hLnNwbGl0KCIlcyIpO2xldCBjPSIiO2NvbnN0IGQ9YS5sZW5ndGgtMTtmb3IobGV0IGU9MDtlPGQ7ZSsrKWMrPWFbZV0rKGU8Yi5sZW5ndGg/YltlXToiJXMiKTtyZXR1cm4gYythW2RdfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2RvQXNzZXJ0RmFpbHVyZShhLGIsYyxkKXtsZXQgZT0iQXNzZXJ0aW9uIGZhaWxlZCIsZjtjPyhlKz0iOiAiK2MsZj1kKTphJiYoZSs9IjogIithLGY9Yik7YT1uZXcgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19Bc3NlcnRpb25FcnJvcigiIitlLGZ8fFtdKTttb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2Vycm9ySGFuZGxlcl8oYSl9Z29vZy5hc3NlcnRzLnNldEVycm9ySGFuZGxlcj1mdW5jdGlvbihhKXtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMmJihtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2Vycm9ySGFuZGxlcl89YSl9Owpnb29nLmFzc2VydHMuYXNzZXJ0PWZ1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMmJiFhJiZtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2RvQXNzZXJ0RmFpbHVyZSgiIixudWxsLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07Z29vZy5hc3NlcnRzLmFzc2VydEV4aXN0cz1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiZudWxsPT1hJiZtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2RvQXNzZXJ0RmFpbHVyZSgiRXhwZWN0ZWQgdG8gZXhpc3Q6ICVzLiIsW2FdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07Cmdvb2cuYXNzZXJ0cy5mYWlsPWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiZtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2Vycm9ySGFuZGxlcl8obmV3IG1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfQXNzZXJ0aW9uRXJyb3IoIkZhaWx1cmUiKyhhPyI6ICIrYToiIiksQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSl9O2dvb2cuYXNzZXJ0cy5hc3NlcnROdW1iZXI9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmIm51bWJlciIhPT10eXBlb2YgYSYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19kb0Fzc2VydEZhaWx1cmUoIkV4cGVjdGVkIG51bWJlciBidXQgZ290ICVzOiAlcy4iLFtnb29nLnR5cGVPZihhKSxhXSxiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSk7cmV0dXJuIGF9Owpnb29nLmFzc2VydHMuYXNzZXJ0U3RyaW5nPWZ1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMmJiJzdHJpbmciIT09dHlwZW9mIGEmJm1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfZG9Bc3NlcnRGYWlsdXJlKCJFeHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAlczogJXMuIixbZ29vZy50eXBlT2YoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfTtnb29nLmFzc2VydHMuYXNzZXJ0RnVuY3Rpb249ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyYmImZ1bmN0aW9uIiE9PXR5cGVvZiBhJiZtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2RvQXNzZXJ0RmFpbHVyZSgiRXhwZWN0ZWQgZnVuY3Rpb24gYnV0IGdvdCAlczogJXMuIixbZ29vZy50eXBlT2YoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfTsKZ29vZy5hc3NlcnRzLmFzc2VydE9iamVjdD1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiYhZ29vZy5pc09iamVjdChhKSYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19kb0Fzc2VydEZhaWx1cmUoIkV4cGVjdGVkIG9iamVjdCBidXQgZ290ICVzOiAlcy4iLFtnb29nLnR5cGVPZihhKSxhXSxiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSk7cmV0dXJuIGF9O2dvb2cuYXNzZXJ0cy5hc3NlcnRBcnJheT1mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiYhQXJyYXkuaXNBcnJheShhKSYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19kb0Fzc2VydEZhaWx1cmUoIkV4cGVjdGVkIGFycmF5IGJ1dCBnb3QgJXM6ICVzLiIsW2dvb2cudHlwZU9mKGEpLGFdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07Cmdvb2cuYXNzZXJ0cy5hc3NlcnRCb29sZWFuPWZ1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMmJiJib29sZWFuIiE9PXR5cGVvZiBhJiZtb2R1bGUkY29udGVudHMkZ29vZyRhc3NlcnRzX2RvQXNzZXJ0RmFpbHVyZSgiRXhwZWN0ZWQgYm9vbGVhbiBidXQgZ290ICVzOiAlcy4iLFtnb29nLnR5cGVPZihhKSxhXSxiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSk7cmV0dXJuIGF9Owpnb29nLmFzc2VydHMuYXNzZXJ0RWxlbWVudD1mdW5jdGlvbihhLGIsYyl7IWdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUU3x8Z29vZy5pc09iamVjdChhKSYmYS5ub2RlVHlwZT09Z29vZy5kb20uTm9kZVR5cGUuRUxFTUVOVHx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19kb0Fzc2VydEZhaWx1cmUoIkV4cGVjdGVkIEVsZW1lbnQgYnV0IGdvdCAlczogJXMuIixbZ29vZy50eXBlT2YoYSksYV0sYixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMikpO3JldHVybiBhfTsKZ29vZy5hc3NlcnRzLmFzc2VydEluc3RhbmNlb2Y9ZnVuY3Rpb24oYSxiLGMsZCl7IWdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUU3x8YSBpbnN0YW5jZW9mIGJ8fG1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfZG9Bc3NlcnRGYWlsdXJlKCJFeHBlY3RlZCBpbnN0YW5jZW9mICVzIGJ1dCBnb3QgJXMuIixbbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19nZXRUeXBlKGIpLG1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfZ2V0VHlwZShhKV0sYyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMykpO3JldHVybiBhfTsKZ29vZy5hc3NlcnRzLmFzc2VydEZpbml0ZT1mdW5jdGlvbihhLGIsYyl7IWdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUU3x8Im51bWJlciI9PXR5cGVvZiBhJiZpc0Zpbml0ZShhKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19kb0Fzc2VydEZhaWx1cmUoIkV4cGVjdGVkICVzIHRvIGJlIGEgZmluaXRlIG51bWJlciBidXQgaXQgaXMgbm90LiIsW2FdLGIsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpKTtyZXR1cm4gYX07CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFzc2VydHNfZ2V0VHlwZShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIEZ1bmN0aW9uP2EuZGlzcGxheU5hbWV8fGEubmFtZXx8InVua25vd24gdHlwZSBuYW1lIjphIGluc3RhbmNlb2YgT2JqZWN0P2EuY29uc3RydWN0b3IuZGlzcGxheU5hbWV8fGEuY29uc3RydWN0b3IubmFtZXx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpOm51bGw9PT1hPyJudWxsIjp0eXBlb2YgYX07Z29vZy5hcnJheT17fTtnb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTPWdvb2cuVFJVU1RFRF9TSVRFO2NvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X0FTU1VNRV9OQVRJVkVfRlVOQ1RJT05TPTIwMTI8Z29vZy5GRUFUVVJFU0VUX1lFQVI7Z29vZy5hcnJheS5BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OUz1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OUztmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9wZWVrKGEpe3JldHVybiBhW2EubGVuZ3RoLTFdfWdvb2cuYXJyYXkucGVlaz1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9wZWVrO2dvb2cuYXJyYXkubGFzdD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9wZWVrOwpjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9pbmRleE9mPWdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMmJihtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLmluZGV4T2YpP2Z1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjKXtjPW51bGw9PWM/MDowPmM/TWF0aC5tYXgoMCxhLmxlbmd0aCtjKTpjO2lmKCJzdHJpbmciPT09dHlwZW9mIGEpcmV0dXJuInN0cmluZyIhPT10eXBlb2YgYnx8MSE9Yi5sZW5ndGg/LTE6YS5pbmRleE9mKGIsYyk7Zm9yKDtjPGEubGVuZ3RoO2MrKylpZihjIGluIGEmJmFbY109PT1iKXJldHVybiBjO3JldHVybi0xfTtnb29nLmFycmF5LmluZGV4T2Y9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW5kZXhPZjsKY29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfbGFzdEluZGV4T2Y9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X0FTU1VNRV9OQVRJVkVfRlVOQ1RJT05TfHxBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YpP2Z1bmN0aW9uKGEsYixjKXtnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYSxiLG51bGw9PWM/YS5sZW5ndGgtMTpjKX06ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbD09Yz9hLmxlbmd0aC0xOmM7MD5jJiYoYz1NYXRoLm1heCgwLGEubGVuZ3RoK2MpKTtpZigic3RyaW5nIj09PXR5cGVvZiBhKXJldHVybiJzdHJpbmciIT09dHlwZW9mIGJ8fDEhPWIubGVuZ3RoPy0xOmEubGFzdEluZGV4T2YoYixjKTtmb3IoOzA8PWM7Yy0tKWlmKGMgaW4gYSYmYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9Owpnb29nLmFycmF5Lmxhc3RJbmRleE9mPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2xhc3RJbmRleE9mO2NvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZvckVhY2g9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X0FTU1VNRV9OQVRJVkVfRlVOQ1RJT05TfHxBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk/ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Y29uc3QgZD1hLmxlbmd0aCxlPSJzdHJpbmciPT09dHlwZW9mIGE/YS5zcGxpdCgiIik6YTtmb3IobGV0IGY9MDtmPGQ7ZisrKWYgaW4gZSYmYi5jYWxsKGMsZVtmXSxmLGEpfTtnb29nLmFycmF5LmZvckVhY2g9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZm9yRWFjaDsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZm9yRWFjaFJpZ2h0KGEsYixjKXt2YXIgZD1hLmxlbmd0aDtjb25zdCBlPSJzdHJpbmciPT09dHlwZW9mIGE/YS5zcGxpdCgiIik6YTtmb3IoLS1kOzA8PWQ7LS1kKWQgaW4gZSYmYi5jYWxsKGMsZVtkXSxkLGEpfWdvb2cuYXJyYXkuZm9yRWFjaFJpZ2h0PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZvckVhY2hSaWdodDsKY29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZmlsdGVyPWdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMmJihtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLmZpbHRlcik/ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Y29uc3QgZD1hLmxlbmd0aCxlPVtdO2xldCBmPTA7Y29uc3QgZz0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmE7Zm9yKGxldCBoPTA7aDxkO2grKylpZihoIGluIGcpe2NvbnN0IGs9Z1toXTtiLmNhbGwoYyxrLGgsYSkmJihlW2YrK109ayl9cmV0dXJuIGV9O2dvb2cuYXJyYXkuZmlsdGVyPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZpbHRlcjsKY29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfbWFwPWdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMmJihtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLm1hcCk/ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYSxiLGMpfTpmdW5jdGlvbihhLGIsYyl7Y29uc3QgZD1hLmxlbmd0aCxlPUFycmF5KGQpLGY9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KCIiKTphO2ZvcihsZXQgZz0wO2c8ZDtnKyspZyBpbiBmJiYoZVtnXT1iLmNhbGwoYyxmW2ddLGcsYSkpO3JldHVybiBlfTtnb29nLmFycmF5Lm1hcD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9tYXA7CmNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3JlZHVjZT1nb29nLk5BVElWRV9BUlJBWV9QUk9UT1RZUEVTJiYobW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfQVNTVU1FX05BVElWRV9GVU5DVElPTlN8fEFycmF5LnByb3RvdHlwZS5yZWR1Y2UpP2Z1bmN0aW9uKGEsYixjLGQpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO2QmJihiPWdvb2cuYmluZChiLGQpKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnJlZHVjZS5jYWxsKGEsYixjKX06ZnVuY3Rpb24oYSxiLGMsZCl7bGV0IGU9Yzttb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9mb3JFYWNoKGEsZnVuY3Rpb24oZixnKXtlPWIuY2FsbChkLGUsZixnLGEpfSk7cmV0dXJuIGV9O2dvb2cuYXJyYXkucmVkdWNlPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3JlZHVjZTsKY29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVkdWNlUmlnaHQ9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X0FTU1VNRV9OQVRJVkVfRlVOQ1RJT05TfHxBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQpP2Z1bmN0aW9uKGEsYixjLGQpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9Yik7ZCYmKGI9Z29vZy5iaW5kKGIsZCkpO3JldHVybiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQuY2FsbChhLGIsYyl9OmZ1bmN0aW9uKGEsYixjLGQpe2xldCBlPWM7bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZm9yRWFjaFJpZ2h0KGEsZnVuY3Rpb24oZixnKXtlPWIuY2FsbChkLGUsZixnLGEpfSk7cmV0dXJuIGV9O2dvb2cuYXJyYXkucmVkdWNlUmlnaHQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVkdWNlUmlnaHQ7CmNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NvbWU9Z29vZy5OQVRJVkVfQVJSQVlfUFJPVE9UWVBFUyYmKG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X0FTU1VNRV9OQVRJVkVfRlVOQ1RJT05TfHxBcnJheS5wcm90b3R5cGUuc29tZSk/ZnVuY3Rpb24oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGEsYixjKX06ZnVuY3Rpb24oYSxiLGMpe2NvbnN0IGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmE7Zm9yKGxldCBmPTA7ZjxkO2YrKylpZihmIGluIGUmJmIuY2FsbChjLGVbZl0sZixhKSlyZXR1cm4hMDtyZXR1cm4hMX07Z29vZy5hcnJheS5zb21lPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NvbWU7CmNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2V2ZXJ5PWdvb2cuTkFUSVZFX0FSUkFZX1BST1RPVFlQRVMmJihtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9BU1NVTUVfTkFUSVZFX0ZVTkNUSU9OU3x8QXJyYXkucHJvdG90eXBlLmV2ZXJ5KT9mdW5jdGlvbihhLGIsYyl7Z29vZy5hc3NlcnRzLmFzc2VydChudWxsIT1hLmxlbmd0aCk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5ldmVyeS5jYWxsKGEsYixjKX06ZnVuY3Rpb24oYSxiLGMpe2NvbnN0IGQ9YS5sZW5ndGgsZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmE7Zm9yKGxldCBmPTA7ZjxkO2YrKylpZihmIGluIGUmJiFiLmNhbGwoYyxlW2ZdLGYsYSkpcmV0dXJuITE7cmV0dXJuITB9O2dvb2cuYXJyYXkuZXZlcnk9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZXZlcnk7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2NvdW50KGEsYixjKXtsZXQgZD0wO21vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZvckVhY2goYSxmdW5jdGlvbihlLGYsZyl7Yi5jYWxsKGMsZSxmLGcpJiYrK2R9LGMpO3JldHVybiBkfWdvb2cuYXJyYXkuY291bnQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY291bnQ7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZmluZChhLGIsYyl7Yj1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9maW5kSW5kZXgoYSxiLGMpO3JldHVybiAwPmI/bnVsbDoic3RyaW5nIj09PXR5cGVvZiBhP2EuY2hhckF0KGIpOmFbYl19Z29vZy5hcnJheS5maW5kPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZpbmQ7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZpbmRJbmRleChhLGIsYyl7Y29uc3QgZD1hLmxlbmd0aCxlPSJzdHJpbmciPT09dHlwZW9mIGE/YS5zcGxpdCgiIik6YTtmb3IobGV0IGY9MDtmPGQ7ZisrKWlmKGYgaW4gZSYmYi5jYWxsKGMsZVtmXSxmLGEpKXJldHVybiBmO3JldHVybi0xfWdvb2cuYXJyYXkuZmluZEluZGV4PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZpbmRJbmRleDtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9maW5kUmlnaHQoYSxiLGMpe2I9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZmluZEluZGV4UmlnaHQoYSxiLGMpO3JldHVybiAwPmI/bnVsbDoic3RyaW5nIj09PXR5cGVvZiBhP2EuY2hhckF0KGIpOmFbYl19Z29vZy5hcnJheS5maW5kUmlnaHQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZmluZFJpZ2h0OwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9maW5kSW5kZXhSaWdodChhLGIsYyl7dmFyIGQ9YS5sZW5ndGg7Y29uc3QgZT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoIiIpOmE7Zm9yKC0tZDswPD1kO2QtLSlpZihkIGluIGUmJmIuY2FsbChjLGVbZF0sZCxhKSlyZXR1cm4gZDtyZXR1cm4tMX1nb29nLmFycmF5LmZpbmRJbmRleFJpZ2h0PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZpbmRJbmRleFJpZ2h0O2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2NvbnRhaW5zKGEsYil7cmV0dXJuIDA8PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luZGV4T2YoYSxiKX1nb29nLmFycmF5LmNvbnRhaW5zPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2NvbnRhaW5zO2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2lzRW1wdHkoYSl7cmV0dXJuIDA9PWEubGVuZ3RofWdvb2cuYXJyYXkuaXNFbXB0eT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9pc0VtcHR5OwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9jbGVhcihhKXtpZighQXJyYXkuaXNBcnJheShhKSlmb3IobGV0IGI9YS5sZW5ndGgtMTswPD1iO2ItLSlkZWxldGUgYVtiXTthLmxlbmd0aD0wfWdvb2cuYXJyYXkuY2xlYXI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY2xlYXI7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW5zZXJ0KGEsYil7bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29udGFpbnMoYSxiKXx8YS5wdXNoKGIpfWdvb2cuYXJyYXkuaW5zZXJ0PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luc2VydDtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9pbnNlcnRBdChhLGIsYyl7bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc3BsaWNlKGEsYywwLGIpfWdvb2cuYXJyYXkuaW5zZXJ0QXQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW5zZXJ0QXQ7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luc2VydEFycmF5QXQoYSxiLGMpe2dvb2cucGFydGlhbChtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zcGxpY2UsYSxjLDApLmFwcGx5KG51bGwsYil9Z29vZy5hcnJheS5pbnNlcnRBcnJheUF0PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luc2VydEFycmF5QXQ7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW5zZXJ0QmVmb3JlKGEsYixjKXtsZXQgZDsyPT1hcmd1bWVudHMubGVuZ3RofHwwPihkPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luZGV4T2YoYSxjKSk/YS5wdXNoKGIpOm1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luc2VydEF0KGEsYixkKX1nb29nLmFycmF5Lmluc2VydEJlZm9yZT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9pbnNlcnRCZWZvcmU7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3JlbW92ZShhLGIpe2I9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW5kZXhPZihhLGIpO2xldCBjOyhjPTA8PWIpJiZtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVBdChhLGIpO3JldHVybiBjfWdvb2cuYXJyYXkucmVtb3ZlPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3JlbW92ZTtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVMYXN0KGEsYil7Yj1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9sYXN0SW5kZXhPZihhLGIpO3JldHVybiAwPD1iPyhtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVBdChhLGIpLCEwKTohMX1nb29nLmFycmF5LnJlbW92ZUxhc3Q9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVtb3ZlTGFzdDsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVtb3ZlQXQoYSxiKXtnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMT09QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGEsYiwxKS5sZW5ndGh9Z29vZy5hcnJheS5yZW1vdmVBdD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVBdDtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVJZihhLGIsYyl7Yj1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9maW5kSW5kZXgoYSxiLGMpO3JldHVybiAwPD1iPyhtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVBdChhLGIpLCEwKTohMX1nb29nLmFycmF5LnJlbW92ZUlmPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3JlbW92ZUlmOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVBbGxJZihhLGIsYyl7bGV0IGQ9MDttb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9mb3JFYWNoUmlnaHQoYSxmdW5jdGlvbihlLGYpe2IuY2FsbChjLGUsZixhKSYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVtb3ZlQXQoYSxmKSYmZCsrfSk7cmV0dXJuIGR9Z29vZy5hcnJheS5yZW1vdmVBbGxJZj1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVBbGxJZjtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9jb25jYXQoYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sYXJndW1lbnRzKX1nb29nLmFycmF5LmNvbmNhdD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9jb25jYXQ7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfam9pbihhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxhcmd1bWVudHMpfQpnb29nLmFycmF5LmpvaW49bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfam9pbjtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV90b0FycmF5KGEpe2NvbnN0IGI9YS5sZW5ndGg7aWYoMDxiKXtjb25zdCBjPUFycmF5KGIpO2ZvcihsZXQgZD0wO2Q8YjtkKyspY1tkXT1hW2RdO3JldHVybiBjfXJldHVybltdfWNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2Nsb25lPWdvb2cuYXJyYXkudG9BcnJheT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV90b0FycmF5O2dvb2cuYXJyYXkuY2xvbmU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfdG9BcnJheTsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZXh0ZW5kKGEsYil7Zm9yKGxldCBjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7Y29uc3QgZD1hcmd1bWVudHNbY107aWYoZ29vZy5pc0FycmF5TGlrZShkKSl7Y29uc3QgZT1hLmxlbmd0aHx8MCxmPWQubGVuZ3RofHwwO2EubGVuZ3RoPWUrZjtmb3IobGV0IGc9MDtnPGY7ZysrKWFbZStnXT1kW2ddfWVsc2UgYS5wdXNoKGQpfX1nb29nLmFycmF5LmV4dGVuZD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9leHRlbmQ7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc3BsaWNlKGEsYixjLGQpe2dvb2cuYXNzZXJ0cy5hc3NlcnQobnVsbCE9YS5sZW5ndGgpO3JldHVybiBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGEsbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc2xpY2UoYXJndW1lbnRzLDEpKX1nb29nLmFycmF5LnNwbGljZT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zcGxpY2U7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NsaWNlKGEsYixjKXtnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwhPWEubGVuZ3RoKTtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYixjKX1nb29nLmFycmF5LnNsaWNlPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NsaWNlOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVEdXBsaWNhdGVzKGEsYixjKXtiPWJ8fGE7dmFyIGQ9ZnVuY3Rpb24oZyl7cmV0dXJuIGdvb2cuaXNPYmplY3QoZyk/Im8iK2dvb2cuZ2V0VWlkKGcpOih0eXBlb2YgZykuY2hhckF0KDApK2d9O2M9Y3x8ZDtsZXQgZT1kPTA7Y29uc3QgZj17fTtmb3IoO2U8YS5sZW5ndGg7KXtjb25zdCBnPWFbZSsrXSxoPWMoZyk7T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGYsaCl8fChmW2hdPSEwLGJbZCsrXT1nKX1iLmxlbmd0aD1kfWdvb2cuYXJyYXkucmVtb3ZlRHVwbGljYXRlcz1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZW1vdmVEdXBsaWNhdGVzOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9iaW5hcnlTZWFyY2goYSxiLGMpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9iaW5hcnlTZWFyY2hfKGEsY3x8bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZGVmYXVsdENvbXBhcmUsITEsYil9Z29vZy5hcnJheS5iaW5hcnlTZWFyY2g9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfYmluYXJ5U2VhcmNoO2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2JpbmFyeVNlbGVjdChhLGIsYyl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2JpbmFyeVNlYXJjaF8oYSxiLCEwLHZvaWQgMCxjKX1nb29nLmFycmF5LmJpbmFyeVNlbGVjdD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9iaW5hcnlTZWxlY3Q7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2JpbmFyeVNlYXJjaF8oYSxiLGMsZCxlKXtsZXQgZj0wLGc9YS5sZW5ndGgsaDtmb3IoO2Y8Zzspe2NvbnN0IGs9ZisoZy1mPj4+MSk7bGV0IGw7bD1jP2IuY2FsbChlLGFba10sayxhKTpiKGQsYVtrXSk7MDxsP2Y9aysxOihnPWssaD0hbCl9cmV0dXJuIGg/ZjotZi0xfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NvcnQoYSxiKXthLnNvcnQoYnx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZGVmYXVsdENvbXBhcmUpfWdvb2cuYXJyYXkuc29ydD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zb3J0OwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zdGFibGVTb3J0KGEsYil7Y29uc3QgYz1BcnJheShhLmxlbmd0aCk7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspY1tlXT17aW5kZXg6ZSx2YWx1ZTphW2VdfTtjb25zdCBkPWJ8fG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2RlZmF1bHRDb21wYXJlO21vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NvcnQoYyxmdW5jdGlvbihlLGYpe3JldHVybiBkKGUudmFsdWUsZi52YWx1ZSl8fGUuaW5kZXgtZi5pbmRleH0pO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXT1jW2JdLnZhbHVlfWdvb2cuYXJyYXkuc3RhYmxlU29ydD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zdGFibGVTb3J0OwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zb3J0QnlLZXkoYSxiLGMpe2NvbnN0IGQ9Y3x8bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZGVmYXVsdENvbXBhcmU7bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc29ydChhLGZ1bmN0aW9uKGUsZil7cmV0dXJuIGQoYihlKSxiKGYpKX0pfWdvb2cuYXJyYXkuc29ydEJ5S2V5PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NvcnRCeUtleTtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zb3J0T2JqZWN0c0J5S2V5KGEsYixjKXttb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9zb3J0QnlLZXkoYSxmdW5jdGlvbihkKXtyZXR1cm4gZFtiXX0sYyl9Z29vZy5hcnJheS5zb3J0T2JqZWN0c0J5S2V5PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3NvcnRPYmplY3RzQnlLZXk7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2lzU29ydGVkKGEsYixjKXtiPWJ8fG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2RlZmF1bHRDb21wYXJlO2ZvcihsZXQgZD0xO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBlPWIoYVtkLTFdLGFbZF0pO2lmKDA8ZXx8MD09ZSYmYylyZXR1cm4hMX1yZXR1cm4hMH1nb29nLmFycmF5LmlzU29ydGVkPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2lzU29ydGVkO2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2VxdWFscyhhLGIsYyl7aWYoIWdvb2cuaXNBcnJheUxpa2UoYSl8fCFnb29nLmlzQXJyYXlMaWtlKGIpfHxhLmxlbmd0aCE9Yi5sZW5ndGgpcmV0dXJuITE7Y29uc3QgZD1hLmxlbmd0aDtjPWN8fG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2RlZmF1bHRDb21wYXJlRXF1YWxpdHk7Zm9yKGxldCBlPTA7ZTxkO2UrKylpZighYyhhW2VdLGJbZV0pKXJldHVybiExO3JldHVybiEwfQpnb29nLmFycmF5LmVxdWFscz1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9lcXVhbHM7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29tcGFyZTMoYSxiLGMpe2M9Y3x8bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZGVmYXVsdENvbXBhcmU7Y29uc3QgZD1NYXRoLm1pbihhLmxlbmd0aCxiLmxlbmd0aCk7Zm9yKGxldCBlPTA7ZTxkO2UrKyl7Y29uc3QgZj1jKGFbZV0sYltlXSk7aWYoMCE9ZilyZXR1cm4gZn1yZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZGVmYXVsdENvbXBhcmUoYS5sZW5ndGgsYi5sZW5ndGgpfWdvb2cuYXJyYXkuY29tcGFyZTM9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29tcGFyZTM7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZGVmYXVsdENvbXBhcmUoYSxiKXtyZXR1cm4gYT5iPzE6YTxiPy0xOjB9Z29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9kZWZhdWx0Q29tcGFyZTsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW52ZXJzZURlZmF1bHRDb21wYXJlKGEsYil7cmV0dXJuLW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2RlZmF1bHRDb21wYXJlKGEsYil9Z29vZy5hcnJheS5pbnZlcnNlRGVmYXVsdENvbXBhcmU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfaW52ZXJzZURlZmF1bHRDb21wYXJlO2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2RlZmF1bHRDb21wYXJlRXF1YWxpdHkoYSxiKXtyZXR1cm4gYT09PWJ9Z29vZy5hcnJheS5kZWZhdWx0Q29tcGFyZUVxdWFsaXR5PW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2RlZmF1bHRDb21wYXJlRXF1YWxpdHk7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2JpbmFyeUluc2VydChhLGIsYyl7Yz1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9iaW5hcnlTZWFyY2goYSxiLGMpO3JldHVybiAwPmM/KG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2luc2VydEF0KGEsYiwtKGMrMSkpLCEwKTohMX1nb29nLmFycmF5LmJpbmFyeUluc2VydD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9iaW5hcnlJbnNlcnQ7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfYmluYXJ5UmVtb3ZlKGEsYixjKXtiPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2JpbmFyeVNlYXJjaChhLGIsYyk7cmV0dXJuIDA8PWI/bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVtb3ZlQXQoYSxiKTohMX1nb29nLmFycmF5LmJpbmFyeVJlbW92ZT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9iaW5hcnlSZW1vdmU7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2J1Y2tldChhLGIsYyl7Y29uc3QgZD17fTtmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKyl7Y29uc3QgZj1hW2VdLGc9Yi5jYWxsKGMsZixlLGEpO3ZvaWQgMCE9PWcmJihkW2ddfHwoZFtnXT1bXSkpLnB1c2goZil9cmV0dXJuIGR9Z29vZy5hcnJheS5idWNrZXQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfYnVja2V0O2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2J1Y2tldFRvTWFwKGEsYil7Y29uc3QgYz1uZXcgTWFwO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBlPWFbZF0sZj1iKGUsZCxhKTtpZih2b2lkIDAhPT1mKXtsZXQgZz1jLmdldChmKTtnfHwoZz1bXSxjLnNldChmLGcpKTtnLnB1c2goZSl9fXJldHVybiBjfWdvb2cuYXJyYXkuYnVja2V0VG9NYXA9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfYnVja2V0VG9NYXA7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3RvT2JqZWN0KGEsYixjKXtjb25zdCBkPXt9O21vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZvckVhY2goYSxmdW5jdGlvbihlLGYpe2RbYi5jYWxsKGMsZSxmLGEpXT1lfSk7cmV0dXJuIGR9Z29vZy5hcnJheS50b09iamVjdD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV90b09iamVjdDtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV90b01hcChhLGIpe2NvbnN0IGM9bmV3IE1hcDtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdO2Muc2V0KGIoZSxkLGEpLGUpfXJldHVybiBjfWdvb2cuYXJyYXkudG9NYXA9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfdG9NYXA7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3JhbmdlKGEsYixjKXtjb25zdCBkPVtdO2xldCBlPTAsZj1hO2M9Y3x8MTt2b2lkIDAhPT1iJiYoZT1hLGY9Yik7aWYoMD5jKihmLWUpKXJldHVybltdO2lmKDA8Yylmb3IoYT1lO2E8ZjthKz1jKWQucHVzaChhKTtlbHNlIGZvcihhPWU7YT5mO2ErPWMpZC5wdXNoKGEpO3JldHVybiBkfWdvb2cuYXJyYXkucmFuZ2U9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmFuZ2U7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfcmVwZWF0KGEsYil7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGI7ZCsrKWNbZF09YTtyZXR1cm4gY31nb29nLmFycmF5LnJlcGVhdD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yZXBlYXQ7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2ZsYXR0ZW4oYSl7Y29uc3QgYj1bXTtmb3IobGV0IGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7ZCsrKXtjb25zdCBlPWFyZ3VtZW50c1tkXTtpZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgZj0wO2Y8ZS5sZW5ndGg7Zis9ODE5Mil7dmFyIGM9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc2xpY2UoZSxmLGYrODE5Mik7Yz1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9mbGF0dGVuLmFwcGx5KG51bGwsYyk7Zm9yKGxldCBnPTA7ZzxjLmxlbmd0aDtnKyspYi5wdXNoKGNbZ10pfWVsc2UgYi5wdXNoKGUpfXJldHVybiBifWdvb2cuYXJyYXkuZmxhdHRlbj1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9mbGF0dGVuOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yb3RhdGUoYSxiKXtnb29nLmFzc2VydHMuYXNzZXJ0KG51bGwhPWEubGVuZ3RoKTthLmxlbmd0aCYmKGIlPWEubGVuZ3RoLDA8Yj9BcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShhLGEuc3BsaWNlKC1iLGIpKTowPmImJkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGEsYS5zcGxpY2UoMCwtYikpKTtyZXR1cm4gYX1nb29nLmFycmF5LnJvdGF0ZT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9yb3RhdGU7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfbW92ZUl0ZW0oYSxiLGMpe2dvb2cuYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxhLmxlbmd0aCk7Z29vZy5hc3NlcnRzLmFzc2VydCgwPD1jJiZjPGEubGVuZ3RoKTtiPUFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhLGIsMSk7QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGEsYywwLGJbMF0pfWdvb2cuYXJyYXkubW92ZUl0ZW09bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfbW92ZUl0ZW07CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X3ppcChhKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bXTtjb25zdCBiPVtdO2xldCBjPWFyZ3VtZW50c1swXS5sZW5ndGg7Zm9yKHZhciBkPTE7ZDxhcmd1bWVudHMubGVuZ3RoO2QrKylhcmd1bWVudHNbZF0ubGVuZ3RoPGMmJihjPWFyZ3VtZW50c1tkXS5sZW5ndGgpO2ZvcihkPTA7ZDxjO2QrKyl7Y29uc3QgZT1bXTtmb3IobGV0IGY9MDtmPGFyZ3VtZW50cy5sZW5ndGg7ZisrKWUucHVzaChhcmd1bWVudHNbZl1bZF0pO2IucHVzaChlKX1yZXR1cm4gYn1nb29nLmFycmF5LnppcD1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV96aXA7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc2h1ZmZsZShhLGIpe2I9Ynx8TWF0aC5yYW5kb207Zm9yKGxldCBjPWEubGVuZ3RoLTE7MDxjO2MtLSl7Y29uc3QgZD1NYXRoLmZsb29yKGIoKSooYysxKSksZT1hW2NdO2FbY109YVtkXTthW2RdPWV9fQpnb29nLmFycmF5LnNodWZmbGU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfc2h1ZmZsZTtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9jb3B5QnlJbmRleChhLGIpe2NvbnN0IGM9W107bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfZm9yRWFjaChiLGZ1bmN0aW9uKGQpe2MucHVzaChhW2RdKX0pO3JldHVybiBjfWdvb2cuYXJyYXkuY29weUJ5SW5kZXg9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29weUJ5SW5kZXg7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29uY2F0TWFwKGEsYixjKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29uY2F0LmFwcGx5KFtdLG1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X21hcChhLGIsYykpfWdvb2cuYXJyYXkuY29uY2F0TWFwPW1vZHVsZSRjb250ZW50cyRnb29nJGFycmF5X2NvbmNhdE1hcDtnb29nLmRvbS5hc3NlcnRzPXt9O2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNMb2NhdGlvbj1mdW5jdGlvbihhKXtpZihnb29nLmFzc2VydHMuRU5BQkxFX0FTU0VSVFMpe3ZhciBiPWdvb2cuZG9tLmFzc2VydHMuZ2V0V2luZG93XyhhKTtiJiYoIWF8fCEoYSBpbnN0YW5jZW9mIGIuTG9jYXRpb24pJiZhIGluc3RhbmNlb2YgYi5FbGVtZW50KSYmZ29vZy5hc3NlcnRzLmZhaWwoIkFyZ3VtZW50IGlzIG5vdCBhIExvY2F0aW9uIChvciBhIG5vbi1FbGVtZW50IG1vY2spOyBnb3Q6ICVzIixnb29nLmRvbS5hc3NlcnRzLmRlYnVnU3RyaW5nRm9yVHlwZV8oYSkpfXJldHVybiBhfTsKZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXz1mdW5jdGlvbihhLGIpe2lmKGdvb2cuYXNzZXJ0cy5FTkFCTEVfQVNTRVJUUyl7dmFyIGM9Z29vZy5kb20uYXNzZXJ0cy5nZXRXaW5kb3dfKGEpO2MmJiJ1bmRlZmluZWQiIT10eXBlb2YgY1tiXSYmKGEmJihhIGluc3RhbmNlb2YgY1tiXXx8IShhIGluc3RhbmNlb2YgYy5Mb2NhdGlvbnx8YSBpbnN0YW5jZW9mIGMuRWxlbWVudCkpfHxnb29nLmFzc2VydHMuZmFpbCgiQXJndW1lbnQgaXMgbm90IGEgJXMgKG9yIGEgbm9uLUVsZW1lbnQsIG5vbi1Mb2NhdGlvbiBtb2NrKTsgZ290OiAlcyIsYixnb29nLmRvbS5hc3NlcnRzLmRlYnVnU3RyaW5nRm9yVHlwZV8oYSkpKX1yZXR1cm4gYX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxBbmNob3JFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsIkhUTUxBbmNob3JFbGVtZW50Iil9Owpnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEJ1dHRvbkVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTEJ1dHRvbkVsZW1lbnQiKX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxMaW5rRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLCJIVE1MTGlua0VsZW1lbnQiKX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxJbWFnZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTEltYWdlRWxlbWVudCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEF1ZGlvRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLCJIVE1MQXVkaW9FbGVtZW50Iil9Owpnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTFZpZGVvRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLCJIVE1MVmlkZW9FbGVtZW50Iil9O2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MSW5wdXRFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsIkhUTUxJbnB1dEVsZW1lbnQiKX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxUZXh0QXJlYUVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTFRleHRBcmVhRWxlbWVudCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTENhbnZhc0VsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTENhbnZhc0VsZW1lbnQiKX07Cmdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MRW1iZWRFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzRWxlbWVudFR5cGVfKGEsIkhUTUxFbWJlZEVsZW1lbnQiKX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxGb3JtRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLCJIVE1MRm9ybUVsZW1lbnQiKX07Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxGcmFtZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTEZyYW1lRWxlbWVudCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTElGcmFtZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTElGcmFtZUVsZW1lbnQiKX07Cmdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MT2JqZWN0RWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0VsZW1lbnRUeXBlXyhhLCJIVE1MT2JqZWN0RWxlbWVudCIpfTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTFNjcmlwdEVsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNFbGVtZW50VHlwZV8oYSwiSFRNTFNjcmlwdEVsZW1lbnQiKX07Cmdvb2cuZG9tLmFzc2VydHMuZGVidWdTdHJpbmdGb3JUeXBlXz1mdW5jdGlvbihhKXtpZihnb29nLmlzT2JqZWN0KGEpKXRyeXtyZXR1cm4gYS5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZXx8YS5jb25zdHJ1Y3Rvci5uYW1lfHxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9Y2F0Y2goYil7cmV0dXJuIjxvYmplY3QgY291bGQgbm90IGJlIHN0cmluZ2lmaWVkPiJ9ZWxzZSByZXR1cm4gdm9pZCAwPT09YT8idW5kZWZpbmVkIjpudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9O2dvb2cuZG9tLmFzc2VydHMuZ2V0V2luZG93Xz1mdW5jdGlvbihhKXt0cnl7dmFyIGI9YSYmYS5vd25lckRvY3VtZW50LGM9YiYmKGIuZGVmYXVsdFZpZXd8fGIucGFyZW50V2luZG93KTtjPWN8fGdvb2cuZ2xvYmFsO2lmKGMuRWxlbWVudCYmYy5Mb2NhdGlvbilyZXR1cm4gY31jYXRjaChkKXt9cmV0dXJuIG51bGx9O2dvb2cuZnVuY3Rpb25zPXt9O2dvb2cuZnVuY3Rpb25zLmNvbnN0YW50PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhfX07Z29vZy5mdW5jdGlvbnMuRkFMU0U9ZnVuY3Rpb24oKXtyZXR1cm4hMX07Z29vZy5mdW5jdGlvbnMuVFJVRT1mdW5jdGlvbigpe3JldHVybiEwfTtnb29nLmZ1bmN0aW9ucy5OVUxMPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O2dvb2cuZnVuY3Rpb25zLlVOREVGSU5FRD1mdW5jdGlvbigpe307Z29vZy5mdW5jdGlvbnMuRU1QVFk9Z29vZy5mdW5jdGlvbnMuVU5ERUZJTkVEO2dvb2cuZnVuY3Rpb25zLmlkZW50aXR5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGF9O2dvb2cuZnVuY3Rpb25zLmVycm9yPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3Rocm93IEVycm9yKGEpO319O2dvb2cuZnVuY3Rpb25zLmZhaWw9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgYTt9fTsKZ29vZy5mdW5jdGlvbnMubG9jaz1mdW5jdGlvbihhLGIpe2I9Ynx8MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwLGIpKX19O2dvb2cuZnVuY3Rpb25zLm50aD1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzW2FdfX07Z29vZy5mdW5jdGlvbnMucGFydGlhbFJpZ2h0PWZ1bmN0aW9uKGEsYil7Y29uc3QgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IGQ9dGhpcztkPT09Z29vZy5nbG9iYWwmJihkPXZvaWQgMCk7Y29uc3QgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2UucHVzaC5hcHBseShlLGMpO3JldHVybiBhLmFwcGx5KGQsZSl9fTsKZ29vZy5mdW5jdGlvbnMud2l0aFJldHVyblZhbHVlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuZnVuY3Rpb25zLnNlcXVlbmNlKGEsZ29vZy5mdW5jdGlvbnMuY29uc3RhbnQoYikpfTtnb29nLmZ1bmN0aW9ucy5lcXVhbFRvPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBiP2E9PWM6YT09PWN9fTtnb29nLmZ1bmN0aW9ucy5jb21wb3NlPWZ1bmN0aW9uKGEsYil7Y29uc3QgYz1hcmd1bWVudHMsZD1jLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgZTtkJiYoZT1jW2QtMV0uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtmb3IobGV0IGY9ZC0yOzA8PWY7Zi0tKWU9Y1tmXS5jYWxsKHRoaXMsZSk7cmV0dXJuIGV9fTsKZ29vZy5mdW5jdGlvbnMuc2VxdWVuY2U9ZnVuY3Rpb24oYSl7Y29uc3QgYj1hcmd1bWVudHMsYz1iLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgZDtmb3IobGV0IGU9MDtlPGM7ZSsrKWQ9YltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGR9fTtnb29nLmZ1bmN0aW9ucy5hbmQ9ZnVuY3Rpb24oYSl7Y29uc3QgYj1hcmd1bWVudHMsYz1iLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oKXtmb3IobGV0IGQ9MDtkPGM7ZCsrKWlmKCFiW2RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKSlyZXR1cm4hMTtyZXR1cm4hMH19O2dvb2cuZnVuY3Rpb25zLm9yPWZ1bmN0aW9uKGEpe2NvbnN0IGI9YXJndW1lbnRzLGM9Yi5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKGxldCBkPTA7ZDxjO2QrKylpZihiW2RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKSlyZXR1cm4hMDtyZXR1cm4hMX19Owpnb29nLmZ1bmN0aW9ucy5ub3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07Z29vZy5mdW5jdGlvbnMuY3JlYXRlPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oKXt9O2MucHJvdG90eXBlPWEucHJvdG90eXBlO2M9bmV3IGM7YS5hcHBseShjLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7cmV0dXJuIGN9O2dvb2cuZnVuY3Rpb25zLkNBQ0hFX1JFVFVSTl9WQUxVRT0hMDtnb29nLmZ1bmN0aW9ucy5jYWNoZVJldHVyblZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPSExLGM7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWdvb2cuZnVuY3Rpb25zLkNBQ0hFX1JFVFVSTl9WQUxVRSlyZXR1cm4gYSgpO2J8fChjPWEoKSxiPSEwKTtyZXR1cm4gY319O2dvb2cuZnVuY3Rpb25zLm9uY2U9ZnVuY3Rpb24oYSl7bGV0IGI9YTtyZXR1cm4gZnVuY3Rpb24oKXtpZihiKXtjb25zdCBjPWI7Yj1udWxsO2MoKX19fTsKZ29vZy5mdW5jdGlvbnMuZGVib3VuY2U9ZnVuY3Rpb24oYSxiLGMpe2xldCBkPTA7cmV0dXJuIGZ1bmN0aW9uKGUpe2dvb2cuZ2xvYmFsLmNsZWFyVGltZW91dChkKTtjb25zdCBmPWFyZ3VtZW50cztkPWdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmFwcGx5KGMsZil9LGIpfX07Z29vZy5mdW5jdGlvbnMudGhyb3R0bGU9ZnVuY3Rpb24oYSxiLGMpe2xldCBkPTAsZT0hMSxmPVtdO2NvbnN0IGc9ZnVuY3Rpb24oKXtkPTA7ZSYmKGU9ITEsaCgpKX0saD1mdW5jdGlvbigpe2Q9Z29vZy5nbG9iYWwuc2V0VGltZW91dChnLGIpO2xldCBrPWY7Zj1bXTthLmFwcGx5KGMsayl9O3JldHVybiBmdW5jdGlvbihrKXtmPWFyZ3VtZW50cztkP2U9ITA6aCgpfX07Cmdvb2cuZnVuY3Rpb25zLnJhdGVMaW1pdD1mdW5jdGlvbihhLGIsYyl7bGV0IGQ9MDtjb25zdCBlPWZ1bmN0aW9uKCl7ZD0wfTtyZXR1cm4gZnVuY3Rpb24oZil7ZHx8KGQ9Z29vZy5nbG9iYWwuc2V0VGltZW91dChlLGIpLGEuYXBwbHkoYyxhcmd1bWVudHMpKX19O2dvb2cuZnVuY3Rpb25zLmlzRnVuY3Rpb249YT0+ImZ1bmN0aW9uIj09PXR5cGVvZiBhO2dvb2cuc3RyaW5nPXt9O2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nPWZ1bmN0aW9uKCl7fTtnb29nLnN0cmluZy5Db25zdD1mdW5jdGlvbihhLGIpe3RoaXMuc3RyaW5nQ29uc3RWYWx1ZVdpdGhTZWN1cml0eUNvbnRyYWN0X19nb29nU3RyaW5nU2VjdXJpdHlQcml2YXRlXz1hPT09Z29vZy5zdHJpbmcuQ29uc3QuR09PR19TVFJJTkdfQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURV8mJmJ8fCIiO3RoaXMuU1RSSU5HX0NPTlNUX1RZUEVfTUFSS0VSX19HT09HX1NUUklOR19TRUNVUklUWV9QUklWQVRFXz1nb29nLnN0cmluZy5Db25zdC5UWVBFX01BUktFUl99O2dvb2cuc3RyaW5nLkNvbnN0LnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO2dvb2cuc3RyaW5nLkNvbnN0LnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nQ29uc3RWYWx1ZVdpdGhTZWN1cml0eUNvbnRyYWN0X19nb29nU3RyaW5nU2VjdXJpdHlQcml2YXRlX307Cmdvb2cuREVCVUcmJihnb29nLnN0cmluZy5Db25zdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ29uc3R7Iit0aGlzLnN0cmluZ0NvbnN0VmFsdWVXaXRoU2VjdXJpdHlDb250cmFjdF9fZ29vZ1N0cmluZ1NlY3VyaXR5UHJpdmF0ZV8rIn0ifSk7Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLnN0cmluZy5Db25zdCYmYS5jb25zdHJ1Y3Rvcj09PWdvb2cuc3RyaW5nLkNvbnN0JiZhLlNUUklOR19DT05TVF9UWVBFX01BUktFUl9fR09PR19TVFJJTkdfU0VDVVJJVFlfUFJJVkFURV89PT1nb29nLnN0cmluZy5Db25zdC5UWVBFX01BUktFUl8pcmV0dXJuIGEuc3RyaW5nQ29uc3RWYWx1ZVdpdGhTZWN1cml0eUNvbnRyYWN0X19nb29nU3RyaW5nU2VjdXJpdHlQcml2YXRlXztnb29nLmFzc2VydHMuZmFpbCgiZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgQ29uc3QsIGdvdCAnIithKyInIik7cmV0dXJuInR5cGVfZXJyb3I6Q29uc3QifTsKZ29vZy5zdHJpbmcuQ29uc3QuZnJvbT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGdvb2cuc3RyaW5nLkNvbnN0KGdvb2cuc3RyaW5nLkNvbnN0LkdPT0dfU1RSSU5HX0NPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEVfLGEpfTtnb29nLnN0cmluZy5Db25zdC5UWVBFX01BUktFUl89e307Z29vZy5zdHJpbmcuQ29uc3QuR09PR19TVFJJTkdfQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURV89e307Z29vZy5zdHJpbmcuQ29uc3QuRU1QVFk9Z29vZy5zdHJpbmcuQ29uc3QuZnJvbSgiIik7Z29vZy5odG1sPXt9O2dvb2cuaHRtbC50cnVzdGVkdHlwZXM9e307Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5QT0xJQ1lfTkFNRT1nb29nLlRSVVNURURfVFlQRVNfUE9MSUNZX05BTUU/Z29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FKyIjaHRtbCI6IiI7Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5nZXRQb2xpY3lQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2U9ZnVuY3Rpb24oKXtpZighZ29vZy5odG1sLnRydXN0ZWR0eXBlcy5QT0xJQ1lfTkFNRSlyZXR1cm4gbnVsbDt2b2lkIDA9PT1nb29nLmh0bWwudHJ1c3RlZHR5cGVzLmNhY2hlZFBvbGljeV8mJihnb29nLmh0bWwudHJ1c3RlZHR5cGVzLmNhY2hlZFBvbGljeV89Z29vZy5jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3koZ29vZy5odG1sLnRydXN0ZWR0eXBlcy5QT0xJQ1lfTkFNRSkpO3JldHVybiBnb29nLmh0bWwudHJ1c3RlZHR5cGVzLmNhY2hlZFBvbGljeV99O2NvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFPXt9OwpjbGFzcyBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTY3JpcHRfU2FmZVNjcmlwdHtjb25zdHJ1Y3RvcihhLGIpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVNjcmlwdFdyYXBwZWRWYWx1ZV89Yj09PW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFP2E6IiI7dGhpcy5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVNjcmlwdFdyYXBwZWRWYWx1ZV8udG9TdHJpbmcoKX1zdGF0aWMgZnJvbUNvbnN0YW50KGEpe2E9Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpO3JldHVybiAwPT09YS5sZW5ndGg/bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQuRU1QVFk6bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQuY3JlYXRlU2FmZVNjcmlwdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfXN0YXRpYyBmcm9tSnNvbihhKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQuY3JlYXRlU2FmZVNjcmlwdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9TYWZlU2NyaXB0LnN0cmluZ2lmeV8oYSkpfWdldFR5cGVkU3RyaW5nVmFsdWUoKXtyZXR1cm4gdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU2NyaXB0V3JhcHBlZFZhbHVlXy50b1N0cmluZygpfXN0YXRpYyB1bndyYXAoYSl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9TYWZlU2NyaXB0LnVud3JhcFRydXN0ZWRTY3JpcHQoYSkudG9TdHJpbmcoKX1zdGF0aWMgdW53cmFwVHJ1c3RlZFNjcmlwdChhKXtpZihhIGluc3RhbmNlb2YKbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQmJmEuY29uc3RydWN0b3I9PT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTY3JpcHRfU2FmZVNjcmlwdClyZXR1cm4gYS5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU2NyaXB0V3JhcHBlZFZhbHVlXzsoMCxnb29nLmFzc2VydHMuZmFpbCkoImV4cGVjdGVkIG9iamVjdCBvZiB0eXBlIFNhZmVTY3JpcHQsIGdvdCAnIithKyInIG9mIHR5cGUgIitnb29nLnR5cGVPZihhKSk7cmV0dXJuInR5cGVfZXJyb3I6U2FmZVNjcmlwdCJ9c3RhdGljIHN0cmluZ2lmeV8oYSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpLnJlcGxhY2UoLzwvZywiXFx4M2MiKX1zdGF0aWMgY3JlYXRlU2FmZVNjcmlwdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpe2NvbnN0IGI9Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5nZXRQb2xpY3lQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoKTthPWI/Yi5jcmVhdGVTY3JpcHQoYSk6CmE7cmV0dXJuIG5ldyBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTY3JpcHRfU2FmZVNjcmlwdChhLG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFKX19bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQuRU1QVFk9ZnVuY3Rpb24oKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQuY3JlYXRlU2FmZVNjcmlwdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKCIiKX0oKTtnb29nLmh0bWwuU2FmZVNjcmlwdD1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTY3JpcHRfU2FmZVNjcmlwdDtnb29nLmZzPXt9O2dvb2cuZnMudXJsPXt9O2dvb2cuZnMudXJsLmNyZWF0ZU9iamVjdFVybD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5mcy51cmwuZ2V0VXJsT2JqZWN0XygpLmNyZWF0ZU9iamVjdFVSTChhKX07Z29vZy5mcy51cmwucmV2b2tlT2JqZWN0VXJsPWZ1bmN0aW9uKGEpe2dvb2cuZnMudXJsLmdldFVybE9iamVjdF8oKS5yZXZva2VPYmplY3RVUkwoYSl9O2dvb2cuZnMudXJsLlVybE9iamVjdF89ZnVuY3Rpb24oKXt9O2dvb2cuZnMudXJsLlVybE9iamVjdF8ucHJvdG90eXBlLmNyZWF0ZU9iamVjdFVSTD1mdW5jdGlvbihhKXt9O2dvb2cuZnMudXJsLlVybE9iamVjdF8ucHJvdG90eXBlLnJldm9rZU9iamVjdFVSTD1mdW5jdGlvbihhKXt9Owpnb29nLmZzLnVybC5nZXRVcmxPYmplY3RfPWZ1bmN0aW9uKCl7Y29uc3QgYT1nb29nLmZzLnVybC5maW5kVXJsT2JqZWN0XygpO2lmKG51bGwhPWEpcmV0dXJuIGE7dGhyb3cgRXJyb3IoIlRoaXMgYnJvd3NlciBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCBibG9iIFVSTHMiKTt9O2dvb2cuZnMudXJsLmZpbmRVcmxPYmplY3RfPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PWdvb2cuZ2xvYmFsLlVSTCYmdm9pZCAwIT09Z29vZy5nbG9iYWwuVVJMLmNyZWF0ZU9iamVjdFVSTD9nb29nLmdsb2JhbC5VUkw6dm9pZCAwIT09Z29vZy5nbG9iYWwuY3JlYXRlT2JqZWN0VVJMP2dvb2cuZ2xvYmFsOm51bGx9O2dvb2cuZnMudXJsLmJyb3dzZXJTdXBwb3J0c09iamVjdFVybHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9Z29vZy5mcy51cmwuZmluZFVybE9iamVjdF8oKX07Z29vZy5mcy5ibG9iPXt9O2dvb2cuZnMuYmxvYi5nZXRCbG9iPWZ1bmN0aW9uKGEpe3ZhciBiPWdvb2cuZ2xvYmFsLkJsb2JCdWlsZGVyfHxnb29nLmdsb2JhbC5XZWJLaXRCbG9iQnVpbGRlcjtpZih2b2lkIDAhPT1iKXtiPW5ldyBiO2ZvcihsZXQgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspYi5hcHBlbmQoYXJndW1lbnRzW2NdKTtyZXR1cm4gYi5nZXRCbG9iKCl9cmV0dXJuIGdvb2cuZnMuYmxvYi5nZXRCbG9iV2l0aFByb3BlcnRpZXMoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9Owpnb29nLmZzLmJsb2IuZ2V0QmxvYldpdGhQcm9wZXJ0aWVzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1nb29nLmdsb2JhbC5CbG9iQnVpbGRlcnx8Z29vZy5nbG9iYWwuV2ViS2l0QmxvYkJ1aWxkZXI7aWYodm9pZCAwIT09ZCl7ZD1uZXcgZDtmb3IobGV0IGU9MDtlPGEubGVuZ3RoO2UrKylkLmFwcGVuZChhW2VdLGMpO3JldHVybiBkLmdldEJsb2IoYil9aWYodm9pZCAwIT09Z29vZy5nbG9iYWwuQmxvYilyZXR1cm4gZD17fSxiJiYoZC50eXBlPWIpLGMmJihkLmVuZGluZ3M9YyksbmV3IEJsb2IoYSxkKTt0aHJvdyBFcnJvcigiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IGNyZWF0aW5nIEJsb2JzIik7fTtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsPWNsYXNze2NvbnN0cnVjdG9yKGEsYil7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VUcnVzdGVkUmVzb3VyY2VVcmxXcmFwcGVkVmFsdWVfPWI9PT1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLkNPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEVfP2E6IiJ9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VUcnVzdGVkUmVzb3VyY2VVcmxXcmFwcGVkVmFsdWVfKyIifX07Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5wcm90b3R5cGUuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz0hMDtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlVHJ1c3RlZFJlc291cmNlVXJsV3JhcHBlZFZhbHVlXy50b1N0cmluZygpfTsKZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5wcm90b3R5cGUuY2xvbmVXaXRoUGFyYW1zPWZ1bmN0aW9uKGEsYil7dmFyIGM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXAodGhpcyk7Yz1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLlVSTF9QQVJBTV9QQVJTRVJfLmV4ZWMoYyk7dmFyIGQ9Y1szXXx8IiI7cmV0dXJuIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuY3JlYXRlVHJ1c3RlZFJlc291cmNlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoY1sxXStnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnN0cmluZ2lmeVBhcmFtc18oIj8iLGNbMl18fCIiLGEpK2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuc3RyaW5naWZ5UGFyYW1zXygiIyIsZCxiKSl9O2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcFRydXN0ZWRTY3JpcHRVUkwoYSkudG9TdHJpbmcoKX07Cmdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwVHJ1c3RlZFNjcmlwdFVSTD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCYmYS5jb25zdHJ1Y3Rvcj09PWdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwpcmV0dXJuIGEucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlVHJ1c3RlZFJlc291cmNlVXJsV3JhcHBlZFZhbHVlXztnb29nLmFzc2VydHMuZmFpbCgiZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgVHJ1c3RlZFJlc291cmNlVXJsLCBnb3QgJyIrYSsiJyBvZiB0eXBlICIrZ29vZy50eXBlT2YoYSkpO3JldHVybiJ0eXBlX2Vycm9yOlRydXN0ZWRSZXNvdXJjZVVybCJ9Owpnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZvcm1hdD1mdW5jdGlvbihhLGIpe3ZhciBjPWdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKTtpZighZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5CQVNFX1VSTF8udGVzdChjKSl0aHJvdyBFcnJvcigiSW52YWxpZCBUcnVzdGVkUmVzb3VyY2VVcmwgZm9ybWF0OiAiK2MpO2E9Yy5yZXBsYWNlKGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuRk9STUFUX01BUktFUl8sZnVuY3Rpb24oZCxlKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsZSkpdGhyb3cgRXJyb3IoJ0ZvdW5kIG1hcmtlciwgIicrZSsnIiwgaW4gZm9ybWF0IHN0cmluZywgIicrYysnIiwgYnV0IG5vIHZhbGlkIGxhYmVsIG1hcHBpbmcgZm91bmQgaW4gYXJnczogJytKU09OLnN0cmluZ2lmeShiKSk7ZD1iW2VdO3JldHVybiBkIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3Q/Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGQpOgplbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGQpKX0pO3JldHVybiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmNyZWF0ZVRydXN0ZWRSZXNvdXJjZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLkZPUk1BVF9NQVJLRVJfPS8leyhcdyspfS9nO2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuQkFTRV9VUkxfPVJlZ0V4cCgiXigoaHR0cHM6KT8vL1swLTlhLXouOltcXF0tXSsvfC9bXi9cXFxcXXxbXjovXFxcXCVdKy98W146L1xcXFwlXSpbPyNdfGFib3V0OmJsYW5rIykiLCJpIik7Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5VUkxfUEFSQU1fUEFSU0VSXz0vXihbXj8jXSopKFw/W14jXSopPygjW1xzXFNdKik/LzsKZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5mb3JtYXRXaXRoUGFyYW1zPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZvcm1hdChhLGIpLmNsb25lV2l0aFBhcmFtcyhjLGQpfTtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZyb21Db25zdGFudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5jcmVhdGVUcnVzdGVkUmVzb3VyY2VVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSkpfTtnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZyb21Db25zdGFudHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1nb29nLnN0cmluZy5Db25zdC51bndyYXAoYVtjXSk7cmV0dXJuIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuY3JlYXRlVHJ1c3RlZFJlc291cmNlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYil9Owpnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLmZyb21TYWZlU2NyaXB0PWZ1bmN0aW9uKGEpe2E9Z29vZy5mcy5ibG9iLmdldEJsb2JXaXRoUHJvcGVydGllcyhbbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQudW53cmFwKGEpXSwidGV4dC9qYXZhc2NyaXB0Iik7YT1nb29nLmZzLnVybC5jcmVhdGVPYmplY3RVcmwoYSk7cmV0dXJuIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuY3JlYXRlVHJ1c3RlZFJlc291cmNlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9O2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURV89e307Cmdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuY3JlYXRlVHJ1c3RlZFJlc291cmNlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2U9ZnVuY3Rpb24oYSl7Y29uc3QgYj1nb29nLmh0bWwudHJ1c3RlZHR5cGVzLmdldFBvbGljeVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZSgpO2E9Yj9iLmNyZWF0ZVNjcmlwdFVSTChhKTphO3JldHVybiBuZXcgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybChhLGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURV8pfTsKZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC5zdHJpbmdpZnlQYXJhbXNfPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT1jKXJldHVybiBiO2lmKCJzdHJpbmciPT09dHlwZW9mIGMpcmV0dXJuIGM/YStlbmNvZGVVUklDb21wb25lbnQoYyk6IiI7Zm9yKHZhciBkIGluIGMpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsZCkpe3ZhciBlPWNbZF07ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO251bGwhPWcmJihifHwoYj1hKSxiKz0oYi5sZW5ndGg+YS5sZW5ndGg/IiYiOiIiKStlbmNvZGVVUklDb21wb25lbnQoZCkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZykpKX19cmV0dXJuIGJ9O2dvb2cuc3RyaW5nLmludGVybmFsPXt9O2dvb2cuc3RyaW5nLmludGVybmFsLnN0YXJ0c1dpdGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09YS5sYXN0SW5kZXhPZihiLDApfTtnb29nLnN0cmluZy5pbnRlcm5hbC5lbmRzV2l0aD1mdW5jdGlvbihhLGIpe2NvbnN0IGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmEuaW5kZXhPZihiLGMpPT1jfTtnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoPWZ1bmN0aW9uKGEsYil7cmV0dXJuIDA9PWdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmUoYixhLnNsaWNlKDAsYi5sZW5ndGgpKX07Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlRW5kc1dpdGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlQ29tcGFyZShiLGEuc2xpY2UoYS5sZW5ndGgtYi5sZW5ndGgpKX07Cmdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUVxdWFscz1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRvTG93ZXJDYXNlKCk9PWIudG9Mb3dlckNhc2UoKX07Z29vZy5zdHJpbmcuaW50ZXJuYWwuaXNFbXB0eU9yV2hpdGVzcGFjZT1mdW5jdGlvbihhKXtyZXR1cm4vXltcc1x4YTBdKiQvLnRlc3QoYSl9O2dvb2cuc3RyaW5nLmludGVybmFsLnRyaW09Z29vZy5UUlVTVEVEX1NJVEUmJlN0cmluZy5wcm90b3R5cGUudHJpbT9mdW5jdGlvbihhKXtyZXR1cm4gYS50cmltKCl9OmZ1bmN0aW9uKGEpe3JldHVybi9eW1xzXHhhMF0qKFtcc1xTXSo/KVtcc1x4YTBdKiQvLmV4ZWMoYSlbMV19O2dvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU9ZnVuY3Rpb24oYSxiKXthPVN0cmluZyhhKS50b0xvd2VyQ2FzZSgpO2I9U3RyaW5nKGIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGE8Yj8tMTphPT1iPzA6MX07Cmdvb2cuc3RyaW5nLmludGVybmFsLm5ld0xpbmVUb0JyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEucmVwbGFjZSgvKFxyXG58XHJ8XG4pL2csYj8iPGJyIC8+IjoiPGJyPiIpfTsKZ29vZy5zdHJpbmcuaW50ZXJuYWwuaHRtbEVzY2FwZT1mdW5jdGlvbihhLGIpe2lmKGIpYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuQU1QX1JFXywiJmFtcDsiKS5yZXBsYWNlKGdvb2cuc3RyaW5nLmludGVybmFsLkxUX1JFXywiJmx0OyIpLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuR1RfUkVfLCImZ3Q7IikucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5RVU9UX1JFXywiJnF1b3Q7IikucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5TSU5HTEVfUVVPVEVfUkVfLCImIzM5OyIpLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuTlVMTF9SRV8sIiYjMDsiKTtlbHNle2lmKCFnb29nLnN0cmluZy5pbnRlcm5hbC5BTExfUkVfLnRlc3QoYSkpcmV0dXJuIGE7LTEhPWEuaW5kZXhPZigiJiIpJiYoYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuQU1QX1JFXywiJmFtcDsiKSk7LTEhPWEuaW5kZXhPZigiPCIpJiYoYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuTFRfUkVfLAoiJmx0OyIpKTstMSE9YS5pbmRleE9mKCI+IikmJihhPWEucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5HVF9SRV8sIiZndDsiKSk7LTEhPWEuaW5kZXhPZignIicpJiYoYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuaW50ZXJuYWwuUVVPVF9SRV8sIiZxdW90OyIpKTstMSE9YS5pbmRleE9mKCInIikmJihhPWEucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5TSU5HTEVfUVVPVEVfUkVfLCImIzM5OyIpKTstMSE9YS5pbmRleE9mKCJceDAwIikmJihhPWEucmVwbGFjZShnb29nLnN0cmluZy5pbnRlcm5hbC5OVUxMX1JFXywiJiMwOyIpKX1yZXR1cm4gYX07Z29vZy5zdHJpbmcuaW50ZXJuYWwuQU1QX1JFXz0vJi9nO2dvb2cuc3RyaW5nLmludGVybmFsLkxUX1JFXz0vPC9nO2dvb2cuc3RyaW5nLmludGVybmFsLkdUX1JFXz0vPi9nO2dvb2cuc3RyaW5nLmludGVybmFsLlFVT1RfUkVfPS8iL2c7Z29vZy5zdHJpbmcuaW50ZXJuYWwuU0lOR0xFX1FVT1RFX1JFXz0vJy9nOwpnb29nLnN0cmluZy5pbnRlcm5hbC5OVUxMX1JFXz0vXHgwMC9nO2dvb2cuc3RyaW5nLmludGVybmFsLkFMTF9SRV89L1tceDAwJjw+IiddLztnb29nLnN0cmluZy5pbnRlcm5hbC53aGl0ZXNwYWNlRXNjYXBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuc3RyaW5nLmludGVybmFsLm5ld0xpbmVUb0JyKGEucmVwbGFjZSgvICAvZywiICYjMTYwOyIpLGIpfTtnb29nLnN0cmluZy5pbnRlcm5hbC5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybi0xIT1hLmluZGV4T2YoYil9O2dvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuc3RyaW5nLmludGVybmFsLmNvbnRhaW5zKGEudG9Mb3dlckNhc2UoKSxiLnRvTG93ZXJDYXNlKCkpfTsKZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZVZlcnNpb25zPWZ1bmN0aW9uKGEsYil7dmFyIGM9MDthPWdvb2cuc3RyaW5nLmludGVybmFsLnRyaW0oU3RyaW5nKGEpKS5zcGxpdCgiLiIpO2I9Z29vZy5zdHJpbmcuaW50ZXJuYWwudHJpbShTdHJpbmcoYikpLnNwbGl0KCIuIik7Y29uc3QgZD1NYXRoLm1heChhLmxlbmd0aCxiLmxlbmd0aCk7Zm9yKGxldCBnPTA7MD09YyYmZzxkO2crKyl7dmFyIGU9YVtnXXx8IiIsZj1iW2ddfHwiIjtkb3tlPS8oXGQqKShcRCopKC4qKS8uZXhlYyhlKXx8WyIiLCIiLCIiLCIiXTtmPS8oXGQqKShcRCopKC4qKS8uZXhlYyhmKXx8WyIiLCIiLCIiLCIiXTtpZigwPT1lWzBdLmxlbmd0aCYmMD09ZlswXS5sZW5ndGgpYnJlYWs7Yz0wPT1lWzFdLmxlbmd0aD8wOnBhcnNlSW50KGVbMV0sMTApO2NvbnN0IGg9MD09ZlsxXS5sZW5ndGg/MDpwYXJzZUludChmWzFdLDEwKTtjPWdvb2cuc3RyaW5nLmludGVybmFsLmNvbXBhcmVFbGVtZW50c18oYyxoKXx8Cmdvb2cuc3RyaW5nLmludGVybmFsLmNvbXBhcmVFbGVtZW50c18oMD09ZVsyXS5sZW5ndGgsMD09ZlsyXS5sZW5ndGgpfHxnb29nLnN0cmluZy5pbnRlcm5hbC5jb21wYXJlRWxlbWVudHNfKGVbMl0sZlsyXSk7ZT1lWzNdO2Y9ZlszXX13aGlsZSgwPT1jKX1yZXR1cm4gY307Z29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZUVsZW1lbnRzXz1mdW5jdGlvbihhLGIpe3JldHVybiBhPGI/LTE6YT5iPzE6MH07Z29vZy5odG1sLlNhZmVVcmw9Y2xhc3N7Y29uc3RydWN0b3IoYSxiKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVVcmxXcmFwcGVkVmFsdWVfPWI9PT1nb29nLmh0bWwuU2FmZVVybC5DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFXz9hOiIifXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV8udG9TdHJpbmcoKX19O2dvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkc9ImFib3V0OmludmFsaWQjekNsb3N1cmV6Ijtnb29nLmh0bWwuU2FmZVVybC5wcm90b3R5cGUuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz0hMDtnb29nLmh0bWwuU2FmZVVybC5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVVcmxXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9Owpnb29nLmh0bWwuU2FmZVVybC51bndyYXA9ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsJiZhLmNvbnN0cnVjdG9yPT09Z29vZy5odG1sLlNhZmVVcmwpcmV0dXJuIGEucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV87Z29vZy5hc3NlcnRzLmZhaWwoImV4cGVjdGVkIG9iamVjdCBvZiB0eXBlIFNhZmVVcmwsIGdvdCAnIithKyInIG9mIHR5cGUgIitnb29nLnR5cGVPZihhKSk7cmV0dXJuInR5cGVfZXJyb3I6U2FmZVVybCJ9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21Db25zdGFudD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChhKSl9Owpnb29nLmh0bWwuU0FGRV9NSU1FX1RZUEVfUEFUVEVSTl89UmVnRXhwKCdeKD86YXVkaW8vKD86M2dwcDJ8M2dwcHxhYWN8TDE2fG1pZGl8bXAzfG1wNHxtcGVnfG9nYXxvZ2d8b3B1c3x4LW00YXx4LW1hdHJvc2thfHgtd2F2fHdhdnx3ZWJtKXxmb250L1xcdyt8aW1hZ2UvKD86Ym1wfGdpZnxqcGVnfGpwZ3xwbmd8dGlmZnx3ZWJwfHgtaWNvbnxoZWljfGhlaWYpfHZpZGVvLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtfHF1aWNrdGltZXx4LW1hdHJvc2thKSkoPzo7XFx3Kz0oPzpcXHcrfCJbXFx3Oyw9IF0rIikpKiQnLCJpIik7Z29vZy5odG1sLlNhZmVVcmwuaXNTYWZlTWltZVR5cGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuaHRtbC5TQUZFX01JTUVfVFlQRV9QQVRURVJOXy50ZXN0KGEpfTsKZ29vZy5odG1sLlNhZmVVcmwuZnJvbUJsb2I9ZnVuY3Rpb24oYSl7YT1nb29nLmh0bWwuU2FmZVVybC5pc1NhZmVNaW1lVHlwZShhLnR5cGUpP2dvb2cuZnMudXJsLmNyZWF0ZU9iamVjdFVybChhKTpnb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9O2dvb2cuaHRtbC5TYWZlVXJsLnJldm9rZU9iamVjdFVybD1mdW5jdGlvbihhKXthPWEuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpO2EhPT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HJiZnb29nLmZzLnVybC5yZXZva2VPYmplY3RVcmwoYSl9Owpnb29nLmh0bWwuU2FmZVVybC5mcm9tTWVkaWFTb3VyY2U9ZnVuY3Rpb24oYSl7Z29vZy5hc3NlcnRzLmFzc2VydCgiTWVkaWFTb3VyY2UiaW4gZ29vZy5nbG9iYWwsIk5vIHN1cHBvcnQgZm9yIE1lZGlhU291cmNlIik7YT1hIGluc3RhbmNlb2YgTWVkaWFTb3VyY2U/Z29vZy5mcy51cmwuY3JlYXRlT2JqZWN0VXJsKGEpOmdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkc7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07Z29vZy5odG1sLkRBVEFfVVJMX1BBVFRFUk5fPS9eZGF0YTooLiopO2Jhc2U2NCxbYS16MC05K1wvXSs9KiQvaTsKZ29vZy5odG1sLlNhZmVVcmwudHJ5RnJvbURhdGFVcmw9ZnVuY3Rpb24oYSl7YT1TdHJpbmcoYSk7YT1hLnJlcGxhY2UoLyglMEF8JTBEKS9nLCIiKTtyZXR1cm4gYS5tYXRjaChnb29nLmh0bWwuREFUQV9VUkxfUEFUVEVSTl8pP2dvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKTpudWxsfTtnb29nLmh0bWwuU2FmZVVybC5mcm9tRGF0YVVybD1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwudHJ5RnJvbURhdGFVcmwoYSl8fGdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19VUkx9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21UZWxVcmw9ZnVuY3Rpb24oYSl7Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aChhLCJ0ZWw6Iil8fChhPWdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9Owpnb29nLmh0bWwuU0lQX1VSTF9QQVRURVJOXz1SZWdFeHAoIl5zaXBbc10/OlsrYS16MC05Xy4hJCUmJypcXC89XmB7fH1+LV0rQChbYS16MC05LV0rXFwuKStbYS16MC05XXsyLDYzfSQiLCJpIik7Z29vZy5odG1sLlNhZmVVcmwuZnJvbVNpcFVybD1mdW5jdGlvbihhKXtnb29nLmh0bWwuU0lQX1VSTF9QQVRURVJOXy50ZXN0KGRlY29kZVVSSUNvbXBvbmVudChhKSl8fChhPWdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9O2dvb2cuaHRtbC5TYWZlVXJsLmZyb21GYWNlYm9va01lc3NlbmdlclVybD1mdW5jdGlvbihhKXtnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoKGEsImZiLW1lc3NlbmdlcjovL3NoYXJlIil8fChhPWdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9Owpnb29nLmh0bWwuU2FmZVVybC5mcm9tV2hhdHNBcHBVcmw9ZnVuY3Rpb24oYSl7Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aChhLCJ3aGF0c2FwcDovL3NlbmQiKXx8KGE9Z29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1NUUklORyk7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLmNyZWF0ZVNhZmVVcmxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX07Z29vZy5odG1sLlNhZmVVcmwuZnJvbVNtc1VybD1mdW5jdGlvbihhKXtnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoKGEsInNtczoiKSYmZ29vZy5odG1sLlNhZmVVcmwuaXNTbXNVcmxCb2R5VmFsaWRfKGEpfHwoYT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTsKZ29vZy5odG1sLlNhZmVVcmwuaXNTbXNVcmxCb2R5VmFsaWRfPWZ1bmN0aW9uKGEpe3ZhciBiPWEuaW5kZXhPZigiIyIpOzA8YiYmKGE9YS5zdWJzdHJpbmcoMCxiKSk7Yj1hLm1hdGNoKC9bPyZdYm9keT0vZ2kpO2lmKCFiKXJldHVybiEwO2lmKDE8Yi5sZW5ndGgpcmV0dXJuITE7YT1hLm1hdGNoKC9bPyZdYm9keT0oW14mXSopLylbMV07aWYoIWEpcmV0dXJuITA7dHJ5e2RlY29kZVVSSUNvbXBvbmVudChhKX1jYXRjaChjKXtyZXR1cm4hMX1yZXR1cm4vXig/OlthLXowLTlcLV8ufl18JVswLTlhLWZdezJ9KSskL2kudGVzdChhKX07Z29vZy5odG1sLlNhZmVVcmwuZnJvbVNzaFVybD1mdW5jdGlvbihhKXtnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVTdGFydHNXaXRoKGEsInNzaDovLyIpfHwoYT1nb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfU1RSSU5HKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfTsKZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVDaHJvbWVFeHRlbnNpb25Vcmw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVFeHRlbnNpb25VcmxfKC9eY2hyb21lLWV4dGVuc2lvbjpcL1wvKFteXC9dKylcLy8sYSxiKX07Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVGaXJlZm94RXh0ZW5zaW9uVXJsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplRXh0ZW5zaW9uVXJsXygvXm1vei1leHRlbnNpb246XC9cLyhbXlwvXSspXC8vLGEsYil9O2dvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplRWRnZUV4dGVuc2lvblVybD1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUV4dGVuc2lvblVybF8oL15tcy1icm93c2VyLWV4dGVuc2lvbjpcL1wvKFteXC9dKylcLy8sYSxiKX07Cmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplRXh0ZW5zaW9uVXJsXz1mdW5jdGlvbihhLGIsYyl7KGE9YS5leGVjKGIpKT8oYT1hWzFdLC0xPT0oYyBpbnN0YW5jZW9mIGdvb2cuc3RyaW5nLkNvbnN0P1tnb29nLnN0cmluZy5Db25zdC51bndyYXAoYyldOmMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBnb29nLnN0cmluZy5Db25zdC51bndyYXAoZCl9KSkuaW5kZXhPZihhKSYmKGI9Z29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1NUUklORykpOmI9Z29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1NUUklORztyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpfTtnb29nLmh0bWwuU2FmZVVybC5mcm9tVHJ1c3RlZFJlc291cmNlVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXAoYSkpfTsKZ29vZy5odG1sLlNBRkVfVVJMX1BBVFRFUk5fPS9eKD86KD86aHR0cHM/fG1haWx0b3xmdHApOnxbXjovPyNdKig/OlsvPyNdfCQpKS9pO2dvb2cuaHRtbC5TYWZlVXJsLlNBRkVfVVJMX1BBVFRFUk49Z29vZy5odG1sLlNBRkVfVVJMX1BBVFRFUk5fO2dvb2cuaHRtbC5TYWZlVXJsLnRyeVNhbml0aXplPWZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybClyZXR1cm4gYTthPSJvYmplY3QiPT10eXBlb2YgYSYmYS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nP2EuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpOlN0cmluZyhhKTtyZXR1cm4gZ29vZy5odG1sLlNBRkVfVVJMX1BBVFRFUk5fLnRlc3QoYSk/Z29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpOmdvb2cuaHRtbC5TYWZlVXJsLnRyeUZyb21EYXRhVXJsKGEpfTsKZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemU9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuaHRtbC5TYWZlVXJsLnRyeVNhbml0aXplKGEpfHxnb29nLmh0bWwuU2FmZVVybC5JTk5PQ1VPVVNfVVJMfTsKZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQ9ZnVuY3Rpb24oYSxiKXtpZihhIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmwpcmV0dXJuIGE7YT0ib2JqZWN0Ij09dHlwZW9mIGEmJmEuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz9hLmdldFR5cGVkU3RyaW5nVmFsdWUoKTpTdHJpbmcoYSk7aWYoYiYmL15kYXRhOi9pLnRlc3QoYSkmJihiPWdvb2cuaHRtbC5TYWZlVXJsLmZyb21EYXRhVXJsKGEpLGIuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpPT1hKSlyZXR1cm4gYjtnb29nLmFzc2VydHMuYXNzZXJ0KGdvb2cuaHRtbC5TQUZFX1VSTF9QQVRURVJOXy50ZXN0KGEpLCIlcyBkb2VzIG5vdCBtYXRjaCB0aGUgc2FmZSBVUkwgcGF0dGVybiIsYSl8fChhPWdvb2cuaHRtbC5TYWZlVXJsLklOTk9DVU9VU19TVFJJTkcpO3JldHVybiBnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9Owpnb29nLmh0bWwuU2FmZVVybC5DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFXz17fTtnb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBnb29nLmh0bWwuU2FmZVVybChhLGdvb2cuaHRtbC5TYWZlVXJsLkNPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEVfKX07Z29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1VSTD1nb29nLmh0bWwuU2FmZVVybC5jcmVhdGVTYWZlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoZ29vZy5odG1sLlNhZmVVcmwuSU5OT0NVT1VTX1NUUklORyk7Z29vZy5odG1sLlNhZmVVcmwuQUJPVVRfQkxBTks9Z29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKCJhYm91dDpibGFuayIpO2NvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX0NPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEU9e307CmNsYXNzIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZXtjb25zdHJ1Y3RvcihhLGIpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlV3JhcHBlZFZhbHVlXz1iPT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURT9hOiIiO3RoaXMuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz0hMH1zdGF0aWMgZnJvbUNvbnN0YW50KGEpe2E9Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlLkVNUFRZOygwLGdvb2cuYXNzZXJ0cy5hc3NlcnQpKCgwLGdvb2cuc3RyaW5nLmludGVybmFsLmVuZHNXaXRoKShhLCI7IiksYExhc3QgY2hhcmFjdGVyIG9mIHN0eWxlIHN0cmluZyBpcyBub3QgJzsnOiAke2F9YCk7KDAsZ29vZy5hc3NlcnRzLmFzc2VydCkoKDAsZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMpKGEsCiI6IiksIlN0eWxlIHN0cmluZyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lICc6JywgdG8gc3BlY2lmeSBhIFwibmFtZTogdmFsdWVcIiBwYWlyOiAiK2EpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl9Z2V0VHlwZWRTdHJpbmdWYWx1ZSgpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVdyYXBwZWRWYWx1ZV99dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9c3RhdGljIHVud3JhcChhKXtpZihhIGluc3RhbmNlb2YgbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlJiZhLmNvbnN0cnVjdG9yPT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlKXJldHVybiBhLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVdyYXBwZWRWYWx1ZV87CigwLGdvb2cuYXNzZXJ0cy5mYWlsKShgZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgU2FmZVN0eWxlLCBnb3QgJyR7YX1gKyInIG9mIHR5cGUgIitnb29nLnR5cGVPZihhKSk7cmV0dXJuInR5cGVfZXJyb3I6U2FmZVN0eWxlIn1zdGF0aWMgY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYSl7cmV0dXJuIG5ldyBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUoYSxtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFKX1zdGF0aWMgY3JlYXRlKGEpe2xldCBiPSIiO2ZvcihsZXQgYyBpbiBhKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpKXtpZighL15bLV9hLXpBLVowLTldKyQvLnRlc3QoYykpdGhyb3cgRXJyb3IoYE5hbWUgYWxsb3dzIG9ubHkgWy1fYS16QS1aMC05XSwgZ290OiAke2N9YCk7bGV0IGQ9YVtjXTtudWxsIT1kJiYKKGQ9QXJyYXkuaXNBcnJheShkKT9kLm1hcChtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9zYW5pdGl6ZVByb3BlcnR5VmFsdWUpLmpvaW4oIiAiKTptb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9zYW5pdGl6ZVByb3BlcnR5VmFsdWUoZCksYis9YCR7Y306JHtkfTtgKX1yZXR1cm4gYj9tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYik6bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlLkVNUFRZfXN0YXRpYyBjb25jYXQoYSl7bGV0IGI9IiI7Y29uc3QgYz1kPT57QXJyYXkuaXNBcnJheShkKT9kLmZvckVhY2goYyk6Yis9bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlLnVud3JhcChkKX07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhcmd1bWVudHMsYyk7CnJldHVybiBiP21vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS5jcmVhdGVTYWZlU3R5bGVTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKTptb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuRU1QVFl9fW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS5FTVBUWT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuY3JlYXRlU2FmZVN0eWxlU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoIiIpO21vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS5JTk5PQ1VPVVNfU1RSSU5HPSJ6Q2xvc3VyZXoiOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9zYW5pdGl6ZVByb3BlcnR5VmFsdWUoYSl7aWYoYSBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsKXJldHVybid1cmwoIicrZ29vZy5odG1sLlNhZmVVcmwudW53cmFwKGEpLnJlcGxhY2UoLzwvZywiJTNjIikucmVwbGFjZSgvW1xcIl0vZywiXFwkJiIpKyciKSc7YT1hIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3Q/Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpOm1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX3Nhbml0aXplUHJvcGVydHlWYWx1ZVN0cmluZyhTdHJpbmcoYSkpO2lmKC9bezt9XS8udGVzdChhKSl0aHJvdyBuZXcgbW9kdWxlJGNvbnRlbnRzJGdvb2ckYXNzZXJ0c19Bc3NlcnRpb25FcnJvcigiVmFsdWUgZG9lcyBub3QgYWxsb3cgW3s7fV0sIGdvdDogJXMuIixbYV0pO3JldHVybiBhfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9zYW5pdGl6ZVByb3BlcnR5VmFsdWVTdHJpbmcoYSl7Y29uc3QgYj1hLnJlcGxhY2UobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfRlVOQ1RJT05TX1JFLCIkMSIpLnJlcGxhY2UobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfRlVOQ1RJT05TX1JFLCIkMSIpLnJlcGxhY2UobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfVVJMX1JFLCJ1cmwiKTtpZihtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9WQUxVRV9SRS50ZXN0KGIpKXtpZihtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9DT01NRU5UX1JFLnRlc3QoYSkpcmV0dXJuKDAsZ29vZy5hc3NlcnRzLmZhaWwpKGBTdHJpbmcgdmFsdWUgZGlzYWxsb3dzIGNvbW1lbnRzLCBnb3Q6ICR7YX1gKSxtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuSU5OT0NVT1VTX1NUUklORzsKaWYoIW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX2hhc0JhbGFuY2VkUXVvdGVzKGEpKXJldHVybigwLGdvb2cuYXNzZXJ0cy5mYWlsKShgU3RyaW5nIHZhbHVlIHJlcXVpcmVzIGJhbGFuY2VkIHF1b3RlcywgZ290OiAke2F9YCksbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlLklOTk9DVU9VU19TVFJJTkc7aWYoIW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX2hhc0JhbGFuY2VkU3F1YXJlQnJhY2tldHMoYSkpcmV0dXJuKDAsZ29vZy5hc3NlcnRzLmZhaWwpKCJTdHJpbmcgdmFsdWUgcmVxdWlyZXMgYmFsYW5jZWQgc3F1YXJlIGJyYWNrZXRzIGFuZCBvbmUgaWRlbnRpZmllciBwZXIgcGFpciBvZiBicmFja2V0cywgZ290OiAiK2EpLG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS5JTk5PQ1VPVVNfU1RSSU5HfWVsc2UgcmV0dXJuKDAsZ29vZy5hc3NlcnRzLmZhaWwpKGBTdHJpbmcgdmFsdWUgYWxsb3dzIG9ubHkgJHttb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9WQUxVRV9BTExPV0VEX0NIQVJTfWArCiIgYW5kIHNpbXBsZSBmdW5jdGlvbnMsIGdvdDogIithKSxtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuSU5OT0NVT1VTX1NUUklORztyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfc2FuaXRpemVVcmwoYSl9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfaGFzQmFsYW5jZWRRdW90ZXMoYSl7bGV0IGI9ITAsYz0hMDtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hLmNoYXJBdChkKTsiJyI9PWUmJmM/Yj0hYjonIic9PWUmJmImJihjPSFjKX1yZXR1cm4gYiYmY30KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfaGFzQmFsYW5jZWRTcXVhcmVCcmFja2V0cyhhKXtsZXQgYj0hMDtjb25zdCBjPS9eWy1fYS16QS1aMC05XSQvO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBlPWEuY2hhckF0KGQpO2lmKCJdIj09ZSl7aWYoYilyZXR1cm4hMTtiPSEwfWVsc2UgaWYoIlsiPT1lKXtpZighYilyZXR1cm4hMTtiPSExfWVsc2UgaWYoIWImJiFjLnRlc3QoZSkpcmV0dXJuITF9cmV0dXJuIGJ9CmNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1ZBTFVFX0FMTE9XRURfQ0hBUlM9IlstLC5cIiclXyEjLyBhLXpBLVowLTlcXFtcXF1dIixtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9WQUxVRV9SRT1uZXcgUmVnRXhwKGBeJHttb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9WQUxVRV9BTExPV0VEX0NIQVJTfStcJGApLG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1VSTF9SRT1SZWdFeHAoIlxcYih1cmxcXChbIFx0XG5dKikoJ1sgLSYoLVxcW1xcXS1+XSonfFwiWyAhIy1cXFtcXF0tfl0qXCJ8WyEjLSYqLVxcW1xcXS1+XSopKFsgXHRcbl0qXFwpKSIsImciKSxtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9BTExPV0VEX0ZVTkNUSU9OUz0iY2FsYyBjdWJpYy1iZXppZXIgZml0LWNvbnRlbnQgaHNsIGhzbGEgbGluZWFyLWdyYWRpZW50IG1hdHJpeCBtaW5tYXggcmFkaWFsLWdyYWRpZW50IHJlcGVhdCByZ2IgcmdiYSAocm90YXRlfHNjYWxlfHRyYW5zbGF0ZSkoWHxZfFp8M2QpPyBzdGVwcyB2YXIiLnNwbGl0KCIgIiksCm1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX0ZVTkNUSU9OU19SRT1uZXcgUmVnRXhwKCJcXGIoIittb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9BTExPV0VEX0ZVTkNUSU9OUy5qb2luKCJ8IikrIilcXChbLSsqLzAtOWEtekEtWi4lI1xcW1xcXSwgXStcXCkiLCJnIiksbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfQ09NTUVOVF9SRT0vXC9cKi87ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfc2FuaXRpemVVcmwoYSl7cmV0dXJuIGEucmVwbGFjZShtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9VUkxfUkUsKGIsYyxkLGUpPT57bGV0IGY9IiI7ZD1kLnJlcGxhY2UoL14oWyciXSkoLiopXDEkLywoZyxoLGspPT57Zj1oO3JldHVybiBrfSk7Yj1nb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZShkKS5nZXRUeXBlZFN0cmluZ1ZhbHVlKCk7cmV0dXJuIGMrZitiK2YrZX0pfQpnb29nLmh0bWwuU2FmZVN0eWxlPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZTtnb29nLm9iamVjdD17fTtmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZm9yRWFjaChhLGIsYyl7Zm9yKGNvbnN0IGQgaW4gYSliLmNhbGwoYyxhW2RdLGQsYSl9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2ZpbHRlcihhLGIsYyl7Y29uc3QgZD17fTtmb3IoY29uc3QgZSBpbiBhKWIuY2FsbChjLGFbZV0sZSxhKSYmKGRbZV09YVtlXSk7cmV0dXJuIGR9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X21hcChhLGIsYyl7Y29uc3QgZD17fTtmb3IoY29uc3QgZSBpbiBhKWRbZV09Yi5jYWxsKGMsYVtlXSxlLGEpO3JldHVybiBkfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9zb21lKGEsYixjKXtmb3IoY29uc3QgZCBpbiBhKWlmKGIuY2FsbChjLGFbZF0sZCxhKSlyZXR1cm4hMDtyZXR1cm4hMX0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2V2ZXJ5KGEsYixjKXtmb3IoY29uc3QgZCBpbiBhKWlmKCFiLmNhbGwoYyxhW2RdLGQsYSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2dldENvdW50KGEpe2xldCBiPTA7Zm9yKGNvbnN0IGMgaW4gYSliKys7cmV0dXJuIGJ9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2dldEFueUtleShhKXtmb3IoY29uc3QgYiBpbiBhKXJldHVybiBifWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRBbnlWYWx1ZShhKXtmb3IoY29uc3QgYiBpbiBhKXJldHVybiBhW2JdfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9jb250YWlucyhhLGIpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY29udGFpbnNWYWx1ZShhLGIpfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZ2V0VmFsdWVzKGEpe2NvbnN0IGI9W107bGV0IGM9MDtmb3IoY29uc3QgZCBpbiBhKWJbYysrXT1hW2RdO3JldHVybiBifWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRLZXlzKGEpe2NvbnN0IGI9W107bGV0IGM9MDtmb3IoY29uc3QgZCBpbiBhKWJbYysrXT1kO3JldHVybiBifWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRWYWx1ZUJ5S2V5cyhhLGIpe3ZhciBjPWdvb2cuaXNBcnJheUxpa2UoYik7Y29uc3QgZD1jP2I6YXJndW1lbnRzO2ZvcihjPWM/MDoxO2M8ZC5sZW5ndGg7YysrKXtpZihudWxsPT1hKXJldHVybjthPWFbZFtjXV19cmV0dXJuIGF9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2NvbnRhaW5zS2V5KGEsYil7cmV0dXJuIG51bGwhPT1hJiZiIGluIGF9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9jb250YWluc1ZhbHVlKGEsYil7Zm9yKGNvbnN0IGMgaW4gYSlpZihhW2NdPT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9maW5kS2V5KGEsYixjKXtmb3IoY29uc3QgZCBpbiBhKWlmKGIuY2FsbChjLGFbZF0sZCxhKSlyZXR1cm4gZH1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZmluZFZhbHVlKGEsYixjKXtyZXR1cm4oYj1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZmluZEtleShhLGIsYykpJiZhW2JdfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9pc0VtcHR5KGEpe2Zvcihjb25zdCBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2NsZWFyKGEpe2Zvcihjb25zdCBiIGluIGEpZGVsZXRlIGFbYl19CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9yZW1vdmUoYSxiKXtsZXQgYzsoYz1iIGluIGEpJiZkZWxldGUgYVtiXTtyZXR1cm4gY31mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfYWRkKGEsYixjKXtpZihudWxsIT09YSYmYiBpbiBhKXRocm93IEVycm9yKGBUaGUgb2JqZWN0IGFscmVhZHkgY29udGFpbnMgdGhlIGtleSAiJHtifSJgKTttb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3Rfc2V0KGEsYixjKX1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZ2V0KGEsYixjKXtyZXR1cm4gbnVsbCE9PWEmJmIgaW4gYT9hW2JdOmN9ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X3NldChhLGIsYyl7YVtiXT1jfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9zZXRJZlVuZGVmaW5lZChhLGIsYyl7cmV0dXJuIGIgaW4gYT9hW2JdOmFbYl09Y30KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X3NldFdpdGhSZXR1cm5WYWx1ZUlmTm90U2V0KGEsYixjKXtpZihiIGluIGEpcmV0dXJuIGFbYl07Yz1jKCk7cmV0dXJuIGFbYl09Y31mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZXF1YWxzKGEsYil7Zm9yKGNvbnN0IGMgaW4gYSlpZighKGMgaW4gYil8fGFbY10hPT1iW2NdKXJldHVybiExO2Zvcihjb25zdCBjIGluIGIpaWYoIShjIGluIGEpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9jbG9uZShhKXtjb25zdCBiPXt9O2Zvcihjb25zdCBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfdW5zYWZlQ2xvbmUoYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhLmNsb25lKXJldHVybiBhLmNsb25lKCk7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgTWFwJiZhIGluc3RhbmNlb2YgTWFwKXJldHVybiBuZXcgTWFwKGEpO2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFNldCYmYSBpbnN0YW5jZW9mIFNldClyZXR1cm4gbmV3IFNldChhKTtpZihhIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUoYS5nZXRUaW1lKCkpO2NvbnN0IGI9QXJyYXkuaXNBcnJheShhKT9bXToiZnVuY3Rpb24iIT09dHlwZW9mIEFycmF5QnVmZmVyfHwiZnVuY3Rpb24iIT09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlld3x8IUFycmF5QnVmZmVyLmlzVmlldyhhKXx8YSBpbnN0YW5jZW9mIERhdGFWaWV3P3t9Om5ldyBhLmNvbnN0cnVjdG9yKGEubGVuZ3RoKTtmb3IoY29uc3QgYyBpbiBhKWJbY109Cm1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF91bnNhZmVDbG9uZShhW2NdKTtyZXR1cm4gYn1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfdHJhbnNwb3NlKGEpe2NvbnN0IGI9e307Zm9yKGNvbnN0IGMgaW4gYSliW2FbY11dPWM7cmV0dXJuIGJ9Y29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X1BST1RPVFlQRV9GSUVMRFM9ImNvbnN0cnVjdG9yIGhhc093blByb3BlcnR5IGlzUHJvdG90eXBlT2YgcHJvcGVydHlJc0VudW1lcmFibGUgdG9Mb2NhbGVTdHJpbmcgdG9TdHJpbmcgdmFsdWVPZiIuc3BsaXQoIiAiKTsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2V4dGVuZChhLGIpe2xldCBjLGQ7Zm9yKGxldCBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7ZD1hcmd1bWVudHNbZV07Zm9yKGMgaW4gZClhW2NdPWRbY107Zm9yKGxldCBmPTA7Zjxtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfUFJPVE9UWVBFX0ZJRUxEUy5sZW5ndGg7ZisrKWM9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X1BST1RPVFlQRV9GSUVMRFNbZl0sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGQsYykmJihhW2NdPWRbY10pfX0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2NyZWF0ZShhKXtjb25zdCBiPWFyZ3VtZW50cy5sZW5ndGg7aWYoMT09YiYmQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMF0pKXJldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY3JlYXRlLmFwcGx5KG51bGwsYXJndW1lbnRzWzBdKTtpZihiJTIpdGhyb3cgRXJyb3IoIlVuZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIik7Y29uc3QgYz17fTtmb3IobGV0IGQ9MDtkPGI7ZCs9MiljW2FyZ3VtZW50c1tkXV09YXJndW1lbnRzW2QrMV07cmV0dXJuIGN9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9jcmVhdGVTZXQoYSl7Y29uc3QgYj1hcmd1bWVudHMubGVuZ3RoO2lmKDE9PWImJkFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2NyZWF0ZVNldC5hcHBseShudWxsLGFyZ3VtZW50c1swXSk7Y29uc3QgYz17fTtmb3IobGV0IGQ9MDtkPGI7ZCsrKWNbYXJndW1lbnRzW2RdXT0hMDtyZXR1cm4gY31mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY3JlYXRlSW1tdXRhYmxlVmlldyhhKXtsZXQgYj1hO09iamVjdC5pc0Zyb3plbiYmIU9iamVjdC5pc0Zyb3plbihhKSYmKGI9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZnJlZXplKGIpKTtyZXR1cm4gYn1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfaXNJbW11dGFibGVWaWV3KGEpe3JldHVybiEhT2JqZWN0LmlzRnJvemVuJiZPYmplY3QuaXNGcm96ZW4oYSl9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRBbGxQcm9wZXJ0eU5hbWVzKGEsYixjKXtpZighYSlyZXR1cm5bXTtpZighT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fCFPYmplY3QuZ2V0UHJvdG90eXBlT2YpcmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRLZXlzKGEpO2NvbnN0IGQ9e307Zm9yKDthJiYoYSE9PU9iamVjdC5wcm90b3R5cGV8fGIpJiYoYSE9PUZ1bmN0aW9uLnByb3RvdHlwZXx8Yyk7KXtjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpO2ZvcihsZXQgZj0wO2Y8ZS5sZW5ndGg7ZisrKWRbZVtmXV09ITA7YT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSl9cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRLZXlzKGQpfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZ2V0U3VwZXJDbGFzcyhhKXtyZXR1cm4oYT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYS5wcm90b3R5cGUpKSYmYS5jb25zdHJ1Y3Rvcn1nb29nLm9iamVjdC5hZGQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2FkZDtnb29nLm9iamVjdC5jbGVhcj1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY2xlYXI7Z29vZy5vYmplY3QuY2xvbmU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2Nsb25lO2dvb2cub2JqZWN0LmNvbnRhaW5zPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9jb250YWlucztnb29nLm9iamVjdC5jb250YWluc0tleT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY29udGFpbnNLZXk7Z29vZy5vYmplY3QuY29udGFpbnNWYWx1ZT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY29udGFpbnNWYWx1ZTtnb29nLm9iamVjdC5jcmVhdGU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2NyZWF0ZTsKZ29vZy5vYmplY3QuY3JlYXRlSW1tdXRhYmxlVmlldz1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfY3JlYXRlSW1tdXRhYmxlVmlldztnb29nLm9iamVjdC5jcmVhdGVTZXQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2NyZWF0ZVNldDtnb29nLm9iamVjdC5lcXVhbHM9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2VxdWFscztnb29nLm9iamVjdC5ldmVyeT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZXZlcnk7Z29vZy5vYmplY3QuZXh0ZW5kPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9leHRlbmQ7Z29vZy5vYmplY3QuZmlsdGVyPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9maWx0ZXI7Z29vZy5vYmplY3QuZmluZEtleT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZmluZEtleTtnb29nLm9iamVjdC5maW5kVmFsdWU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2ZpbmRWYWx1ZTtnb29nLm9iamVjdC5mb3JFYWNoPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9mb3JFYWNoOwpnb29nLm9iamVjdC5nZXQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2dldDtnb29nLm9iamVjdC5nZXRBbGxQcm9wZXJ0eU5hbWVzPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRBbGxQcm9wZXJ0eU5hbWVzO2dvb2cub2JqZWN0LmdldEFueUtleT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZ2V0QW55S2V5O2dvb2cub2JqZWN0LmdldEFueVZhbHVlPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRBbnlWYWx1ZTtnb29nLm9iamVjdC5nZXRDb3VudD1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZ2V0Q291bnQ7Z29vZy5vYmplY3QuZ2V0S2V5cz1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfZ2V0S2V5cztnb29nLm9iamVjdC5nZXRTdXBlckNsYXNzPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRTdXBlckNsYXNzO2dvb2cub2JqZWN0LmdldFZhbHVlQnlLZXlzPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRWYWx1ZUJ5S2V5czsKZ29vZy5vYmplY3QuZ2V0VmFsdWVzPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9nZXRWYWx1ZXM7Z29vZy5vYmplY3QuaXNFbXB0eT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfaXNFbXB0eTtnb29nLm9iamVjdC5pc0ltbXV0YWJsZVZpZXc9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X2lzSW1tdXRhYmxlVmlldztnb29nLm9iamVjdC5tYXA9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X21hcDtnb29nLm9iamVjdC5yZW1vdmU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X3JlbW92ZTtnb29nLm9iamVjdC5zZXQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X3NldDtnb29nLm9iamVjdC5zZXRJZlVuZGVmaW5lZD1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3Rfc2V0SWZVbmRlZmluZWQ7Z29vZy5vYmplY3Quc2V0V2l0aFJldHVyblZhbHVlSWZOb3RTZXQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckb2JqZWN0X3NldFdpdGhSZXR1cm5WYWx1ZUlmTm90U2V0Owpnb29nLm9iamVjdC5zb21lPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9zb21lO2dvb2cub2JqZWN0LnRyYW5zcG9zZT1tb2R1bGUkY29udGVudHMkZ29vZyRvYmplY3RfdHJhbnNwb3NlO2dvb2cub2JqZWN0LnVuc2FmZUNsb25lPW1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF91bnNhZmVDbG9uZTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZVNoZWV0X0NPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEU9e307CmNsYXNzIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXR7Y29uc3RydWN0b3IoYSxiKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlXz1iPT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVTaGVldF9DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFP2E6IiI7dGhpcy5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlU2hlZXRXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9c3RhdGljIGNyZWF0ZVJ1bGUoYSxiKXtpZigoMCxnb29nLnN0cmluZy5pbnRlcm5hbC5jb250YWlucykoYSwiPCIpKXRocm93IEVycm9yKGBTZWxlY3RvciBkb2VzIG5vdCBhbGxvdyAnPCcsIGdvdDogJHthfWApO2NvbnN0IGM9YS5yZXBsYWNlKC8oJ3wiKSgoPyFcMSlbXlxyXG5cZlxcXXxcXFtcc1xTXSkqXDEvZywKIiIpO2lmKCEvXlstX2EtekEtWjAtOSMuOiogLD4rfltcXSgpPV4kfF0rJC8udGVzdChjKSl0aHJvdyBFcnJvcigiU2VsZWN0b3IgYWxsb3dzIG9ubHkgWy1fYS16QS1aMC05Iy46KiAsPit+W1xcXSgpPV4kfF0gYW5kIHN0cmluZ3MsIGdvdDogIithKTtpZighbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVTaGVldF9TYWZlU3R5bGVTaGVldC5oYXNCYWxhbmNlZEJyYWNrZXRzXyhjKSl0aHJvdyBFcnJvcigiKCkgYW5kIFtdIGluIHNlbGVjdG9yIG11c3QgYmUgYmFsYW5jZWQsIGdvdDogIithKTtiIGluc3RhbmNlb2YgbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlfHwoYj1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZV9TYWZlU3R5bGUuY3JlYXRlKGIpKTthPWAke2F9e2ArbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlLnVud3JhcChiKS5yZXBsYWNlKC88L2csIlxcM0MgIikrIn0iOwpyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVTaGVldF9TYWZlU3R5bGVTaGVldC5jcmVhdGVTYWZlU3R5bGVTaGVldFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpfXN0YXRpYyBoYXNCYWxhbmNlZEJyYWNrZXRzXyhhKXtjb25zdCBiPXsiKCI6IikiLCJbIjoiXSJ9LGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspe2NvbnN0IGU9YVtkXTtpZihiW2VdKWMucHVzaChiW2VdKTtlbHNlIGlmKG1vZHVsZSRjb250ZW50cyRnb29nJG9iamVjdF9jb250YWlucyhiLGUpJiZjLnBvcCgpIT1lKXJldHVybiExfXJldHVybiAwPT1jLmxlbmd0aH1zdGF0aWMgY29uY2F0KGEpe2xldCBiPSIiO2NvbnN0IGM9ZD0+e0FycmF5LmlzQXJyYXkoZCk/ZC5mb3JFYWNoKGMpOmIrPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQudW53cmFwKGQpfTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGFyZ3VtZW50cywKYyk7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX1zdGF0aWMgZnJvbUNvbnN0YW50KGEpe2E9Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVTaGVldF9TYWZlU3R5bGVTaGVldC5FTVBUWTsoMCxnb29nLmFzc2VydHMuYXNzZXJ0KSghKDAsZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29udGFpbnMpKGEsIjwiKSxgRm9yYmlkZGVuICc8JyBjaGFyYWN0ZXIgaW4gc3R5bGUgc2hlZXQgc3RyaW5nOiAke2F9YCk7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKX1nZXRUeXBlZFN0cmluZ1ZhbHVlKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlU2hlZXRXcmFwcGVkVmFsdWVffXN0YXRpYyB1bndyYXAoYSl7aWYoYSBpbnN0YW5jZW9mCm1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQmJmEuY29uc3RydWN0b3I9PT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZVNoZWV0X1NhZmVTdHlsZVNoZWV0KXJldHVybiBhLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlXzsoMCxnb29nLmFzc2VydHMuZmFpbCkoImV4cGVjdGVkIG9iamVjdCBvZiB0eXBlIFNhZmVTdHlsZVNoZWV0LCBnb3QgJyIrYSsiJyBvZiB0eXBlICIrZ29vZy50eXBlT2YoYSkpO3JldHVybiJ0eXBlX2Vycm9yOlNhZmVTdHlsZVNoZWV0In1zdGF0aWMgY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhKXtyZXR1cm4gbmV3IG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQoYSxtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZVNoZWV0X0NPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEUpfX0KbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVTaGVldF9TYWZlU3R5bGVTaGVldC5FTVBUWT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZVNoZWV0X1NhZmVTdHlsZVNoZWV0LmNyZWF0ZVNhZmVTdHlsZVNoZWV0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoIiIpO2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldD1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVTdHlsZVNoZWV0X1NhZmVTdHlsZVNoZWV0O2dvb2cuZG9tLkh0bWxFbGVtZW50PWZ1bmN0aW9uKCl7fTtnb29nLmRvbS5UYWdOYW1lPWNsYXNze3N0YXRpYyBjYXN0KGEsYil7cmV0dXJuIGF9Y29uc3RydWN0b3IoKXt9dG9TdHJpbmcoKXt9fTtnb29nLmRvbS5UYWdOYW1lLkE9IkEiO2dvb2cuZG9tLlRhZ05hbWUuQUJCUj0iQUJCUiI7Z29vZy5kb20uVGFnTmFtZS5BQ1JPTllNPSJBQ1JPTllNIjtnb29nLmRvbS5UYWdOYW1lLkFERFJFU1M9IkFERFJFU1MiO2dvb2cuZG9tLlRhZ05hbWUuQVBQTEVUPSJBUFBMRVQiO2dvb2cuZG9tLlRhZ05hbWUuQVJFQT0iQVJFQSI7Z29vZy5kb20uVGFnTmFtZS5BUlRJQ0xFPSJBUlRJQ0xFIjtnb29nLmRvbS5UYWdOYW1lLkFTSURFPSJBU0lERSI7Z29vZy5kb20uVGFnTmFtZS5BVURJTz0iQVVESU8iO2dvb2cuZG9tLlRhZ05hbWUuQj0iQiI7Z29vZy5kb20uVGFnTmFtZS5CQVNFPSJCQVNFIjtnb29nLmRvbS5UYWdOYW1lLkJBU0VGT05UPSJCQVNFRk9OVCI7Z29vZy5kb20uVGFnTmFtZS5CREk9IkJESSI7Z29vZy5kb20uVGFnTmFtZS5CRE89IkJETyI7Cmdvb2cuZG9tLlRhZ05hbWUuQklHPSJCSUciO2dvb2cuZG9tLlRhZ05hbWUuQkxPQ0tRVU9URT0iQkxPQ0tRVU9URSI7Z29vZy5kb20uVGFnTmFtZS5CT0RZPSJCT0RZIjtnb29nLmRvbS5UYWdOYW1lLkJSPSJCUiI7Z29vZy5kb20uVGFnTmFtZS5CVVRUT049IkJVVFRPTiI7Z29vZy5kb20uVGFnTmFtZS5DQU5WQVM9IkNBTlZBUyI7Z29vZy5kb20uVGFnTmFtZS5DQVBUSU9OPSJDQVBUSU9OIjtnb29nLmRvbS5UYWdOYW1lLkNFTlRFUj0iQ0VOVEVSIjtnb29nLmRvbS5UYWdOYW1lLkNJVEU9IkNJVEUiO2dvb2cuZG9tLlRhZ05hbWUuQ09ERT0iQ09ERSI7Z29vZy5kb20uVGFnTmFtZS5DT0w9IkNPTCI7Z29vZy5kb20uVGFnTmFtZS5DT0xHUk9VUD0iQ09MR1JPVVAiO2dvb2cuZG9tLlRhZ05hbWUuQ09NTUFORD0iQ09NTUFORCI7Z29vZy5kb20uVGFnTmFtZS5EQVRBPSJEQVRBIjtnb29nLmRvbS5UYWdOYW1lLkRBVEFMSVNUPSJEQVRBTElTVCI7Z29vZy5kb20uVGFnTmFtZS5ERD0iREQiOwpnb29nLmRvbS5UYWdOYW1lLkRFTD0iREVMIjtnb29nLmRvbS5UYWdOYW1lLkRFVEFJTFM9IkRFVEFJTFMiO2dvb2cuZG9tLlRhZ05hbWUuREZOPSJERk4iO2dvb2cuZG9tLlRhZ05hbWUuRElBTE9HPSJESUFMT0ciO2dvb2cuZG9tLlRhZ05hbWUuRElSPSJESVIiO2dvb2cuZG9tLlRhZ05hbWUuRElWPSJESVYiO2dvb2cuZG9tLlRhZ05hbWUuREw9IkRMIjtnb29nLmRvbS5UYWdOYW1lLkRUPSJEVCI7Z29vZy5kb20uVGFnTmFtZS5FTT0iRU0iO2dvb2cuZG9tLlRhZ05hbWUuRU1CRUQ9IkVNQkVEIjtnb29nLmRvbS5UYWdOYW1lLkZJRUxEU0VUPSJGSUVMRFNFVCI7Z29vZy5kb20uVGFnTmFtZS5GSUdDQVBUSU9OPSJGSUdDQVBUSU9OIjtnb29nLmRvbS5UYWdOYW1lLkZJR1VSRT0iRklHVVJFIjtnb29nLmRvbS5UYWdOYW1lLkZPTlQ9IkZPTlQiO2dvb2cuZG9tLlRhZ05hbWUuRk9PVEVSPSJGT09URVIiO2dvb2cuZG9tLlRhZ05hbWUuRk9STT0iRk9STSI7Cmdvb2cuZG9tLlRhZ05hbWUuRlJBTUU9IkZSQU1FIjtnb29nLmRvbS5UYWdOYW1lLkZSQU1FU0VUPSJGUkFNRVNFVCI7Z29vZy5kb20uVGFnTmFtZS5IMT0iSDEiO2dvb2cuZG9tLlRhZ05hbWUuSDI9IkgyIjtnb29nLmRvbS5UYWdOYW1lLkgzPSJIMyI7Z29vZy5kb20uVGFnTmFtZS5IND0iSDQiO2dvb2cuZG9tLlRhZ05hbWUuSDU9Ikg1Ijtnb29nLmRvbS5UYWdOYW1lLkg2PSJINiI7Z29vZy5kb20uVGFnTmFtZS5IRUFEPSJIRUFEIjtnb29nLmRvbS5UYWdOYW1lLkhFQURFUj0iSEVBREVSIjtnb29nLmRvbS5UYWdOYW1lLkhHUk9VUD0iSEdST1VQIjtnb29nLmRvbS5UYWdOYW1lLkhSPSJIUiI7Z29vZy5kb20uVGFnTmFtZS5IVE1MPSJIVE1MIjtnb29nLmRvbS5UYWdOYW1lLkk9IkkiO2dvb2cuZG9tLlRhZ05hbWUuSUZSQU1FPSJJRlJBTUUiO2dvb2cuZG9tLlRhZ05hbWUuSU1HPSJJTUciO2dvb2cuZG9tLlRhZ05hbWUuSU5QVVQ9IklOUFVUIjsKZ29vZy5kb20uVGFnTmFtZS5JTlM9IklOUyI7Z29vZy5kb20uVGFnTmFtZS5JU0lOREVYPSJJU0lOREVYIjtnb29nLmRvbS5UYWdOYW1lLktCRD0iS0JEIjtnb29nLmRvbS5UYWdOYW1lLktFWUdFTj0iS0VZR0VOIjtnb29nLmRvbS5UYWdOYW1lLkxBQkVMPSJMQUJFTCI7Z29vZy5kb20uVGFnTmFtZS5MRUdFTkQ9IkxFR0VORCI7Z29vZy5kb20uVGFnTmFtZS5MST0iTEkiO2dvb2cuZG9tLlRhZ05hbWUuTElOSz0iTElOSyI7Z29vZy5kb20uVGFnTmFtZS5NQUlOPSJNQUlOIjtnb29nLmRvbS5UYWdOYW1lLk1BUD0iTUFQIjtnb29nLmRvbS5UYWdOYW1lLk1BUks9Ik1BUksiO2dvb2cuZG9tLlRhZ05hbWUuTUFUSD0iTUFUSCI7Z29vZy5kb20uVGFnTmFtZS5NRU5VPSJNRU5VIjtnb29nLmRvbS5UYWdOYW1lLk1FTlVJVEVNPSJNRU5VSVRFTSI7Z29vZy5kb20uVGFnTmFtZS5NRVRBPSJNRVRBIjtnb29nLmRvbS5UYWdOYW1lLk1FVEVSPSJNRVRFUiI7Cmdvb2cuZG9tLlRhZ05hbWUuTkFWPSJOQVYiO2dvb2cuZG9tLlRhZ05hbWUuTk9GUkFNRVM9Ik5PRlJBTUVTIjtnb29nLmRvbS5UYWdOYW1lLk5PU0NSSVBUPSJOT1NDUklQVCI7Z29vZy5kb20uVGFnTmFtZS5PQkpFQ1Q9Ik9CSkVDVCI7Z29vZy5kb20uVGFnTmFtZS5PTD0iT0wiO2dvb2cuZG9tLlRhZ05hbWUuT1BUR1JPVVA9Ik9QVEdST1VQIjtnb29nLmRvbS5UYWdOYW1lLk9QVElPTj0iT1BUSU9OIjtnb29nLmRvbS5UYWdOYW1lLk9VVFBVVD0iT1VUUFVUIjtnb29nLmRvbS5UYWdOYW1lLlA9IlAiO2dvb2cuZG9tLlRhZ05hbWUuUEFSQU09IlBBUkFNIjtnb29nLmRvbS5UYWdOYW1lLlBJQ1RVUkU9IlBJQ1RVUkUiO2dvb2cuZG9tLlRhZ05hbWUuUFJFPSJQUkUiO2dvb2cuZG9tLlRhZ05hbWUuUFJPR1JFU1M9IlBST0dSRVNTIjtnb29nLmRvbS5UYWdOYW1lLlE9IlEiO2dvb2cuZG9tLlRhZ05hbWUuUlA9IlJQIjtnb29nLmRvbS5UYWdOYW1lLlJUPSJSVCI7Cmdvb2cuZG9tLlRhZ05hbWUuUlRDPSJSVEMiO2dvb2cuZG9tLlRhZ05hbWUuUlVCWT0iUlVCWSI7Z29vZy5kb20uVGFnTmFtZS5TPSJTIjtnb29nLmRvbS5UYWdOYW1lLlNBTVA9IlNBTVAiO2dvb2cuZG9tLlRhZ05hbWUuU0NSSVBUPSJTQ1JJUFQiO2dvb2cuZG9tLlRhZ05hbWUuU0VDVElPTj0iU0VDVElPTiI7Z29vZy5kb20uVGFnTmFtZS5TRUxFQ1Q9IlNFTEVDVCI7Z29vZy5kb20uVGFnTmFtZS5TTUFMTD0iU01BTEwiO2dvb2cuZG9tLlRhZ05hbWUuU09VUkNFPSJTT1VSQ0UiO2dvb2cuZG9tLlRhZ05hbWUuU1BBTj0iU1BBTiI7Z29vZy5kb20uVGFnTmFtZS5TVFJJS0U9IlNUUklLRSI7Z29vZy5kb20uVGFnTmFtZS5TVFJPTkc9IlNUUk9ORyI7Z29vZy5kb20uVGFnTmFtZS5TVFlMRT0iU1RZTEUiO2dvb2cuZG9tLlRhZ05hbWUuU1VCPSJTVUIiO2dvb2cuZG9tLlRhZ05hbWUuU1VNTUFSWT0iU1VNTUFSWSI7Z29vZy5kb20uVGFnTmFtZS5TVVA9IlNVUCI7Cmdvb2cuZG9tLlRhZ05hbWUuU1ZHPSJTVkciO2dvb2cuZG9tLlRhZ05hbWUuVEFCTEU9IlRBQkxFIjtnb29nLmRvbS5UYWdOYW1lLlRCT0RZPSJUQk9EWSI7Z29vZy5kb20uVGFnTmFtZS5URD0iVEQiO2dvb2cuZG9tLlRhZ05hbWUuVEVNUExBVEU9IlRFTVBMQVRFIjtnb29nLmRvbS5UYWdOYW1lLlRFWFRBUkVBPSJURVhUQVJFQSI7Z29vZy5kb20uVGFnTmFtZS5URk9PVD0iVEZPT1QiO2dvb2cuZG9tLlRhZ05hbWUuVEg9IlRIIjtnb29nLmRvbS5UYWdOYW1lLlRIRUFEPSJUSEVBRCI7Z29vZy5kb20uVGFnTmFtZS5USU1FPSJUSU1FIjtnb29nLmRvbS5UYWdOYW1lLlRJVExFPSJUSVRMRSI7Z29vZy5kb20uVGFnTmFtZS5UUj0iVFIiO2dvb2cuZG9tLlRhZ05hbWUuVFJBQ0s9IlRSQUNLIjtnb29nLmRvbS5UYWdOYW1lLlRUPSJUVCI7Z29vZy5kb20uVGFnTmFtZS5VPSJVIjtnb29nLmRvbS5UYWdOYW1lLlVMPSJVTCI7Z29vZy5kb20uVGFnTmFtZS5WQVI9IlZBUiI7Cmdvb2cuZG9tLlRhZ05hbWUuVklERU89IlZJREVPIjtnb29nLmRvbS5UYWdOYW1lLldCUj0iV0JSIjtnb29nLmxhYnM9e307Z29vZy5sYWJzLnVzZXJBZ2VudD17fTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudF9VU0VfQ0xJRU5UX0hJTlRTX09WRVJSSURFPSIiLG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50X1VTRV9DTElFTlRfSElOVFM9ITE7bGV0IG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50X2ZvcmNlQ2xpZW50SGludHNJblRlc3RzPSExO2dvb2cubGFicy51c2VyQWdlbnQuc2V0VXNlQ2xpZW50SGludHNGb3JUZXN0aW5nPWE9Pnttb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudF9mb3JjZUNsaWVudEhpbnRzSW5UZXN0cz1hfTsKY29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnRfdXNlQ2xpZW50SGludHNSdW50aW1lT3ZlcnJpZGU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnRfVVNFX0NMSUVOVF9ISU5UU19PVkVSUklERT8hIWdvb2cuZ2V0T2JqZWN0QnlOYW1lKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50X1VTRV9DTElFTlRfSElOVFNfT1ZFUlJJREUpOiExO2dvb2cubGFicy51c2VyQWdlbnQudXNlQ2xpZW50SGludHM9KCk9Pm1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50X1VTRV9DTElFTlRfSElOVFN8fG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50X3VzZUNsaWVudEhpbnRzUnVudGltZU92ZXJyaWRlfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudF9mb3JjZUNsaWVudEhpbnRzSW5UZXN0cztnb29nLmxhYnMudXNlckFnZW50LnV0aWw9e307Y29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9BU1NVTUVfQ0xJRU5UX0hJTlRTX1NVUFBPUlQ9ITE7ZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9nZXROYXRpdmVVc2VyQWdlbnRTdHJpbmcoKXt2YXIgYT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldE5hdmlnYXRvcigpO3JldHVybiBhJiYoYT1hLnVzZXJBZ2VudCk/YToiIn1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldE5hdGl2ZVVzZXJBZ2VudERhdGEoKXtjb25zdCBhPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0TmF2aWdhdG9yKCk7cmV0dXJuIGE/YS51c2VyQWdlbnREYXRhfHxudWxsOm51bGx9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0TmF2aWdhdG9yKCl7cmV0dXJuIGdvb2cuZ2xvYmFsLm5hdmlnYXRvcn1sZXQgbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF91c2VyQWdlbnRJbnRlcm5hbD1udWxsLG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfdXNlckFnZW50RGF0YUludGVybmFsPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0TmF0aXZlVXNlckFnZW50RGF0YSgpOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX3NldFVzZXJBZ2VudChhKXttb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX3VzZXJBZ2VudEludGVybmFsPSJzdHJpbmciPT09dHlwZW9mIGE/YTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldE5hdGl2ZVVzZXJBZ2VudFN0cmluZygpfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50KCl7cmV0dXJuIG51bGw9PW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfdXNlckFnZW50SW50ZXJuYWw/bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9nZXROYXRpdmVVc2VyQWdlbnRTdHJpbmcoKTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX3VzZXJBZ2VudEludGVybmFsfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX3NldFVzZXJBZ2VudERhdGEoYSl7bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF91c2VyQWdlbnREYXRhSW50ZXJuYWw9YX1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX3Jlc2V0VXNlckFnZW50RGF0YSgpe21vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfdXNlckFnZW50RGF0YUludGVybmFsPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0TmF0aXZlVXNlckFnZW50RGF0YSgpfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50RGF0YSgpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX3VzZXJBZ2VudERhdGFJbnRlcm5hbH0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudERhdGFCcmFuZChhKXtpZighKDAsZ29vZy5sYWJzLnVzZXJBZ2VudC51c2VDbGllbnRIaW50cykoKSlyZXR1cm4hMTtjb25zdCBiPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50RGF0YSgpO3JldHVybiBiP2IuYnJhbmRzLnNvbWUoKHticmFuZDpjfSk9PmMmJigwLGdvb2cuc3RyaW5nLmludGVybmFsLmNvbnRhaW5zKShjLGEpKTohMX1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KGEpe2NvbnN0IGI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9nZXRVc2VyQWdlbnQoKTtyZXR1cm4oMCxnb29nLnN0cmluZy5pbnRlcm5hbC5jb250YWlucykoYixhKX0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudElnbm9yZUNhc2UoYSl7Y29uc3QgYj1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldFVzZXJBZ2VudCgpO3JldHVybigwLGdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbnRhaW5zKShiLGEpfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZXh0cmFjdFZlcnNpb25UdXBsZXMoYSl7Y29uc3QgYj1SZWdFeHAoIihbQS1aXVtcXHcgXSspLyhbXlxcc10rKVxccyooPzpcXCgoLio/KVxcKSk/IiwiZyIpLGM9W107bGV0IGQ7Zm9yKDtkPWIuZXhlYyhhKTspYy5wdXNoKFtkWzFdLGRbMl0sZFszXXx8dm9pZCAwXSk7cmV0dXJuIGN9Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLkFTU1VNRV9DTElFTlRfSElOVFNfU1VQUE9SVD1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX0FTU1VNRV9DTElFTlRfSElOVFNfU1VQUE9SVDsKZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmV4dHJhY3RWZXJzaW9uVHVwbGVzPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZXh0cmFjdFZlcnNpb25UdXBsZXM7Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLmdldE5hdGl2ZVVzZXJBZ2VudFN0cmluZz1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldE5hdGl2ZVVzZXJBZ2VudFN0cmluZztnb29nLmxhYnMudXNlckFnZW50LnV0aWwuZ2V0VXNlckFnZW50PW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50O2dvb2cubGFicy51c2VyQWdlbnQudXRpbC5nZXRVc2VyQWdlbnREYXRhPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50RGF0YTtnb29nLmxhYnMudXNlckFnZW50LnV0aWwubWF0Y2hVc2VyQWdlbnQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudDsKZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50RGF0YUJyYW5kPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnREYXRhQnJhbmQ7Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLm1hdGNoVXNlckFnZW50SWdub3JlQ2FzZT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50SWdub3JlQ2FzZTtnb29nLmxhYnMudXNlckFnZW50LnV0aWwucmVzZXRVc2VyQWdlbnREYXRhPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfcmVzZXRVc2VyQWdlbnREYXRhO2dvb2cubGFicy51c2VyQWdlbnQudXRpbC5zZXRVc2VyQWdlbnQ9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9zZXRVc2VyQWdlbnQ7Z29vZy5sYWJzLnVzZXJBZ2VudC51dGlsLnNldFVzZXJBZ2VudERhdGE9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9zZXRVc2VyQWdlbnREYXRhO3ZhciBtb2R1bGUkZXhwb3J0cyRnb29nJGxhYnMkdXNlckFnZW50JGhpZ2hFbnRyb3B5JGhpZ2hFbnRyb3B5VmFsdWU9e0FzeW5jVmFsdWU6Y2xhc3N7Z2V0SWZMb2FkZWQoKXt9bG9hZCgpe319LEhpZ2hFbnRyb3B5VmFsdWU6Y2xhc3N7Y29uc3RydWN0b3IoYSl7dGhpcy5rZXlfPWE7dGhpcy5wcm9taXNlXz10aGlzLnZhbHVlXz12b2lkIDA7dGhpcy5wZW5kaW5nXz0hMX1nZXRJZkxvYWRlZCgpe2lmKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50RGF0YSgpKXJldHVybiB0aGlzLnZhbHVlX31hc3luYyBsb2FkKCl7Y29uc3QgYT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldFVzZXJBZ2VudERhdGEoKTtpZihhKXJldHVybiB0aGlzLnByb21pc2VffHwodGhpcy5wZW5kaW5nXz0hMCx0aGlzLnByb21pc2VfPShhc3luYygpPT57dHJ5e3JldHVybiB0aGlzLnZhbHVlXz0oYXdhaXQgYS5nZXRIaWdoRW50cm9weVZhbHVlcyhbdGhpcy5rZXlfXSkpW3RoaXMua2V5X119ZmluYWxseXt0aGlzLnBlbmRpbmdfPQohMX19KSgpKSxhd2FpdCB0aGlzLnByb21pc2VffXJlc2V0Rm9yVGVzdGluZygpe2lmKHRoaXMucGVuZGluZ18pdGhyb3cgRXJyb3IoIlVuc2FmZSBjYWxsIHRvIHJlc2V0Rm9yVGVzdGluZyIpO3RoaXMudmFsdWVfPXRoaXMucHJvbWlzZV89dm9pZCAwO3RoaXMucGVuZGluZ189ITF9fSxWZXJzaW9uOmNsYXNze2NvbnN0cnVjdG9yKGEpe3RoaXMudmVyc2lvblN0cmluZ189YX10b1ZlcnNpb25TdHJpbmdGb3JMb2dnaW5nKCl7cmV0dXJuIHRoaXMudmVyc2lvblN0cmluZ199aXNBdExlYXN0KGEpe3JldHVybiAwPD0oMCxnb29nLnN0cmluZy5pbnRlcm5hbC5jb21wYXJlVmVyc2lvbnMpKHRoaXMudmVyc2lvblN0cmluZ18sYSl9fX07dmFyIG1vZHVsZSRleHBvcnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkaGlnaEVudHJvcHkkaGlnaEVudHJvcHlEYXRhPXt9O21vZHVsZSRleHBvcnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkaGlnaEVudHJvcHkkaGlnaEVudHJvcHlEYXRhLmZ1bGxWZXJzaW9uTGlzdD1uZXcgbW9kdWxlJGV4cG9ydHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRoaWdoRW50cm9weSRoaWdoRW50cm9weVZhbHVlLkhpZ2hFbnRyb3B5VmFsdWUoImZ1bGxWZXJzaW9uTGlzdCIpO21vZHVsZSRleHBvcnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkaGlnaEVudHJvcHkkaGlnaEVudHJvcHlEYXRhLnBsYXRmb3JtVmVyc2lvbj1uZXcgbW9kdWxlJGV4cG9ydHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRoaWdoRW50cm9weSRoaWdoRW50cm9weVZhbHVlLkhpZ2hFbnRyb3B5VmFsdWUoInBsYXRmb3JtVmVyc2lvbiIpO2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlcj17fTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX0JyYW5kPXtBTkRST0lEX0JST1dTRVI6IkFuZHJvaWQgQnJvd3NlciIsQ0hST01JVU06IkNocm9taXVtIixFREdFOiJNaWNyb3NvZnQgRWRnZSIsRklSRUZPWDoiRmlyZWZveCIsSUU6IkludGVybmV0IEV4cGxvcmVyIixPUEVSQToiT3BlcmEiLFNBRkFSSToiU2FmYXJpIixTSUxLOiJTaWxrIn07Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLkJyYW5kPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfQnJhbmQ7CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfdXNlVXNlckFnZW50RGF0YUJyYW5kKGE9ITEpe2lmKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfQVNTVU1FX0NMSUVOVF9ISU5UU19TVVBQT1JUKXJldHVybiEwO2lmKCFhJiYhKDAsZ29vZy5sYWJzLnVzZXJBZ2VudC51c2VDbGllbnRIaW50cykoKSlyZXR1cm4hMTthPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50RGF0YSgpO3JldHVybiEhYSYmMDxhLmJyYW5kcy5sZW5ndGh9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaGFzRnVsbFZlcnNpb25MaXN0KCl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNBdExlYXN0KG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfQnJhbmQuQ0hST01JVU0sOTgpfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hPcGVyYSgpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCgpPyExOm1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoIk9wZXJhIil9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hJRSgpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCgpPyExOm1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoIlRyaWRlbnQiKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudCgiTVNJRSIpfWZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hFZGdlSHRtbCgpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCgpPyExOm1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoIkVkZ2UiKX0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEVkZ2VDaHJvbWl1bSgpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCgpP21vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnREYXRhQnJhbmQobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9CcmFuZC5FREdFKTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KCJFZGcvIil9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hPcGVyYUNocm9taXVtKCl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfdXNlVXNlckFnZW50RGF0YUJyYW5kKCk/bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudERhdGFCcmFuZChtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX0JyYW5kLk9QRVJBKTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KCJPUFIiKX0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEZpcmVmb3goKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudCgiRmlyZWZveCIpfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KCJGeGlPUyIpfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoU2FmYXJpKCl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoIlNhZmFyaSIpJiYhKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hDaHJvbWUoKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaENvYXN0KCl8fG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hPcGVyYSgpfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoRWRnZUh0bWwoKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEVkZ2VDaHJvbWl1bSgpfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoT3BlcmFDaHJvbWl1bSgpfHwKbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEZpcmVmb3goKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9pc1NpbGsoKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudCgiQW5kcm9pZCIpKX1mdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoQ29hc3QoKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl91c2VVc2VyQWdlbnREYXRhQnJhbmQoKT8hMTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KCJDb2FzdCIpfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoSW9zV2Vidmlldygpe3JldHVybihtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KCJpUGFkIil8fG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoImlQaG9uZSIpKSYmIW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hTYWZhcmkoKSYmIW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hDaHJvbWUoKSYmIW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hDb2FzdCgpJiYhbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEZpcmVmb3goKSYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudCgiQXBwbGVXZWJLaXQiKX0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaENocm9tZSgpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCgpP21vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnREYXRhQnJhbmQobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9CcmFuZC5DSFJPTUlVTSk6KG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoIkNocm9tZSIpfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX21hdGNoVXNlckFnZW50KCJDcmlPUyIpKSYmIW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hFZGdlSHRtbCgpfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzU2lsaygpfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoQW5kcm9pZEJyb3dzZXIoKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9tYXRjaFVzZXJBZ2VudCgiQW5kcm9pZCIpJiYhKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hDaHJvbWUoKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEZpcmVmb3goKXx8bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaE9wZXJhKCl8fG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNTaWxrKCkpfWNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNPcGVyYT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoT3BlcmE7Cmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc09wZXJhPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hPcGVyYTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzSUU9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaElFO2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5pc0lFPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hJRTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzRWRnZT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoRWRnZUh0bWw7Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzRWRnZT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoRWRnZUh0bWw7CmNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNFZGdlQ2hyb21pdW09bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEVkZ2VDaHJvbWl1bTtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNFZGdlQ2hyb21pdW09bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEVkZ2VDaHJvbWl1bTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzT3BlcmFDaHJvbWl1bT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoT3BlcmFDaHJvbWl1bTtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNPcGVyYUNocm9taXVtPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hPcGVyYUNocm9taXVtOwpjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzRmlyZWZveD1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoRmlyZWZveDtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNGaXJlZm94PW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hGaXJlZm94O2NvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNTYWZhcmk9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaFNhZmFyaTtnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNTYWZhcmk9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaFNhZmFyaTtjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzQ29hc3Q9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaENvYXN0Owpnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNDb2FzdD1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoQ29hc3Q7Y29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9pc0lvc1dlYnZpZXc9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaElvc1dlYnZpZXc7Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzSW9zV2Vidmlldz1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoSW9zV2Vidmlldztjb25zdCBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzQ2hyb21lPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hDaHJvbWU7Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQ2hyb21lPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hDaHJvbWU7CmNvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNBbmRyb2lkQnJvd3Nlcj1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoQW5kcm9pZEJyb3dzZXI7Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQW5kcm9pZEJyb3dzZXI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEFuZHJvaWRCcm93c2VyO2Z1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNTaWxrKCl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfbWF0Y2hVc2VyQWdlbnQoIlNpbGsiKX1nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNTaWxrPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNTaWxrOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2NyZWF0ZVZlcnNpb25NYXAoYSl7Y29uc3QgYj17fTthLmZvckVhY2goYz0+e2JbY1swXV09Y1sxXX0pO3JldHVybiBjPT5iW2MuZmluZChkPT5kIGluIGIpXXx8IiJ9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfZ2V0VmVyc2lvbigpe3ZhciBhPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50KCk7aWYobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaElFKCkpcmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfZ2V0SUVWZXJzaW9uKGEpO2E9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9leHRyYWN0VmVyc2lvblR1cGxlcyhhKTtjb25zdCBiPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfY3JlYXRlVmVyc2lvbk1hcChhKTtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaE9wZXJhKCk/YihbIlZlcnNpb24iLCJPcGVyYSJdKTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoRWRnZUh0bWwoKT8KYihbIkVkZ2UiXSk6bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEVkZ2VDaHJvbWl1bSgpP2IoWyJFZGciXSk6bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9pc1NpbGsoKT9iKFsiU2lsayJdKTptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoQ2hyb21lKCk/YihbIkNocm9tZSIsIkNyaU9TIiwiSGVhZGxlc3NDaHJvbWUiXSk6KGE9YVsyXSkmJmFbMV18fCIifWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5nZXRWZXJzaW9uPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfZ2V0VmVyc2lvbjsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9pc1ZlcnNpb25PckhpZ2hlcihhKXtyZXR1cm4gMDw9KDAsZ29vZy5zdHJpbmcuaW50ZXJuYWwuY29tcGFyZVZlcnNpb25zKShtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2dldFZlcnNpb24oKSxhKX1nb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXIuaXNWZXJzaW9uT3JIaWdoZXI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9pc1ZlcnNpb25PckhpZ2hlcjsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9nZXRJRVZlcnNpb24oYSl7dmFyIGI9L3J2OiAqKFtcZFwuXSopLy5leGVjKGEpO2lmKGImJmJbMV0pcmV0dXJuIGJbMV07Yj0iIjtjb25zdCBjPS9NU0lFICsoW1xkXC5dKykvLmV4ZWMoYSk7aWYoYyYmY1sxXSlpZihhPS9UcmlkZW50XC8oXGQuXGQpLy5leGVjKGEpLCI3LjAiPT1jWzFdKWlmKGEmJmFbMV0pc3dpdGNoKGFbMV0pe2Nhc2UgIjQuMCI6Yj0iOC4wIjticmVhaztjYXNlICI1LjAiOmI9IjkuMCI7YnJlYWs7Y2FzZSAiNi4wIjpiPSIxMC4wIjticmVhaztjYXNlICI3LjAiOmI9IjExLjAifWVsc2UgYj0iNy4wIjtlbHNlIGI9Y1sxXTtyZXR1cm4gYn0KZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9nZXRGdWxsVmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoYSl7dmFyIGI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkdXRpbF9nZXRVc2VyQWdlbnQoKTtpZihhPT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9CcmFuZC5JRSlyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaElFKCk/bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9nZXRJRVZlcnNpb24oYik6IiI7Yj1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2V4dHJhY3RWZXJzaW9uVHVwbGVzKGIpO2NvbnN0IGM9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9jcmVhdGVWZXJzaW9uTWFwKGIpO3N3aXRjaChhKXtjYXNlIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfQnJhbmQuT1BFUkE6aWYobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaE9wZXJhKCkpcmV0dXJuIGMoWyJWZXJzaW9uIiwKIk9wZXJhIl0pO2lmKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hPcGVyYUNocm9taXVtKCkpcmV0dXJuIGMoWyJPUFIiXSk7YnJlYWs7Y2FzZSBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX0JyYW5kLkVER0U6aWYobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaEVkZ2VIdG1sKCkpcmV0dXJuIGMoWyJFZGdlIl0pO2lmKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hFZGdlQ2hyb21pdW0oKSlyZXR1cm4gYyhbIkVkZyJdKTticmVhaztjYXNlIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfQnJhbmQuQ0hST01JVU06aWYobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaENocm9tZSgpKXJldHVybiBjKFsiQ2hyb21lIiwiQ3JpT1MiLCJIZWFkbGVzc0Nocm9tZSJdKX1yZXR1cm4gYT09PQptb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX0JyYW5kLkZJUkVGT1gmJm1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hGaXJlZm94KCl8fGE9PT1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX0JyYW5kLlNBRkFSSSYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9tYXRjaFNhZmFyaSgpfHxhPT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9CcmFuZC5BTkRST0lEX0JST1dTRVImJm1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hBbmRyb2lkQnJvd3NlcigpfHxhPT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9CcmFuZC5TSUxLJiZtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzU2lsaygpPyhhPWJbMl0pJiYKYVsxXXx8IiI6IiJ9CmZ1bmN0aW9uIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfdmVyc2lvbk9mXyhhKXtpZihtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCgpJiZhIT09bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9CcmFuZC5TSUxLKXt2YXIgYj1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldFVzZXJBZ2VudERhdGEoKS5icmFuZHMuZmluZCgoe2JyYW5kOmN9KT0+Yz09PWEpO2lmKCFifHwhYi52ZXJzaW9uKXJldHVybiBOYU47Yj1iLnZlcnNpb24uc3BsaXQoIi4iKX1lbHNle2I9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9nZXRGdWxsVmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoYSk7aWYoIiI9PT1iKXJldHVybiBOYU47Yj1iLnNwbGl0KCIuIil9cmV0dXJuIDA9PT1iLmxlbmd0aD9OYU46TnVtYmVyKGJbMF0pfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzQXRMZWFzdChhLGIpeygwLGdvb2cuYXNzZXJ0cy5hc3NlcnQpKE1hdGguZmxvb3IoYik9PT1iLCJNYWpvciB2ZXJzaW9uIG11c3QgYmUgYW4gaW50ZWdlciIpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3ZlcnNpb25PZl8oYSk+PWJ9Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQXRMZWFzdD1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2lzQXRMZWFzdDsKZnVuY3Rpb24gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9pc0F0TW9zdChhLGIpeygwLGdvb2cuYXNzZXJ0cy5hc3NlcnQpKE1hdGguZmxvb3IoYik9PT1iLCJNYWpvciB2ZXJzaW9uIG11c3QgYmUgYW4gaW50ZWdlciIpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3ZlcnNpb25PZl8oYSk8PWJ9Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmlzQXRNb3N0PW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfaXNBdE1vc3Q7CmNsYXNzIG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfSGlnaEVudHJvcHlCcmFuZFZlcnNpb257Y29uc3RydWN0b3IoYSxiLGMpe3RoaXMuYnJhbmRfPWE7dGhpcy52ZXJzaW9uXz1uZXcgbW9kdWxlJGV4cG9ydHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRoaWdoRW50cm9weSRoaWdoRW50cm9weVZhbHVlLlZlcnNpb24oYyk7dGhpcy51c2VVYWNoXz1ifWdldElmTG9hZGVkKCl7aWYodGhpcy51c2VVYWNoXyl7dmFyIGE9bW9kdWxlJGV4cG9ydHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRoaWdoRW50cm9weSRoaWdoRW50cm9weURhdGEuZnVsbFZlcnNpb25MaXN0LmdldElmTG9hZGVkKCk7aWYodm9pZCAwIT09YSlyZXR1cm4gYT1hLmZpbmQoKHticmFuZDpifSk9PnRoaXMuYnJhbmRfPT09YiksKDAsZ29vZy5hc3NlcnRzLmFzc2VydEV4aXN0cykoYSksbmV3IG1vZHVsZSRleHBvcnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkaGlnaEVudHJvcHkkaGlnaEVudHJvcHlWYWx1ZS5WZXJzaW9uKGEudmVyc2lvbil9aWYobW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9wcmVVYWNoSGFzTG9hZGVkKXJldHVybiB0aGlzLnZlcnNpb25ffWFzeW5jIGxvYWQoKXtpZih0aGlzLnVzZVVhY2hfKXt2YXIgYT0KYXdhaXQgbW9kdWxlJGV4cG9ydHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRoaWdoRW50cm9weSRoaWdoRW50cm9weURhdGEuZnVsbFZlcnNpb25MaXN0LmxvYWQoKTtpZih2b2lkIDAhPT1hKXJldHVybiBhPWEuZmluZCgoe2JyYW5kOmJ9KT0+dGhpcy5icmFuZF89PT1iKSwoMCxnb29nLmFzc2VydHMuYXNzZXJ0RXhpc3RzKShhKSxuZXcgbW9kdWxlJGV4cG9ydHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRoaWdoRW50cm9weSRoaWdoRW50cm9weVZhbHVlLlZlcnNpb24oYS52ZXJzaW9uKX1lbHNlIGF3YWl0IDA7bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9wcmVVYWNoSGFzTG9hZGVkPSEwO3JldHVybiB0aGlzLnZlcnNpb25ffX1sZXQgbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9wcmVVYWNoSGFzTG9hZGVkPSExOwphc3luYyBmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2xvYWRGdWxsVmVyc2lvbnMoKXttb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX3VzZVVzZXJBZ2VudERhdGFCcmFuZCghMCkmJmF3YWl0IG1vZHVsZSRleHBvcnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkaGlnaEVudHJvcHkkaGlnaEVudHJvcHlEYXRhLmZ1bGxWZXJzaW9uTGlzdC5sb2FkKCk7bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9wcmVVYWNoSGFzTG9hZGVkPSEwfWdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5sb2FkRnVsbFZlcnNpb25zPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbG9hZEZ1bGxWZXJzaW9uczsKZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLnJlc2V0Rm9yVGVzdGluZz0oKT0+e21vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfcHJlVWFjaEhhc0xvYWRlZD0hMTttb2R1bGUkZXhwb3J0cyRnb29nJGxhYnMkdXNlckFnZW50JGhpZ2hFbnRyb3B5JGhpZ2hFbnRyb3B5RGF0YS5mdWxsVmVyc2lvbkxpc3QucmVzZXRGb3JUZXN0aW5nKCl9OwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2Z1bGxWZXJzaW9uT2YoYSl7bGV0IGI9IiI7bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9oYXNGdWxsVmVyc2lvbkxpc3QoKXx8KGI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9nZXRGdWxsVmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoYSkpO2NvbnN0IGM9YSE9PW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfQnJhbmQuU0lMSyYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl91c2VVc2VyQWdlbnREYXRhQnJhbmQoITApO2lmKGMpe2lmKCFtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCR1dGlsX2dldFVzZXJBZ2VudERhdGEoKS5icmFuZHMuZmluZCgoe2JyYW5kOmR9KT0+ZD09PWEpKXJldHVybn1lbHNlIGlmKCIiPT09YilyZXR1cm47cmV0dXJuIG5ldyBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX0hpZ2hFbnRyb3B5QnJhbmRWZXJzaW9uKGEsCmMsYil9Z29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyLmZ1bGxWZXJzaW9uT2Y9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9mdWxsVmVyc2lvbk9mOwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2dldFZlcnNpb25TdHJpbmdGb3JMb2dnaW5nKGEpe2lmKG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfdXNlVXNlckFnZW50RGF0YUJyYW5kKCEwKSl7dmFyIGI9bW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9mdWxsVmVyc2lvbk9mKGEpO2lmKGIpe2lmKGI9Yi5nZXRJZkxvYWRlZCgpKXJldHVybiBiLnRvVmVyc2lvblN0cmluZ0ZvckxvZ2dpbmcoKTtiPW1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JHV0aWxfZ2V0VXNlckFnZW50RGF0YSgpLmJyYW5kcy5maW5kKCh7YnJhbmQ6Y30pPT5jPT09YSk7KDAsZ29vZy5hc3NlcnRzLmFzc2VydEV4aXN0cykoYik7cmV0dXJuIGIudmVyc2lvbn1yZXR1cm4iIn1yZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckbGFicyR1c2VyQWdlbnQkYnJvd3Nlcl9nZXRGdWxsVmVyc2lvbkZyb21Vc2VyQWdlbnRTdHJpbmcoYSl9Cmdvb2cubGFicy51c2VyQWdlbnQuYnJvd3Nlci5nZXRWZXJzaW9uU3RyaW5nRm9yTG9nZ2luZz1tb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX2dldFZlcnNpb25TdHJpbmdGb3JMb2dnaW5nO2dvb2cuZG9tLnRhZ3M9e307Z29vZy5kb20udGFncy5WT0lEX1RBR1NfPXthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGNvbW1hbmQ6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH07Z29vZy5kb20udGFncy5pc1ZvaWRUYWc9ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1nb29nLmRvbS50YWdzLlZPSURfVEFHU19bYV19O2NvbnN0IG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURT17fTsKY2xhc3MgbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbHtjb25zdHJ1Y3RvcihhLGIpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfPWI9PT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX0NPTlNUUlVDVE9SX1RPS0VOX1BSSVZBVEU/YToiIjt0aGlzLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc9ITB9Z2V0VHlwZWRTdHJpbmdWYWx1ZSgpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVIdG1sV3JhcHBlZFZhbHVlXy50b1N0cmluZygpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9c3RhdGljIHVud3JhcChhKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChhKS50b1N0cmluZygpfXN0YXRpYyB1bndyYXBUcnVzdGVkSFRNTChhKXtpZihhIGluc3RhbmNlb2YgbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbCYmCmEuY29uc3RydWN0b3I9PT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sKXJldHVybiBhLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVIdG1sV3JhcHBlZFZhbHVlXztnb29nLmFzc2VydHMuZmFpbChgZXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgU2FmZUh0bWwsIGdvdCAnJHthfScgb2YgdHlwZSBgK2dvb2cudHlwZU9mKGEpKTtyZXR1cm4idHlwZV9lcnJvcjpTYWZlSHRtbCJ9c3RhdGljIGh0bWxFc2NhcGUoYSl7aWYoYSBpbnN0YW5jZW9mIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwpcmV0dXJuIGE7YT0ib2JqZWN0Ij09dHlwZW9mIGEmJmEuaW1wbGVtZW50c0dvb2dTdHJpbmdUeXBlZFN0cmluZz9hLmdldFR5cGVkU3RyaW5nVmFsdWUoKTpTdHJpbmcoYSk7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShnb29nLnN0cmluZy5pbnRlcm5hbC5odG1sRXNjYXBlKGEpKX1zdGF0aWMgaHRtbEVzY2FwZVByZXNlcnZpbmdOZXdsaW5lcyhhKXtpZihhIGluc3RhbmNlb2YKbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbClyZXR1cm4gYTthPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuaHRtbEVzY2FwZShhKTtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGdvb2cuc3RyaW5nLmludGVybmFsLm5ld0xpbmVUb0JyKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwudW53cmFwKGEpKSl9c3RhdGljIGh0bWxFc2NhcGVQcmVzZXJ2aW5nTmV3bGluZXNBbmRTcGFjZXMoYSl7aWYoYSBpbnN0YW5jZW9mIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwpcmV0dXJuIGE7YT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmh0bWxFc2NhcGUoYSk7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShnb29nLnN0cmluZy5pbnRlcm5hbC53aGl0ZXNwYWNlRXNjYXBlKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwudW53cmFwKGEpKSl9c3RhdGljIGNvbW1lbnQoYSl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZSgiXHgzYyEtLSIrCmdvb2cuc3RyaW5nLmludGVybmFsLmh0bWxFc2NhcGUoYSkrIi0tXHgzZSIpfXN0YXRpYyBjcmVhdGUoYSxiLGMpe21vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwudmVyaWZ5VGFnTmFtZShTdHJpbmcoYSkpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sVGFnU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoU3RyaW5nKGEpLGIsYyl9c3RhdGljIHZlcmlmeVRhZ05hbWUoYSl7aWYoIW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfVkFMSURfTkFNRVNfSU5fVEFHLnRlc3QoYSkpdGhyb3cgRXJyb3IobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTkFCTEVfRVJST1JfTUVTU0FHRVM/YEludmFsaWQgdGFnIG5hbWUgPCR7YX0+LmA6IiIpO2lmKGEudG9VcHBlckNhc2UoKWluIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfTk9UX0FMTE9XRURfVEFHX05BTUVTKXRocm93IEVycm9yKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuRU5BQkxFX0VSUk9SX01FU1NBR0VTPwpgVGFnIG5hbWUgPCR7YX0+IGlzIG5vdCBhbGxvd2VkIGZvciBTYWZlSHRtbC5gOiIiKTt9c3RhdGljIGNyZWF0ZUlmcmFtZShhLGIsYyxkKXthJiZnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcChhKTtjb25zdCBlPXt9O2Uuc3JjPWF8fG51bGw7ZS5zcmNkb2M9YiYmbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXAoYik7YT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNvbWJpbmVBdHRyaWJ1dGVzKGUse3NhbmRib3g6IiJ9LGMpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sVGFnU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoImlmcmFtZSIsYSxkKX1zdGF0aWMgY3JlYXRlU2FuZGJveElmcmFtZShhLGIsYyxkKXtpZighbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5jYW5Vc2VTYW5kYm94SWZyYW1lKCkpdGhyb3cgRXJyb3IobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTkFCTEVfRVJST1JfTUVTU0FHRVM/CiJUaGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHNhbmRib3hlZCBpZnJhbWVzLiI6IiIpO2NvbnN0IGU9e307ZS5zcmM9YT9nb29nLmh0bWwuU2FmZVVybC51bndyYXAoZ29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemUoYSkpOm51bGw7ZS5zcmNkb2M9Ynx8bnVsbDtlLnNhbmRib3g9IiI7YT1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNvbWJpbmVBdHRyaWJ1dGVzKGUse30sYyk7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxUYWdTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZSgiaWZyYW1lIixhLGQpfXN0YXRpYyBjYW5Vc2VTYW5kYm94SWZyYW1lKCl7cmV0dXJuIGdvb2cuZ2xvYmFsLkhUTUxJRnJhbWVFbGVtZW50JiYic2FuZGJveCJpbiBnb29nLmdsb2JhbC5IVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGV9c3RhdGljIGNyZWF0ZVNjcmlwdFNyYyhhLGIpe2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwKGEpOwphPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY29tYmluZUF0dHJpYnV0ZXMoe3NyYzphfSx7fSxiKTtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFRhZ1NlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKCJzY3JpcHQiLGEpfXN0YXRpYyBjcmVhdGVTY3JpcHQoYSxiKXtmb3IodmFyIGMgaW4gYilpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYixjKSl7dmFyIGQ9Yy50b0xvd2VyQ2FzZSgpO2lmKCJsYW5ndWFnZSI9PWR8fCJzcmMiPT1kfHwidGV4dCI9PWQpdGhyb3cgRXJyb3IobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTkFCTEVfRVJST1JfTUVTU0FHRVM/YENhbm5vdCBzZXQgIiR7ZH0iIGF0dHJpYnV0ZWA6IiIpO31jPSIiO2E9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29uY2F0KGEpO2ZvcihkPTA7ZDwKYS5sZW5ndGg7ZCsrKWMrPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9TYWZlU2NyaXB0LnVud3JhcChhW2RdKTthPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShjKTtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFRhZ1NlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKCJzY3JpcHQiLGIsYSl9c3RhdGljIGNyZWF0ZVN0eWxlKGEsYil7Yj1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNvbWJpbmVBdHRyaWJ1dGVzKHt0eXBlOiJ0ZXh0L2NzcyJ9LHt9LGIpO2xldCBjPSIiO2E9bW9kdWxlJGNvbnRlbnRzJGdvb2ckYXJyYXlfY29uY2F0KGEpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKWMrPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQudW53cmFwKGFbZF0pOwphPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShjKTtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5jcmVhdGVTYWZlSHRtbFRhZ1NlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKCJzdHlsZSIsYixhKX1zdGF0aWMgY3JlYXRlTWV0YVJlZnJlc2goYSxiKXthPWdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcChnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZShhKSk7KG1vZHVsZSRjb250ZW50cyRnb29nJGxhYnMkdXNlckFnZW50JGJyb3dzZXJfbWF0Y2hJRSgpfHxtb2R1bGUkY29udGVudHMkZ29vZyRsYWJzJHVzZXJBZ2VudCRicm93c2VyX21hdGNoRWRnZUh0bWwoKSkmJmdvb2cuc3RyaW5nLmludGVybmFsLmNvbnRhaW5zKGEsIjsiKSYmKGE9IiciK2EucmVwbGFjZSgvJy9nLCIlMjciKSsiJyIpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sVGFnU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoIm1ldGEiLAp7Imh0dHAtZXF1aXYiOiJyZWZyZXNoIixjb250ZW50OihifHwwKSsiOyB1cmw9IithfSl9c3RhdGljIGpvaW4oYSxiKXthPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuaHRtbEVzY2FwZShhKTtjb25zdCBjPVtdLGQ9ZT0+e0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGQpOihlPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuaHRtbEVzY2FwZShlKSxjLnB1c2gobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXAoZSkpKX07Yi5mb3JFYWNoKGQpO3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYy5qb2luKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwudW53cmFwKGEpKSl9c3RhdGljIGNvbmNhdChhKXtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5qb2luKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuRU1QVFksCkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfXN0YXRpYyBjcmVhdGVTYWZlSHRtbFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGEpe2NvbnN0IGI9Z29vZy5odG1sLnRydXN0ZWR0eXBlcy5nZXRQb2xpY3lQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoKTthPWI/Yi5jcmVhdGVIVE1MKGEpOmE7cmV0dXJuIG5ldyBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sKGEsbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9DT05TVFJVQ1RPUl9UT0tFTl9QUklWQVRFKX1zdGF0aWMgY3JlYXRlU2FmZUh0bWxUYWdTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShhLGIsYyl7Yj1gPCR7YX1gK21vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuc3RyaW5naWZ5QXR0cmlidXRlcyhhLGIpO251bGw9PWM/Yz1bXTpBcnJheS5pc0FycmF5KGMpfHwoYz1bY10pO2dvb2cuZG9tLnRhZ3MuaXNWb2lkVGFnKGEudG9Mb3dlckNhc2UoKSk/Cihnb29nLmFzc2VydHMuYXNzZXJ0KCFjLmxlbmd0aCxgVm9pZCB0YWcgPCR7YX0+IGRvZXMgbm90IGFsbG93IGNvbnRlbnQuYCksYis9Ij4iKTooYz1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNvbmNhdChjKSxiKz0iPiIrbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXAoYykrIjwvIithKyI+Iik7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX1zdGF0aWMgc3RyaW5naWZ5QXR0cmlidXRlcyhhLGIpe2xldCBjPSIiO2lmKGIpZm9yKGxldCBkIGluIGIpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsZCkpe2lmKCFtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1ZBTElEX05BTUVTX0lOX1RBRy50ZXN0KGQpKXRocm93IEVycm9yKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuRU5BQkxFX0VSUk9SX01FU1NBR0VTPwpgSW52YWxpZCBhdHRyaWJ1dGUgbmFtZSAiJHtkfSIuYDoiIik7Y29uc3QgZT1iW2RdO251bGwhPWUmJihjKz0iICIrbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9nZXRBdHRyTmFtZUFuZFZhbHVlKGEsZCxlKSl9cmV0dXJuIGN9c3RhdGljIGNvbWJpbmVBdHRyaWJ1dGVzKGEsYixjKXtjb25zdCBkPXt9O2Zvcih2YXIgZSBpbiBhKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGUpJiYoZ29vZy5hc3NlcnRzLmFzc2VydChlLnRvTG93ZXJDYXNlKCk9PWUsIk11c3QgYmUgbG93ZXIgY2FzZSIpLGRbZV09YVtlXSk7Zm9yKGNvbnN0IGYgaW4gYilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYixmKSYmKGdvb2cuYXNzZXJ0cy5hc3NlcnQoZi50b0xvd2VyQ2FzZSgpPT1mLCJNdXN0IGJlIGxvd2VyIGNhc2UiKSxkW2ZdPWJbZl0pO2lmKGMpZm9yKGNvbnN0IGYgaW4gYylpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYywKZikpe2U9Zi50b0xvd2VyQ2FzZSgpO2lmKGUgaW4gYSl0aHJvdyBFcnJvcihtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLkVOQUJMRV9FUlJPUl9NRVNTQUdFUz9gQ2Fubm90IG92ZXJyaWRlICIke2V9IiBhdHRyaWJ1dGUsIGdvdCAiYCtmKyciIHdpdGggdmFsdWUgIicrY1tmXSsnIic6IiIpO2UgaW4gYiYmZGVsZXRlIGRbZV07ZFtmXT1jW2ZdfXJldHVybiBkfX1tb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLkVOQUJMRV9FUlJPUl9NRVNTQUdFUz1nb29nLkRFQlVHO21vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuU1VQUE9SVF9TVFlMRV9BVFRSSUJVVEU9ITA7bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5mcm9tPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuaHRtbEVzY2FwZTsKY29uc3QgbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9WQUxJRF9OQU1FU19JTl9UQUc9L15bYS16QS1aMC05LV0rJC8sbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9VUkxfQVRUUklCVVRFUz17YWN0aW9uOiEwLGNpdGU6ITAsZGF0YTohMCxmb3JtYWN0aW9uOiEwLGhyZWY6ITAsbWFuaWZlc3Q6ITAscG9zdGVyOiEwLHNyYzohMH0sbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9OT1RfQUxMT1dFRF9UQUdfTkFNRVM9e1tnb29nLmRvbS5UYWdOYW1lLkFQUExFVF06ITAsW2dvb2cuZG9tLlRhZ05hbWUuQkFTRV06ITAsW2dvb2cuZG9tLlRhZ05hbWUuRU1CRURdOiEwLFtnb29nLmRvbS5UYWdOYW1lLklGUkFNRV06ITAsW2dvb2cuZG9tLlRhZ05hbWUuTElOS106ITAsW2dvb2cuZG9tLlRhZ05hbWUuTUFUSF06ITAsW2dvb2cuZG9tLlRhZ05hbWUuTUVUQV06ITAsW2dvb2cuZG9tLlRhZ05hbWUuT0JKRUNUXTohMCxbZ29vZy5kb20uVGFnTmFtZS5TQ1JJUFRdOiEwLApbZ29vZy5kb20uVGFnTmFtZS5TVFlMRV06ITAsW2dvb2cuZG9tLlRhZ05hbWUuU1ZHXTohMCxbZ29vZy5kb20uVGFnTmFtZS5URU1QTEFURV06ITB9OwpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX2dldEF0dHJOYW1lQW5kVmFsdWUoYSxiLGMpe2lmKGMgaW5zdGFuY2VvZiBnb29nLnN0cmluZy5Db25zdCljPWdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChjKTtlbHNlIGlmKCJzdHlsZSI9PWIudG9Mb3dlckNhc2UoKSlpZihtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLlNVUFBPUlRfU1RZTEVfQVRUUklCVVRFKWM9bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9nZXRTdHlsZVZhbHVlKGMpO2Vsc2UgdGhyb3cgRXJyb3IobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTkFCTEVfRVJST1JfTUVTU0FHRVM/J0F0dHJpYnV0ZSAic3R5bGUiIG5vdCBzdXBwb3J0ZWQuJzoiIik7ZWxzZXtpZigvXm9uL2kudGVzdChiKSl0aHJvdyBFcnJvcihtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLkVOQUJMRV9FUlJPUl9NRVNTQUdFUz8KYEF0dHJpYnV0ZSAiJHtifWArJyIgcmVxdWlyZXMgZ29vZy5zdHJpbmcuQ29uc3QgdmFsdWUsICInK2MrJyIgZ2l2ZW4uJzoiIik7aWYoYi50b0xvd2VyQ2FzZSgpaW4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9VUkxfQVRUUklCVVRFUylpZihjIGluc3RhbmNlb2YgZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCljPWdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwKGMpO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsKWM9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGMpO2Vsc2UgaWYoInN0cmluZyI9PT10eXBlb2YgYyljPWdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplKGMpLmdldFR5cGVkU3RyaW5nVmFsdWUoKTtlbHNlIHRocm93IEVycm9yKG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuRU5BQkxFX0VSUk9SX01FU1NBR0VTP2BBdHRyaWJ1dGUgIiR7Yn0iIG9uIHRhZyAiJHthfWArJyIgcmVxdWlyZXMgZ29vZy5odG1sLlNhZmVVcmwsIGdvb2cuc3RyaW5nLkNvbnN0LCBvciBzdHJpbmcsIHZhbHVlICInKwpjKyciIGdpdmVuLic6IiIpO31jLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmcmJihjPWMuZ2V0VHlwZWRTdHJpbmdWYWx1ZSgpKTtnb29nLmFzc2VydHMuYXNzZXJ0KCJzdHJpbmciPT09dHlwZW9mIGN8fCJudW1iZXIiPT09dHlwZW9mIGMsIlN0cmluZyBvciBudW1iZXIgdmFsdWUgZXhwZWN0ZWQsIGdvdCAiK3R5cGVvZiBjKyIgd2l0aCB2YWx1ZTogIitjKTtyZXR1cm5gJHtifT0iYCtnb29nLnN0cmluZy5pbnRlcm5hbC5odG1sRXNjYXBlKFN0cmluZyhjKSkrJyInfQpmdW5jdGlvbiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX2dldFN0eWxlVmFsdWUoYSl7aWYoIWdvb2cuaXNPYmplY3QoYSkpdGhyb3cgRXJyb3IobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTkFCTEVfRVJST1JfTUVTU0FHRVM/J1RoZSAic3R5bGUiIGF0dHJpYnV0ZSByZXF1aXJlcyBnb29nLmh0bWwuU2FmZVN0eWxlIG9yIG1hcCBvZiBzdHlsZSBwcm9wZXJ0aWVzLCAnK3R5cGVvZiBhKyIgZ2l2ZW46ICIrYToiIik7YSBpbnN0YW5jZW9mIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZXx8KGE9bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU3R5bGVfU2FmZVN0eWxlLmNyZWF0ZShhKSk7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS51bndyYXAoYSl9Cm1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuRE9DVFlQRV9IVE1MPWZ1bmN0aW9uKCl7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZSgiPCFET0NUWVBFIGh0bWw+Iil9KCk7bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTVBUWT1uZXcgbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbChnb29nLmdsb2JhbC50cnVzdGVkVHlwZXMmJmdvb2cuZ2xvYmFsLnRydXN0ZWRUeXBlcy5lbXB0eUhUTUx8fCIiLG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfQ09OU1RSVUNUT1JfVE9LRU5fUFJJVkFURSk7bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5CUj1mdW5jdGlvbigpe3JldHVybiBtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLmNyZWF0ZVNhZmVIdG1sU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoIjxicj4iKX0oKTsKZ29vZy5odG1sLlNhZmVIdG1sPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWw7Z29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zPXt9O2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlSHRtbEZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdD1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnRTdHJpbmcoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpLCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvbiIpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cuc3RyaW5nLmludGVybmFsLmlzRW1wdHlPcldoaXRlc3BhY2UoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpKSwibXVzdCBwcm92aWRlIG5vbi1lbXB0eSBqdXN0aWZpY2F0aW9uIik7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwuY3JlYXRlU2FmZUh0bWxTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX07Cmdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlU2NyaXB0RnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksIm11c3QgcHJvdmlkZSBqdXN0aWZpY2F0aW9uIik7Z29vZy5hc3NlcnRzLmFzc2VydCghZ29vZy5zdHJpbmcuaW50ZXJuYWwuaXNFbXB0eU9yV2hpdGVzcGFjZShnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSkpLCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb24iKTtyZXR1cm4gbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlU2NyaXB0X1NhZmVTY3JpcHQuY3JlYXRlU2FmZVNjcmlwdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpfTsKZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zLnNhZmVTdHlsZUZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdD1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnRTdHJpbmcoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpLCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvbiIpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cuc3RyaW5nLmludGVybmFsLmlzRW1wdHlPcldoaXRlc3BhY2UoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpKSwibXVzdCBwcm92aWRlIG5vbi1lbXB0eSBqdXN0aWZpY2F0aW9uIik7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS5jcmVhdGVTYWZlU3R5bGVTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX07Cmdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlU3R5bGVTaGVldEZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdD1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnRTdHJpbmcoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpLCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvbiIpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cuc3RyaW5nLmludGVybmFsLmlzRW1wdHlPcldoaXRlc3BhY2UoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpKSwibXVzdCBwcm92aWRlIG5vbi1lbXB0eSBqdXN0aWZpY2F0aW9uIik7cmV0dXJuIG1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlU2hlZXRfU2FmZVN0eWxlU2hlZXQuY3JlYXRlU2FmZVN0eWxlU2hlZXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZShiKX07Cmdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlVXJsRnJvbVN0cmluZ0tub3duVG9TYXRpc2Z5VHlwZUNvbnRyYWN0PWZ1bmN0aW9uKGEsYil7Z29vZy5hc3NlcnRzLmFzc2VydFN0cmluZyhnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSksIm11c3QgcHJvdmlkZSBqdXN0aWZpY2F0aW9uIik7Z29vZy5hc3NlcnRzLmFzc2VydCghZ29vZy5zdHJpbmcuaW50ZXJuYWwuaXNFbXB0eU9yV2hpdGVzcGFjZShnb29nLnN0cmluZy5Db25zdC51bndyYXAoYSkpLCJtdXN0IHByb3ZpZGUgbm9uLWVtcHR5IGp1c3RpZmljYXRpb24iKTtyZXR1cm4gZ29vZy5odG1sLlNhZmVVcmwuY3JlYXRlU2FmZVVybFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlKGIpfTsKZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zLnRydXN0ZWRSZXNvdXJjZVVybEZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdD1mdW5jdGlvbihhLGIpe2dvb2cuYXNzZXJ0cy5hc3NlcnRTdHJpbmcoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpLCJtdXN0IHByb3ZpZGUganVzdGlmaWNhdGlvbiIpO2dvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cuc3RyaW5nLmludGVybmFsLmlzRW1wdHlPcldoaXRlc3BhY2UoZ29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGEpKSwibXVzdCBwcm92aWRlIG5vbi1lbXB0eSBqdXN0aWZpY2F0aW9uIik7cmV0dXJuIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwuY3JlYXRlVHJ1c3RlZFJlc291cmNlVXJsU2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2UoYil9O2dvb2cuZG9tLnNhZmU9e307Z29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbj17QUZURVJCRUdJTjoiYWZ0ZXJiZWdpbiIsQUZURVJFTkQ6ImFmdGVyZW5kIixCRUZPUkVCRUdJTjoiYmVmb3JlYmVnaW4iLEJFRk9SRUVORDoiYmVmb3JlZW5kIn07Z29vZy5kb20uc2FmZS5pbnNlcnRBZGphY2VudEh0bWw9ZnVuY3Rpb24oYSxiLGMpe2EuaW5zZXJ0QWRqYWNlbnRIVE1MKGIsbW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChjKSl9O2dvb2cuZG9tLnNhZmUuU0VUX0lOTkVSX0hUTUxfRElTQUxMT1dFRF9UQUdTXz17TUFUSDohMCxTQ1JJUFQ6ITAsU1RZTEU6ITAsU1ZHOiEwLFRFTVBMQVRFOiEwfTsKZ29vZy5kb20uc2FmZS5pc0lubmVySHRtbENsZWFudXBSZWN1cnNpdmVfPWdvb2cuZnVuY3Rpb25zLmNhY2hlUmV0dXJuVmFsdWUoZnVuY3Rpb24oKXtpZihnb29nLkRFQlVHJiYidW5kZWZpbmVkIj09PXR5cGVvZiBkb2N1bWVudClyZXR1cm4hMTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2EuYXBwZW5kQ2hpbGQoYik7aWYoZ29vZy5ERUJVRyYmIWEuZmlyc3RDaGlsZClyZXR1cm4hMTtiPWEuZmlyc3RDaGlsZC5maXJzdENoaWxkO2EuaW5uZXJIVE1MPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwudW53cmFwVHJ1c3RlZEhUTUwobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC5FTVBUWSk7cmV0dXJuIWIucGFyZW50RWxlbWVudH0pOwpnb29nLmRvbS5zYWZlLnVuc2FmZVNldElubmVySHRtbERvTm90VXNlT3JFbHNlPWZ1bmN0aW9uKGEsYil7aWYoZ29vZy5kb20uc2FmZS5pc0lubmVySHRtbENsZWFudXBSZWN1cnNpdmVfKCkpZm9yKDthLmxhc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCk7YS5pbm5lckhUTUw9bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChiKX07Cmdvb2cuZG9tLnNhZmUuc2V0SW5uZXJIdG1sPWZ1bmN0aW9uKGEsYil7aWYoZ29vZy5hc3NlcnRzLkVOQUJMRV9BU1NFUlRTJiZhLnRhZ05hbWUpe3ZhciBjPWEudGFnTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGdvb2cuZG9tLnNhZmUuU0VUX0lOTkVSX0hUTUxfRElTQUxMT1dFRF9UQUdTX1tjXSl0aHJvdyBFcnJvcigiZ29vZy5kb20uc2FmZS5zZXRJbm5lckh0bWwgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGNvbnRlbnQgb2YgIithLnRhZ05hbWUrIi4iKTt9Z29vZy5kb20uc2FmZS51bnNhZmVTZXRJbm5lckh0bWxEb05vdFVzZU9yRWxzZShhLGIpfTsKZ29vZy5kb20uc2FmZS5zZXRJbm5lckh0bWxGcm9tQ29uc3RhbnQ9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5zYWZlLnNldElubmVySHRtbChhLGdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlSHRtbEZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdChnb29nLnN0cmluZy5Db25zdC5mcm9tKCJDb25zdGFudCBIVE1MIHRvIGJlIGltbWVkaWF0ZWxseSB1c2VkLiIpLGdvb2cuc3RyaW5nLkNvbnN0LnVud3JhcChiKSkpfTtnb29nLmRvbS5zYWZlLnNldE91dGVySHRtbD1mdW5jdGlvbihhLGIpe2Eub3V0ZXJIVE1MPW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZUh0bWxfU2FmZUh0bWwudW53cmFwVHJ1c3RlZEhUTUwoYil9Owpnb29nLmRvbS5zYWZlLnNldEZvcm1FbGVtZW50QWN0aW9uPWZ1bmN0aW9uKGEsYil7Yj1iIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmw/Yjpnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiKTtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEZvcm1FbGVtZW50KGEpLmFjdGlvbj1nb29nLmh0bWwuU2FmZVVybC51bndyYXAoYil9O2dvb2cuZG9tLnNhZmUuc2V0QnV0dG9uRm9ybUFjdGlvbj1mdW5jdGlvbihhLGIpe2I9YiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5TYWZlVXJsP2I6Z29vZy5odG1sLlNhZmVVcmwuc2FuaXRpemVBc3NlcnRVbmNoYW5nZWQoYik7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxCdXR0b25FbGVtZW50KGEpLmZvcm1BY3Rpb249Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGIpfTsKZ29vZy5kb20uc2FmZS5zZXRJbnB1dEZvcm1BY3Rpb249ZnVuY3Rpb24oYSxiKXtiPWIgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybD9iOmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIpO2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MSW5wdXRFbGVtZW50KGEpLmZvcm1BY3Rpb249Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGIpfTtnb29nLmRvbS5zYWZlLnNldFN0eWxlPWZ1bmN0aW9uKGEsYil7YS5zdHlsZS5jc3NUZXh0PW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVN0eWxlX1NhZmVTdHlsZS51bndyYXAoYil9O2dvb2cuZG9tLnNhZmUuZG9jdW1lbnRXcml0ZT1mdW5jdGlvbihhLGIpe2Eud3JpdGUobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChiKSl9Owpnb29nLmRvbS5zYWZlLnNldEFuY2hvckhyZWY9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTEFuY2hvckVsZW1lbnQoYSk7Yj1iIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmw/Yjpnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiKTthLmhyZWY9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGIpfTtnb29nLmRvbS5zYWZlLnNldEF1ZGlvU3JjPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxBdWRpb0VsZW1lbnQoYSk7aWYoIShiIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmwpKXt2YXIgYz0vXmRhdGE6YXVkaW9cLy9pLnRlc3QoYik7Yj1nb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiLGMpfWEuc3JjPWdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcChiKX07Cmdvb2cuZG9tLnNhZmUuc2V0VmlkZW9TcmM9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTFZpZGVvRWxlbWVudChhKTtpZighKGIgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybCkpe3ZhciBjPS9eZGF0YTp2aWRlb1wvL2kudGVzdChiKTtiPWdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIsYyl9YS5zcmM9Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGIpfTtnb29nLmRvbS5zYWZlLnNldEVtYmVkU3JjPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxFbWJlZEVsZW1lbnQoYSk7YS5zcmM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkU2NyaXB0VVJMKGIpfTtnb29nLmRvbS5zYWZlLnNldEZyYW1lU3JjPWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxGcmFtZUVsZW1lbnQoYSk7YS5zcmM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXAoYil9Owpnb29nLmRvbS5zYWZlLnNldElmcmFtZVNyYz1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MSUZyYW1lRWxlbWVudChhKTthLnNyYz1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcChiKX07Z29vZy5kb20uc2FmZS5zZXRJZnJhbWVTcmNkb2M9ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzSFRNTElGcmFtZUVsZW1lbnQoYSk7YS5zcmNkb2M9bW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChiKX07Cmdvb2cuZG9tLnNhZmUuc2V0TGlua0hyZWZBbmRSZWw9ZnVuY3Rpb24oYSxiLGMpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MTGlua0VsZW1lbnQoYSk7YS5yZWw9Yztnb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVDb250YWlucyhjLCJzdHlsZXNoZWV0Iik/KGdvb2cuYXNzZXJ0cy5hc3NlcnQoYiBpbnN0YW5jZW9mIGdvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwsJ1VSTCBtdXN0IGJlIFRydXN0ZWRSZXNvdXJjZVVybCBiZWNhdXNlICJyZWwiIGNvbnRhaW5zICJzdHlsZXNoZWV0IicpLGEuaHJlZj1nb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsLnVud3JhcChiKSwoYj1nb29nLmRvbS5zYWZlLmdldFN0eWxlTm9uY2UoYS5vd25lckRvY3VtZW50JiZhLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpKSYmYS5zZXRBdHRyaWJ1dGUoIm5vbmNlIixiKSk6YS5ocmVmPWIgaW5zdGFuY2VvZiBnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsP2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwudW53cmFwKGIpOgpiIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmw/Z29vZy5odG1sLlNhZmVVcmwudW53cmFwKGIpOmdvb2cuaHRtbC5TYWZlVXJsLnVud3JhcChnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiKSl9O2dvb2cuZG9tLnNhZmUuc2V0T2JqZWN0RGF0YT1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MT2JqZWN0RWxlbWVudChhKTthLmRhdGE9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkU2NyaXB0VVJMKGIpfTtnb29nLmRvbS5zYWZlLnNldFNjcmlwdFNyYz1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNIVE1MU2NyaXB0RWxlbWVudChhKTtnb29nLmRvbS5zYWZlLnNldE5vbmNlRm9yU2NyaXB0RWxlbWVudF8oYSk7YS5zcmM9Z29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybC51bndyYXBUcnVzdGVkU2NyaXB0VVJMKGIpfTsKZ29vZy5kb20uc2FmZS5zZXRTY3JpcHRDb250ZW50PWZ1bmN0aW9uKGEsYil7Z29vZy5kb20uYXNzZXJ0cy5hc3NlcnRJc0hUTUxTY3JpcHRFbGVtZW50KGEpO2dvb2cuZG9tLnNhZmUuc2V0Tm9uY2VGb3JTY3JpcHRFbGVtZW50XyhhKTthLnRleHRDb250ZW50PW1vZHVsZSRjb250ZW50cyRnb29nJGh0bWwkU2FmZVNjcmlwdF9TYWZlU2NyaXB0LnVud3JhcFRydXN0ZWRTY3JpcHQoYil9O2dvb2cuZG9tLnNhZmUuc2V0Tm9uY2VGb3JTY3JpcHRFbGVtZW50Xz1mdW5jdGlvbihhKXtjb25zdCBiPWdvb2cuZG9tLnNhZmUuZ2V0U2NyaXB0Tm9uY2UoYS5vd25lckRvY3VtZW50JiZhLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpO2ImJmEuc2V0QXR0cmlidXRlKCJub25jZSIsYil9Owpnb29nLmRvbS5zYWZlLnNldExvY2F0aW9uSHJlZj1mdW5jdGlvbihhLGIpe2dvb2cuZG9tLmFzc2VydHMuYXNzZXJ0SXNMb2NhdGlvbihhKTtiPWIgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybD9iOmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIpO2EuaHJlZj1nb29nLmh0bWwuU2FmZVVybC51bndyYXAoYil9O2dvb2cuZG9tLnNhZmUuYXNzaWduTG9jYXRpb249ZnVuY3Rpb24oYSxiKXtnb29nLmRvbS5hc3NlcnRzLmFzc2VydElzTG9jYXRpb24oYSk7Yj1iIGluc3RhbmNlb2YgZ29vZy5odG1sLlNhZmVVcmw/Yjpnb29nLmh0bWwuU2FmZVVybC5zYW5pdGl6ZUFzc2VydFVuY2hhbmdlZChiKTthLmFzc2lnbihnb29nLmh0bWwuU2FmZVVybC51bndyYXAoYikpfTsKZ29vZy5kb20uc2FmZS5yZXBsYWNlTG9jYXRpb249ZnVuY3Rpb24oYSxiKXtiPWIgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybD9iOmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGIpO2EucmVwbGFjZShnb29nLmh0bWwuU2FmZVVybC51bndyYXAoYikpfTtnb29nLmRvbS5zYWZlLm9wZW5JbldpbmRvdz1mdW5jdGlvbihhLGIsYyxkKXthPWEgaW5zdGFuY2VvZiBnb29nLmh0bWwuU2FmZVVybD9hOmdvb2cuaHRtbC5TYWZlVXJsLnNhbml0aXplQXNzZXJ0VW5jaGFuZ2VkKGEpO2I9Ynx8Z29vZy5nbG9iYWw7Yz1jIGluc3RhbmNlb2YgZ29vZy5zdHJpbmcuQ29uc3Q/Z29vZy5zdHJpbmcuQ29uc3QudW53cmFwKGMpOmN8fCIiO3JldHVybiB2b2lkIDAhPT1kP2Iub3Blbihnb29nLmh0bWwuU2FmZVVybC51bndyYXAoYSksYyxkKTpiLm9wZW4oZ29vZy5odG1sLlNhZmVVcmwudW53cmFwKGEpLGMpfTsKZ29vZy5kb20uc2FmZS5wYXJzZUZyb21TdHJpbmdIdG1sPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuZG9tLnNhZmUucGFyc2VGcm9tU3RyaW5nKGEsYiwidGV4dC9odG1sIil9O2dvb2cuZG9tLnNhZmUucGFyc2VGcm9tU3RyaW5nPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5wYXJzZUZyb21TdHJpbmcobW9kdWxlJGNvbnRlbnRzJGdvb2ckaHRtbCRTYWZlSHRtbF9TYWZlSHRtbC51bndyYXBUcnVzdGVkSFRNTChiKSxjKX07Cmdvb2cuZG9tLnNhZmUuY3JlYXRlSW1hZ2VGcm9tQmxvYj1mdW5jdGlvbihhKXtpZighL15pbWFnZVwvLiovZy50ZXN0KGEudHlwZSkpdGhyb3cgRXJyb3IoImdvb2cuZG9tLnNhZmUuY3JlYXRlSW1hZ2VGcm9tQmxvYiBvbmx5IGFjY2VwdHMgTUlNRSB0eXBlIGltYWdlLy4qLiIpO3ZhciBiPWdvb2cuZ2xvYmFsLlVSTC5jcmVhdGVPYmplY3RVUkwoYSk7YT1uZXcgZ29vZy5nbG9iYWwuSW1hZ2U7YS5vbmxvYWQ9ZnVuY3Rpb24oKXtnb29nLmdsb2JhbC5VUkwucmV2b2tlT2JqZWN0VVJMKGIpfTthLnNyYz1iO3JldHVybiBhfTtnb29nLmRvbS5zYWZlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudD1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChtb2R1bGUkY29udGVudHMkZ29vZyRodG1sJFNhZmVIdG1sX1NhZmVIdG1sLnVud3JhcFRydXN0ZWRIVE1MKGIpKX07Cmdvb2cuZG9tLnNhZmUuZ2V0U2NyaXB0Tm9uY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGdvb2cuZG9tLnNhZmUuZ2V0Tm9uY2VfKCJzY3JpcHRbbm9uY2VdIixhKX07Z29vZy5kb20uc2FmZS5nZXRTdHlsZU5vbmNlPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLmRvbS5zYWZlLmdldE5vbmNlXygnc3R5bGVbbm9uY2VdLGxpbmtbcmVsPSJzdHlsZXNoZWV0Il1bbm9uY2VdJyxhKX07Z29vZy5kb20uc2FmZS5OT05DRV9QQVRURVJOXz0vXltcdysvXy1dK1s9XXswLDJ9JC87Z29vZy5kb20uc2FmZS5nZXROb25jZV89ZnVuY3Rpb24oYSxiKXtiPShifHxnb29nLmdsb2JhbCkuZG9jdW1lbnQ7cmV0dXJuIGIucXVlcnlTZWxlY3Rvcj8oYT1iLnF1ZXJ5U2VsZWN0b3IoYSkpJiYoYT1hLm5vbmNlfHxhLmdldEF0dHJpYnV0ZSgibm9uY2UiKSkmJmdvb2cuZG9tLnNhZmUuTk9OQ0VfUEFUVEVSTl8udGVzdChhKT9hOiIiOiIifTtnb29nLnN0cmluZy5ERVRFQ1RfRE9VQkxFX0VTQ0FQSU5HPSExO2dvb2cuc3RyaW5nLkZPUkNFX05PTl9ET01fSFRNTF9VTkVTQ0FQSU5HPSExO2dvb2cuc3RyaW5nLlVuaWNvZGU9e05CU1A6Ilx1MDBhMCIsWkVST19XSURUSF9TUEFDRToiXHUyMDBiIn07Z29vZy5zdHJpbmcuc3RhcnRzV2l0aD1nb29nLnN0cmluZy5pbnRlcm5hbC5zdGFydHNXaXRoO2dvb2cuc3RyaW5nLmVuZHNXaXRoPWdvb2cuc3RyaW5nLmludGVybmFsLmVuZHNXaXRoO2dvb2cuc3RyaW5nLmNhc2VJbnNlbnNpdGl2ZVN0YXJ0c1dpdGg9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlU3RhcnRzV2l0aDtnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVFbmRzV2l0aD1nb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVFbmRzV2l0aDtnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVFcXVhbHM9Z29vZy5zdHJpbmcuaW50ZXJuYWwuY2FzZUluc2Vuc2l0aXZlRXF1YWxzOwpnb29nLnN0cmluZy5zdWJzPWZ1bmN0aW9uKGEsYil7Y29uc3QgYz1hLnNwbGl0KCIlcyIpO2xldCBkPSIiO2NvbnN0IGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2Zvcig7ZS5sZW5ndGgmJjE8Yy5sZW5ndGg7KWQrPWMuc2hpZnQoKStlLnNoaWZ0KCk7cmV0dXJuIGQrYy5qb2luKCIlcyIpfTtnb29nLnN0cmluZy5jb2xsYXBzZVdoaXRlc3BhY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvW1xzXHhhMF0rL2csIiAiKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9O2dvb2cuc3RyaW5nLmlzRW1wdHlPcldoaXRlc3BhY2U9Z29vZy5zdHJpbmcuaW50ZXJuYWwuaXNFbXB0eU9yV2hpdGVzcGFjZTtnb29nLnN0cmluZy5pc0VtcHR5U3RyaW5nPWZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmxlbmd0aH07Z29vZy5zdHJpbmcuaXNFbXB0eT1nb29nLnN0cmluZy5pc0VtcHR5T3JXaGl0ZXNwYWNlOwpnb29nLnN0cmluZy5pc0VtcHR5T3JXaGl0ZXNwYWNlU2FmZT1mdW5jdGlvbihhKXtyZXR1cm4gZ29vZy5zdHJpbmcuaXNFbXB0eU9yV2hpdGVzcGFjZShnb29nLnN0cmluZy5tYWtlU2FmZShhKSl9O2dvb2cuc3RyaW5nLmlzRW1wdHlTYWZlPWdvb2cuc3RyaW5nLmlzRW1wdHlPcldoaXRlc3BhY2VTYWZlO2dvb2cuc3RyaW5nLmlzQnJlYWtpbmdXaGl0ZXNwYWNlPWZ1bmN0aW9uKGEpe3JldHVybiEvW15cdFxuXHIgXS8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNBbHBoYT1mdW5jdGlvbihhKXtyZXR1cm4hL1teYS16QS1aXS8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNOdW1lcmljPWZ1bmN0aW9uKGEpe3JldHVybiEvW14wLTldLy50ZXN0KGEpfTtnb29nLnN0cmluZy5pc0FscGhhTnVtZXJpYz1mdW5jdGlvbihhKXtyZXR1cm4hL1teYS16QS1aMC05XS8udGVzdChhKX07Z29vZy5zdHJpbmcuaXNTcGFjZT1mdW5jdGlvbihhKXtyZXR1cm4iICI9PWF9Owpnb29nLnN0cmluZy5pc1VuaWNvZGVDaGFyPWZ1bmN0aW9uKGEpe3JldHVybiAxPT1hLmxlbmd0aCYmIiAiPD1hJiYifiI+PWF8fCJcdTAwODAiPD1hJiYiXHVmZmZkIj49YX07Z29vZy5zdHJpbmcuc3RyaXBOZXdsaW5lcz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC8oXHJcbnxccnxcbikrL2csIiAiKX07Z29vZy5zdHJpbmcuY2Fub25pY2FsaXplTmV3bGluZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvKFxyXG58XHJ8XG4pL2csIlxuIil9O2dvb2cuc3RyaW5nLm5vcm1hbGl6ZVdoaXRlc3BhY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXHhhMHxccy9nLCIgIil9O2dvb2cuc3RyaW5nLm5vcm1hbGl6ZVNwYWNlcz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9ceGEwfFsgXHRdKy9nLCIgIil9Owpnb29nLnN0cmluZy5jb2xsYXBzZUJyZWFraW5nU3BhY2VzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1tcdFxyXG4gXSsvZywiICIpLnJlcGxhY2UoL15bXHRcclxuIF0rfFtcdFxyXG4gXSskL2csIiIpfTtnb29nLnN0cmluZy50cmltPWdvb2cuc3RyaW5nLmludGVybmFsLnRyaW07Z29vZy5zdHJpbmcudHJpbUxlZnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXltcc1x4YTBdKy8sIiIpfTtnb29nLnN0cmluZy50cmltUmlnaHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvW1xzXHhhMF0rJC8sIiIpfTtnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVDb21wYXJlPWdvb2cuc3RyaW5nLmludGVybmFsLmNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU7Cmdvb2cuc3RyaW5nLm51bWJlckF3YXJlQ29tcGFyZV89ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PWIpcmV0dXJuIDA7aWYoIWEpcmV0dXJuLTE7aWYoIWIpcmV0dXJuIDE7Y29uc3QgZD1hLnRvTG93ZXJDYXNlKCkubWF0Y2goYyksZT1iLnRvTG93ZXJDYXNlKCkubWF0Y2goYyksZj1NYXRoLm1pbihkLmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCBnPTA7ZzxmO2crKyl7Yz1kW2ddO2NvbnN0IGg9ZVtnXTtpZihjIT1oKXJldHVybiBhPXBhcnNlSW50KGMsMTApLCFpc05hTihhKSYmKGI9cGFyc2VJbnQoaCwxMCksIWlzTmFOKGIpJiZhLWIpP2EtYjpjPGg/LTE6MX1yZXR1cm4gZC5sZW5ndGghPWUubGVuZ3RoP2QubGVuZ3RoLWUubGVuZ3RoOmE8Yj8tMToxfTtnb29nLnN0cmluZy5pbnRBd2FyZUNvbXBhcmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5zdHJpbmcubnVtYmVyQXdhcmVDb21wYXJlXyhhLGIsL1xkK3xcRCsvZyl9Owpnb29nLnN0cmluZy5mbG9hdEF3YXJlQ29tcGFyZT1mdW5jdGlvbihhLGIpe3JldHVybiBnb29nLnN0cmluZy5udW1iZXJBd2FyZUNvbXBhcmVfKGEsYiwvXGQrfFwuXGQrfFxEKy9nKX07Z29vZy5zdHJpbmcubnVtZXJhdGVDb21wYXJlPWdvb2cuc3RyaW5nLmZsb2F0QXdhcmVDb21wYXJlO2dvb2cuc3RyaW5nLnVybEVuY29kZT1mdW5jdGlvbihhKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhhKSl9O2dvb2cuc3RyaW5nLnVybERlY29kZT1mdW5jdGlvbihhKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGEucmVwbGFjZSgvXCsvZywiICIpKX07Z29vZy5zdHJpbmcubmV3TGluZVRvQnI9Z29vZy5zdHJpbmcuaW50ZXJuYWwubmV3TGluZVRvQnI7Cmdvb2cuc3RyaW5nLmh0bWxFc2NhcGU9ZnVuY3Rpb24oYSxiKXthPWdvb2cuc3RyaW5nLmludGVybmFsLmh0bWxFc2NhcGUoYSxiKTtnb29nLnN0cmluZy5ERVRFQ1RfRE9VQkxFX0VTQ0FQSU5HJiYoYT1hLnJlcGxhY2UoZ29vZy5zdHJpbmcuRV9SRV8sIiYjMTAxOyIpKTtyZXR1cm4gYX07Z29vZy5zdHJpbmcuRV9SRV89L2UvZztnb29nLnN0cmluZy51bmVzY2FwZUVudGl0aWVzPWZ1bmN0aW9uKGEpe3JldHVybiBnb29nLnN0cmluZy5jb250YWlucyhhLCImIik/IWdvb2cuc3RyaW5nLkZPUkNFX05PTl9ET01fSFRNTF9VTkVTQ0FQSU5HJiYiZG9jdW1lbnQiaW4gZ29vZy5nbG9iYWw/Z29vZy5zdHJpbmcudW5lc2NhcGVFbnRpdGllc1VzaW5nRG9tXyhhKTpnb29nLnN0cmluZy51bmVzY2FwZVB1cmVYbWxFbnRpdGllc18oYSk6YX07Cmdvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXNXaXRoRG9jdW1lbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ29vZy5zdHJpbmcuY29udGFpbnMoYSwiJiIpP2dvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXNVc2luZ0RvbV8oYSxiKTphfTsKZ29vZy5zdHJpbmcudW5lc2NhcGVFbnRpdGllc1VzaW5nRG9tXz1mdW5jdGlvbihhLGIpe2NvbnN0IGM9eyImYW1wOyI6IiYiLCImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIid9O2xldCBkO2Q9Yj9iLmNyZWF0ZUVsZW1lbnQoImRpdiIpOmdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBhLnJlcGxhY2UoZ29vZy5zdHJpbmcuSFRNTF9FTlRJVFlfUEFUVEVSTl8sZnVuY3Rpb24oZSxmKXtsZXQgZz1jW2VdO2lmKGcpcmV0dXJuIGc7IiMiPT1mLmNoYXJBdCgwKSYmKGY9TnVtYmVyKCIwIitmLnNsaWNlKDEpKSxpc05hTihmKXx8KGc9U3RyaW5nLmZyb21DaGFyQ29kZShmKSkpO2d8fChnb29nLmRvbS5zYWZlLnNldElubmVySHRtbChkLGdvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucy5zYWZlSHRtbEZyb21TdHJpbmdLbm93blRvU2F0aXNmeVR5cGVDb250cmFjdChnb29nLnN0cmluZy5Db25zdC5mcm9tKCJTaW5nbGUgSFRNTCBlbnRpdHkuIiksCmUrIiAiKSksZz1kLmZpcnN0Q2hpbGQubm9kZVZhbHVlLnNsaWNlKDAsLTEpKTtyZXR1cm4gY1tlXT1nfSl9O2dvb2cuc3RyaW5nLnVuZXNjYXBlUHVyZVhtbEVudGl0aWVzXz1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC8mKFteO10rKTsvZyxmdW5jdGlvbihiLGMpe3N3aXRjaChjKXtjYXNlICJhbXAiOnJldHVybiImIjtjYXNlICJsdCI6cmV0dXJuIjwiO2Nhc2UgImd0IjpyZXR1cm4iPiI7Y2FzZSAicXVvdCI6cmV0dXJuJyInO2RlZmF1bHQ6cmV0dXJuIiMiIT1jLmNoYXJBdCgwKXx8KGM9TnVtYmVyKCIwIitjLnNsaWNlKDEpKSxpc05hTihjKSk/YjpTdHJpbmcuZnJvbUNoYXJDb2RlKGMpfX0pfTtnb29nLnN0cmluZy5IVE1MX0VOVElUWV9QQVRURVJOXz0vJihbXjtcczwmXSspOz8vZztnb29nLnN0cmluZy53aGl0ZXNwYWNlRXNjYXBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdvb2cuc3RyaW5nLm5ld0xpbmVUb0JyKGEucmVwbGFjZSgvICAvZywiICYjMTYwOyIpLGIpfTsKZ29vZy5zdHJpbmcucHJlc2VydmVTcGFjZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvKF58W1xuIF0pIC9nLCIkMSIrZ29vZy5zdHJpbmcuVW5pY29kZS5OQlNQKX07Z29vZy5zdHJpbmcuc3RyaXBRdW90ZXM9ZnVuY3Rpb24oYSxiKXtjb25zdCBjPWIubGVuZ3RoO2ZvcihsZXQgZD0wO2Q8YztkKyspe2NvbnN0IGU9MT09Yz9iOmIuY2hhckF0KGQpO2lmKGEuY2hhckF0KDApPT1lJiZhLmNoYXJBdChhLmxlbmd0aC0xKT09ZSlyZXR1cm4gYS5zdWJzdHJpbmcoMSxhLmxlbmd0aC0xKX1yZXR1cm4gYX07Z29vZy5zdHJpbmcudHJ1bmNhdGU9ZnVuY3Rpb24oYSxiLGMpe2MmJihhPWdvb2cuc3RyaW5nLnVuZXNjYXBlRW50aXRpZXMoYSkpO2EubGVuZ3RoPmImJihhPWEuc3Vic3RyaW5nKDAsYi0zKSsiLi4uIik7YyYmKGE9Z29vZy5zdHJpbmcuaHRtbEVzY2FwZShhKSk7cmV0dXJuIGF9Owpnb29nLnN0cmluZy50cnVuY2F0ZU1pZGRsZT1mdW5jdGlvbihhLGIsYyxkKXtjJiYoYT1nb29nLnN0cmluZy51bmVzY2FwZUVudGl0aWVzKGEpKTtpZihkJiZhLmxlbmd0aD5iKXtkPmImJihkPWIpO3ZhciBlPWEubGVuZ3RoLWQ7YT1hLnN1YnN0cmluZygwLGItZCkrIi4uLiIrYS5zdWJzdHJpbmcoZSl9ZWxzZSBhLmxlbmd0aD5iJiYoZD1NYXRoLmZsb29yKGIvMiksZT1hLmxlbmd0aC1kLGE9YS5zdWJzdHJpbmcoMCxkK2IlMikrIi4uLiIrYS5zdWJzdHJpbmcoZSkpO2MmJihhPWdvb2cuc3RyaW5nLmh0bWxFc2NhcGUoYSkpO3JldHVybiBhfTtnb29nLnN0cmluZy5zcGVjaWFsRXNjYXBlQ2hhcnNfPXsiXHgwMCI6IlxcMCIsIlxiIjoiXFxiIiwiXGYiOiJcXGYiLCJcbiI6IlxcbiIsIlxyIjoiXFxyIiwiXHQiOiJcXHQiLCJcdiI6IlxceDBCIiwnIic6J1xcIicsIlxcIjoiXFxcXCIsIjwiOiJcXHUwMDNDIn07Z29vZy5zdHJpbmcuanNFc2NhcGVDYWNoZV89eyInIjoiXFwnIn07Cmdvb2cuc3RyaW5nLnF1b3RlPWZ1bmN0aW9uKGEpe2E9U3RyaW5nKGEpO2NvbnN0IGI9WyciJ107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspe2NvbnN0IGQ9YS5jaGFyQXQoYyksZT1kLmNoYXJDb2RlQXQoMCk7YltjKzFdPWdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc19bZF18fCgzMTxlJiYxMjc+ZT9kOmdvb2cuc3RyaW5nLmVzY2FwZUNoYXIoZCkpfWIucHVzaCgnIicpO3JldHVybiBiLmpvaW4oIiIpfTtnb29nLnN0cmluZy5lc2NhcGVTdHJpbmc9ZnVuY3Rpb24oYSl7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliW2NdPWdvb2cuc3RyaW5nLmVzY2FwZUNoYXIoYS5jaGFyQXQoYykpO3JldHVybiBiLmpvaW4oIiIpfTsKZ29vZy5zdHJpbmcuZXNjYXBlQ2hhcj1mdW5jdGlvbihhKXtpZihhIGluIGdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfKXJldHVybiBnb29nLnN0cmluZy5qc0VzY2FwZUNhY2hlX1thXTtpZihhIGluIGdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc18pcmV0dXJuIGdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfW2FdPWdvb2cuc3RyaW5nLnNwZWNpYWxFc2NhcGVDaGFyc19bYV07bGV0IGI7Y29uc3QgYz1hLmNoYXJDb2RlQXQoMCk7aWYoMzE8YyYmMTI3PmMpYj1hO2Vsc2V7aWYoMjU2PmMpe2lmKGI9IlxceCIsMTY+Y3x8MjU2PGMpYis9IjAifWVsc2UgYj0iXFx1Iiw0MDk2PmMmJihiKz0iMCIpO2IrPWMudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9cmV0dXJuIGdvb2cuc3RyaW5nLmpzRXNjYXBlQ2FjaGVfW2FdPWJ9O2dvb2cuc3RyaW5nLmNvbnRhaW5zPWdvb2cuc3RyaW5nLmludGVybmFsLmNvbnRhaW5zOwpnb29nLnN0cmluZy5jYXNlSW5zZW5zaXRpdmVDb250YWlucz1nb29nLnN0cmluZy5pbnRlcm5hbC5jYXNlSW5zZW5zaXRpdmVDb250YWlucztnb29nLnN0cmluZy5jb3VudE9mPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJmI/YS5zcGxpdChiKS5sZW5ndGgtMTowfTtnb29nLnN0cmluZy5yZW1vdmVBdD1mdW5jdGlvbihhLGIsYyl7bGV0IGQ9YTswPD1iJiZiPGEubGVuZ3RoJiYwPGMmJihkPWEuc2xpY2UoMCxiKSthLnNsaWNlKGIrYykpO3JldHVybiBkfTtnb29nLnN0cmluZy5yZW1vdmU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5yZXBsYWNlKGIsIiIpfTtnb29nLnN0cmluZy5yZW1vdmVBbGw9ZnVuY3Rpb24oYSxiKXtiPW5ldyBSZWdFeHAoZ29vZy5zdHJpbmcucmVnRXhwRXNjYXBlKGIpLCJnIik7cmV0dXJuIGEucmVwbGFjZShiLCIiKX07Cmdvb2cuc3RyaW5nLnJlcGxhY2VBbGw9ZnVuY3Rpb24oYSxiLGMpe2I9bmV3IFJlZ0V4cChnb29nLnN0cmluZy5yZWdFeHBFc2NhcGUoYiksImciKTtyZXR1cm4gYS5yZXBsYWNlKGIsYy5yZXBsYWNlKC9cJC9nLCIkJCQkIikpfTtnb29nLnN0cmluZy5yZWdFeHBFc2NhcGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC8oWy0oKVxbXF17fSs/Ki4kXF58LDojPCFcXF0pL2csIlxcJDEiKS5yZXBsYWNlKC9ceDA4L2csIlxceDA4Iil9O2dvb2cuc3RyaW5nLnJlcGVhdD1TdHJpbmcucHJvdG90eXBlLnJlcGVhdD9mdW5jdGlvbihhLGIpe3JldHVybiBhLnJlcGVhdChiKX06ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQXJyYXkoYisxKS5qb2luKGEpfTsKZ29vZy5zdHJpbmcucGFkTnVtYmVyPWZ1bmN0aW9uKGEsYixjKXtpZighTnVtYmVyLmlzRmluaXRlKGEpKXJldHVybiBTdHJpbmcoYSk7YT12b2lkIDAhPT1jP2EudG9GaXhlZChjKTpTdHJpbmcoYSk7Yz1hLmluZGV4T2YoIi4iKTstMT09PWMmJihjPWEubGVuZ3RoKTtjb25zdCBkPSItIj09PWFbMF0/Ii0iOiIiO2QmJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gZCtnb29nLnN0cmluZy5yZXBlYXQoIjAiLE1hdGgubWF4KDAsYi1jKSkrYX07Z29vZy5zdHJpbmcubWFrZVNhZmU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6U3RyaW5nKGEpfTtnb29nLnN0cmluZy5nZXRSYW5kb21TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcigyMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KStNYXRoLmFicyhNYXRoLmZsb29yKDIxNDc0ODM2NDgqTWF0aC5yYW5kb20oKSleZ29vZy5ub3coKSkudG9TdHJpbmcoMzYpfTsKZ29vZy5zdHJpbmcuY29tcGFyZVZlcnNpb25zPWdvb2cuc3RyaW5nLmludGVybmFsLmNvbXBhcmVWZXJzaW9ucztnb29nLnN0cmluZy5oYXNoQ29kZT1mdW5jdGlvbihhKXtsZXQgYj0wO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7KytjKWI9MzEqYithLmNoYXJDb2RlQXQoYyk+Pj4wO3JldHVybiBifTtnb29nLnN0cmluZy51bmlxdWVTdHJpbmdDb3VudGVyXz0yMTQ3NDgzNjQ4Kk1hdGgucmFuZG9tKCl8MDtnb29nLnN0cmluZy5jcmVhdGVVbmlxdWVTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iZ29vZ18iK2dvb2cuc3RyaW5nLnVuaXF1ZVN0cmluZ0NvdW50ZXJfKyt9O2dvb2cuc3RyaW5nLnRvTnVtYmVyPWZ1bmN0aW9uKGEpe2NvbnN0IGI9TnVtYmVyKGEpO3JldHVybiAwPT1iJiZnb29nLnN0cmluZy5pc0VtcHR5T3JXaGl0ZXNwYWNlKGEpP05hTjpifTtnb29nLnN0cmluZy5pc0xvd2VyQ2FtZWxDYXNlPWZ1bmN0aW9uKGEpe3JldHVybi9eW2Etel0rKFtBLVpdW2Etel0qKSokLy50ZXN0KGEpfTsKZ29vZy5zdHJpbmcuaXNVcHBlckNhbWVsQ2FzZT1mdW5jdGlvbihhKXtyZXR1cm4vXihbQS1aXVthLXpdKikrJC8udGVzdChhKX07Z29vZy5zdHJpbmcudG9DYW1lbENhc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC9cLShbYS16XSkvZyxmdW5jdGlvbihiLGMpe3JldHVybiBjLnRvVXBwZXJDYXNlKCl9KX07Z29vZy5zdHJpbmcudG9TZWxlY3RvckNhc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKS5yZXBsYWNlKC8oW0EtWl0pL2csIi0kMSIpLnRvTG93ZXJDYXNlKCl9O2dvb2cuc3RyaW5nLnRvVGl0bGVDYXNlPWZ1bmN0aW9uKGEsYil7Yj0ic3RyaW5nIj09PXR5cGVvZiBiP2dvb2cuc3RyaW5nLnJlZ0V4cEVzY2FwZShiKToiXFxzIjtyZXR1cm4gYS5yZXBsYWNlKG5ldyBSZWdFeHAoIiheIisoYj8ifFsiK2IrIl0rIjoiIikrIikoW2Etel0pIiwiZyIpLGZ1bmN0aW9uKGMsZCxlKXtyZXR1cm4gZCtlLnRvVXBwZXJDYXNlKCl9KX07Cmdvb2cuc3RyaW5nLmNhcGl0YWxpemU9ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhLmNoYXJBdCgwKSkudG9VcHBlckNhc2UoKStTdHJpbmcoYS5zbGljZSgxKSkudG9Mb3dlckNhc2UoKX07Z29vZy5zdHJpbmcucGFyc2VJbnQ9ZnVuY3Rpb24oYSl7aXNGaW5pdGUoYSkmJihhPVN0cmluZyhhKSk7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYT8vXlxzKi0/MHgvaS50ZXN0KGEpP3BhcnNlSW50KGEsMTYpOnBhcnNlSW50KGEsMTApOk5hTn07Z29vZy5zdHJpbmcuc3BsaXRMaW1pdD1mdW5jdGlvbihhLGIsYyl7YT1hLnNwbGl0KGIpO2NvbnN0IGQ9W107Zm9yKDswPGMmJmEubGVuZ3RoOylkLnB1c2goYS5zaGlmdCgpKSxjLS07YS5sZW5ndGgmJmQucHVzaChhLmpvaW4oYikpO3JldHVybiBkfTsKZ29vZy5zdHJpbmcubGFzdENvbXBvbmVudD1mdW5jdGlvbihhLGIpe2lmKGIpInN0cmluZyI9PXR5cGVvZiBiJiYoYj1bYl0pO2Vsc2UgcmV0dXJuIGE7bGV0IGM9LTE7Zm9yKGxldCBkPTA7ZDxiLmxlbmd0aDtkKyspe2lmKCIiPT1iW2RdKWNvbnRpbnVlO2NvbnN0IGU9YS5sYXN0SW5kZXhPZihiW2RdKTtlPmMmJihjPWUpfXJldHVybi0xPT1jP2E6YS5zbGljZShjKzEpfTsKZ29vZy5zdHJpbmcuZWRpdERpc3RhbmNlPWZ1bmN0aW9uKGEsYil7Y29uc3QgYz1bXSxkPVtdO2lmKGE9PWIpcmV0dXJuIDA7aWYoIWEubGVuZ3RofHwhYi5sZW5ndGgpcmV0dXJuIE1hdGgubWF4KGEubGVuZ3RoLGIubGVuZ3RoKTtmb3IodmFyIGU9MDtlPGIubGVuZ3RoKzE7ZSsrKWNbZV09ZTtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtkWzBdPWUrMTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylkW2YrMV09TWF0aC5taW4oZFtmXSsxLGNbZisxXSsxLGNbZl0rTnVtYmVyKGFbZV0hPWJbZl0pKTtmb3IoZj0wO2Y8Yy5sZW5ndGg7ZisrKWNbZl09ZFtmXX1yZXR1cm4gZFtiLmxlbmd0aF19O2dvb2cuc3RyaW5nLnBhdGg9e307Z29vZy5zdHJpbmcucGF0aC5iYXNlTmFtZT1mdW5jdGlvbihhKXtjb25zdCBiPWEubGFzdEluZGV4T2YoIi8iKSsxO3JldHVybiBhLnNsaWNlKGIpfTtnb29nLnN0cmluZy5wYXRoLmJhc2VuYW1lPWdvb2cuc3RyaW5nLnBhdGguYmFzZU5hbWU7Z29vZy5zdHJpbmcucGF0aC5kaXJuYW1lPWZ1bmN0aW9uKGEpe2NvbnN0IGI9YS5sYXN0SW5kZXhPZigiLyIpKzE7YT1hLnNsaWNlKDAsYik7L15cLyskLy50ZXN0KGEpfHwoYT1hLnJlcGxhY2UoL1wvKyQvLCIiKSk7cmV0dXJuIGF9O2dvb2cuc3RyaW5nLnBhdGguZXh0ZW5zaW9uPWZ1bmN0aW9uKGEpe2E9Z29vZy5zdHJpbmcucGF0aC5iYXNlTmFtZShhKS5yZXBsYWNlKC9cLisvZywiLiIpO2NvbnN0IGI9YS5sYXN0SW5kZXhPZigiLiIpO3JldHVybiAwPj1iPyIiOmEuc2xpY2UoYisxKX07Cmdvb2cuc3RyaW5nLnBhdGguam9pbj1mdW5jdGlvbihhKXtsZXQgYj1hcmd1bWVudHNbMF07Zm9yKGxldCBjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7Y29uc3QgZD1hcmd1bWVudHNbY107Yj1nb29nLnN0cmluZy5zdGFydHNXaXRoKGQsIi8iKT9kOiIiPT1ifHxnb29nLnN0cmluZy5lbmRzV2l0aChiLCIvIik/YitkOmIrKCIvIitkKX1yZXR1cm4gYn07Cmdvb2cuc3RyaW5nLnBhdGgubm9ybWFsaXplUGF0aD1mdW5jdGlvbihhKXtpZigiIj09YSlyZXR1cm4iLiI7bGV0IGI9IiI7Z29vZy5zdHJpbmcuc3RhcnRzV2l0aChhLCIvIikmJihiPSIvIixnb29nLnN0cmluZy5zdGFydHNXaXRoKGEsIi8vIikmJiFnb29nLnN0cmluZy5zdGFydHNXaXRoKGEsIi8vLyIpJiYoYj0iLy8iKSk7YT1hLnNwbGl0KCIvIik7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdOyIiIT1lJiYiLiIhPWUmJigiLi4iIT1lfHwhYiYmIWMubGVuZ3RofHwiLi4iPT1tb2R1bGUkY29udGVudHMkZ29vZyRhcnJheV9wZWVrKGMpP2MucHVzaChlKTpjLnBvcCgpKX1yZXR1cm4gYitjLmpvaW4oIi8iKXx8Ii4ifTtnb29nLnN0cmluZy5wYXRoLnNwbGl0PWZ1bmN0aW9uKGEpe2NvbnN0IGI9Z29vZy5zdHJpbmcucGF0aC5kaXJuYW1lKGEpO2E9Z29vZy5zdHJpbmcucGF0aC5iYXNlTmFtZShhKTtyZXR1cm5bYixhXX07Y29uc3QgREVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2k9ITE7ZnVuY3Rpb24gYXNzZXJ0TGVhZGluZ1NsYXNoJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaShhKXtyZXR1cm4vXlwvL2cudGVzdChhKT9hOmAvJHthfWB9ZnVuY3Rpb24gcmVtb3ZlTGVhZGluZ1NsYXNoJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaShhKXtyZXR1cm4gYS5yZXBsYWNlKC9eXC8vZywiIil9ZnVuY3Rpb24gc2hvdWxkT3BlblJlYWRlciQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koYSl7cmV0dXJuKGEmKFdBU0lfUklHSFRfRkRfUkVBRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c3xXQVNJX1JJR0hUX0ZEX1JFQURESVIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMpKSE9PWdvb2cuZ2xvYmFsLkJpZ0ludCgwKX0KZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3dQb2x5JCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSgpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIHBlcmZvcm1hbmNlfHwidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3cpe2NvbnN0IGE9RGF0ZS5ub3coKTtyZXR1cm4gRGF0ZS5ub3coKS1hfXJldHVybiBwZXJmb3JtYW5jZS5ub3coKX1mdW5jdGlvbiBjb25jYXRVaW50OEFycmF5cyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koYSl7dmFyIGI9YS5yZWR1Y2UoKGQsZSk9PmQrZS5sZW5ndGgsMCk7aWYoMCE9PWEubGVuZ3RoKXtiPW5ldyBVaW50OEFycmF5KGIpO3ZhciBjPTA7Zm9yKGNvbnN0IGQgb2YgYSliLnNldChkLGMpLGMrPWQubGVuZ3RoO3JldHVybiBifX0KY29uc3QgV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2k9ZnVuY3Rpb24oe30pe3RoaXMuZmQ9QXJyYXkuZnJvbSh7bGVuZ3RoOjR9KTt0aGlzLmZkWzBdPXtmZDowLHBhdGg6Ii9kZXYvc3RkaW4iLHNlZWtQb3M6Z29vZy5nbG9iYWwuQmlnSW50KDApLGJ1ZmZlcnM6W10sb3BlbjohMX07dGhpcy5mZFsxXT17ZmQ6MSxwYXRoOiIvZGV2L3N0ZG91dCIsc2Vla1Bvczpnb29nLmdsb2JhbC5CaWdJbnQoMCksYnVmZmVyczpbXSxvcGVuOiExfTt0aGlzLmZkWzJdPXtmZDoyLHBhdGg6Ii9kZXYvc3RkZXJyIixzZWVrUG9zOmdvb2cuZ2xvYmFsLkJpZ0ludCgwKSxidWZmZXJzOltdLG9wZW46ITF9O3RoaXMuZmRbM109e2ZkOjMscGF0aDoiLyIsc2Vla1Bvczpnb29nLmdsb2JhbC5CaWdJbnQoMCksYnVmZmVyczpbXSxvcGVuOiExfTt0aGlzLmdldE1lbW9yeT10aGlzLmdldE1lbW9yeS5iaW5kKHRoaXMpO3RoaXMuQ1BVVElNRV9TVEFSVD0wfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGEpe3RoaXMuQ1BVVElNRV9TVEFSVD1wZXJmb3JtYW5jZU5vd1BvbHkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpKCk7YS5leHBvcnRzLl9zdGFydCgpfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuZ2V0SW1wb3J0cz1mdW5jdGlvbihhKXtjb25zdCBiPXt9O2E9V2ViQXNzZW1ibHkuTW9kdWxlLmltcG9ydHMoYSk7Zm9yKGNvbnN0IGMgb2YgYSkiZnVuY3Rpb24iPT09Yy5raW5kJiZjLm1vZHVsZS5zdGFydHNXaXRoKCJ3YXNpXyIpJiYoIm9iamVjdCIhPT10eXBlb2YgYltjLm1vZHVsZV0mJihiW2MubW9kdWxlXT17fSksYltjLm1vZHVsZV1bYy5uYW1lXT10aGlzW2MubmFtZV0uYmluZCh0aGlzKSk7cmV0dXJuIGJ9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuc2V0TWVtb3J5PWZ1bmN0aW9uKGEpe3RoaXMubWVtb3J5PWF9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5nZXRNZW1vcnk9ZnVuY3Rpb24oKXt0aGlzLnZpZXcmJnRoaXMudmlldy5idWZmZXImJnRoaXMudmlldy5idWZmZXIuYnl0ZUxlbmd0aHx8KHRoaXMudmlldz1uZXcgRGF0YVZpZXcodGhpcy5tZW1vcnkuYnVmZmVyKSk7cmV0dXJuIHRoaXMudmlld307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLm1zVG9Ocz1mdW5jdGlvbihhKXtjb25zdCBiPU1hdGgudHJ1bmMoYSk7YT1nb29nLmdsb2JhbC5CaWdJbnQoTWF0aC5yb3VuZCgxRTYqKGEtYikpKTtyZXR1cm4gZ29vZy5nbG9iYWwuQmlnSW50KGIpKmdvb2cuZ2xvYmFsLkJpZ0ludCgxRTYpK2F9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUubm93PWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIFdBU0lfQ0xPQ0tfTU9OT1RPTklDJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOnJldHVybiBNYXRoLmZsb29yKHBlcmZvcm1hbmNlTm93UG9seSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koKSk7Y2FzZSBXQVNJX0NMT0NLX1JFQUxUSU1FJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOnJldHVybiB0aGlzLm1zVG9OcyhEYXRlLm5vdygpKTtjYXNlIFdBU0lfQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOmNhc2UgV0FTSV9DTE9DS19USFJFQURfQ1BVVElNRV9JRCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czpyZXR1cm4gTWF0aC5mbG9vcihwZXJmb3JtYW5jZU5vd1BvbHkkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpKCktdGhpcy5DUFVUSU1FX1NUQVJUKTsKZGVmYXVsdDpyZXR1cm4gMH19O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5hcmdzX2dldD1mdW5jdGlvbihhLGIpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiYXJnc19nZXQiLGEsYixtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmFyZ3Nfc2l6ZXNfZ2V0PWZ1bmN0aW9uKGEsYil7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJhcmdzX3NpemVzX2dldCIsYSxiLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuY2xvY2tfcmVzX2dldD1mdW5jdGlvbihhLGIpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiYXJnc19nZXQiLGEsYixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuY2xvY2tfdGltZV9nZXQ9ZnVuY3Rpb24oYSxiLGMpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiY2xvY2tfdGltZV9nZXQiLGEsYixjLGFyZ3VtZW50cyk7Y29uc3QgZD10aGlzLmdldE1lbW9yeSgpLGU9dGhpcy5ub3coYSk7ZC5zZXRCaWdVaW50NjQoYyxnb29nLmdsb2JhbC5CaWdJbnQoZSksITApO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmVudmlyb25fZ2V0PWZ1bmN0aW9uKGEsYil7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJlbnZpcm9uX2dldCIsYSxiLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5lbnZpcm9uX3NpemVzX2dldD1mdW5jdGlvbihhLGIpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZW52aXJvbl9zaXplc19nZXQiLGEsYixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX2FkdmlzZT1mdW5jdGlvbihhLGIsYyxkKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX2FkdmlzZSIsYSxiLGMsZCxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VOT1NZUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX2FsbG9jYXRlPWZ1bmN0aW9uKGEsYixjKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX2FsbG9jYXRlIixhLGIsYyxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VOT1NZUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5mZF9jbG9zZT1mdW5jdGlvbihhKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX2Nsb3NlIixhLGFyZ3VtZW50cyk7dGhpcy5mZFthXSYmKHRoaXMuZmRbYV0ub3Blbj0hMSk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5mZF9kYXRhc3luYz1mdW5jdGlvbihhKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX2RhdGFzeW5jIixhLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuZmRfZmRzdGF0X2dldD1mdW5jdGlvbihhLGIpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfZmRzdGF0X2dldCIsYSxiLGFyZ3VtZW50cyk7Y29uc3QgYz10aGlzLmdldE1lbW9yeSgpO2Muc2V0VWludDgoYis0LFdBU0lfRklMRVRZUEVfUkVHVUxBUl9GSUxFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzKTtjLnNldFVpbnQxNihiKzIsMCwhMCk7Yy5zZXRVaW50MTYoYis0LDAsITApO2Muc2V0QmlnVWludDY0KGIrOCxnb29nLmdsb2JhbC5CaWdJbnQoUklHSFRTX1JFR1VMQVJfRklMRV9CQVNFJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzKSwhMCk7Yy5zZXRCaWdVaW50NjQoYis4KzgsZ29vZy5nbG9iYWwuQmlnSW50KFJJR0hUU19SRUdVTEFSX0ZJTEVfSU5IRVJJVElORyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50cyksCiEwKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX2Zkc3RhdF9zZXRfZmxhZ3M9ZnVuY3Rpb24oYSxiKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX2Zkc3RhdF9zZXRfZmxhZ3MiLGEsYixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VOT1NZUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX2Zkc3RhdF9zZXRfcmlnaHRzPWZ1bmN0aW9uKGEsYixjKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX2Zkc3RhdF9zZXRfcmlnaHRzIixhLGIsYyxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX2ZpbGVzdGF0X2dldD1mdW5jdGlvbihhLGIpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfZmlsZXN0YXRfZ2V0IixhLGIsYXJndW1lbnRzKTtsZXQgYz0wO3RoaXMuZmRbYV0mJihjPXRoaXMuZmRbYV0uYnVmZmVycy5yZWR1Y2UoZnVuY3Rpb24oZSxmKXtyZXR1cm4gZSsobnVsbD09Zj92b2lkIDA6Zi5ieXRlTGVuZ3RoKT9udWxsPT1mP3ZvaWQgMDpmLmJ5dGVMZW5ndGg6MH0sMCkpO2NvbnN0IGQ9dGhpcy5nZXRNZW1vcnkoKTtkLnNldEJpZ1VpbnQ2NChiLGdvb2cuZ2xvYmFsLkJpZ0ludChhKSwhMCk7Yis9ODtkLnNldEJpZ1VpbnQ2NChiLGdvb2cuZ2xvYmFsLkJpZ0ludChhKSwhMCk7Yis9ODtkLnNldFVpbnQ4KGIsV0FTSV9GSUxFVFlQRV9SRUdVTEFSX0ZJTEUkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMpO2IrPTg7ZC5zZXRCaWdVaW50NjQoYiwKZ29vZy5nbG9iYWwuQmlnSW50KDEpLCEwKTtiKz04O2Quc2V0QmlnVWludDY0KGIsZ29vZy5nbG9iYWwuQmlnSW50KGMpLCEwKTtiKz04O2Quc2V0QmlnVWludDY0KGIsdGhpcy5tc1RvTnModGhpcy5DUFVUSU1FX1NUQVJUKSwhMCk7Yis9ODtkLnNldEJpZ1VpbnQ2NChiLHRoaXMubXNUb05zKHRoaXMuQ1BVVElNRV9TVEFSVCksITApO2Quc2V0QmlnVWludDY0KGIrOCx0aGlzLm1zVG9Ocyh0aGlzLkNQVVRJTUVfU1RBUlQpLCEwKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX2ZpbGVzdGF0X3NldF9zaXplPWZ1bmN0aW9uKGEsYil7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJmZF9maWxlc3RhdF9zZXRfc2l6ZSIsYSxiLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuZmRfZmlsZXN0YXRfc2V0X3RpbWVzPWZ1bmN0aW9uKGEsYixjLGQpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfZmlsZXN0YXRfc2V0X3RpbWVzIixhLGIsYyxkLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5mZF9wcmVhZD1mdW5jdGlvbihhLGIsYyxkLGUpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfcHJlYWQiLGEsYixjLGQsZSxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX3ByZXN0YXRfZGlyX25hbWU9ZnVuY3Rpb24oYSxiLGMpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfcHJlc3RhdF9kaXJfbmFtZSIsYSxiLGMsdGhpcy5mZFthXSk7aWYoIXRoaXMuZmRbYV0mJiF0aGlzLmZkW2EtMV0pcmV0dXJuIFdBU0lfRUJBREYkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7KHtwYXRoOmN9PXRoaXMuZmRbYV0pO2E9dGhpcy5nZXRNZW1vcnkoKTtjPWVuY29kZXIkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycy5lbmNvZGUoYyk7KG5ldyBVaW50OEFycmF5KGEuYnVmZmVyKSkuc2V0KGMsYik7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuZmRfcHJlc3RhdF9nZXQ9ZnVuY3Rpb24oYSxiKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX3ByZXN0YXRfZ2V0IixhLGIsdGhpcy5mZFthXSk7aWYoIXRoaXMuZmRbYV0pcmV0dXJuIFdBU0lfRUJBREYkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7dmFyIHtwYXRoOmN9PXRoaXMuZmRbYV07YT10aGlzLmdldE1lbW9yeSgpO2M9ZW5jb2RlciQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzLmVuY29kZShjKTthLnNldFVpbnQ4KGIsV0FTSV9QUkVPUEVOVFlQRV9ESVIkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHMpO2Euc2V0VWludDMyKGIrNCxjLmJ5dGVMZW5ndGgsITApO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX3B3cml0ZT1mdW5jdGlvbihhLGIsYyxkLGUpe2NvbnNvbGUubG9nKCJmZF9wd3JpdGUiLGEsYixjLGQsZSxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX3JlYWQ9ZnVuY3Rpb24oYSxiLGMsZCl7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJmZF9yZWFkIixhLGIsYyxkLGFyZ3VtZW50cyk7Y29uc3QgZT10aGlzLmZkW2FdJiZ0aGlzLmZkW2FdLmJ1ZmZlcnM7dmFyIGY9ZS5yZWR1Y2UoKG4scCk9Pm4rcC5sZW5ndGgsMCk7Y29uc3QgZz10aGlzLmdldE1lbW9yeSgpO2lmKGUmJjAhPT1lLmxlbmd0aCl7dmFyIGg9TnVtYmVyKHRoaXMuZmRbYV0uc2Vla1Bvcyksaz0wLGw9ITE7aWYoaD49ZilyZXR1cm4gaz1nLmdldFVpbnQzMihiLCEwKSxnLnNldFVpbnQ4KGssIlx4MDAiKSxnLnNldFVpbnQzMihkLDAsITApLFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHM7Zm9yKGY9MDtmPGM7ZisrKXt2YXIgbT1iKzgqZjtjb25zdCBuPWcuZ2V0VWludDMyKG0sITApO209Zy5nZXRVaW50MzIobSsKNCwhMCk7bHx8KGsrPW0sQXJyYXkuZnJvbSh7bGVuZ3RoOm19LChwLHEpPT5xKS5yZWR1Y2UoKHAscSk9PntpZihsKXJldHVybiBwO2NvbnN0IFt1LHRdPXA7bGV0IHY9cD0wLEE9ITEseT0wLHI7aWYoMD09PXEpZm9yKDshQTspcj1lW3BdP2VbcF0uYnl0ZUxlbmd0aDowLHk8PWgmJnIreT5oPyhBPSEwLHY9aC15KTooeSs9cixwKz0xKTtlbHNlIHA9dSx2PXQ7ZVtwXT8oZy5zZXRVaW50OChuK3EsZVtwXVt2XSksdisxPj1lW3BdLmJ5dGVMZW5ndGg/KHA9dSsxLHY9MCk6dis9MSk6KGcuc2V0VWludDgobitxLCJceDAwIiksaCs9cSxsPSEwKTtyZXR1cm5bcCx2XX0sWzAsMF0pLGx8fChoKz1tKSl9dGhpcy5mZFthXS5zZWVrUG9zPWdvb2cuZ2xvYmFsLkJpZ0ludChoKTtnLnNldFVpbnQzMihkLGssITApO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfWNvbnNvbGUuZXJyb3IoIlJlYWRpbmcgbm9uIGV4aXN0ZW50IGZpbGUiLGEsdGhpcy5mZFthXSl9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuZmRfcmVhZGRpcj1mdW5jdGlvbihhLGIsYyxkLGUpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfcmVhZGRpciIsYSxiLGMsZCxlLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5mZF9yZW51bWJlcj1mdW5jdGlvbihhLGIpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfcmVudW1iZXIiLGEsYixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX3NlZWs9ZnVuY3Rpb24oYSxiLGMsZCl7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJmZF9zZWVrIixhLGIsYyxkLGFyZ3VtZW50cyk7Y29uc3QgZT10aGlzLmdldE1lbW9yeSgpO3N3aXRjaChjKXtjYXNlIFdBU0lfV0hFTkNFX0NVUiQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czp2YXIgZjt0aGlzLmZkW2FdLnNlZWtQb3M9KG51bGwhPShmPXRoaXMuZmRbYV0uc2Vla1Bvcyk/Zjpnb29nLmdsb2JhbC5CaWdJbnQoMCkpK2dvb2cuZ2xvYmFsLkJpZ0ludChiKTticmVhaztjYXNlIFdBU0lfV0hFTkNFX0VORCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50czpmPSh0aGlzLmZkW2FdLmJ1ZmZlcnN8fFtdKS5yZWR1Y2UoKGcsaCk9PmcraC5sZW5ndGgsMCk7dGhpcy5mZFthXS5zZWVrUG9zPUJpZ0ludChmKStCaWdJbnQoYik7YnJlYWs7CmNhc2UgV0FTSV9XSEVOQ0VfU0VUJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOnRoaXMuZmRbYV0uc2Vla1Bvcz1CaWdJbnQoYil9ZS5zZXRCaWdVaW50NjQoZCx0aGlzLmZkW2FdLnNlZWtQb3MsITApO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuZmRfc3luYz1mdW5jdGlvbihhKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coImZkX3N5bmMiLGEsYXJndW1lbnRzKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5mZF90ZWxsPWZ1bmN0aW9uKGEsYil7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJmZF90ZWxsIixhLGIsYXJndW1lbnRzKTtjb25zdCBjPXRoaXMuZ2V0TWVtb3J5KCk7dGhpcy5mZFthXS5zZWVrUG9zfHwodGhpcy5mZFthXS5zZWVrUG9zPWdvb2cuZ2xvYmFsLkJpZ0ludCgwKSk7Yy5zZXRCaWdVaW50NjQoYix0aGlzLmZkW2FdLnNlZWtQb3MsITApO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZkX3dyaXRlPWZ1bmN0aW9uKGEsYixjLGQpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygiZmRfd3JpdGUiLHtmZDphLGlvdnM6Yixpb3ZzTGVuZ3RoOmMsbndyaXR0ZW46ZH0pO2NvbnN0IGU9dGhpcy5nZXRNZW1vcnkoKTt0aGlzLmZkW2FdLmJ1ZmZlcnM9dGhpcy5mZFthXS5idWZmZXJzfHxbXTt0aGlzLmZkW2FdLmJ1ZmZlcnM9MDx0aGlzLmZkW2FdLmJ1ZmZlcnMubGVuZ3RoP1tjb25jYXRVaW50OEFycmF5cyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kodGhpcy5mZFthXS5idWZmZXJzKV06dGhpcy5mZFthXS5idWZmZXJzO2xldCBmPTA7Zm9yKGxldCBrPTA7azxjO2srKyl7dmFyIGc9Yis4KmssaD1lLmdldFVpbnQzMihnLCEwKTtnPWUuZ2V0VWludDMyKGcrNCwhMCk7Zis9ZztoPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGgsZyk7aWYodGhpcy5mZFthXS5idWZmZXJzWzBdJiYKdGhpcy5mZFthXS5zZWVrUG9zPHRoaXMuZmRbYV0uYnVmZmVyc1swXS5sZW5ndGgpe2NvbnN0IGw9TnVtYmVyKHRoaXMuZmRbYV0uc2Vla1Bvcyk7aC5zbGljZSgwLGcpLmZvckVhY2goKG0sbik9Pnt0aGlzLmZkW2FdLmJ1ZmZlcnNbMF1bbCtuXT1tfSl9ZWxzZSB0aGlzLmZkW2FdLmJ1ZmZlcnMucHVzaChoLnNsaWNlKDAsZykpfXRoaXMuZmRbYV0uc2Vla1Bvcys9Z29vZy5nbG9iYWwuQmlnSW50KGYpO2Uuc2V0VWludDMyKGQsZiwhMCk7WzEsMl0uaW5jbHVkZXMoYSkmJmNvbnNvbGUubG9nKGRlY29kZXIkJG1vZHVsZSRzcmMkdXRpbHMkdGV4dF9lbmNvZGVycy5kZWNvZGUoY29uY2F0VWludDhBcnJheXMkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpKHRoaXMuZmRbYV0uYnVmZmVycykpKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5wYXRoX2NyZWF0ZV9kaXJlY3Rvcnk9ZnVuY3Rpb24oYSxiLGMpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygicGF0aF9jcmVhdGVfZGlyZWN0b3J5IixhLGIsYyxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUucGF0aF9maWxlc3RhdF9nZXQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInBhdGhfZmlsZXN0YXRfZ2V0IixhLGIsYyxkLGUsYXJndW1lbnRzKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5wYXRoX2ZpbGVzdGF0X3NldF90aW1lcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzIixhLGIsYyxkLGUsZixnLGFyZ3VtZW50cyk7cmV0dXJuIFdBU0lfRVNVQ0NFU1MkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSRjb25zdGFudHN9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5wYXRoX2xpbms9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJwYXRoX2xpbmsiLGEsYixjLGQsZSxmLGcsYXJndW1lbnRzKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5wYXRoX29wZW49ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGspe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygicGF0aF9vcGVuIixhLGIsYyxkLGUsZixnLGgsayxhcmd1bWVudHMpO2NvbnN0IGw9dGhpcy5nZXRNZW1vcnkoKTt2YXIgbT0odGhpcy5mZFthXXx8e3BhdGg6Ii8ifSkucGF0aCxuPW5ldyBVaW50OEFycmF5KGwuYnVmZmVyLGMsZCk7bj1kZWNvZGVyJCRtb2R1bGUkc3JjJHV0aWxzJHRleHRfZW5jb2RlcnMuZGVjb2RlKG4pO2NvbnN0IHA9YXNzZXJ0TGVhZGluZ1NsYXNoJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSgoMCxnb29nLnN0cmluZy5wYXRoLm5vcm1hbGl6ZVBhdGgpKGdvb2cuc3RyaW5nLnBhdGguam9pbigzPT09YT8iIjptLG4pKSk7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCI7OyBvcGVuaW5nIHBhdGgiLApwLCJ3aXRoUkVhZGVyIixzaG91bGRPcGVuUmVhZGVyJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaShmKSk7aWYocC5zdGFydHNXaXRoKCIvLi4iKXx8Ii8uXyI9PT1wfHwiLy5BcHBsZURvdWJsZSI9PT1wKXJldHVybiBXQVNJX0VCQURGJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzOyhtPU9iamVjdC52YWx1ZXModGhpcy5mZCkuZmluZChxPT5xLnBhdGg9PT1wJiZBcnJheS5pc0FycmF5KHEuYnVmZmVycykpKT9uPW0uZmQ6KG49dGhpcy5mZC5sZW5ndGgsdGhpcy5mZFtuXT17ZmQ6bn0pO3RoaXMuZmRbbl09ey4uLnRoaXMuZmRbbl0scGF0aDpwLHR5cGU6ImZpbGUiLHNlZWtQb3M6Z29vZy5nbG9iYWwuQmlnSW50KDApLGJ1ZmZlcnM6bT90aGlzLmZkW25dLmJ1ZmZlcnM6W10sb3BlbjohMH07c2hvdWxkT3BlblJlYWRlciQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koZikmJkRFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygic2hvdWxkIG9wZW4gYSByZWFkIGhhbmRsZSBmb3IiLApwKTtsLnNldFVpbnQzMihrLG4sITApO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUucGF0aF9yZWFkbGluaz1mdW5jdGlvbihhLGIsYyxkLGUsZil7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJwYXRoX3JlYWRsaW5rIixhLGIsYyxkLGUsZixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUucGF0aF9yZW1vdmVfZGlyZWN0b3J5PWZ1bmN0aW9uKGEsYixjKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInBhdGhfcmVtb3ZlX2RpcmVjdG9yeSIsYSxiLGMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnBhdGhfcmVuYW1lPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInBhdGhfcmVuYW1lIixhLGIsYyxkLGUsZixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUucGF0aF9zeW1saW5rPWZ1bmN0aW9uKGEsYixjLGQsZSl7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJwYXRoX3N5bWxpbmsiLGEsYixjLGQsZSxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnBhdGhfdW5saW5rX2ZpbGU9ZnVuY3Rpb24oYSxiLGMpezM8YSYmREVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJwYXRoX3VubGlua19maWxlIixhLGIsYyxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUucG9sbF9vbmVvZmY9ZnVuY3Rpb24oYSxiLGMsZCl7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJwb2xsX29uZW9mZiIsYSxiLGMsZCxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnByb2NfZXhpdD1mdW5jdGlvbihhKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInByb2NfZXhpdCIsYSxhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUucHJvY19yYWlzZT1mdW5jdGlvbihhKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInByb2NfcmFpc2UiLGEsYXJndW1lbnRzKTtyZXR1cm4gV0FTSV9FU1VDQ0VTUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5yYW5kb21fZ2V0PWZ1bmN0aW9uKGEsYil7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJyYW5kb21fZ2V0IixhLGIpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTtXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuc2NoZWRfeWllbGQ9ZnVuY3Rpb24oKXtERUJVR19XQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSYmY29uc29sZS5sb2coInNjaGVkX3lpZWxkIixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VTVUNDRVNTJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kY29uc3RhbnRzfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnNvY2tfcmVjdj1mdW5jdGlvbigpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygic29ja19yZWN2Iixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VOT1NZUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnNvY2tfc2VuZD1mdW5jdGlvbigpe0RFQlVHX1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpJiZjb25zb2xlLmxvZygic29ja19zZW5kIixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VOT1NZUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5zb2NrX3NodXRkb3duPWZ1bmN0aW9uKCl7REVCVUdfV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kmJmNvbnNvbGUubG9nKCJzb2NrX3NodXRkb3duIixhcmd1bWVudHMpO3JldHVybiBXQVNJX0VOT1NZUyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJGNvbnN0YW50c307V0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLmZpbmRCdWZmZXJzPWZ1bmN0aW9uKGEpe2NvbnN0IGI9T2JqZWN0LnZhbHVlcyh0aGlzLmZkKS5maW5kKCh7cGF0aDpjfSk9PmM9PT1hKTtyZXR1cm5bYiYmYi5idWZmZXJzLGIuZmRdfTsKV0FTSSQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2kucHJvdG90eXBlLnJlYWRkaXI9ZnVuY3Rpb24oYSl7Y29uc3QgYj0oYXNzZXJ0TGVhZGluZ1NsYXNoJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaSgoMCxnb29nLnN0cmluZy5wYXRoLm5vcm1hbGl6ZVBhdGgpKGEpKSsiLyIpLnJlcGxhY2UoIi8vIiwiLyIpLGM9W107T2JqZWN0LnZhbHVlcyh0aGlzLmZkKS5mb3JFYWNoKCh7cGF0aDpkfSk9PiEvXC8vZy50ZXN0KGQucmVwbGFjZShiLCIiKSkmJmMucHVzaChkKSk7cmV0dXJuIGMubWFwKGQ9PnJlbW92ZUxlYWRpbmdTbGFzaCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koZC5yZXBsYWNlKGIsIiIpKSkuZmlsdGVyKGQ9PiEhZCl9OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUud3JpdGVGaWxlPWZ1bmN0aW9uKGEsYil7Y29uc3QgYz1hc3NlcnRMZWFkaW5nU2xhc2gkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpKCgwLGdvb2cuc3RyaW5nLnBhdGgubm9ybWFsaXplUGF0aCkoYSkpO2E9T2JqZWN0LmtleXModGhpcy5mZCkubGVuZ3RoO2NvbnN0IGQ9T2JqZWN0LnZhbHVlcyh0aGlzLmZkKS5maW5kKCh7cGF0aDplfSk9PmU9PT1jKTt0aGlzLmZkW2FdPXtmZDphLHBhdGg6YyxzZWVrUG9zOmdvb2cuZ2xvYmFsLkJpZ0ludCgwKSxidWZmZXJzOltiXX07ZCYmZGVsZXRlIHRoaXMuZmRbZF19OwpXQVNJJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5wcm90b3R5cGUuYXBwZW5kRmlsZT1mdW5jdGlvbihhLGIpe3ZhciBjPWFzc2VydExlYWRpbmdTbGFzaCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koKDAsZ29vZy5zdHJpbmcucGF0aC5ub3JtYWxpemVQYXRoKShhKSk7W2NdPXRoaXMuZmluZEJ1ZmZlcnMoYyk7Yz9jLnB1c2goYik6Y29uc29sZS5lcnJvcihgQ2FuJ3QgYXBwZW5kIHRvIG5vbi1leGlzdGluZyBmaWxlICR7YX1gKX07CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5yZWFkRmlsZT1mdW5jdGlvbihhKXtjb25zdCBiPWFzc2VydExlYWRpbmdTbGFzaCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koKDAsZ29vZy5zdHJpbmcucGF0aC5ub3JtYWxpemVQYXRoKShhKSksW2MsZF09dGhpcy5maW5kQnVmZmVycyhiKTt0aGlzLmZkW2RdJiZ0aGlzLmZkW2RdLm9wZW4mJmNvbnNvbGUud2FybihgcmVhZEZpbGU6IGZpbGUgJHthfSBoYXNuJ3QgYmVlbiBjbG9zZWQgeWV0IWApO2lmKGMpcmV0dXJuIGNvbmNhdFVpbnQ4QXJyYXlzJCRtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaShjKX07CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5yZWFkU3RkT3V0PWZ1bmN0aW9uKCl7Y29uc3QgYT1PYmplY3QudmFsdWVzKHRoaXMuZmRbMF0pO3JldHVybiBjb25jYXRVaW50OEFycmF5cyQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koYSYmYS5idWZmZXJzfHxbXSl9O1dBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS51bmxpbms9ZnVuY3Rpb24oYSl7Y29uc3QgYj1hc3NlcnRMZWFkaW5nU2xhc2gkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpKCgwLGdvb2cuc3RyaW5nLnBhdGgubm9ybWFsaXplUGF0aCkoYSkpOyhhPU9iamVjdC52YWx1ZXModGhpcy5mZCkuZmluZCgoe3BhdGg6Y30pPT5jPT09YikpP2RlbGV0ZSB0aGlzLmZkW2FdOmNvbnNvbGUuZXJyb3IoYFdoaWxlIHRyeWluZyB0byB1bmxpbmsgJHtifSwgcGF0aCBub3QgZm91bmRgKX07CldBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpLnByb3RvdHlwZS5ta2Rpcj1mdW5jdGlvbihhKXtjb25zdCBiPWFzc2VydExlYWRpbmdTbGFzaCQkbW9kdWxlJHNyYyRmaWxlc3lzdGVtJHdhc2koKDAsZ29vZy5zdHJpbmcucGF0aC5ub3JtYWxpemVQYXRoKShhKSksYz1bXTtPYmplY3QudmFsdWVzKHRoaXMuZmQpLmZvckVhY2goKHtwYXRoOmR9KT0+ZC5zdGFydHNXaXRoKGIpJiZjLnB1c2goZCkpOzA8Yy5sZW5ndGg/Y29uc29sZS53YXJuKGBta2RpcjogcGF0aCAke2F9IGFscmVhZHkgZXhpc3RzYCk6KGE9T2JqZWN0LmtleXModGhpcy5mZCkubGVuZ3RoLHRoaXMuZmRbYV09e2ZkOmEscGF0aDpifSl9O3ZhciBtb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaT17fTttb2R1bGUkc3JjJGZpbGVzeXN0ZW0kd2FzaS5XQVNJPVdBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpO2Z1bmN0aW9uIGNsZWFyQXJyYXkkJG1vZHVsZSRzcmMkdXRpbHMkY2xlYXJfYXJyYXkoYSl7Zm9yKDswPGEubGVuZ3RoOylhLnBvcCgpfXZhciBtb2R1bGUkc3JjJHV0aWxzJGNsZWFyX2FycmF5PXt9O21vZHVsZSRzcmMkdXRpbHMkY2xlYXJfYXJyYXkuY2xlYXJBcnJheT1jbGVhckFycmF5JCRtb2R1bGUkc3JjJHV0aWxzJGNsZWFyX2FycmF5O3ZhciBtb2R1bGUkbm9kZV9tb2R1bGVzJGxpbmVzX2xvZ2dlciRsaWIkaW5kZXg9e2RlZmF1bHQ6e319O21vZHVsZSRub2RlX21vZHVsZXMkbGluZXNfbG9nZ2VyJGxpYiRpbmRleC5kZWZhdWx0Ll9fZXNNb2R1bGU9ITA7bW9kdWxlJG5vZGVfbW9kdWxlcyRsaW5lc19sb2dnZXIkbGliJGluZGV4LmRlZmF1bHQuTG9nZ2VyRmFjdG9yeT1tb2R1bGUkbm9kZV9tb2R1bGVzJGxpbmVzX2xvZ2dlciRsaWIkaW5kZXguZGVmYXVsdC5sb2dMZXZlbHM9dm9pZCAwO21vZHVsZSRub2RlX21vZHVsZXMkbGluZXNfbG9nZ2VyJGxpYiRpbmRleC5kZWZhdWx0LmxvZ0xldmVscz17bG9nX3JhaXNlX2Vycm9yOjEsbG9nX3dpdGhfd2FybmluZ3M6Mix0cmFjZTozLGRlYnVnOjQsaW5mbzo1LHdhcm46NixlcnJvcjo3LGRpc2FibGU6OH07CnZhciBMb2dnZXJGYWN0b3J5JCRtb2R1bGUkbm9kZV9tb2R1bGVzJGxpbmVzX2xvZ2dlciRsaWIkaW5kZXg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsYyl7aWYodm9pZCAwPT09YiYmKGI9ImxvZ193aXRoX3dhcm5pbmdzIiksdm9pZCAwPT09YyYmKGM9bnVsbCksdGhpcy5sb2dMZXZlbD1iLCFtb2R1bGUkbm9kZV9tb2R1bGVzJGxpbmVzX2xvZ2dlciRsaWIkaW5kZXguZGVmYXVsdC5sb2dMZXZlbHNbYl0pdGhyb3cgRXJyb3IoIkludmFsaWQgbG9nIGxldmVsICIrYisiIGFsbG93ZWQ6ICIrSlNPTi5zdHJpbmdpZnkobW9kdWxlJG5vZGVfbW9kdWxlcyRsaW5lc19sb2dnZXIkbGliJGluZGV4LmRlZmF1bHQubG9nTGV2ZWxzKSk7dGhpcy5tb2NrQ29uc29sZT1jfHxjb25zb2xlfXJldHVybiBhLnByb3RvdHlwZS5kdW1teT1mdW5jdGlvbigpe30sYS5wcm90b3R5cGUuc2V0TG9nV2FybmluZ3M9ZnVuY3Rpb24oYil7dGhpcy5sb2dMZXZlbD1ifSxhLnByb3RvdHlwZS5nZXRMb2dXYXJuaW5ncz0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2dMZXZlbH0sYS5wcm90b3R5cGUuZ2V0U2luZ2xlTG9nZ2VyQ29sb3I9ZnVuY3Rpb24oYixjLGQpe3JldHVybiB0aGlzLmdldFNpbmdsZUxvZ2dlclN0eWxlKGIsdGhpcy5nZXRDb2xvclN0eWxlKGMpLGQpfSxhLnByb3RvdHlwZS5nZXRTaW5nbGVMb2dnZXI9ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLmdldFJhbmRvbUNvbG9yKGIpO3JldHVybiB0aGlzLmdldFNpbmdsZUxvZ2dlclN0eWxlKGIsdGhpcy5nZXRDb2xvclN0eWxlKGQpLGMpfSxhLnByb3RvdHlwZS5nZXRTaW5nbGVMb2dnZXJTdHlsZT1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj10aGlzO3JldHVybiB2b2lkIDA9PT1lJiYoZT0ibG9nX3dpdGhfd2FybmluZ3MiKSxmdW5jdGlvbigpe2Zvcih2YXIgZz1bXSxoPTA7aDxhcmd1bWVudHMubGVuZ3RoO2grKylnW2hdPWFyZ3VtZW50c1toXTtpZihtb2R1bGUkbm9kZV9tb2R1bGVzJGxpbmVzX2xvZ2dlciRsaWIkaW5kZXguZGVmYXVsdC5sb2dMZXZlbHNbZi5sb2dMZXZlbF0+Cm1vZHVsZSRub2RlX21vZHVsZXMkbGluZXNfbG9nZ2VyJGxpYiRpbmRleC5kZWZhdWx0LmxvZ0xldmVsc1tlXSlyZXR1cm4gZi5kdW1teTtnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGcpO2g9Zy5zaGlmdCgpLnNwbGl0KCJ7fSIpO2Zvcih2YXIgaz1bZi5tb2NrQ29uc29sZSwiJWMiK2IsY10sbD0wO2w8aC5sZW5ndGg7bCsrKWsucHVzaChoW2xdKSx2b2lkIDAhPT1nW2xdJiZrLnB1c2goZ1tsXSk7aWYoaC5sZW5ndGgtMSE9PWcubGVuZ3RoKWlmKCJsb2dfd2l0aF93YXJuaW5ncyI9PT1mLmxvZ0xldmVsKWYubW9ja0NvbnNvbGUuZXJyb3IoIk1pc3NNYXRjaCBhbW91bnQgb2YgYXJndW1lbnRzIik7ZWxzZSBpZigibG9nX3JhaXNlX2Vycm9yIj09PWYubG9nTGV2ZWwpdGhyb3cgRXJyb3IoIk1pc3NNYXRjaCBhbW91bnQgb2YgYXJndW1lbnRzIik7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KGQsayl9fSxhLnByb3RvdHlwZS5nZXRMb2dnZXJDb2xvcj1mdW5jdGlvbihiLApjKXtyZXR1cm4gdGhpcy5nZXRMb2dnZXJTdHlsZShiLHRoaXMuZ2V0Q29sb3JTdHlsZShjKSl9LGEucHJvdG90eXBlLmdldENvbG9yU3R5bGU9ZnVuY3Rpb24oYil7cmV0dXJuImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIitiKyI7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDJweDsgZm9udC1zaXplOiAxMHB4In0sYS5nZXRIYXNoPWZ1bmN0aW9uKGIsYyl7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGQ9MzczNTkyODU1OV5jO2NePTExMDM1NDc5OTE7Zm9yKHZhciBlPTAsZjtlPGIubGVuZ3RoO2UrKylmPWIuY2hhckNvZGVBdChlKSxkPU1hdGguaW11bChkXmYsMjY1NDQzNTc2MSksYz1NYXRoLmltdWwoY15mLDE1OTczMzQ2NzcpO3JldHVybiBkPU1hdGguaW11bChkXmQ+Pj4xNiwyMjQ2ODIyNTA3KV5NYXRoLmltdWwoY15jPj4+MTMsMzI2NjQ4OTkwOSksNDI5NDk2NzI5NiooMjA5NzE1MSYoTWF0aC5pbXVsKGNeYz4+PjE2LDIyNDY4MjI1MDcpXk1hdGguaW11bChkXgpkPj4+MTMsMzI2NjQ4OTkwOSkpKSsoZD4+PjApfSxhLnByb3RvdHlwZS5nZXRSYW5kb21Db2xvcj1mdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj0iIik7Yj1hLmdldEhhc2goYik7Zm9yKHZhciBjPSIjIixkPTA7Mz5kO2QrKyljKz0oIjAwIisoOCsoYj4+NypkJjEyNykpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKTtyZXR1cm4gY30sYS5wcm90b3R5cGUuZ2V0TG9nZ2VyPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmdldExvZ2dlckNvbG9yKGIsdGhpcy5nZXRSYW5kb21Db2xvcihiKSl9LGEucHJvdG90eXBlLmdldExvZ2dlclN0eWxlPWZ1bmN0aW9uKGIsYyl7cmV0dXJue3RyYWNlOnRoaXMuZ2V0U2luZ2xlTG9nZ2VyU3R5bGUoYixjLHRoaXMubW9ja0NvbnNvbGUudHJhY2UsInRyYWNlIiksZGVidWc6dGhpcy5nZXRTaW5nbGVMb2dnZXJTdHlsZShiLGMsdGhpcy5tb2NrQ29uc29sZS5kZWJ1ZywiZGVidWciKSxsb2c6dGhpcy5nZXRTaW5nbGVMb2dnZXJTdHlsZShiLGMsdGhpcy5tb2NrQ29uc29sZS5sb2csCiJpbmZvIiksd2Fybjp0aGlzLmdldFNpbmdsZUxvZ2dlclN0eWxlKGIsYyx0aGlzLm1vY2tDb25zb2xlLndhcm4sIndhcm4iKSxlcnJvcjp0aGlzLmdldFNpbmdsZUxvZ2dlclN0eWxlKGIsYyx0aGlzLm1vY2tDb25zb2xlLmVycm9yLCJlcnJvciIpfX0sYX0oKTttb2R1bGUkbm9kZV9tb2R1bGVzJGxpbmVzX2xvZ2dlciRsaWIkaW5kZXguZGVmYXVsdC5Mb2dnZXJGYWN0b3J5PUxvZ2dlckZhY3RvcnkkJG1vZHVsZSRub2RlX21vZHVsZXMkbGluZXNfbG9nZ2VyJGxpYiRpbmRleDtsZXQgbG9nV29ya2xldE1haW4kJG1vZHVsZSRzcmMkbG9nZ2VyLGxvZ1dvcmtsZXRXb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyLGxvZ1NBQk1haW4kJG1vZHVsZSRzcmMkbG9nZ2VyLGxvZ1NBQldvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXIsbG9nVkFOTWFpbiQkbW9kdWxlJHNyYyRsb2dnZXIsbG9nVkFOV29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcixsb2dPbGRTcG5NYWluJCRtb2R1bGUkc3JjJGxvZ2dlcixsb2dPbGRTcG5Xb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyLGxvZ0luZGV4JCRtb2R1bGUkc3JjJGxvZ2dlcixsb2dTUE5NYWluU2luZ2xlJCRtb2R1bGUkc3JjJGxvZ2dlcixsb2dTaW5nbGV0aHJlYWRXb3JrbGV0TWFpbiQkbW9kdWxlJHNyYyRsb2dnZXIsbG9nU2luZ2xldGhyZWFkV29ya2xldFdvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXIsbG9nQ29tbW9uVXRpbHMkJG1vZHVsZSRzcmMkbG9nZ2VyLGxvZ1dhc21Nb2R1bGUkJG1vZHVsZSRzcmMkbG9nZ2VyLGxvZ01pZGlSZXF1ZXN0JCRtb2R1bGUkc3JjJGxvZ2dlcjsKY29uc3QgaXNQcm9kJCRtb2R1bGUkc3JjJGxvZ2dlcj0xO2xvZ1dvcmtsZXRNYWluJCRtb2R1bGUkc3JjJGxvZ2dlcj1hPT5iPT57fTtsb2dXb3JrbGV0V29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcj1hPT5iPT57fTtsb2dTQUJNYWluJCRtb2R1bGUkc3JjJGxvZ2dlcj1hPT5iPT57fTtsb2dTQUJXb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyPWE9PmI9Pnt9O2xvZ1ZBTk1haW4kJG1vZHVsZSRzcmMkbG9nZ2VyPWE9PmI9Pnt9O2xvZ1ZBTldvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e307bG9nT2xkU3BuTWFpbiQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e307bG9nT2xkU3BuV29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcj1hPT5iPT57fTtsb2dJbmRleCQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e307bG9nU1BOTWFpblNpbmdsZSQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e307CmxvZ1NpbmdsZXRocmVhZFdvcmtsZXRNYWluJCRtb2R1bGUkc3JjJGxvZ2dlcj1hPT5iPT57fTtsb2dTaW5nbGV0aHJlYWRXb3JrbGV0V29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcj1hPT5iPT57fTtsb2dDb21tb25VdGlscyQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e307bG9nV2FzbU1vZHVsZSQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e307bG9nTWlkaVJlcXVlc3QkJG1vZHVsZSRzcmMkbG9nZ2VyPWE9PmI9Pnt9O3ZhciAkanNjb21wRGVmYXVsdEV4cG9ydCQkbW9kdWxlJHNyYyRsb2dnZXI9YT0+Yj0+e30sbW9kdWxlJHNyYyRsb2dnZXI9e307bW9kdWxlJHNyYyRsb2dnZXIuZGVmYXVsdD0kanNjb21wRGVmYXVsdEV4cG9ydCQkbW9kdWxlJHNyYyRsb2dnZXI7bW9kdWxlJHNyYyRsb2dnZXIubG9nQ29tbW9uVXRpbHM9bG9nQ29tbW9uVXRpbHMkJG1vZHVsZSRzcmMkbG9nZ2VyO21vZHVsZSRzcmMkbG9nZ2VyLmxvZ0luZGV4PWxvZ0luZGV4JCRtb2R1bGUkc3JjJGxvZ2dlcjsKbW9kdWxlJHNyYyRsb2dnZXIubG9nTWlkaVJlcXVlc3Q9bG9nTWlkaVJlcXVlc3QkJG1vZHVsZSRzcmMkbG9nZ2VyO21vZHVsZSRzcmMkbG9nZ2VyLmxvZ09sZFNwbk1haW49bG9nT2xkU3BuTWFpbiQkbW9kdWxlJHNyYyRsb2dnZXI7bW9kdWxlJHNyYyRsb2dnZXIubG9nT2xkU3BuV29ya2VyPWxvZ09sZFNwbldvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXI7bW9kdWxlJHNyYyRsb2dnZXIubG9nU0FCTWFpbj1sb2dTQUJNYWluJCRtb2R1bGUkc3JjJGxvZ2dlcjttb2R1bGUkc3JjJGxvZ2dlci5sb2dTQUJXb3JrZXI9bG9nU0FCV29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcjttb2R1bGUkc3JjJGxvZ2dlci5sb2dTUE5NYWluU2luZ2xlPWxvZ1NQTk1haW5TaW5nbGUkJG1vZHVsZSRzcmMkbG9nZ2VyO21vZHVsZSRzcmMkbG9nZ2VyLmxvZ1NpbmdsZXRocmVhZFdvcmtsZXRNYWluPWxvZ1NpbmdsZXRocmVhZFdvcmtsZXRNYWluJCRtb2R1bGUkc3JjJGxvZ2dlcjsKbW9kdWxlJHNyYyRsb2dnZXIubG9nU2luZ2xldGhyZWFkV29ya2xldFdvcmtlcj1sb2dTaW5nbGV0aHJlYWRXb3JrbGV0V29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcjttb2R1bGUkc3JjJGxvZ2dlci5sb2dWQU5NYWluPWxvZ1ZBTk1haW4kJG1vZHVsZSRzcmMkbG9nZ2VyO21vZHVsZSRzcmMkbG9nZ2VyLmxvZ1ZBTldvcmtlcj1sb2dWQU5Xb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyO21vZHVsZSRzcmMkbG9nZ2VyLmxvZ1dhc21Nb2R1bGU9bG9nV2FzbU1vZHVsZSQkbW9kdWxlJHNyYyRsb2dnZXI7bW9kdWxlJHNyYyRsb2dnZXIubG9nV29ya2xldE1haW49bG9nV29ya2xldE1haW4kJG1vZHVsZSRzcmMkbG9nZ2VyO21vZHVsZSRzcmMkbG9nZ2VyLmxvZ1dvcmtsZXRXb3JrZXI9bG9nV29ya2xldFdvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXI7Y29uc3QgQ29tcHJlc3Npb25NZXRob2QkJG1vZHVsZSRzcmMkemxpYiR6bGliPXtERUZMQVRFOjgsUkVTRVJWRUQ6MTV9O3ZhciBtb2R1bGUkc3JjJHpsaWIkemxpYj17fTttb2R1bGUkc3JjJHpsaWIkemxpYi5Db21wcmVzc2lvbk1ldGhvZD1Db21wcmVzc2lvbk1ldGhvZCQkbW9kdWxlJHNyYyR6bGliJHpsaWI7LyoKIHpsaWIuanMgMjAxMiAtIGltYXlhIFsgaHR0cHM6Ly9naXRodWIuY29tL2ltYXlhL3psaWIuanMgXSBUaGUgTUlUIExpY2Vuc2UgKi8KZnVuY3Rpb24gSHVmZm1hbiQkbW9kdWxlJHNyYyR6bGliJGh1ZmZtYW4oYSl7Y29uc3QgYj1hLmxlbmd0aDtsZXQgYz0wLGQ9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGUsZixnLGg7bGV0IGssbDtmb3Ioaz0wO2s8YjsrK2spYVtrXT5jJiYoYz1hW2tdKSxhW2tdPGQmJihkPWFba10pO2NvbnN0IG09MTw8YyxuPW5ldyBVaW50MzJBcnJheShtKTtlPTE7Zj0wO2ZvcihnPTI7ZTw9Yzspe2ZvcihrPTA7azxiOysraylpZihhW2tdPT09ZSl7aD0wO3ZhciBwPWY7Zm9yKGw9MDtsPGU7KytsKWg9aDw8MXxwJjEscD4+PTE7cD1lPDwxNnxrO2ZvcihsPWg7bDxtO2wrPWcpbltsXT1wOysrZn0rK2U7Zjw8PTE7Zzw8PTF9cmV0dXJuW24sYyxkXX12YXIgbW9kdWxlJHNyYyR6bGliJGh1ZmZtYW49e307bW9kdWxlJHNyYyR6bGliJGh1ZmZtYW4uSHVmZm1hbj1IdWZmbWFuJCRtb2R1bGUkc3JjJHpsaWIkaHVmZm1hbjtjb25zdCBaTElCX1JBV19JTkZMQVRFX0JVRkZFUl9TSVpFJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZT0zMjc2ODsKZnVuY3Rpb24gUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUoYSxiKXt0aGlzLmJsb2Nrcz1bXTt0aGlzLmJ1ZmZlclNpemU9WkxJQl9SQVdfSU5GTEFURV9CVUZGRVJfU0laRSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGU7dGhpcy5iaXRzYnVmbGVuPXRoaXMuYml0c2J1Zj10aGlzLmlwPXRoaXMudG90YWxwb3M9MDt0aGlzLmlucHV0PW5ldyBVaW50OEFycmF5KGEpO3RoaXMuYmZpbmFsPSExO3RoaXMuYnVmZmVyVHlwZT1SYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5CdWZmZXJUeXBlLkFEQVBUSVZFO3RoaXMucmVzaXplPSExO2lmKGJ8fCEoYj17fSkpYi5pbmRleCYmKHRoaXMuaXA9Yi5pbmRleCksYi5idWZmZXJTaXplJiYodGhpcy5idWZmZXJTaXplPWIuYnVmZmVyU2l6ZSksYi5idWZmZXJUeXBlJiYodGhpcy5idWZmZXJUeXBlPWIuYnVmZmVyVHlwZSksYi5yZXNpemUmJih0aGlzLnJlc2l6ZT1iLnJlc2l6ZSk7c3dpdGNoKHRoaXMuYnVmZmVyVHlwZSl7Y2FzZSBSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5CdWZmZXJUeXBlLkJMT0NLOnRoaXMub3A9ClJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoO3RoaXMub3V0cHV0PW5ldyBVaW50OEFycmF5KFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoK3RoaXMuYnVmZmVyU2l6ZStSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5NYXhDb3B5TGVuZ3RoKTticmVhaztjYXNlIFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkJ1ZmZlclR5cGUuQURBUFRJVkU6dGhpcy5vcD0wO3RoaXMub3V0cHV0PW5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyU2l6ZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCBpbmZsYXRlIG1vZGUiKTt9fVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkJ1ZmZlclR5cGU9e0JMT0NLOjAsQURBUFRJVkU6MX07ClJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLnByb3RvdHlwZS5kZWNvbXByZXNzPWZ1bmN0aW9uKCl7Zm9yKDshdGhpcy5iZmluYWw7KXRoaXMucGFyc2VCbG9jaygpO3N3aXRjaCh0aGlzLmJ1ZmZlclR5cGUpe2Nhc2UgUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuQnVmZmVyVHlwZS5CTE9DSzpyZXR1cm4gdGhpcy5jb25jYXRCdWZmZXJCbG9jaygpO2Nhc2UgUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuQnVmZmVyVHlwZS5BREFQVElWRTpyZXR1cm4gdGhpcy5jb25jYXRCdWZmZXJEeW5hbWljKCk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCBpbmZsYXRlIG1vZGUiKTt9fTtSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5NYXhCYWNrd2FyZExlbmd0aD0zMjc2ODtSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5NYXhDb3B5TGVuZ3RoPTI1ODsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuT3JkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBVaW50MTZBcnJheShhKX0oWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdKTtSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5MZW5ndGhDb2RlVGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBVaW50MTZBcnJheShhKX0oWzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMjU4LDI1OF0pO1Jhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkxlbmd0aEV4dHJhVGFibGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGEpfShbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDAsMF0pOwpSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5EaXN0Q29kZVRhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVWludDE2QXJyYXkoYSl9KFsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzddKTtSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5EaXN0RXh0cmFUYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSl9KFswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSk7ClJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkZpeGVkTGl0ZXJhbExlbmd0aFRhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBhfShmdW5jdGlvbigpe2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkoMjg4KTtsZXQgYixjO2I9MDtmb3IoYz1hLmxlbmd0aDtiPGM7KytiKWFbYl09MTQzPj1iPzg6MjU1Pj1iPzk6Mjc5Pj1iPzc6ODtyZXR1cm4gSHVmZm1hbiQkbW9kdWxlJHNyYyR6bGliJGh1ZmZtYW4oYSl9KCkpO1Jhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkZpeGVkRGlzdGFuY2VUYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gYX0oZnVuY3Rpb24oKXtjb25zdCBhPW5ldyBVaW50OEFycmF5KDMwKTtsZXQgYixjO2I9MDtmb3IoYz1hLmxlbmd0aDtiPGM7KytiKWFbYl09NTtyZXR1cm4gSHVmZm1hbiQkbW9kdWxlJHNyYyR6bGliJGh1ZmZtYW4oYSl9KCkpOwpSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5wcm90b3R5cGUucGFyc2VCbG9jaz1mdW5jdGlvbigpe2xldCBhPXRoaXMucmVhZEJpdHMoMyk7YSYxJiYodGhpcy5iZmluYWw9ITApO2E+Pj49MTtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMucGFyc2VVbmNvbXByZXNzZWRCbG9jaygpO2JyZWFrO2Nhc2UgMTp0aGlzLnBhcnNlRml4ZWRIdWZmbWFuQmxvY2soKTticmVhaztjYXNlIDI6dGhpcy5wYXJzZUR5bmFtaWNIdWZmbWFuQmxvY2soKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJ1bmtub3duIEJUWVBFOiAiK2EpO319OwpSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5wcm90b3R5cGUucmVhZEJpdHM9ZnVuY3Rpb24oYSl7bGV0IGI9dGhpcy5iaXRzYnVmLGM9dGhpcy5iaXRzYnVmbGVuO2NvbnN0IGQ9dGhpcy5pbnB1dDtsZXQgZT10aGlzLmlwO2lmKGUrKGEtYys3Pj4zKT49ZC5sZW5ndGgpdGhyb3cgRXJyb3IoImlucHV0IGJ1ZmZlciBpcyBicm9rZW4iKTtmb3IoO2M8YTspYnw9ZFtlKytdPDxjLGMrPTg7dGhpcy5iaXRzYnVmPWI+Pj5hO3RoaXMuYml0c2J1Zmxlbj1jLWE7dGhpcy5pcD1lO3JldHVybiBiJigxPDxhKS0xfTsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLnJlYWRDb2RlQnlUYWJsZT1mdW5jdGlvbihhKXtsZXQgYj10aGlzLmJpdHNidWYsYz10aGlzLmJpdHNidWZsZW47dmFyIGQ9dGhpcy5pbnB1dDtsZXQgZT10aGlzLmlwO3ZhciBmPWQubGVuZ3RoO2NvbnN0IGc9YVswXTtmb3IoYT1hWzFdO2M8YSYmIShlPj1mKTspYnw9ZFtlKytdPDxjLGMrPTg7ZD1nW2ImKDE8PGEpLTFdO2Y9ZD4+PjE2O2lmKGY+Yyl0aHJvdyBFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aDogIitmKTt0aGlzLmJpdHNidWY9Yj4+Zjt0aGlzLmJpdHNidWZsZW49Yy1mO3RoaXMuaXA9ZTtyZXR1cm4gZCY2NTUzNX07ClJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLnByb3RvdHlwZS5wYXJzZVVuY29tcHJlc3NlZEJsb2NrPWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLmlucHV0O2xldCBiPXRoaXMuaXAsYz10aGlzLm91dHB1dCxkPXRoaXMub3A7dmFyIGU9YS5sZW5ndGg7bGV0IGY7Y29uc3QgZz1jLmxlbmd0aDt0aGlzLmJpdHNidWZsZW49dGhpcy5iaXRzYnVmPTA7aWYoYisxPj1lKXRocm93IEVycm9yKCJpbnZhbGlkIHVuY29tcHJlc3NlZCBibG9jayBoZWFkZXI6IExFTiIpO2Y9YVtiKytdfGFbYisrXTw8ODtpZihiKzE+PWUpdGhyb3cgRXJyb3IoImludmFsaWQgdW5jb21wcmVzc2VkIGJsb2NrIGhlYWRlcjogTkxFTiIpO2U9YVtiKytdfGFbYisrXTw8ODtpZihmPT09fmUpdGhyb3cgRXJyb3IoImludmFsaWQgdW5jb21wcmVzc2VkIGJsb2NrIGhlYWRlcjogbGVuZ3RoIHZlcmlmeSIpO2lmKGIrZj5hLmxlbmd0aCl0aHJvdyBFcnJvcigiaW5wdXQgYnVmZmVyIGlzIGJyb2tlbiIpOwpzd2l0Y2godGhpcy5idWZmZXJUeXBlKXtjYXNlIFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkJ1ZmZlclR5cGUuQkxPQ0s6Zm9yKDtkK2Y+Yy5sZW5ndGg7KWU9Zy1kLGYtPWUsYy5zZXQoYS5zdWJhcnJheShiLGIrZSksZCksZCs9ZSxiKz1lLHRoaXMub3A9ZCxjPXRoaXMuZXhwYW5kQnVmZmVyQmxvY2soKSxkPXRoaXMub3A7YnJlYWs7Y2FzZSBSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5CdWZmZXJUeXBlLkFEQVBUSVZFOmZvcig7ZCtmPmMubGVuZ3RoOyljPXRoaXMuZXhwYW5kQnVmZmVyQWRhcHRpdmUoe2ZpeFJhdGlvOjJ9KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIGluZmxhdGUgbW9kZSIpO31jLnNldChhLnN1YmFycmF5KGIsYitmKSxkKTt0aGlzLmlwPWIrZjt0aGlzLm9wPWQrZjt0aGlzLm91dHB1dD1jfTsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLnBhcnNlRml4ZWRIdWZmbWFuQmxvY2s9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5idWZmZXJUeXBlKXtjYXNlIFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkJ1ZmZlclR5cGUuQURBUFRJVkU6dGhpcy5kZWNvZGVIdWZmbWFuQWRhcHRpdmUoUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuRml4ZWRMaXRlcmFsTGVuZ3RoVGFibGUsUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuRml4ZWREaXN0YW5jZVRhYmxlKTticmVhaztjYXNlIFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkJ1ZmZlclR5cGUuQkxPQ0s6dGhpcy5kZWNvZGVIdWZmbWFuQmxvY2soUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuRml4ZWRMaXRlcmFsTGVuZ3RoVGFibGUsUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuRml4ZWREaXN0YW5jZVRhYmxlKTsKYnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCBpbmZsYXRlIG1vZGUiKTt9fTsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLnBhcnNlRHluYW1pY0h1ZmZtYW5CbG9jaz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZEJpdHMoNSkrMjU3LGI9dGhpcy5yZWFkQml0cyg1KSsxLGM9dGhpcy5yZWFkQml0cyg0KSs0LGQ9bmV3IFVpbnQ4QXJyYXkoUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuT3JkZXIubGVuZ3RoKTtsZXQgZTtmb3IoZT0wO2U8YzsrK2UpZFtSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5PcmRlcltlXV09dGhpcy5yZWFkQml0cygzKTtkPUh1ZmZtYW4kJG1vZHVsZSRzcmMkemxpYiRodWZmbWFuKGQpO2M9bmV3IFVpbnQ4QXJyYXkoYStiKTtlPTA7Zm9yKGI9YStiO2U8Yjspe3ZhciBmPXRoaXMucmVhZENvZGVCeVRhYmxlKGQpO3N3aXRjaChmKXtjYXNlIDE2OmZvcihmPTMrdGhpcy5yZWFkQml0cygyKTtmLS07KWNbZSsrXT1nO2JyZWFrO2Nhc2UgMTc6Zm9yKGY9CjMrdGhpcy5yZWFkQml0cygzKTtmLS07KWNbZSsrXT0wO3ZhciBnPTA7YnJlYWs7Y2FzZSAxODpmb3IoZj0xMSt0aGlzLnJlYWRCaXRzKDcpO2YtLTspY1tlKytdPTA7Zz0wO2JyZWFrO2RlZmF1bHQ6Zz1jW2UrK109Zn19Zz1IdWZmbWFuJCRtb2R1bGUkc3JjJHpsaWIkaHVmZm1hbihjLnN1YmFycmF5KDAsYSkpO2E9SHVmZm1hbiQkbW9kdWxlJHNyYyR6bGliJGh1ZmZtYW4oYy5zdWJhcnJheShhKSk7c3dpdGNoKHRoaXMuYnVmZmVyVHlwZSl7Y2FzZSBSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5CdWZmZXJUeXBlLkFEQVBUSVZFOnRoaXMuZGVjb2RlSHVmZm1hbkFkYXB0aXZlKGcsYSk7YnJlYWs7Y2FzZSBSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5CdWZmZXJUeXBlLkJMT0NLOnRoaXMuZGVjb2RlSHVmZm1hbkJsb2NrKGcsYSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW52YWxpZCBpbmZsYXRlIG1vZGUiKTt9fTsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLmRlY29kZUh1ZmZtYW5CbG9jaz1mdW5jdGlvbihhLGIpe2xldCBjPXRoaXMub3V0cHV0LGQ9dGhpcy5vcDt0aGlzLmN1cnJlbnRMaXRsZW5UYWJsZT1hO2NvbnN0IGU9Yy5sZW5ndGgtUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuTWF4Q29weUxlbmd0aDt2YXIgZjtsZXQgZyxoO2NvbnN0IGs9UmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuTGVuZ3RoQ29kZVRhYmxlLGw9UmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuTGVuZ3RoRXh0cmFUYWJsZSxtPVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkRpc3RDb2RlVGFibGUsbj1SYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5EaXN0RXh0cmFUYWJsZTtmb3IoOzI1NiE9PShmPXRoaXMucmVhZENvZGVCeVRhYmxlKGEpKTspaWYoMjU2PmYpZD49CmUmJih0aGlzLm9wPWQsYz10aGlzLmV4cGFuZEJ1ZmZlckJsb2NrKCksZD10aGlzLm9wKSxjW2QrK109ZjtlbHNlIGZvcihmLT0yNTcsaD1rW2ZdLDA8bFtmXSYmKGgrPXRoaXMucmVhZEJpdHMobFtmXSkpLGY9dGhpcy5yZWFkQ29kZUJ5VGFibGUoYiksZz1tW2ZdLDA8bltmXSYmKGcrPXRoaXMucmVhZEJpdHMobltmXSkpLGQ+PWUmJih0aGlzLm9wPWQsYz10aGlzLmV4cGFuZEJ1ZmZlckJsb2NrKCksZD10aGlzLm9wKTtoLS07KWNbZF09Y1tkKystZ107Zm9yKDs4PD10aGlzLmJpdHNidWZsZW47KXRoaXMuYml0c2J1Zmxlbi09OCx0aGlzLmlwLS07dGhpcy5vcD1kfTsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLmRlY29kZUh1ZmZtYW5BZGFwdGl2ZT1mdW5jdGlvbihhLGIpe2xldCBjPXRoaXMub3V0cHV0LGQ9dGhpcy5vcDt0aGlzLmN1cnJlbnRMaXRsZW5UYWJsZT1hO2xldCBlPWMubGVuZ3RoO3ZhciBmO2xldCBnLGg7Y29uc3Qgaz1SYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5MZW5ndGhDb2RlVGFibGUsbD1SYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5MZW5ndGhFeHRyYVRhYmxlLG09UmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuRGlzdENvZGVUYWJsZSxuPVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLkRpc3RFeHRyYVRhYmxlO2Zvcig7MjU2IT09KGY9dGhpcy5yZWFkQ29kZUJ5VGFibGUoYSkpOylpZigyNTY+ZilkPj1lJiYoYz10aGlzLmV4cGFuZEJ1ZmZlckFkYXB0aXZlKCksZT1jLmxlbmd0aCksY1tkKytdPQpmO2Vsc2UgZm9yKGYtPTI1NyxoPWtbZl0sMDxsW2ZdJiYoaCs9dGhpcy5yZWFkQml0cyhsW2ZdKSksZj10aGlzLnJlYWRDb2RlQnlUYWJsZShiKSxnPW1bZl0sMDxuW2ZdJiYoZys9dGhpcy5yZWFkQml0cyhuW2ZdKSksZCtoPmUmJihjPXRoaXMuZXhwYW5kQnVmZmVyQWRhcHRpdmUoKSxlPWMubGVuZ3RoKTtoLS07KWNbZF09Y1tkKystZ107Zm9yKDs4PD10aGlzLmJpdHNidWZsZW47KXRoaXMuYml0c2J1Zmxlbi09OCx0aGlzLmlwLS07dGhpcy5vcD1kfTsKUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLmV4cGFuZEJ1ZmZlckJsb2NrPWZ1bmN0aW9uKGEpe2E9bmV3IFVpbnQ4QXJyYXkodGhpcy5vcC1SYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5NYXhCYWNrd2FyZExlbmd0aCk7Y29uc3QgYj10aGlzLm9wLVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoLGM9dGhpcy5vdXRwdXQ7YS5zZXQoYy5zdWJhcnJheShSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5NYXhCYWNrd2FyZExlbmd0aCxhLmxlbmd0aCkpO3RoaXMuYmxvY2tzLnB1c2goYSk7dGhpcy50b3RhbHBvcys9YS5sZW5ndGg7Yy5zZXQoYy5zdWJhcnJheShiLGIrUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuTWF4QmFja3dhcmRMZW5ndGgpKTt0aGlzLm9wPVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoOwpyZXR1cm4gY307UmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUucHJvdG90eXBlLmV4cGFuZEJ1ZmZlckFkYXB0aXZlPWZ1bmN0aW9uKGEpe2xldCBiPU1hdGgudHJ1bmModGhpcy5pbnB1dC5sZW5ndGgvdGhpcy5pcCsxKTtjb25zdCBjPXRoaXMuaW5wdXQsZD10aGlzLm91dHB1dDthJiYoIm51bWJlciI9PT10eXBlb2YgYS5maXhSYXRpbyYmKGI9YS5maXhSYXRpbyksIm51bWJlciI9PT10eXBlb2YgYS5hZGRSYXRpbyYmKGIrPWEuYWRkUmF0aW8pKTsyPmI/KGE9KGMubGVuZ3RoLXRoaXMuaXApL3RoaXMuY3VycmVudExpdGxlblRhYmxlWzJdLGE9TWF0aC50cnVuYyhhLzIqMjU4KSxhPWE8ZC5sZW5ndGg/ZC5sZW5ndGgrYTpkLmxlbmd0aDw8MSk6YT1kLmxlbmd0aCpiO2E9bmV3IFVpbnQ4QXJyYXkoYSk7YS5zZXQoZCk7cmV0dXJuIHRoaXMub3V0cHV0PWF9OwpSYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5wcm90b3R5cGUuY29uY2F0QnVmZmVyQmxvY2s9ZnVuY3Rpb24oKXtsZXQgYT0wO2NvbnN0IGI9dGhpcy5vdXRwdXQsYz10aGlzLmJsb2NrcztsZXQgZDtjb25zdCBlPW5ldyBVaW50OEFycmF5KHRoaXMudG90YWxwb3MrKHRoaXMub3AtUmF3SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJHJhd2luZmxhdGUuTWF4QmFja3dhcmRMZW5ndGgpKTtsZXQgZixnLGgsaztpZigwPT09Yy5sZW5ndGgpcmV0dXJuIHRoaXMub3V0cHV0LnN1YmFycmF5KFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoLHRoaXMub3ApO2Y9MDtmb3IoZz1jLmxlbmd0aDtmPGc7KytmKWZvcihkPWNbZl0saD0wLGs9ZC5sZW5ndGg7aDxrOysraCllW2ErK109ZFtoXTtmPVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLk1heEJhY2t3YXJkTGVuZ3RoO2ZvcihnPXRoaXMub3A7ZjwKZzsrK2YpZVthKytdPWJbZl07dGhpcy5ibG9ja3M9W107cmV0dXJuIHRoaXMuYnVmZmVyPWV9O1Jhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlLnByb3RvdHlwZS5jb25jYXRCdWZmZXJEeW5hbWljPWZ1bmN0aW9uKCl7bGV0IGE7Y29uc3QgYj10aGlzLm9wO3RoaXMucmVzaXplPyhhPW5ldyBVaW50OEFycmF5KGIpLGEuc2V0KHRoaXMub3V0cHV0LnN1YmFycmF5KDAsYikpKTphPXRoaXMub3V0cHV0LnN1YmFycmF5KDAsYik7cmV0dXJuIHRoaXMuYnVmZmVyPWF9O3ZhciBtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZT17fTttb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5SYXdJbmZsYXRlPVJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlO2Z1bmN0aW9uIFV0aWwkJG1vZHVsZSRzcmMkemxpYiR1dGlsKCl7fVV0aWwkJG1vZHVsZSRzcmMkemxpYiR1dGlsLnN0cmluZ1RvQnl0ZUFycmF5PWZ1bmN0aW9uKGEpe2E9Wy4uLmFdO2xldCBiLGM7Yj0wO2ZvcihjPWEubGVuZ3RoO2I8YztiKyspYVtiXT0oYVtiXS5jaGFyUG9pbnRBdCgwKSYyNTUpPj4+MDtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2FdKX07dmFyIG1vZHVsZSRzcmMkemxpYiR1dGlsPXt9O21vZHVsZSRzcmMkemxpYiR1dGlsLlV0aWw9VXRpbCQkbW9kdWxlJHNyYyR6bGliJHV0aWw7ZnVuY3Rpb24gQWRsZXIzMiQkbW9kdWxlJHNyYyR6bGliJGFkbGVyMzIoYSl7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9VXRpbCQkbW9kdWxlJHNyYyR6bGliJHV0aWwuc3RyaW5nVG9CeXRlQXJyYXkoYSkpO3JldHVybiBBZGxlcjMyJCRtb2R1bGUkc3JjJHpsaWIkYWRsZXIzMi51cGRhdGUoMSxhKX1BZGxlcjMyJCRtb2R1bGUkc3JjJHpsaWIkYWRsZXIzMi51cGRhdGU9ZnVuY3Rpb24oYSxiKXtsZXQgYz1hJjY1NTM1O2E9YT4+PjE2JjY1NTM1O2xldCBkPWIubGVuZ3RoLGUsZj0wO2Zvcig7MDxkOyl7ZT1kPkFkbGVyMzIkJG1vZHVsZSRzcmMkemxpYiRhZGxlcjMyLk9wdGltaXphdGlvblBhcmFtZXRlcj9BZGxlcjMyJCRtb2R1bGUkc3JjJHpsaWIkYWRsZXIzMi5PcHRpbWl6YXRpb25QYXJhbWV0ZXI6ZDtkLT1lO2RvIGMrPWJbZisrXSxhKz1jO3doaWxlKC0tZSk7YyU9NjU1MjE7YSU9NjU1MjF9cmV0dXJuKGE8PDE2fGMpPj4+MH07CkFkbGVyMzIkJG1vZHVsZSRzcmMkemxpYiRhZGxlcjMyLk9wdGltaXphdGlvblBhcmFtZXRlcj0xMDI0O3ZhciBtb2R1bGUkc3JjJHpsaWIkYWRsZXIzMj17fTttb2R1bGUkc3JjJHpsaWIkYWRsZXIzMi5BZGxlcjMyPUFkbGVyMzIkJG1vZHVsZSRzcmMkemxpYiRhZGxlcjMyO2Z1bmN0aW9uIEluZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRpbmZsYXRlKGEsYil7dGhpcy5pbnB1dD1hO3RoaXMuaXA9MDtpZihifHwhKGI9e30pKWIuaW5kZXgmJih0aGlzLmlwPWIuaW5kZXgpLGIudmVyaWZ5JiYodGhpcy52ZXJpZnk9Yi52ZXJpZnkpO2NvbnN0IGM9YVt0aGlzLmlwKytdLGQ9YVt0aGlzLmlwKytdO3N3aXRjaChjJjE1KXtjYXNlIENvbXByZXNzaW9uTWV0aG9kJCRtb2R1bGUkc3JjJHpsaWIkemxpYi5ERUZMQVRFOnRoaXMubWV0aG9kPUNvbXByZXNzaW9uTWV0aG9kJCRtb2R1bGUkc3JjJHpsaWIkemxpYi5ERUZMQVRFO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCIpO31pZigwIT09KChjPDw4KStkKSUzMSl0aHJvdyBFcnJvcigiaW52YWxpZCBmY2hlY2sgZmxhZzoiKygoYzw8OCkrZCklMzEpO2lmKGQmMzIpdGhyb3cgRXJyb3IoImZkaWN0IGZsYWcgaXMgbm90IHN1cHBvcnRlZCIpO3RoaXMucmF3aW5mbGF0ZT0KbmV3IFJhd0luZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRyYXdpbmZsYXRlKGEse2luZGV4OnRoaXMuaXAsYnVmZmVyU2l6ZTpiLmJ1ZmZlclNpemUsYnVmZmVyVHlwZTpiLmJ1ZmZlclR5cGUscmVzaXplOmIucmVzaXplfSl9SW5mbGF0ZSQkbW9kdWxlJHNyYyR6bGliJGluZmxhdGUuQnVmZmVyVHlwZT1SYXdJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkcmF3aW5mbGF0ZS5CdWZmZXJUeXBlOwpJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkaW5mbGF0ZS5wcm90b3R5cGUuZGVjb21wcmVzcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5wdXQ7Y29uc3QgYj10aGlzLnJhd2luZmxhdGUuZGVjb21wcmVzcygpO3RoaXMuaXA9dGhpcy5yYXdpbmZsYXRlLmlwO2lmKHRoaXMudmVyaWZ5JiYoYT0oYVt0aGlzLmlwKytdPDwyNHxhW3RoaXMuaXArK108PDE2fGFbdGhpcy5pcCsrXTw8OHxhW3RoaXMuaXArK10pPj4+MCxhIT09QWRsZXIzMiQkbW9kdWxlJHNyYyR6bGliJGFkbGVyMzIoYikpKXRocm93IEVycm9yKCJpbnZhbGlkIGFkbGVyLTMyIGNoZWNrc3VtIik7cmV0dXJuIGJ9O3ZhciBtb2R1bGUkc3JjJHpsaWIkaW5mbGF0ZT17fTttb2R1bGUkc3JjJHpsaWIkaW5mbGF0ZS5JbmZsYXRlPUluZmxhdGUkJG1vZHVsZSRzcmMkemxpYiRpbmZsYXRlO2NvbnN0IFBBR0VfU0laRSQkbW9kdWxlJHNyYyRtb2R1bGU9NjU1MzYsUEFHRVNfUEVSX01CJCRtb2R1bGUkc3JjJG1vZHVsZT0xNixjc291bmRXYXNpSnNNZXNzYWdlQ2FsbGJhY2skJG1vZHVsZSRzcmMkbW9kdWxlPSh7bWVtb3J5OmEsbWVzc2FnZVBvcnQ6YixzdHJlYW1CdWZmZXI6Y30pPT5mdW5jdGlvbihkLGUsZixnKXtpZihhKXtkPW5ldyBVaW50OEFycmF5KGEuYnVmZmVyLGcsZik7ZD11aW50MlN0cmluZyQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzKGQpO3ZhciBoPS9cbiQvZy50ZXN0KGQpO2U9L15cbi9nLnRlc3QoZCk7dmFyIGs9ZC5zcGxpdCgiXG4iKS5maWx0ZXIobT0+MDxtLmxlbmd0aCksbD1bXTtpZigwPT09ay5sZW5ndGgmJmh8fGUpbC5wdXNoKGMuam9pbigiIikpLGNsZWFyQXJyYXkkJG1vZHVsZSRzcmMkdXRpbHMkY2xlYXJfYXJyYXkoYyk7ay5mb3JFYWNoKChtLG4pPT57bisxPT09ay5sZW5ndGg/aD8wPT09bj8obC5wdXNoKGMuam9pbigiIikrbSksCmNsZWFyQXJyYXkkJG1vZHVsZSRzcmMkdXRpbHMkY2xlYXJfYXJyYXkoYykpOmwucHVzaChtKTpjLnB1c2gobSk6MD09PW4/KGwucHVzaChjLmpvaW4oIiIpK20pLGNsZWFyQXJyYXkkJG1vZHVsZSRzcmMkdXRpbHMkY2xlYXJfYXJyYXkoYykpOmwucHVzaChtKX0pO2wuZm9yRWFjaChtPT57bS5yZXBsYWNlKC8oXHJcbnxcbnxccikvZ20sIiIpJiZiLnBvc3Qoe2xvZzptfSl9KX19LGFzc2VydFBsdWdpbkV4cG9ydHMkJG1vZHVsZSRzcmMkbW9kdWxlPWE9PntpZihhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhLmV4cG9ydHMpe2lmKGEuZXhwb3J0cy5fX3dhc21fY2FsbF9jdG9ycyl7aWYoYS5leHBvcnRzLmNzb3VuZE1vZHVsZUNyZWF0ZXx8YS5leHBvcnRzLmNzb3VuZF9vcGNvZGVfaW5pdHx8YS5leHBvcnRzLmNzb3VuZF9mZ2VuX2luaXQpcmV0dXJuITA7Y29uc29sZS5lcnJvcihhLmV4cG9ydHMsIkEgY3NvdW5kIHBsdWdpbiB0dXJucyBvdXQgdG8gYmUgbmVpdGhlciBhIHBsdWdpbiwgb3Bjb2RlIG9yIG1vZHVsZS5cblBlcmhhcHMgY3NkbC5oIG9yIG1vZHVsZS5oIHdhc24ndCBpbXBvcnRlZCBjb3JyZWN0bHk/Iik7CnJldHVybiExfWNvbnNvbGUuZXJyb3IoIkEgY3NvdW5kIHBsdWdpbiBkaWRuJ3QgZXhwb3J0IF9fd2FzbV9jYWxsX2N0b3JzLlxuUGxlYXNlIHJlLXJ1biB3YXNtLWxkIHdpdGggZWl0aGVyIC0tZXhwb3J0LWFsbCBvciBpbmNsdWRlIC0tZXhwb3J0PV9fd2FzbV9jYWxsX2N0b3JzIik7cmV0dXJuITF9Y29uc29sZS5lcnJvcigiRXJyb3IgaW5zdGFudGlhdGluZyBhIGNzb3VuZCBwbHVnaW4sIGluc3RhbmNlIGFuZC9vciBleHBvcnQgaXMgbWlzc2luZyEiKTtyZXR1cm4hMX0sZ2V0QmluYXJ5SGVhZGVyRGF0YSQkbW9kdWxlJHNyYyRtb2R1bGU9YT0+e2Z1bmN0aW9uIGIoKXtsZXQgbD0wLG09MTtmb3IoOzspe2NvbnN0IG49YVtjKytdO2wrPShuJjEyNykqbTttKj0xMjg7aWYoIShuJjEyOCkpYnJlYWt9cmV0dXJuIGx9MTgzNjI3ODAxNiE9PShuZXcgVWludDMyQXJyYXkoKG5ldyBVaW50OEFycmF5KGEuc3ViYXJyYXkoMCwyNCkpKS5idWZmZXIpKVswXSYmY29uc29sZS5lcnJvcigiV2FzbSBtYWdpYyBudW1iZXIgaXMgbWlzc2luZyEiKTsKaWYoMCE9PWFbOF0pcmV0dXJuIGxvZ1dhc21Nb2R1bGUkJG1vZHVsZSRzcmMkbG9nZ2VyKCJEeWxpbmsgc2VjdGlvbiB3YXNuJ3QgZm91bmQgaW4gd2FzbSBiaW5hcnksIGFzc3VtaW5nIHN0YXRpYyB3YXNtLiIpLCJzdGF0aWMiO2xldCBjPTk7Y29uc3QgZD1iKCk7YysrOygwLGdvb2cuYXNzZXJ0cy5hc3NlcnQpKGFbY109PT0iZCIuY29kZVBvaW50QXQoMCkpO2MrKzsoMCxnb29nLmFzc2VydHMuYXNzZXJ0KShhW2NdPT09InkiLmNvZGVQb2ludEF0KDApKTtjKys7KDAsZ29vZy5hc3NlcnRzLmFzc2VydCkoYVtjXT09PSJsIi5jb2RlUG9pbnRBdCgwKSk7YysrOygwLGdvb2cuYXNzZXJ0cy5hc3NlcnQpKGFbY109PT0iaSIuY29kZVBvaW50QXQoMCkpO2MrKzsoMCxnb29nLmFzc2VydHMuYXNzZXJ0KShhW2NdPT09Im4iLmNvZGVQb2ludEF0KDApKTtjKys7KDAsZ29vZy5hc3NlcnRzLmFzc2VydCkoYVtjXT09PSJrIi5jb2RlUG9pbnRBdCgwKSk7YysrOygwLGdvb2cuYXNzZXJ0cy5hc3NlcnQpKGFbY109PT0KIi4iLmNvZGVQb2ludEF0KDApKTtjKys7KDAsZ29vZy5hc3NlcnRzLmFzc2VydCkoYVtjXT09PSIwIi5jb2RlUG9pbnRBdCgwKSk7Yys9Mztjb25zdCBlPWIoKSxmPWIoKSxnPWIoKSxoPWIoKSxrPWIoKTtyZXR1cm57c2VjdGlvblNpemU6ZCxtZW1vcnlTaXplOmUsbWVtb3J5QWxpZ246ZixuZWVkZWREeW5saWJzQ291bnQ6ayx0YWJsZVNpemU6Zyx0YWJsZUFsaWduOmh9fSxsb2FkU3RhdGljV2FzbSQkbW9kdWxlJHNyYyRtb2R1bGU9YXN5bmMoe3dhc21CeXRlczphLHdhc2k6YixtZXNzYWdlUG9ydDpjfSk9Pntjb25zdCBkPWF3YWl0IFdlYkFzc2VtYmx5LmNvbXBpbGUoYSk7YT1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOjE2Mzg0fSk7Y29uc3QgZT1iLmdldEltcG9ydHMoZCk7ZS5lbnY9ZS5lbnZ8fHt9O2UuZW52LmNzb3VuZExvYWRNb2R1bGVzPSgpPT4wO2UuZW52Lm1lbW9yeT1hO2UuZW52LmNzb3VuZFdhc2lKc01lc3NhZ2VDYWxsYmFjaz1jc291bmRXYXNpSnNNZXNzYWdlQ2FsbGJhY2skJG1vZHVsZSRzcmMkbW9kdWxlKHttZW1vcnk6ZS5lbnYubWVtb3J5LApzdHJlYW1CdWZmZXI6W10sbWVzc2FnZVBvcnQ6Y30pO2M9YXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZCxlKTtiLnNldE1lbW9yeShhKTtiLnN0YXJ0KGMpO2MuZXhwb3J0cy5fX3dhc2lfanNfY3NvdW5kU2V0TWVzc2FnZVN0cmluZ0NhbGxiYWNrKCk7cmV0dXJuW2MsYl19Owp2YXIgJGpzY29tcERlZmF1bHRFeHBvcnQkJG1vZHVsZSRzcmMkbW9kdWxlPWFzeW5jIGZ1bmN0aW9uKHt3YXNtRGF0YVVSSTphLHdpdGhQbHVnaW5zOmI9W10sbWVzc2FnZVBvcnQ6Y30pe3ZhciBkPXt9O2NvbnN0IGU9bmV3IFdBU0kkJG1vZHVsZSRzcmMkZmlsZXN5c3RlbSR3YXNpKHtwcmVvcGVuczp7Ii8iOiIvIn19KTthPW5ldyBVaW50OEFycmF5KGEpO2E9KG5ldyBJbmZsYXRlJCRtb2R1bGUkc3JjJHpsaWIkaW5mbGF0ZShhKSkuZGVjb21wcmVzcygpO3ZhciBmPWdldEJpbmFyeUhlYWRlckRhdGEkJG1vZHVsZSRzcmMkbW9kdWxlKGEpO2lmKCJzdGF0aWMiPT09ZilyZXR1cm4gYXdhaXQgbG9hZFN0YXRpY1dhc20kJG1vZHVsZSRzcmMkbW9kdWxlKHttZXNzYWdlUG9ydDpjLHdhc21CeXRlczphLHdhc21GczpkLHdhc2k6ZX0pO2NvbnN0IHttZW1vcnlTaXplOmcsbWVtb3J5QWxpZ246aCx0YWJsZVNpemU6a309ZjtiPWF3YWl0IGIucmVkdWNlKGFzeW5jKHIsdyk9PntyPWF3YWl0IHI7CmxldCBCLHo7dHJ5e0I9bmV3IFVpbnQ4QXJyYXkodyksej1nZXRCaW5hcnlIZWFkZXJEYXRhJCRtb2R1bGUkc3JjJG1vZHVsZShCKX1jYXRjaChDKXtjb25zb2xlLmVycm9yKCJFcnJvciBpbiBwbHVnaW4iLEMpfXomJnIucHVzaCh7aGVhZGVyRGF0YTp6LHdhc21QbHVnaW5CeXRlczpCfSk7cmV0dXJuIHJ9LFtdKTt2YXIgbD0xMjgqUEFHRVNfUEVSX01CJCRtb2R1bGUkc3JjJG1vZHVsZTtkPU1hdGguY2VpbCgoZytoKS9QQUdFX1NJWkUkJG1vZHVsZSRzcmMkbW9kdWxlKTtmPU1hdGguY2VpbChiLnJlZHVjZSgocix7aGVhZGVyRGF0YTp3fSk9PiJzdGF0aWMiPT09dz8wOnIrKHcubWVtb3J5U2l6ZStoKSwwKS9QQUdFX1NJWkUkJG1vZHVsZSRzcmMkbW9kdWxlKTtmPWQrZitsO2NvbnN0IG09bmV3IFdlYkFzc2VtYmx5Lk1lbW9yeSh7aW5pdGlhbDpmLG1heGltdW06MTAyNCpQQUdFU19QRVJfTUIkJG1vZHVsZSRzcmMkbW9kdWxlfSksbj1uZXcgV2ViQXNzZW1ibHkuVGFibGUoe2luaXRpYWw6aysKMSxlbGVtZW50OiJhbnlmdW5jIn0pO2Uuc2V0TWVtb3J5KG0pO2NvbnN0IHA9bmV3IFdlYkFzc2VtYmx5Lkdsb2JhbCh7dmFsdWU6ImkzMiIsbXV0YWJsZTohMH0sZipQQUdFX1NJWkUkJG1vZHVsZSRzcmMkbW9kdWxlKTtmPW5ldyBXZWJBc3NlbWJseS5HbG9iYWwoe3ZhbHVlOiJpMzIiLG11dGFibGU6ITB9LGYqUEFHRV9TSVpFJCRtb2R1bGUkc3JjJG1vZHVsZSk7bD1uZXcgV2ViQXNzZW1ibHkuR2xvYmFsKHt2YWx1ZToiaTMyIixtdXRhYmxlOiExfSxsKTtjb25zdCBxPW5ldyBXZWJBc3NlbWJseS5HbG9iYWwoe3ZhbHVlOiJpMzIiLG11dGFibGU6ITF9LDEpLHU9bmV3IFdlYkFzc2VtYmx5Lkdsb2JhbCh7dmFsdWU6ImkzMiIsbXV0YWJsZTohMH0sMCk7YT1hd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKGEpO2NvbnN0IHQ9ZS5nZXRJbXBvcnRzKGEpO2xldCB2PVtdLEE9ZDt0LmVudj10LmVudnx8e307dC5lbnYubWVtb3J5PW07dC5lbnYuX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZT0Kbjt0LmVudi5fX3N0YWNrX3BvaW50ZXI9cDt0LmVudi5fX21lbW9yeV9iYXNlPWw7dC5lbnYuX190YWJsZV9iYXNlPXE7dC5lbnYuY3NvdW5kTG9hZE1vZHVsZXM9cj0+e3YuZm9yRWFjaCh3PT57dm9pZCAwPT09eT9jb25zb2xlLmVycm9yKCJjc291bmQtd2FzbSBpbnRlcm5hbDogdGltaW5nIHByb2JsZW0gZGV0ZWN0ZWQhIik6ZGxpbml0JCRtb2R1bGUkc3JjJGRsaW5pdCh5LHcsbixyKX0pO3JldHVybiAwfTt0LmVudi5fWlRINWVycm5vPWZ1bmN0aW9uKCl7fTt0LmVudi5jc291bmRXYXNpSnNNZXNzYWdlQ2FsbGJhY2s9Y3NvdW5kV2FzaUpzTWVzc2FnZUNhbGxiYWNrJCRtb2R1bGUkc3JjJG1vZHVsZSh7bWVtb3J5Om0sbWVzc2FnZVBvcnQ6YyxzdHJlYW1CdWZmZXI6W119KTt0LmVudi5wcmludERlYnVnQ2FsbGJhY2s9KHIsdyk9PntyPW5ldyBVaW50OEFycmF5KG0uYnVmZmVyLHIsdyk7cj11aW50MlN0cmluZyQkbW9kdWxlJHNyYyR1dGlscyR0ZXh0X2VuY29kZXJzKHIpO2NvbnNvbGUubG9nKHIpfTsKdFsiR09ULm1lbSJdPXRbIkdPVC5tZW0iXXx8e307dFsiR09ULm1lbSJdLl9faGVhcF9iYXNlPWY7dFsiR09ULmZ1bmMiXT10WyJHT1QuZnVuYyJdfHx7fTtjb25zdCB5PWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGEsdCk7Yz1PYmplY3QuYXNzaWduKHt9LHkuZXhwb3J0cyk7YT17fTthLmV4cG9ydHM9T2JqZWN0LmFzc2lnbihjLHttZW1vcnk6bX0pO3Y9YXdhaXQgYi5yZWR1Y2UoYXN5bmMocix7aGVhZGVyRGF0YTp3LHdhc21QbHVnaW5CeXRlczpCfSk9PntyPWF3YWl0IHI7dHJ5e2NvbnN0IHttZW1vcnlTaXplOnosbWVtb3J5QWxpZ246Qyx0YWJsZVNpemU6Rn09dyxFPWF3YWl0IFdlYkFzc2VtYmx5LmNvbXBpbGUoQikseD1lLmdldEltcG9ydHMoRSksRz1uZXcgV2ViQXNzZW1ibHkuR2xvYmFsKHt2YWx1ZToiaTMyIixtdXRhYmxlOiExfSxBKlBBR0VfU0laRSQkbW9kdWxlJHNyYyRtb2R1bGUpO24uZ3JvdyhGKTt4LmVudj1PYmplY3QuYXNzaWduKHt9LHguZW52KTt4LmVudi5tZW1vcnk9Cm07eC5lbnYuX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZT1uO3guZW52Ll9fbWVtb3J5X2Jhc2U9Rzt4LmVudi5fX3N0YWNrX3BvaW50ZXI9cDt4LmVudi5fX3RhYmxlX2Jhc2U9cTt4LmVudi5jc291bmRMb2FkTW9kdWxlcz11O2RlbGV0ZSB4LmVudi5jc291bmRXYXNpSnNNZXNzYWdlQ2FsbGJhY2s7QSs9TWF0aC5jZWlsKCh6K0MpL1BBR0VfU0laRSQkbW9kdWxlJHNyYyRtb2R1bGUpO2NvbnN0IEQ9YXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoRSx4KTthc3NlcnRQbHVnaW5FeHBvcnRzJCRtb2R1bGUkc3JjJG1vZHVsZShEKSYmKEQuZXhwb3J0cy5fX3dhc21fY2FsbF9jdG9ycygpLHIucHVzaChEKSl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiRXJyb3Igd2hpbGUgY29tcGlsaW5nIGNzb3VuZC1wbHVnaW4iLHopfXJldHVybiByfSxbXSk7ZS5zdGFydChhKTthLmV4cG9ydHMuX193YXNpX2pzX2Nzb3VuZFNldE1lc3NhZ2VTdHJpbmdDYWxsYmFjaygpO3JldHVyblthLGVdfSwKbW9kdWxlJHNyYyRtb2R1bGU9e307bW9kdWxlJHNyYyRtb2R1bGUuY3NvdW5kV2FzaUpzTWVzc2FnZUNhbGxiYWNrPWNzb3VuZFdhc2lKc01lc3NhZ2VDYWxsYmFjayQkbW9kdWxlJHNyYyRtb2R1bGU7bW9kdWxlJHNyYyRtb2R1bGUuZGVmYXVsdD0kanNjb21wRGVmYXVsdEV4cG9ydCQkbW9kdWxlJHNyYyRtb2R1bGU7Y29uc3QgaGFuZGxlQ3NvdW5kU3RhcnQkJG1vZHVsZSRzcmMkd29ya2VycyRjb21tb25fdXRpbHM9KGEsYixjLGQsZSk9PmY9Pntjb25zdCB7Y3NvdW5kOmd9PWYsaD0xPT09Yi5jc291bmRTaG91bGREYWVtb25pemUoZyk7aCYmKGIuY3NvdW5kU2V0T3B0aW9uKGcsIi0tZGFlbW9uIiksYi5jc291bmRTZXRPcHRpb24oZywiLW9kYWMiKSk7Y29uc3Qgaz1iLmNzb3VuZFN0YXJ0KGcpLGw9Yi5jc291bmRHZXRPdXRwdXROYW1lKGcpfHwidGVzdC53YXYiO2xvZ0NvbW1vblV0aWxzJCRtb2R1bGUkc3JjJGxvZ2dlcihgaGFuZGxlQ3NvdW5kU3RhcnQ6IGFjdHVhbCBjc291bmRTdGFydCByZXN1bHQgJHtrfSwgb3V0cHV0TmFtZTogJHtsfWApKCk7MCE9PWsmJmEucG9zdChgZXJyb3I6IGNzb3VuZFN0YXJ0IGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gcmVuZGVyICR7bH0sYCsiIGxvb2sgb3V0IGZvciBlcnJvcnMgaW4gb3B0aW9ucyBhbmQgc3ludGF4Iik7c2V0VGltZW91dCgoKT0+e2NvbnN0IG09CmIuX2lzUmVxdWVzdGluZ1J0TWlkaUlucHV0KGcpO2lmKGh8fG18fGwuaW5jbHVkZXMoImRhYyIpKWQoZik7ZWxzZSBpZihhLmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVuZGVyU3RhcnRlZCIpLGUpZShmKTtlbHNlIGZvcig7MD09PWIuY3NvdW5kUGVyZm9ybUtzbXBzKGcpOyk7fSwwKTtyZXR1cm4ga30saW5zdGFudGlhdGVBdWRpb1BhY2tldCQkbW9kdWxlJHNyYyR3b3JrZXJzJGNvbW1vbl91dGlscz0oYSxiKT0+e2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhO2QrKyljLnB1c2gobmV3IEZsb2F0NjRBcnJheShiKSk7cmV0dXJuIGN9LHJlbmRlckZ1bmN0aW9uJCRtb2R1bGUkc3JjJHdvcmtlcnMkY29tbW9uX3V0aWxzPSh7bGlicmFyeUNzb3VuZDphLHdvcmtlck1lc3NhZ2VQb3J0OmJ9KT0+YXN5bmMoe2Nzb3VuZDpjfSk9Pntjb25zdCBkPWEuY3NvdW5kR2V0S3IoYyk7bGV0IGU9MCxmPTA7Zm9yKDsoInJlbmRlclN0YXJ0ZWQiPT09Yi52YW5pbGxhV29ya2VyU3RhdGV8fCJyZW5kZXJTdGFydGVkIj09PQpiLndvcmtlclN0YXRlKSYmMD09PWU7KWU9YS5jc291bmRQZXJmb3JtS3NtcHMoYyksZis9MSwiZnVuY3Rpb24iPT09dHlwZW9mIHNldFRpbWVvdXQmJjA9PT1lJiYwPT09ZiUoMipkKSYmYXdhaXQgbmV3IFByb21pc2UoZz0+c2V0VGltZW91dChnLDApKTtiLmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVuZGVyRW5kZWQiKX07dmFyIG1vZHVsZSRzcmMkd29ya2VycyRjb21tb25fdXRpbHM9e307bW9kdWxlJHNyYyR3b3JrZXJzJGNvbW1vbl91dGlscy5oYW5kbGVDc291bmRTdGFydD1oYW5kbGVDc291bmRTdGFydCQkbW9kdWxlJHNyYyR3b3JrZXJzJGNvbW1vbl91dGlsczttb2R1bGUkc3JjJHdvcmtlcnMkY29tbW9uX3V0aWxzLmluc3RhbnRpYXRlQXVkaW9QYWNrZXQ9aW5zdGFudGlhdGVBdWRpb1BhY2tldCQkbW9kdWxlJHNyYyR3b3JrZXJzJGNvbW1vbl91dGlsczttb2R1bGUkc3JjJHdvcmtlcnMkY29tbW9uX3V0aWxzLnJlbmRlckZ1bmN0aW9uPXJlbmRlckZ1bmN0aW9uJCRtb2R1bGUkc3JjJHdvcmtlcnMkY29tbW9uX3V0aWxzO2xldCBsaWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLGNvbWJpbmVkJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyO2NvbnN0IHJ0bWlkaVF1ZXVlJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyPVtdLGNhbGxVbmNsb25lZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlcj1hc3luYyhhLGIpPT4oYT1jb21iaW5lZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlci5nZXQoYSkpJiZhLmFwcGx5KHt9LGJ8fFtdKTsKY2xhc3MgV29ya2xldFNpbmdsZXRocmVhZFdvcmtlciQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlciBleHRlbmRzIEF1ZGlvV29ya2xldFByb2Nlc3NvcntzdGF0aWMgZ2V0IHBhcmFtZXRlckRlc2NyaXB0b3JzKCl7cmV0dXJuW119Y29uc3RydWN0b3IoYSl7c3VwZXIoYSk7dGhpcy5zYW1wbGVSYXRlPXNhbXBsZVJhdGU7dGhpcy5vcHRpb25zPWE7dGhpcy5pbml0aWFsaXplPXRoaXMuaW5pdGlhbGl6ZS5iaW5kKHRoaXMpO3RoaXMucGF1c2U9dGhpcy5wYXVzZS5iaW5kKHRoaXMpO3RoaXMucHJvY2Vzcz10aGlzLnByb2Nlc3MuYmluZCh0aGlzKTt0aGlzLnJlc3VtZT10aGlzLnJlc3VtZS5iaW5kKHRoaXMpO3RoaXMuc3RhcnQ9dGhpcy5zdGFydC5iaW5kKHRoaXMpO3RoaXMuaXNQYXVzZWQ9dGhpcy5uZWVkc1N0YXJ0Tm90aWZpY2F0aW9uPSExO3RoaXMuY2FsbFVuY2xvbmVkPSgpPT5jb25zb2xlLmVycm9yKCJDc291bmQgd29ya2xldCB0aHJlYWQgaXMgc3RpbGwgdW5pbml0aWFsaXplZCEiKTsKdGhpcy5wb3J0LnN0YXJ0KCk7ZXhwb3NlJCRtb2R1bGUkbm9kZV9tb2R1bGVzJGNvbWxpbmskZGlzdCRlc20kY29tbGlua19tanModGhpcyx0aGlzLnBvcnQpO3RoaXMud29ya2VyTWVzc2FnZVBvcnQ9bmV3ICRqc2NvbXBEZWZhdWx0RXhwb3J0JCRtb2R1bGUkc3JjJHV0aWxzJG1lc3NhZ2VfcG9ydF9zdGF0ZTt0aGlzLmluaXRpYWxpemVNZXNzYWdlUG9ydD0oe21lc3NhZ2VQb3J0OmIscnRtaWRpUG9ydDpjfSk9Pnt0aGlzLndvcmtlck1lc3NhZ2VQb3J0LnBvc3Q9ZD0+Yi5wb3N0TWVzc2FnZSh7bG9nOmR9KTt0aGlzLndvcmtlck1lc3NhZ2VQb3J0LmJyb2FkY2FzdFBsYXlTdGF0ZT1kPT57dGhpcy53b3JrZXJNZXNzYWdlUG9ydC53b3JrZXJTdGF0ZSE9PWQmJih0aGlzLndvcmtlck1lc3NhZ2VQb3J0LndvcmtlclN0YXRlPWQpO2IucG9zdE1lc3NhZ2Uoe3BsYXlTdGF0ZUNoYW5nZTpkfSl9O3RoaXMud29ya2VyTWVzc2FnZVBvcnQucmVhZHk9ITA7bG9nU2luZ2xldGhyZWFkV29ya2xldFdvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXIoImluaXRSdE1pZGlFdmVudFBvcnQiKSgpOwp0aGlzLnJ0bWlkaVBvcnQ9Yzt0aGlzLnJ0bWlkaVBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKHtkYXRhOmR9KT0+e3J0bWlkaVF1ZXVlJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLnB1c2goZCl9KTt0aGlzLnJ0bWlkaVBvcnQuc3RhcnQoKX19YXN5bmMgaW5pdGlhbGl6ZShhLGIpe2xvZ1NpbmdsZXRocmVhZFdvcmtsZXRXb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyKCJpbml0aWFsaXppbmcgd29ya2xldC5zaW5nbGV0aHJlYWQud29ya2VyIikoKTtsZXQgYztjb25zdCBkPW5ldyBQcm9taXNlKGU9PntjPWV9KTskanNjb21wRGVmYXVsdEV4cG9ydCQkbW9kdWxlJHNyYyRtb2R1bGUoe3dhc21EYXRhVVJJOmEsd2l0aFBsdWdpbnM6YixtZXNzYWdlUG9ydDp0aGlzLndvcmtlck1lc3NhZ2VQb3J0fSkudGhlbigoW2UsZl0pPT57dGhpcy53YXNtPWU7dGhpcy53YXNpPWY7ZS53YXNpPWY7bGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlcj0KJGpzY29tcERlZmF1bHRFeHBvcnQkJG1vZHVsZSRzcmMkbGliY3NvdW5kKGUpO3RoaXMuY2FsbFVuY2xvbmVkPWNhbGxVbmNsb25lZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlcjt0aGlzLmNzb3VuZD1saWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZENyZWF0ZSgwKTt0aGlzLnJlc3VsdD0wO3RoaXMuc3RhcnRlZD10aGlzLmlzUmVuZGVyaW5nPXRoaXMucnVubmluZz0hMTt0aGlzLnJlc2V0Q3NvdW5kKCExKTtlPXBpcGUkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcyhhc3NvYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKCJjc291bmRDcmVhdGUiLGFzeW5jIGc9PnRoaXMuY3NvdW5kKSxhc3NvYyQkbW9kdWxlJG5vZGVfbW9kdWxlcyRyYW1iZGEkZGlzdCRyYW1iZGFfbWpzKCJjc291bmRSZXNldCIsdGhpcy5yZXNldENzb3VuZC5iaW5kKHRoaXMpKSwKYXNzb2MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygiY3NvdW5kU3RhcnQiLHRoaXMuc3RhcnQuYmluZCh0aGlzKSksYXNzb2MkJG1vZHVsZSRub2RlX21vZHVsZXMkcmFtYmRhJGRpc3QkcmFtYmRhX21qcygiY3NvdW5kU3RvcCIsdGhpcy5zdG9wLmJpbmQodGhpcykpLGFzc29jJCRtb2R1bGUkbm9kZV9tb2R1bGVzJHJhbWJkYSRkaXN0JHJhbWJkYV9tanMoIndhc20iLGUpKShsaWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyKTtjb21iaW5lZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlcj1uZXcgTWFwKE9iamVjdC5lbnRyaWVzKGUpKTtsb2dTaW5nbGV0aHJlYWRXb3JrbGV0V29ya2VyJCRtb2R1bGUkc3JjJGxvZ2dlcigid2FzbSBpbml0aWFsaXplZCBhbmQgYXBpIGdlbmVyYXRlZCIpKCk7YygpfSk7bG9nU2luZ2xldGhyZWFkV29ya2xldFdvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXIoIndhaXRpbmcgb24gd2FzbSBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSIpKCk7CmF3YWl0IGR9YXN5bmMgcmVzZXRDc291bmQoYSl7aWYoYSYmIXRoaXMud29ya2VyTWVzc2FnZVBvcnR8fGEmJiJyZWFsdGltZVBlcmZvcm1hbmNlRW5kZWQiIT09dGhpcy53b3JrZXJNZXNzYWdlUG9ydC53b3JrZXJTdGF0ZSYmInJlYWx0aW1lUGVyZm9ybWFuY2VTdGFydGVkIiE9PXRoaXMud29ya2VyTWVzc2FnZVBvcnQud29ya2VyU3RhdGUpcmV0dXJuLTE7YSYmInJlYWx0aW1lUGVyZm9ybWFuY2VTdGFydGVkIj09PXRoaXMud29ya2VyTWVzc2FnZVBvcnQud29ya2VyU3RhdGUmJnRoaXMud29ya2VyTWVzc2FnZVBvcnQuYnJvYWRjYXN0UGxheVN0YXRlKCJyZWFsdGltZVBlcmZvcm1hbmNlRW5kZWQiKTt0aGlzLnN0YXJ0ZWQ9dGhpcy5ydW5uaW5nPSExO3RoaXMucmVzdWx0PTA7Y29uc3QgYj10aGlzLmNzb3VuZDthJiZsaWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZFJlc2V0KGIpO2xpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kU2V0TWlkaUNhbGxiYWNrcyhiKTsKdGhpcy5zYW1wbGVSYXRlJiZsaWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZFNldE9wdGlvbihiLCItLXNhbXBsZS1yYXRlPSIrdGhpcy5zYW1wbGVSYXRlKTt0aGlzLm5jaG5sc19pPXRoaXMubmNobmxzPS0xO2RlbGV0ZSB0aGlzLmNzb3VuZE91dHB1dEJ1ZmZlcn1zdG9wKCl7dGhpcy5jc291bmQmJmxpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kU3RvcCh0aGlzLmNzb3VuZCk7dGhpcy53b3JrZXJNZXNzYWdlUG9ydC5icm9hZGNhc3RQbGF5U3RhdGUoInJlYWx0aW1lUGVyZm9ybWFuY2VFbmRlZCIpfXBhdXNlKCl7dGhpcy5pc1BhdXNlZHx8KHRoaXMud29ya2VyTWVzc2FnZVBvcnQuYnJvYWRjYXN0UGxheVN0YXRlKCJyZWFsdGltZVBlcmZvcm1hbmNlUGF1c2VkIiksdGhpcy5pc1BhdXNlZD0hMCl9cmVzdW1lKCl7dGhpcy5pc1BhdXNlZCYmCih0aGlzLndvcmtlck1lc3NhZ2VQb3J0LmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVhbHRpbWVQZXJmb3JtYW5jZVJlc3VtZWQiKSx0aGlzLmlzUGF1c2VkPSExKX1wcm9jZXNzKGEsYil7aWYoISh0aGlzLmlzUmVuZGVyaW5nfHwhdGhpcy5pc1BhdXNlZCYmdGhpcy5jc291bmRPdXRwdXRCdWZmZXImJnRoaXMucnVubmluZykpe2E9YlswXTtiPWFbMF0ubGVuZ3RoO2Zvcih2YXIgYz0wO2M8YjtjKyspZm9yKHZhciBkPTA7ZDxhLm51bWJlck9mQ2hhbm5lbHM7ZCsrKWFbZF1bY109MDtyZXR1cm4hMH10aGlzLm5lZWRzU3RhcnROb3RpZmljYXRpb24mJih0aGlzLm5lZWRzU3RhcnROb3RpZmljYXRpb249ITEsdGhpcy53b3JrZXJNZXNzYWdlUG9ydC5icm9hZGNhc3RQbGF5U3RhdGUoInJlYWx0aW1lUGVyZm9ybWFuY2VTdGFydGVkIikpOzA8cnRtaWRpUXVldWUkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIubGVuZ3RoJiYocnRtaWRpUXVldWUkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuZm9yRWFjaChxPT4Ke2xpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kUHVzaE1pZGlNZXNzYWdlKHRoaXMuY3NvdW5kLHFbMF0scVsxXSxxWzJdKX0pLGNsZWFyQXJyYXkkJG1vZHVsZSRzcmMkdXRpbHMkY2xlYXJfYXJyYXkocnRtaWRpUXVldWUkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIpKTthPWFbMF07Yj1iWzBdO2M9YlswXS5sZW5ndGg7ZD10aGlzLmNzb3VuZE91dHB1dEJ1ZmZlcjtsZXQgZT10aGlzLmNzb3VuZElucHV0QnVmZmVyO2NvbnN0IGY9dGhpcy5rc21wcyxnPXRoaXMuemVyb2RCRlM7bGV0IGg9dGhpcy5jbnQ7Y29uc3Qgaz10aGlzLm5jaG5scyxsPXRoaXMubmNobmxzX2k7bGV0IG09dGhpcy5yZXN1bHQ7Zm9yKGxldCBxPTA7cTxjO3ErKyxoKyspe2g+PWYmJjA9PT1tJiYobT1saWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZFBlcmZvcm1Lc21wcyh0aGlzLmNzb3VuZCksCmg9MCwwIT09bSYmKHRoaXMuc3RhcnRlZD10aGlzLnJ1bm5pbmc9ITEsbGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlci5jc291bmRDbGVhbnVwKHRoaXMuY3NvdW5kKSx0aGlzLndvcmtlck1lc3NhZ2VQb3J0LmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVhbHRpbWVQZXJmb3JtYW5jZUVuZGVkIikpKTtkJiYwIT09ZC5sZW5ndGh8fChkPXRoaXMuY3NvdW5kT3V0cHV0QnVmZmVyPW5ldyBGbG9hdDY0QXJyYXkodGhpcy53YXNtLndhc2kubWVtb3J5LmJ1ZmZlcixsaWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZEdldFNwb3V0KHRoaXMuY3NvdW5kKSxmKmspKTtlJiYwIT09ZS5sZW5ndGh8fChlPXRoaXMuY3NvdW5kSW5wdXRCdWZmZXI9bmV3IEZsb2F0NjRBcnJheSh0aGlzLndhc20ud2FzaS5tZW1vcnkuYnVmZmVyLGxpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kR2V0U3Bpbih0aGlzLmNzb3VuZCksCmYqbCkpO3ZhciBuPU1hdGgubWluKHRoaXMubmNobmxzX2ksYS5sZW5ndGgpO2Zvcih2YXIgcD0wO3A8bjtwKyspZVtoKmwrcF09YVtwXVtxXSpnO2lmKHRoaXMubmNobmxzPT09Yi5sZW5ndGgpZm9yKGNvbnN0IFt1LHRdb2YgYi5lbnRyaWVzKCkpdFtxXT0wPT09bT9kW2gqayt1XS9nOjA7ZWxzZSBpZigyPT09dGhpcy5uY2hubHMmJjE9PT1iLmxlbmd0aCliWzBdW3FdPTA9PT1tPy41KihkW2gqa10vZytkW2gqaysxXS9nKTowO2Vsc2UgaWYoMT09PXRoaXMubmNobmxzJiYyPT09Yi5sZW5ndGgpaWYobj1iWzBdLHA9YlsxXSwwPT09bSl7Y29uc3QgdT1kW2gqa10vZztuW3FdPXU7cFtxXT11fWVsc2UgbltxXT0wLHBbcV09MH10aGlzLmNudD1oO3RoaXMucmVzdWx0PW07cmV0dXJuITB9YXN5bmMgaXNSZXF1ZXN0aW5nSW5wdXQoKXtyZXR1cm4obGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlci5jc291bmRHZXRJbnB1dE5hbWUodGhpcy5jc291bmQpfHwKIiIpLmluY2x1ZGVzKCJhZGMiKX1hc3luYyBpc1JlcXVlc3RpbmdSZWFsdGltZU91dHB1dCgpe3JldHVybihsaWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZEdldE91dHB1dE5hbWUodGhpcy5jc291bmQpfHwiIikuaW5jbHVkZXMoImRhYyIpfWFzeW5jIHN0YXJ0KCl7bGV0IGE9LTE7aWYodGhpcy5zdGFydGVkKWxvZ1NpbmdsZXRocmVhZFdvcmtsZXRXb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyKCJ3b3JrbGV0IHdhcyBhc2tlZCB0byBzdGFydCBidXQgaXQgYWxyZWFkeSBoYXMhIikoKTtlbHNle2xvZ1NpbmdsZXRocmVhZFdvcmtsZXRXb3JrZXIkJG1vZHVsZSRzcmMkbG9nZ2VyKCJ3b3JrbGV0IHRocmVhZCBpcyBzdGFydGluZy4uIikoKTtjb25zdCBiPXRoaXMuY3NvdW5kLGM9bGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlci5jc291bmRHZXRLc21wcyhiKTsKdGhpcy5jbnQ9dGhpcy5rc21wcz1jO3RoaXMubmNobmxzPWxpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kR2V0TmNobmxzKGIpO3RoaXMubmNobmxzX2k9bGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlci5jc291bmRHZXROY2hubHNJbnB1dChiKTt0aGlzLnplcm9kQkZTPWxpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kR2V0MGRCRlMoYik7YT1saWJyYXJ5Q3NvdW5kJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyLmNzb3VuZFN0YXJ0KGIpO2lmKDAhPT1hKXJldHVybiBhO2lmKGF3YWl0IHRoaXMuaXNSZXF1ZXN0aW5nUmVhbHRpbWVPdXRwdXQoKSl0aGlzLmNzb3VuZE91dHB1dEJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMud2FzbS53YXNpLm1lbW9yeS5idWZmZXIsCmxpYnJhcnlDc291bmQkJG1vZHVsZSRzcmMkd29ya2VycyR3b3JrbGV0X3NpbmdsZXRocmVhZF93b3JrZXIuY3NvdW5kR2V0U3BvdXQoYiksYyp0aGlzLm5jaG5scyksdGhpcy5jc291bmRJbnB1dEJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KHRoaXMud2FzbS53YXNpLm1lbW9yeS5idWZmZXIsbGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlci5jc291bmRHZXRTcGluKGIpLGMqdGhpcy5uY2hubHNfaSksbG9nU2luZ2xldGhyZWFkV29ya2xldFdvcmtlciQkbW9kdWxlJHNyYyRsb2dnZXIoImNzb3VuZFN0YXJ0IGNhbGxlZCB3aXRoIHt9IHJldHVybiB2YWwiLGEpKCksdGhpcy5uZWVkc1N0YXJ0Tm90aWZpY2F0aW9uPXRoaXMuc3RhcnRlZD0hMDtlbHNlIHJldHVybiB0aGlzLndvcmtlck1lc3NhZ2VQb3J0LmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVuZGVyU3RhcnRlZCIpLHRoaXMuaXNSZW5kZXJpbmc9ITAscmVuZGVyRnVuY3Rpb24kJG1vZHVsZSRzcmMkd29ya2VycyRjb21tb25fdXRpbHMoe2xpYnJhcnlDc291bmQ6bGlicmFyeUNzb3VuZCQkbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlciwKd29ya2VyTWVzc2FnZVBvcnQ6dGhpcy53b3JrZXJNZXNzYWdlUG9ydCx3YXNpOnRoaXMud2FzaX0pKHtjc291bmQ6Yn0pLnRoZW4oKCk9Pnt0aGlzLndvcmtlck1lc3NhZ2VQb3J0LmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVuZGVyRW5kZWQiKTt0aGlzLmlzUmVuZGVyaW5nPSExfSkuY2F0Y2goKCk9Pnt0aGlzLndvcmtlck1lc3NhZ2VQb3J0LmJyb2FkY2FzdFBsYXlTdGF0ZSgicmVuZGVyRW5kZWQiKTt0aGlzLmlzUmVuZGVyaW5nPSExfSksMH10aGlzLnJ1bm5pbmc9ITA7cmV0dXJuIGF9fXJlZ2lzdGVyUHJvY2Vzc29yKCJjc291bmQtc2luZ2xldGhyZWFkLXdvcmtsZXQtcHJvY2Vzc29yIixXb3JrbGV0U2luZ2xldGhyZWFkV29ya2VyJCRtb2R1bGUkc3JjJHdvcmtlcnMkd29ya2xldF9zaW5nbGV0aHJlYWRfd29ya2VyKTt2YXIgbW9kdWxlJHNyYyR3b3JrZXJzJHdvcmtsZXRfc2luZ2xldGhyZWFkX3dvcmtlcj17fTsKLy8jIHNvdXJjZVVSTD0vZGlzdC9fX2NvbXBpbGVkLndvcmtsZXQuc2luZ2xldGhyZWFkLndvcmtlci5qcwovLyMgc291cmNlTWFwcGluZ1VSTD0vZGlzdC9fX2NvbXBpbGVkLndvcmtsZXQuc2luZ2xldGhyZWFkLndvcmtlci5qcy5tYXAK", +module$dist$__compiled_worklet_singlethread_worker_inline={};module$dist$__compiled_worklet_singlethread_worker_inline.default=$jscompDefaultExport$$module$dist$__compiled_worklet_singlethread_worker_inline;const initializeModule$$module$src$mains$worklet_singlethread_main=async a=>{logSinglethreadWorkletMain$$module$src$logger("Initialize Module")();try{await a.audioWorklet.addModule($jscompDefaultExport$$module$dist$__compiled_worklet_singlethread_worker_inline())}catch(b){return console.error("Error calling audioWorklet.addModule",b),!1}return!0}; +class SingleThreadAudioWorkletMainThread$$module$src$mains$worklet_singlethread_main{constructor({audioContext:a,inputChannelCount:b=1,outputChannelCount:c=2}){this.exportApi={};this.ipcMessagePorts=new IPCMessagePorts$$module$src$mains$messages_main;this.publicEvents=new PublicEventAPI$$module$src$events(this);this.eventPromises=new EventPromises$$module$src$utils$event_promises;this.audioContext=a;this.inputChannelCount=b;this.outputChannelCount=c;this.messageCallbacks=[];this.onPlayStateChange= +this.onPlayStateChange.bind(this);this.currentPlayState=void 0}async terminateInstance(){this.node&&(this.node.disconnect(),delete this.node);this.audioContext&&("closed"!==this.audioContext.state&&await this.audioContext.close(),delete this.audioContext);this.workletProxy&&(this.workletProxy[releaseProxy$$module$node_modules$comlink$dist$esm$comlink_mjs](),delete this.workletProxy);this.publicEvents&&(this.publicEvents.terminateInstance(),delete this.publicEvents);Object.keys(this.exportApi).forEach(a=> +delete this.exportApi[a]);Object.keys(this).forEach(a=>delete this[a])}async onPlayStateChange(a){if(this.currentPlayState!==a&&this.publicEvents)switch(this.currentPlayState=a,a){case "realtimePerformanceStarted":this.eventPromises.isWaitingToStart()&&(logSinglethreadWorkletMain$$module$src$logger("Start promise resolved")(),this.eventPromises.releaseStartPromise());this.publicEvents.triggerRealtimePerformanceStarted(this);break;case "realtimePerformanceEnded":this.midiPortStarted=!1;this.currentPlayState= +void 0;this.publicEvents&&this.publicEvents.triggerRealtimePerformanceEnded(this);this.eventPromises&&this.eventPromises.isWaitingToStop()&&this.eventPromises.releaseStopPromise();this.eventPromises&&this.eventPromises.releaseStartPromise();break;case "realtimePerformancePaused":this.publicEvents.triggerRealtimePerformancePaused(this);break;case "realtimePerformanceResumed":this.publicEvents.triggerRealtimePerformanceResumed(this);break;case "renderStarted":this.eventPromises.isWaitingToStart()&& +(logSinglethreadWorkletMain$$module$src$logger("Start promise resolved")(),this.publicEvents.triggerRenderStarted(this),this.eventPromises.releaseStartPromise());break;case "renderEnded":this.publicEvents.triggerRenderEnded(this),this.eventPromises&&this.eventPromises.isWaitingToStop()&&this.eventPromises.releaseStopPromise(),this.eventPromises&&this.eventPromises.releaseStartPromise()}}async csoundPause(){void 0!==this.workletProxy&&await this.workletProxy.pause()}async csoundResume(){void 0!==this.workletProxy&& +await this.workletProxy.resume()}handleMidiInput({data:a}){this.ipcMessagePorts.csoundMainRtMidiPort.postMessage&&this.ipcMessagePorts.csoundMainRtMidiPort.postMessage(a)}async initialize({wasmDataURI:a,withPlugins:b,autoConnect:c}){b&&0this.audioContext;this.exportApi.getNode=async()=>this.node;this.exportApi.enableAudioInput=enableAudioInput$$module$src$mains$io_utils.bind(this.exportApi);this.exportApi.name="Csound: Audio Worklet, Single-threaded";this.exportApi=this.publicEvents.decorateAPI(this.exportApi); +this.exportApi.addListener("message",console.log);for(const e of Object.keys(api$$module$src$libcsound)){const f=api$$module$src$libcsound[e],g=makeProxyCallback$$module$src$utils(this.workletProxy,d,e,this.currentPlayState);switch(e){case "csoundCreate":break;case "csoundStart":a=async function(){this.eventPromises.createStartPromise();var h=await this.workletProxy.isRequestingInput();if(await this.workletProxy.isRequestingRealtimeOutput())return h&&this.exportApi.enableAudioInput(),await this.exportApi._isRequestingRtMidiInput(d)&& +requestMidi$$module$src$utils$request_midi({onMidiMessage:this.handleMidiInput.bind(this)}),h=await g({csound:d}),this.publicEvents.triggerOnAudioNodeCreated(this.node),await this.eventPromises.waitForStart(),h;g({csound:d});this.publicEvents.triggerOnAudioNodeCreated(this.node);await this.eventPromises.waitForStart();return 0};a.toString=()=>f.toString();this.exportApi.start=a.bind(this);break;case "csoundStop":a=async()=>{if(this.eventPromises.isWaitingToStop())return logSinglethreadWorkletMain$$module$src$logger("already waiting to stop, doing nothing")(), +-1;this.eventPromises.createStopPromise();const h=await g();await this.eventPromises.waitForStop();return h};a.toString=()=>f.toString();this.exportApi.stop=a.bind(this);break;case "fs":this.exportApi.fs={};Object.keys(f).forEach(h=>{const k=makeProxyCallback$$module$src$utils(this.workletProxy,d,h,this.currentPlayState);k.toString=()=>f[h].toString();this.exportApi.fs[h]=k});break;default:g.toString=()=>f.toString(),this.exportApi[csoundApiRename$$module$src$utils(e)]=g}}return this.exportApi}} +var $jscompDefaultExport$$module$src$mains$worklet_singlethread_main=SingleThreadAudioWorkletMainThread$$module$src$mains$worklet_singlethread_main,module$src$mains$worklet_singlethread_main={};module$src$mains$worklet_singlethread_main.default=$jscompDefaultExport$$module$src$mains$worklet_singlethread_main;(0,module$node_modules$unmute_ios_audio$index.default)(); +const Csound$$module$src$index=async function({audioContext:a,inputChannelCount:b,outputChannelCount:c,autoConnect:d=!0,withPlugins:e=[],useWorker:f=!1,useSAB:g=!0,useSPN:h=!1}={}){const k=a&&WebkitAudioContext$$module$src$utils()&&a instanceof WebkitAudioContext$$module$src$utils();k||(a=a||new (WebkitAudioContext$$module$src$utils())({latencyHint:"interactive"}));isSafari$$module$src$utils()&&a.resume();const n=areWorkletsSupported$$module$src$utils(),m=isScriptProcessorNodeSupported$$module$src$utils(); +if(f){n?logIndex$$module$src$logger("worklet support detected")():m?logIndex$$module$src$logger("scriptProcessorNode support detected")():console.error("No WebAudio Support detected");var l;!h&&n?l=new $jscompDefaultExport$$module$src$mains$worklet_main({audioContext:a,audioContextIsProvided:k,autoConnect:d}):m&&(l=new $jscompDefaultExport$$module$src$mains$old_spn_main({audioContext:a,audioContextIsProvided:k,autoConnect:d}));if(l)return(d=isSabSupported$$module$src$utils())?g&&logIndex$$module$src$logger("using SharedArrayBuffers")(): +logIndex$$module$src$logger("SharedArrayBuffers not found, falling back to Vanilla concurrency")(),a=d&&n&&g?new $jscompDefaultExport$$module$src$mains$sab_main({audioWorker:l,audioContext:a,audioContextIsProvided:k,inputChannelCount:b,outputChannelCount:c}):new $jscompDefaultExport$$module$src$mains$vanilla_main({audioWorker:l,audioContextIsProvided:k}),logIndex$$module$src$logger("starting Csound thread initialization via WebWorker")(),await a.initialize({wasmDataURI:$jscompDefaultExport$$module$dist$__csound_wasm_inline, +withPlugins:e}),e=a.api}else{if(n&&!h)return logIndex$$module$src$logger("Single Thread AudioWorklet")(),(new $jscompDefaultExport$$module$src$mains$worklet_singlethread_main({audioContext:a,inputChannelCount:b||2,outputChannelCount:c||2})).initialize({wasmDataURI:$jscompDefaultExport$$module$dist$__csound_wasm_inline,withPlugins:e,autoConnect:d});if(m)return logIndex$$module$src$logger("Single Thread ScriptProcessorNode")(),await (new $jscompDefaultExport$$module$src$mains$spn_main({audioContext:a, +inputChannelCount:b||2,outputChannelCount:c||2})).initialize({wasmDataURI:$jscompDefaultExport$$module$dist$__csound_wasm_inline,withPlugins:e,autoConnect:d})}console.error("No detectable WebAudioAPI in current environment")};goog.exportSymbol("Csound$$module$src$index",Csound$$module$src$index);var module$src$index={};module$src$index.Csound=Csound$$module$src$index; +const Csound = Csound$$module$src$index; +Csound.toString = () => 'async (options) => CsoundObj;'; +export { Csound } +export default Csound +//# sourceMappingURL=csound.js.map -- cgit v1.2.3