UNPKG

@nota/nativescript-webview-ext

Version:

Extended WebView for NativeScript which adds 'x-local' scheme for local-files. events between WebView and native-layer, javascript execution, injecting CSS and JS-files.

5 lines 72.5 kB
export const fetchPolyfill = "!function(global,factory){\"object\"==typeof exports&&\"undefined\"!=typeof module?factory(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],factory):factory(global.WHATWGFetch={})}(this,(function(exports){\"use strict\";var global=\"undefined\"!=typeof globalThis&&globalThis||\"undefined\"!=typeof self&&self||void 0!==global&&global,support_searchParams=\"URLSearchParams\"in global,support_iterable=\"Symbol\"in global&&\"iterator\"in Symbol,support_blob=\"FileReader\"in global&&\"Blob\"in global&&function(){try{return new Blob,!0}catch(e){return!1}}(),support_formData=\"FormData\"in global,support_arrayBuffer=\"ArrayBuffer\"in global;if(support_arrayBuffer)var viewClasses=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],isArrayBufferView=ArrayBuffer.isView||function(obj){return obj&&viewClasses.indexOf(Object.prototype.toString.call(obj))>-1};function normalizeName(name){if(\"string\"!=typeof name&&(name=String(name)),/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name)||\"\"===name)throw new TypeError('Invalid character in header field name: \"'+name+'\"');return name.toLowerCase()}function normalizeValue(value){return\"string\"!=typeof value&&(value=String(value)),value}function iteratorFor(items){var iterator={next:function(){var value=items.shift();return{done:void 0===value,value:value}}};return support_iterable&&(iterator[Symbol.iterator]=function(){return iterator}),iterator}function Headers(headers){this.map={},headers instanceof Headers?headers.forEach((function(value,name){this.append(name,value)}),this):Array.isArray(headers)?headers.forEach((function(header){this.append(header[0],header[1])}),this):headers&&Object.getOwnPropertyNames(headers).forEach((function(name){this.append(name,headers[name])}),this)}function consumed(body){if(body.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));body.bodyUsed=!0}function fileReaderReady(reader){return new Promise((function(resolve,reject){reader.onload=function(){resolve(reader.result)},reader.onerror=function(){reject(reader.error)}}))}function readBlobAsArrayBuffer(blob){var reader=new FileReader,promise=fileReaderReady(reader);return reader.readAsArrayBuffer(blob),promise}function bufferClone(buf){if(buf.slice)return buf.slice(0);var view=new Uint8Array(buf.byteLength);return view.set(new Uint8Array(buf)),view.buffer}function Body(){return this.bodyUsed=!1,this._initBody=function(body){var obj;this.bodyUsed=this.bodyUsed,this._bodyInit=body,body?\"string\"==typeof body?this._bodyText=body:support_blob&&Blob.prototype.isPrototypeOf(body)?this._bodyBlob=body:support_formData&&FormData.prototype.isPrototypeOf(body)?this._bodyFormData=body:support_searchParams&&URLSearchParams.prototype.isPrototypeOf(body)?this._bodyText=body.toString():support_arrayBuffer&&support_blob&&((obj=body)&&DataView.prototype.isPrototypeOf(obj))?(this._bodyArrayBuffer=bufferClone(body.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):support_arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(body)||isArrayBufferView(body))?this._bodyArrayBuffer=bufferClone(body):this._bodyText=body=Object.prototype.toString.call(body):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof body?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):support_searchParams&&URLSearchParams.prototype.isPrototypeOf(body)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},support_blob&&(this.blob=function(){var rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){if(this._bodyArrayBuffer){var isConsumed=consumed(this);return isConsumed||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}return this.blob().then(readBlobAsArrayBuffer)}),this.text=function(){var blob,reader,promise,rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return blob=this._bodyBlob,reader=new FileReader,promise=fileReaderReady(reader),reader.readAsText(blob),promise;if(this._bodyArrayBuffer)return Promise.resolve(function(buf){for(var view=new Uint8Array(buf),chars=new Array(view.length),i=0;i<view.length;i++)chars[i]=String.fromCharCode(view[i]);return chars.join(\"\")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error(\"could not read FormData body as text\");return Promise.resolve(this._bodyText)},support_formData&&(this.formData=function(){return this.text().then(decode)}),this.json=function(){return this.text().then(JSON.parse)},this}Headers.prototype.append=function(name,value){name=normalizeName(name),value=normalizeValue(value);var oldValue=this.map[name];this.map[name]=oldValue?oldValue+\", \"+value:value},Headers.prototype.delete=function(name){delete this.map[normalizeName(name)]},Headers.prototype.get=function(name){return name=normalizeName(name),this.has(name)?this.map[name]:null},Headers.prototype.has=function(name){return this.map.hasOwnProperty(normalizeName(name))},Headers.prototype.set=function(name,value){this.map[normalizeName(name)]=normalizeValue(value)},Headers.prototype.forEach=function(callback,thisArg){for(var name in this.map)this.map.hasOwnProperty(name)&&callback.call(thisArg,this.map[name],name,this)},Headers.prototype.keys=function(){var items=[];return this.forEach((function(value,name){items.push(name)})),iteratorFor(items)},Headers.prototype.values=function(){var items=[];return this.forEach((function(value){items.push(value)})),iteratorFor(items)},Headers.prototype.entries=function(){var items=[];return this.forEach((function(value,name){items.push([name,value])})),iteratorFor(items)},support_iterable&&(Headers.prototype[Symbol.iterator]=Headers.prototype.entries);var methods=[\"DELETE\",\"GET\",\"HEAD\",\"OPTIONS\",\"POST\",\"PUT\"];function Request(input,options){if(!(this instanceof Request))throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.');var method,upcased,body=(options=options||{}).body;if(input instanceof Request){if(input.bodyUsed)throw new TypeError(\"Already read\");this.url=input.url,this.credentials=input.credentials,options.headers||(this.headers=new Headers(input.headers)),this.method=input.method,this.mode=input.mode,this.signal=input.signal,body||null==input._bodyInit||(body=input._bodyInit,input.bodyUsed=!0)}else this.url=String(input);if(this.credentials=options.credentials||this.credentials||\"same-origin\",!options.headers&&this.headers||(this.headers=new Headers(options.headers)),this.method=(method=options.method||this.method||\"GET\",upcased=method.toUpperCase(),methods.indexOf(upcased)>-1?upcased:method),this.mode=options.mode||this.mode||null,this.signal=options.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&body)throw new TypeError(\"Body not allowed for GET or HEAD requests\");if(this._initBody(body),!(\"GET\"!==this.method&&\"HEAD\"!==this.method||\"no-store\"!==options.cache&&\"no-cache\"!==options.cache)){var reParamSearch=/([?&])_=[^&]*/;if(reParamSearch.test(this.url))this.url=this.url.replace(reParamSearch,\"$1_=\"+(new Date).getTime());else{this.url+=(/\\?/.test(this.url)?\"&\":\"?\")+\"_=\"+(new Date).getTime()}}}function decode(body){var form=new FormData;return body.trim().split(\"&\").forEach((function(bytes){if(bytes){var split=bytes.split(\"=\"),name=split.shift().replace(/\\+/g,\" \"),value=split.join(\"=\").replace(/\\+/g,\" \");form.append(decodeURIComponent(name),decodeURIComponent(value))}})),form}function Response(bodyInit,options){if(!(this instanceof Response))throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.');options||(options={}),this.type=\"default\",this.status=void 0===options.status?200:options.status,this.ok=this.status>=200&&this.status<300,this.statusText=void 0===options.statusText?\"\":\"\"+options.statusText,this.headers=new Headers(options.headers),this.url=options.url||\"\",this._initBody(bodyInit)}Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var response=new Response(null,{status:0,statusText:\"\"});return response.type=\"error\",response};var redirectStatuses=[301,302,303,307,308];Response.redirect=function(url,status){if(-1===redirectStatuses.indexOf(status))throw new RangeError(\"Invalid status code\");return new Response(null,{status:status,headers:{location:url}})},exports.DOMException=global.DOMException;try{new exports.DOMException}catch(err){exports.DOMException=function(message,name){this.message=message,this.name=name;var error=Error(message);this.stack=error.stack},exports.DOMException.prototype=Object.create(Error.prototype),exports.DOMException.prototype.constructor=exports.DOMException}function fetch(input,init){return new Promise((function(resolve,reject){var request=new Request(input,init);if(request.signal&&request.signal.aborted)return reject(new exports.DOMException(\"Aborted\",\"AbortError\"));var xhr=new XMLHttpRequest;function abortXhr(){xhr.abort()}xhr.onload=function(){var rawHeaders,headers,options={status:xhr.status,statusText:xhr.statusText,headers:(rawHeaders=xhr.getAllResponseHeaders()||\"\",headers=new Headers,rawHeaders.replace(/\\r?\\n[\\t ]+/g,\" \").split(\"\\r\").map((function(header){return 0===header.indexOf(\"\\n\")?header.substr(1,header.length):header})).forEach((function(line){var parts=line.split(\":\"),key=parts.shift().trim();if(key){var value=parts.join(\":\").trim();headers.append(key,value)}})),headers)};options.url=\"responseURL\"in xhr?xhr.responseURL:options.headers.get(\"X-Request-URL\");var body=\"response\"in xhr?xhr.response:xhr.responseText;setTimeout((function(){resolve(new Response(body,options))}),0)},xhr.onerror=function(){setTimeout((function(){reject(new TypeError(\"Network request failed\"))}),0)},xhr.ontimeout=function(){setTimeout((function(){reject(new TypeError(\"Network request failed\"))}),0)},xhr.onabort=function(){setTimeout((function(){reject(new exports.DOMException(\"Aborted\",\"AbortError\"))}),0)},xhr.open(request.method,function(url){try{return\"\"===url&&global.location.href?global.location.href:url}catch(e){return url}}(request.url),!0),\"include\"===request.credentials?xhr.withCredentials=!0:\"omit\"===request.credentials&&(xhr.withCredentials=!1),\"responseType\"in xhr&&(support_blob?xhr.responseType=\"blob\":support_arrayBuffer&&request.headers.get(\"Content-Type\")&&-1!==request.headers.get(\"Content-Type\").indexOf(\"application/octet-stream\")&&(xhr.responseType=\"arraybuffer\")),!init||\"object\"!=typeof init.headers||init.headers instanceof Headers?request.headers.forEach((function(value,name){xhr.setRequestHeader(name,value)})):Object.getOwnPropertyNames(init.headers).forEach((function(name){xhr.setRequestHeader(name,normalizeValue(init.headers[name]))})),request.signal&&(request.signal.addEventListener(\"abort\",abortXhr),xhr.onreadystatechange=function(){4===xhr.readyState&&request.signal.removeEventListener(\"abort\",abortXhr)}),xhr.send(void 0===request._bodyInit?null:request._bodyInit)}))}fetch.polyfill=!0,global.fetch||(global.fetch=fetch,global.Headers=Headers,global.Request=Request,global.Response=Response),exports.Headers=Headers,exports.Request=Request,exports.Response=Response,exports.fetch=fetch,Object.defineProperty(exports,\"__esModule\",{value:!0})}));"; export const promisePolyfill = "!function(global,factory){\"object\"==typeof exports&&\"undefined\"!=typeof module?factory():\"function\"==typeof define&&define.amd?define(factory):factory()}(0,(function(){\"use strict\";function finallyConstructor(callback){var constructor=this.constructor;return this.then((function(value){return constructor.resolve(callback()).then((function(){return value}))}),(function(reason){return constructor.resolve(callback()).then((function(){return constructor.reject(reason)}))}))}function allSettled(arr){return new this((function(resolve,reject){if(!arr||void 0===arr.length)return reject(new TypeError(typeof arr+\" \"+arr+\" is not iterable(cannot read property Symbol(Symbol.iterator))\"));var args=Array.prototype.slice.call(arr);if(0===args.length)return resolve([]);var remaining=args.length;function res(i,val){if(val&&(\"object\"==typeof val||\"function\"==typeof val)){var then=val.then;if(\"function\"==typeof then)return void then.call(val,(function(val){res(i,val)}),(function(e){args[i]={status:\"rejected\",reason:e},0==--remaining&&resolve(args)}))}args[i]={status:\"fulfilled\",value:val},0==--remaining&&resolve(args)}for(var i=0;i<args.length;i++)res(i,args[i])}))}var setTimeoutFunc=setTimeout;function isArray(x){return Boolean(x&&void 0!==x.length)}function noop(){}function Promise(fn){if(!(this instanceof Promise))throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!=typeof fn)throw new TypeError(\"not a function\");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],doResolve(fn,this)}function handle(self,deferred){for(;3===self._state;)self=self._value;0!==self._state?(self._handled=!0,Promise._immediateFn((function(){var cb=1===self._state?deferred.onFulfilled:deferred.onRejected;if(null!==cb){var ret;try{ret=cb(self._value)}catch(e){return void reject(deferred.promise,e)}resolve(deferred.promise,ret)}else(1===self._state?resolve:reject)(deferred.promise,self._value)}))):self._deferreds.push(deferred)}function resolve(self,newValue){try{if(newValue===self)throw new TypeError(\"A promise cannot be resolved with itself.\");if(newValue&&(\"object\"==typeof newValue||\"function\"==typeof newValue)){var then=newValue.then;if(newValue instanceof Promise)return self._state=3,self._value=newValue,void finale(self);if(\"function\"==typeof then)return void doResolve((fn=then,thisArg=newValue,function(){fn.apply(thisArg,arguments)}),self)}self._state=1,self._value=newValue,finale(self)}catch(e){reject(self,e)}var fn,thisArg}function reject(self,newValue){self._state=2,self._value=newValue,finale(self)}function finale(self){2===self._state&&0===self._deferreds.length&&Promise._immediateFn((function(){self._handled||Promise._unhandledRejectionFn(self._value)}));for(var i=0,len=self._deferreds.length;i<len;i++)handle(self,self._deferreds[i]);self._deferreds=null}function Handler(onFulfilled,onRejected,promise){this.onFulfilled=\"function\"==typeof onFulfilled?onFulfilled:null,this.onRejected=\"function\"==typeof onRejected?onRejected:null,this.promise=promise}function doResolve(fn,self){var done=!1;try{fn((function(value){done||(done=!0,resolve(self,value))}),(function(reason){done||(done=!0,reject(self,reason))}))}catch(ex){if(done)return;done=!0,reject(self,ex)}}Promise.prototype.catch=function(onRejected){return this.then(null,onRejected)},Promise.prototype.then=function(onFulfilled,onRejected){var prom=new this.constructor(noop);return handle(this,new Handler(onFulfilled,onRejected,prom)),prom},Promise.prototype.finally=finallyConstructor,Promise.all=function(arr){return new Promise((function(resolve,reject){if(!isArray(arr))return reject(new TypeError(\"Promise.all accepts an array\"));var args=Array.prototype.slice.call(arr);if(0===args.length)return resolve([]);var remaining=args.length;function res(i,val){try{if(val&&(\"object\"==typeof val||\"function\"==typeof val)){var then=val.then;if(\"function\"==typeof then)return void then.call(val,(function(val){res(i,val)}),reject)}args[i]=val,0==--remaining&&resolve(args)}catch(ex){reject(ex)}}for(var i=0;i<args.length;i++)res(i,args[i])}))},Promise.allSettled=allSettled,Promise.resolve=function(value){return value&&\"object\"==typeof value&&value.constructor===Promise?value:new Promise((function(resolve){resolve(value)}))},Promise.reject=function(value){return new Promise((function(resolve,reject){reject(value)}))},Promise.race=function(arr){return new Promise((function(resolve,reject){if(!isArray(arr))return reject(new TypeError(\"Promise.race accepts an array\"));for(var i=0,len=arr.length;i<len;i++)Promise.resolve(arr[i]).then(resolve,reject)}))},Promise._immediateFn=\"function\"==typeof setImmediate&&function(fn){setImmediate(fn)}||function(fn){setTimeoutFunc(fn,0)},Promise._unhandledRejectionFn=function(err){\"undefined\"!=typeof console&&console&&console.warn(\"Possible Unhandled Promise Rejection:\",err)};var globalNS=function(){if(\"undefined\"!=typeof self)return self;if(\"undefined\"!=typeof window)return window;if(\"undefined\"!=typeof global)return global;throw new Error(\"unable to locate global object\")}();\"function\"!=typeof globalNS.Promise?globalNS.Promise=Promise:(globalNS.Promise.prototype.finally||(globalNS.Promise.prototype.finally=finallyConstructor),globalNS.Promise.allSettled||(globalNS.Promise.allSettled=allSettled))}));"; export const webViewBridge = "var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P((function(resolve){resolve(value)}))).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))},__generator=this&&this.__generator||function(thisArg,body){var f,y,t,g,_={label:0,sent:function(){if(1&t[0])throw t[1];return t[1]},trys:[],ops:[]};return g={next:verb(0),throw:verb(1),return:verb(2)},\"function\"==typeof Symbol&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return function(op){if(f)throw new TypeError(\"Generator is already executing.\");for(;_;)try{if(f=1,y&&(t=2&op[0]?y.return:op[0]?y.throw||((t=y.return)&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;switch(y=0,t&&(op=[2&op[0],t.value]),op[0]){case 0:case 1:t=op;break;case 4:return _.label++,{value:op[1],done:!1};case 5:_.label++,y=op[1],op=[0];continue;case 7:op=_.ops.pop(),_.trys.pop();continue;default:if(!(t=_.trys,(t=t.length>0&&t[t.length-1])||6!==op[0]&&2!==op[0])){_=0;continue}if(3===op[0]&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(6===op[0]&&_.label<t[1]){_.label=t[1],t=op;break}if(t&&_.label<t[2]){_.label=t[2],_.ops.push(op);break}t[2]&&_.ops.pop(),_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e],y=0}finally{f=t=0}if(5&op[0])throw op[1];return{value:op[0]?op[1]:void 0,done:!0}}([n,v])}}},__values=this&&this.__values||function(o){var s=\"function\"==typeof Symbol&&Symbol.iterator,m=s&&o[s],i=0;if(m)return m.call(o);if(o&&\"number\"==typeof o.length)return{next:function(){return o&&i>=o.length&&(o=void 0),{value:o&&o[i++],done:!o}}};throw new TypeError(s?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},__read=this&&this.__read||function(o,n){var m=\"function\"==typeof Symbol&&o[Symbol.iterator];if(!m)return o;var r,e,i=m.call(o),ar=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error:error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{if(e)throw e.error}}return ar};function getWkWebViewMessageHandler(){var _a,_b,w=window;if(null===(_b=null===(_a=null==w?void 0:w.webkit)||void 0===_a?void 0:_a.messageHandlers)||void 0===_b?void 0:_b.nsBridge)return w.webkit.messageHandlers.nsBridge;console.error(\"Cannot get the window.webkit.messageHandlers.nsBridge - we can't communicate with native-layer\")}Object.keys||(Object.keys=function(){\"use strict\";var hasOwnProperty=Object.prototype.hasOwnProperty,hasDontEnumBug=!{toString:null}.propertyIsEnumerable(\"toString\"),dontEnums=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],dontEnumsLength=dontEnums.length;return function(obj){if(\"function\"!=typeof obj&&(\"object\"!=typeof obj||null===obj))throw new TypeError(\"Object.keys called on non-object\");var result=new Array;for(var prop in obj)hasOwnProperty.call(obj,prop)&&result.push(prop);if(hasDontEnumBug)for(var i=0;i<dontEnumsLength;i++)hasOwnProperty.call(obj,dontEnums[i])&&result.push(dontEnums[i]);return result}}()),Object.entries||(Object.entries=function(obj){for(var ownProps=Object.keys(obj),i=ownProps.length,resArray=new Array(i);i--;)resArray[i]=[ownProps[i],obj[ownProps[i]]];return resArray});var NSWebViewBridge=function(){function NSWebViewBridge(){this.eventListenerMap={}}return Object.defineProperty(NSWebViewBridge.prototype,\"androidWebViewBridge\",{get:function(){if(\"undefined\"!=typeof androidWebViewBridge)return androidWebViewBridge},enumerable:!1,configurable:!0}),NSWebViewBridge.prototype.onNativeEvent=function(eventName,data){var e_1,_a,events=this.eventListenerMap[eventName];if(null==events?void 0:events.length)try{for(var events_1=__values(events),events_1_1=events_1.next();!events_1_1.done;events_1_1=events_1.next()){var listener=events_1_1.value;if(!1===(null==listener?void 0:listener(data)))break}}catch(e_1_1){e_1={error:e_1_1}}finally{try{events_1_1&&!events_1_1.done&&(_a=events_1.return)&&_a.call(events_1)}finally{if(e_1)throw e_1.error}}},NSWebViewBridge.prototype.emitEventToIOS=function(eventName,data){var messageHandler=getWkWebViewMessageHandler();messageHandler?messageHandler.postMessage(JSON.stringify({eventName:eventName,data:data})):console.error(\"NSWebViewBridge only supports WKWebView\")},NSWebViewBridge.prototype.emitEventToAndroid=function(eventName,data){var androidWebViewBridge=this.androidWebViewBridge;androidWebViewBridge?androidWebViewBridge.emitEvent(eventName,null!=data?data:\"null\"):console.error(\"Tried to emit to android without the androidWebViewBridge\")},NSWebViewBridge.prototype.on=function(eventName,callback){callback&&(this.eventListenerMap[eventName]||(this.eventListenerMap[eventName]=[]),this.eventListenerMap[eventName].push(callback))},NSWebViewBridge.prototype.addEventListener=function(eventName,callback){this.on(eventName,callback)},NSWebViewBridge.prototype.off=function(eventName,callback){eventName?this.eventListenerMap[eventName]&&(callback?(this.eventListenerMap[eventName]=this.eventListenerMap[eventName].filter((function(oldCallback){return oldCallback!==callback})),0===this.eventListenerMap[eventName].length&&delete this.eventListenerMap[eventName]):delete this.eventListenerMap[eventName]):this.eventListenerMap={}},NSWebViewBridge.prototype.removeEventListener=function(eventName,callback){return this.off(eventName,callback)},NSWebViewBridge.prototype.emit=function(eventName,data){this.androidWebViewBridge?this.emitEventToAndroid(eventName,JSON.stringify(data)):this.emitEventToIOS(eventName,data)},NSWebViewBridge.prototype.injectJavaScriptFile=function(href){var _this=this,elId=this.elementIdFromHref(href);return document.getElementById(elId)?(console.log(\"\".concat(elId,\" already exists\")),Promise.resolve()):new Promise((function(resolve,reject){var scriptElement=document.createElement(\"script\");scriptElement.async=!0,scriptElement.setAttribute(\"id\",elId),scriptElement.addEventListener(\"error\",(function(error){console.error(\"Failed to load \".concat(href,\" - error: \").concat(error)),reject(_this.serializeError(error)),scriptElement.parentElement&&scriptElement.parentElement.removeChild(scriptElement)})),scriptElement.addEventListener(\"load\",(function(){console.info(\"Loaded \".concat(href)),window.requestAnimationFrame((function(){resolve()})),scriptElement.parentElement&&scriptElement.parentElement.removeChild(scriptElement)})),scriptElement.src=href,document.body.appendChild(scriptElement)}))},NSWebViewBridge.prototype.injectJavaScript=function(elId,scriptCode){return document.getElementById(elId)?(console.log(\"\".concat(elId,\" already exists\")),Promise.resolve()):new Promise((function(resolve,reject){var scriptElement=document.createElement(\"script\");scriptElement.setAttribute(\"id\",elId),scriptElement.addEventListener(\"error\",(function(error){console.error(\"Failed to inject javascript- error: \".concat(error)),reject(error),scriptElement.parentElement&&scriptElement.parentElement.removeChild(scriptElement)})),scriptElement.text=scriptCode,document.body.appendChild(scriptElement),window.requestAnimationFrame((function(){return resolve()}))}))},NSWebViewBridge.prototype.injectStyleSheetFile=function(href,insertBefore){var elId=this.elementIdFromHref(href);return document.getElementById(elId)?(console.log(\"\".concat(elId,\" already exists\")),Promise.resolve()):new Promise((function(resolve,reject){var linkElement=document.createElement(\"link\");linkElement.addEventListener(\"error\",(function(error){console.error(\"Failed to load \".concat(href,\" - error: \").concat(error)),reject(error),linkElement.parentElement&&linkElement.parentElement.removeChild(linkElement)})),linkElement.addEventListener(\"load\",(function(){console.info(\"Loaded \".concat(href)),window.requestAnimationFrame((function(){resolve()}))})),linkElement.setAttribute(\"id\",elId),linkElement.setAttribute(\"rel\",\"stylesheet\"),linkElement.setAttribute(\"type\",\"text/css\"),linkElement.setAttribute(\"href\",href),document.head&&(insertBefore&&document.head.childElementCount>0?document.head.insertBefore(linkElement,document.head.firstElementChild):document.head.appendChild(linkElement))}))},NSWebViewBridge.prototype.injectStyleSheet=function(elId,stylesheet,insertBefore){return document.getElementById(elId)?(console.log(\"\".concat(elId,\" already exists\")),Promise.resolve()):new Promise((function(resolve,reject){var _a,styleElement=document.createElement(\"style\");styleElement.addEventListener(\"error\",reject),styleElement.textContent=stylesheet,styleElement.setAttribute(\"id\",elId);var parentElement=null!==(_a=document.head)&&void 0!==_a?_a:document.body;parentElement?(insertBefore&&parentElement.childElementCount>0?document.head.insertBefore(styleElement,parentElement.firstElementChild):document.head.appendChild(styleElement),resolve()):reject(new Error(\"Couldn't find parent element\"))}))},NSWebViewBridge.prototype.executePromise=function(promise,eventName){return __awaiter(this,void 0,void 0,(function(){var data,err_1;return __generator(this,(function(_a){switch(_a.label){case 0:return _a.trys.push([0,2,,3]),[4,promise];case 1:return data=_a.sent(),this.emit(eventName,{data:data}),[3,3];case 2:return err_1=_a.sent(),this.emitError(err_1,eventName),[3,3];case 3:return[2]}}))}))},NSWebViewBridge.prototype.emitError=function(err,eventName){void 0===eventName&&(eventName=\"web-error\"),\"object\"==typeof err&&(null==err?void 0:err.message)?this.emit(eventName,{err:this.serializeError(err)}):this.emit(eventName,{err:err})},NSWebViewBridge.prototype.elementIdFromHref=function(href){return href.replace(/^[:]*:\\/\\//,\"\").replace(/[^a-z0-9]/g,\"\")},NSWebViewBridge.prototype.serializeError=function(error){var e_2,_a,res={name:error.name,message:error.message,stack:error.stack};try{for(var _b=__values(Object.entries(error)),_c=_b.next();!_c.done;_c=_b.next()){var _d=__read(_c.value,2),key=_d[0],value=_d[1];value instanceof HTMLElement||(key in res||(res[key]=value))}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_2)throw e_2.error}}return res},NSWebViewBridge}(),nsBridgeReadyEventName=\"ns-bridge-ready\";\"nsWebViewBridge\"in window||function(fn){window.nsWebViewBridge=new NSWebViewBridge,\"complete\"===document.readyState||\"interactive\"===document.readyState?setTimeout(fn,1):document.addEventListener(\"DOMContentLoaded\",fn)}((function(){var e_3,_a;try{for(var _b=__values([nsBridgeReadyEventName,\"ns-brige-ready\"]),_c=_b.next();!_c.done;_c=_b.next()){var eventName=_c.value;\"undefined\"!=typeof CustomEvent?window.dispatchEvent(new CustomEvent(eventName,{detail:window.nsWebViewBridge})):window.dispatchEvent(new Event(eventName))}}catch(e_3_1){e_3={error:e_3_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_3)throw e_3.error}}}));"; export const metadataViewPort = "!function(window){var defaultViewPort={initialScale:1},document=window.document,meta=document.querySelector('head meta[name=\"viewport\"]');meta||((meta=document.createElement(\"meta\")).setAttribute(\"name\",\"viewport\"),document.head.appendChild(meta));var viewPortValues=defaultViewPort;var _a=viewPortValues.initialScale,initialScale=void 0===_a?defaultViewPort.initialScale:_a,width=viewPortValues.width,height=viewPortValues.height,userScalable=viewPortValues.userScalable,minimumScale=viewPortValues.minimumScale,maximumScale=viewPortValues.maximumScale,content=[\"initial-scale=\".concat(initialScale)];if(width&&content.push(\"width=\".concat(width)),height&&content.push(\"height=\".concat(height)),\"boolean\"==typeof userScalable)content.push(\"user-scalable=\".concat(userScalable?\"yes\":\"no\"));else if(\"string\"==typeof userScalable){var lcUserScalable=\"\".concat(userScalable).toLowerCase();\"yes\"===lcUserScalable?content.push(\"user-scalable=yes\"):\"no\"===lcUserScalable?content.push(\"user-scalable=no\"):console.error(\"userScalable=\".concat(JSON.stringify(userScalable),\" is an unknown value\"))}minimumScale&&content.push(\"minimum-scale=\".concat(minimumScale)),maximumScale&&content.push(\"maximum-scale=\".concat(maximumScale)),meta.setAttribute(\"content\",content.join(\", \"))}(window);"; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlc2NyaXB0LXdlYnZpZXctYnJpZGdlLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5hdGl2ZXNjcmlwdC13ZWJ2aWV3LWJyaWRnZS1sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFXLDgvWEFBOC9YLENBQUM7QUFDcGlZLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBVyx5dEtBQXl0SyxDQUFDO0FBQ2p3SyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQVcsdzdWQUF3N1YsQ0FBQztBQUM5OVYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQVcsOHlDQUE4eUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBmZXRjaFBvbHlmaWxsOiBzdHJpbmcgPSBcIiFmdW5jdGlvbihnbG9iYWwsZmFjdG9yeSl7XFxcIm9iamVjdFxcXCI9PXR5cGVvZiBleHBvcnRzJiZcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIG1vZHVsZT9mYWN0b3J5KGV4cG9ydHMpOlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcXFwiZXhwb3J0c1xcXCJdLGZhY3RvcnkpOmZhY3RvcnkoZ2xvYmFsLldIQVRXR0ZldGNoPXt9KX0odGhpcywoZnVuY3Rpb24oZXhwb3J0cyl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBnbG9iYWw9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzfHxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fHZvaWQgMCE9PWdsb2JhbCYmZ2xvYmFsLHN1cHBvcnRfc2VhcmNoUGFyYW1zPVxcXCJVUkxTZWFyY2hQYXJhbXNcXFwiaW4gZ2xvYmFsLHN1cHBvcnRfaXRlcmFibGU9XFxcIlN5bWJvbFxcXCJpbiBnbG9iYWwmJlxcXCJpdGVyYXRvclxcXCJpbiBTeW1ib2wsc3VwcG9ydF9ibG9iPVxcXCJGaWxlUmVhZGVyXFxcImluIGdsb2JhbCYmXFxcIkJsb2JcXFwiaW4gZ2xvYmFsJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHN1cHBvcnRfZm9ybURhdGE9XFxcIkZvcm1EYXRhXFxcImluIGdsb2JhbCxzdXBwb3J0X2FycmF5QnVmZmVyPVxcXCJBcnJheUJ1ZmZlclxcXCJpbiBnbG9iYWw7aWYoc3VwcG9ydF9hcnJheUJ1ZmZlcil2YXIgdmlld0NsYXNzZXM9W1xcXCJbb2JqZWN0IEludDhBcnJheV1cXFwiLFxcXCJbb2JqZWN0IFVpbnQ4QXJyYXldXFxcIixcXFwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV1cXFwiLFxcXCJbb2JqZWN0IEludDE2QXJyYXldXFxcIixcXFwiW29iamVjdCBVaW50MTZBcnJheV1cXFwiLFxcXCJbb2JqZWN0IEludDMyQXJyYXldXFxcIixcXFwiW29iamVjdCBVaW50MzJBcnJheV1cXFwiLFxcXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cXFwiLFxcXCJbb2JqZWN0IEZsb2F0NjRBcnJheV1cXFwiXSxpc0FycmF5QnVmZmVyVmlldz1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSk+LTF9O2Z1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSl7aWYoXFxcInN0cmluZ1xcXCIhPXR5cGVvZiBuYW1lJiYobmFtZT1TdHJpbmcobmFtZSkpLC9bXmEtejAtOVxcXFwtIyQlJicqKy5eX2B8fiFdL2kudGVzdChuYW1lKXx8XFxcIlxcXCI9PT1uYW1lKXRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lOiBcXFwiJytuYW1lKydcXFwiJyk7cmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSl7cmV0dXJuXFxcInN0cmluZ1xcXCIhPXR5cGVvZiB2YWx1ZSYmKHZhbHVlPVN0cmluZyh2YWx1ZSkpLHZhbHVlfWZ1bmN0aW9uIGl0ZXJhdG9yRm9yKGl0ZW1zKXt2YXIgaXRlcmF0b3I9e25leHQ6ZnVuY3Rpb24oKXt2YXIgdmFsdWU9aXRlbXMuc2hpZnQoKTtyZXR1cm57ZG9uZTp2b2lkIDA9PT12YWx1ZSx2YWx1ZTp2YWx1ZX19fTtyZXR1cm4gc3VwcG9ydF9pdGVyYWJsZSYmKGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gaXRlcmF0b3J9KSxpdGVyYXRvcn1mdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpe3RoaXMubWFwPXt9LGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzP2hlYWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24odmFsdWUsbmFtZSl7dGhpcy5hcHBlbmQobmFtZSx2YWx1ZSl9KSx0aGlzKTpBcnJheS5pc0FycmF5KGhlYWRlcnMpP2hlYWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24oaGVhZGVyKXt0aGlzLmFwcGVuZChoZWFkZXJbMF0saGVhZGVyWzFdKX0pLHRoaXMpOmhlYWRlcnMmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goKGZ1bmN0aW9uKG5hbWUpe3RoaXMuYXBwZW5kKG5hbWUsaGVhZGVyc1tuYW1lXSl9KSx0aGlzKX1mdW5jdGlvbiBjb25zdW1lZChib2R5KXtpZihib2R5LmJvZHlVc2VkKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFxcXCJBbHJlYWR5IHJlYWRcXFwiKSk7Ym9keS5ib2R5VXNlZD0hMH1mdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtyZWFkZXIub25sb2FkPWZ1bmN0aW9uKCl7cmVzb2x2ZShyZWFkZXIucmVzdWx0KX0scmVhZGVyLm9uZXJyb3I9ZnVuY3Rpb24oKXtyZWplY3QocmVhZGVyLmVycm9yKX19KSl9ZnVuY3Rpb24gcmVhZEJsb2JBc0FycmF5QnVmZmVyKGJsb2Ipe3ZhciByZWFkZXI9bmV3IEZpbGVSZWFkZXIscHJvbWlzZT1maWxlUmVhZGVyUmVhZHkocmVhZGVyKTtyZXR1cm4gcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpLHByb21pc2V9ZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKXtpZihidWYuc2xpY2UpcmV0dXJuIGJ1Zi5zbGljZSgwKTt2YXIgdmlldz1uZXcgVWludDhBcnJheShidWYuYnl0ZUxlbmd0aCk7cmV0dXJuIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpLHZpZXcuYnVmZmVyfWZ1bmN0aW9uIEJvZHkoKXtyZXR1cm4gdGhpcy5ib2R5VXNlZD0hMSx0aGlzLl9pbml0Qm9keT1mdW5jdGlvbihib2R5KXt2YXIgb2JqO3RoaXMuYm9keVVzZWQ9dGhpcy5ib2R5VXNlZCx0aGlzLl9ib2R5SW5pdD1ib2R5LGJvZHk/XFxcInN0cmluZ1xcXCI9PXR5cGVvZiBib2R5P3RoaXMuX2JvZHlUZXh0PWJvZHk6c3VwcG9ydF9ibG9iJiZCbG9iLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpP3RoaXMuX2JvZHlCbG9iPWJvZHk6c3VwcG9ydF9mb3JtRGF0YSYmRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSk/dGhpcy5fYm9keUZvcm1EYXRhPWJvZHk6c3VwcG9ydF9zZWFyY2hQYXJhbXMmJlVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KT90aGlzLl9ib2R5VGV4dD1ib2R5LnRvU3RyaW5nKCk6c3VwcG9ydF9hcnJheUJ1ZmZlciYmc3VwcG9ydF9ibG9iJiYoKG9iaj1ib2R5KSYmRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKSk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj1idWZmZXJDbG9uZShib2R5LmJ1ZmZlciksdGhpcy5fYm9keUluaXQ9bmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTpzdXBwb3J0X2FycmF5QnVmZmVyJiYoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSl8fGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKT90aGlzLl9ib2R5QXJyYXlCdWZmZXI9YnVmZmVyQ2xvbmUoYm9keSk6dGhpcy5fYm9keVRleHQ9Ym9keT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSk6dGhpcy5fYm9keVRleHQ9XFxcIlxcXCIsdGhpcy5oZWFkZXJzLmdldChcXFwiY29udGVudC10eXBlXFxcIil8fChcXFwic3RyaW5nXFxcIj09dHlwZW9mIGJvZHk/dGhpcy5oZWFkZXJzLnNldChcXFwiY29udGVudC10eXBlXFxcIixcXFwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04XFxcIik6dGhpcy5fYm9keUJsb2ImJnRoaXMuX2JvZHlCbG9iLnR5cGU/dGhpcy5oZWFkZXJzLnNldChcXFwiY29udGVudC10eXBlXFxcIix0aGlzLl9ib2R5QmxvYi50eXBlKTpzdXBwb3J0X3NlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpJiZ0aGlzLmhlYWRlcnMuc2V0KFxcXCJjb250ZW50LXR5cGVcXFwiLFxcXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOFxcXCIpKX0sc3VwcG9ydF9ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIHJlamVjdGVkPWNvbnN1bWVkKHRoaXMpO2lmKHJlamVjdGVkKXJldHVybiByZWplY3RlZDtpZih0aGlzLl9ib2R5QmxvYilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKTtpZih0aGlzLl9ib2R5QXJyYXlCdWZmZXIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpO2lmKHRoaXMuX2JvZHlGb3JtRGF0YSl0aHJvdyBuZXcgRXJyb3IoXFxcImNvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYlxcXCIpO3JldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpfSx0aGlzLmFycmF5QnVmZmVyPWZ1bmN0aW9uKCl7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXt2YXIgaXNDb25zdW1lZD1jb25zdW1lZCh0aGlzKTtyZXR1cm4gaXNDb25zdW1lZHx8KEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpP1Byb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKSk6UHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpfXJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcil9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgYmxvYixyZWFkZXIscHJvbWlzZSxyZWplY3RlZD1jb25zdW1lZCh0aGlzKTtpZihyZWplY3RlZClyZXR1cm4gcmVqZWN0ZWQ7aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIGJsb2I9dGhpcy5fYm9keUJsb2IscmVhZGVyPW5ldyBGaWxlUmVhZGVyLHByb21pc2U9ZmlsZVJlYWRlclJlYWR5KHJlYWRlcikscmVhZGVyLnJlYWRBc1RleHQoYmxvYikscHJvbWlzZTtpZih0aGlzLl9ib2R5QXJyYXlCdWZmZXIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShmdW5jdGlvbihidWYpe2Zvcih2YXIgdmlldz1uZXcgVWludDhBcnJheShidWYpLGNoYXJzPW5ldyBBcnJheSh2aWV3Lmxlbmd0aCksaT0wO2k8dmlldy5sZW5ndGg7aSsrKWNoYXJzW2ldPVN0cmluZy5mcm9tQ2hhckNvZGUodmlld1tpXSk7cmV0dXJuIGNoYXJzLmpvaW4oXFxcIlxcXCIpfSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKFxcXCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHRcXFwiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KX0sc3VwcG9ydF9mb3JtRGF0YSYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpfSksdGhpcy5qc29uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSl9LHRoaXN9SGVhZGVycy5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKG5hbWUsdmFsdWUpe25hbWU9bm9ybWFsaXplTmFtZShuYW1lKSx2YWx1ZT1ub3JtYWxpemVWYWx1ZSh2YWx1ZSk7dmFyIG9sZFZhbHVlPXRoaXMubWFwW25hbWVdO3RoaXMubWFwW25hbWVdPW9sZFZhbHVlP29sZFZhbHVlK1xcXCIsIFxcXCIrdmFsdWU6dmFsdWV9LEhlYWRlcnMucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihuYW1lKXtkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV19LEhlYWRlcnMucHJvdG90eXBlLmdldD1mdW5jdGlvbihuYW1lKXtyZXR1cm4gbmFtZT1ub3JtYWxpemVOYW1lKG5hbWUpLHRoaXMuaGFzKG5hbWUpP3RoaXMubWFwW25hbWVdOm51bGx9LEhlYWRlcnMucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuYW1lKXtyZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSl9LEhlYWRlcnMucHJvdG90eXBlLnNldD1mdW5jdGlvbihuYW1lLHZhbHVlKXt0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXT1ub3JtYWxpemVWYWx1ZSh2YWx1ZSl9LEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oY2FsbGJhY2ssdGhpc0FyZyl7Zm9yKHZhciBuYW1lIGluIHRoaXMubWFwKXRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpJiZjYWxsYmFjay5jYWxsKHRoaXNBcmcsdGhpcy5tYXBbbmFtZV0sbmFtZSx0aGlzKX0sSGVhZGVycy5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBpdGVtcz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbih2YWx1ZSxuYW1lKXtpdGVtcy5wdXNoKG5hbWUpfSkpLGl0ZXJhdG9yRm9yKGl0ZW1zKX0sSGVhZGVycy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7dmFyIGl0ZW1zPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKHZhbHVlKXtpdGVtcy5wdXNoKHZhbHVlKX0pKSxpdGVyYXRvckZvcihpdGVtcyl9LEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgaXRlbXM9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24odmFsdWUsbmFtZSl7aXRlbXMucHVzaChbbmFtZSx2YWx1ZV0pfSkpLGl0ZXJhdG9yRm9yKGl0ZW1zKX0sc3VwcG9ydF9pdGVyYWJsZSYmKEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09SGVhZGVycy5wcm90b3R5cGUuZW50cmllcyk7dmFyIG1ldGhvZHM9W1xcXCJERUxFVEVcXFwiLFxcXCJHRVRcXFwiLFxcXCJIRUFEXFxcIixcXFwiT1BUSU9OU1xcXCIsXFxcIlBPU1RcXFwiLFxcXCJQVVRcXFwiXTtmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlcXVlc3QpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFxcXCJuZXdcXFwiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpO3ZhciBtZXRob2QsdXBjYXNlZCxib2R5PShvcHRpb25zPW9wdGlvbnN8fHt9KS5ib2R5O2lmKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCl7aWYoaW5wdXQuYm9keVVzZWQpdGhyb3cgbmV3IFR5cGVFcnJvcihcXFwiQWxyZWFkeSByZWFkXFxcIik7dGhpcy51cmw9aW5wdXQudXJsLHRoaXMuY3JlZGVudGlhbHM9aW5wdXQuY3JlZGVudGlhbHMsb3B0aW9ucy5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBIZWFkZXJzKGlucHV0LmhlYWRlcnMpKSx0aGlzLm1ldGhvZD1pbnB1dC5tZXRob2QsdGhpcy5tb2RlPWlucHV0Lm1vZGUsdGhpcy5zaWduYWw9aW5wdXQuc2lnbmFsLGJvZHl8fG51bGw9PWlucHV0Ll9ib2R5SW5pdHx8KGJvZHk9aW5wdXQuX2JvZHlJbml0LGlucHV0LmJvZHlVc2VkPSEwKX1lbHNlIHRoaXMudXJsPVN0cmluZyhpbnB1dCk7aWYodGhpcy5jcmVkZW50aWFscz1vcHRpb25zLmNyZWRlbnRpYWxzfHx0aGlzLmNyZWRlbnRpYWxzfHxcXFwic2FtZS1vcmlnaW5cXFwiLCFvcHRpb25zLmhlYWRlcnMmJnRoaXMuaGVhZGVyc3x8KHRoaXMuaGVhZGVycz1uZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpKSx0aGlzLm1ldGhvZD0obWV0aG9kPW9wdGlvbnMubWV0aG9kfHx0aGlzLm1ldGhvZHx8XFxcIkdFVFxcXCIsdXBjYXNlZD1tZXRob2QudG9VcHBlckNhc2UoKSxtZXRob2RzLmluZGV4T2YodXBjYXNlZCk+LTE/dXBjYXNlZDptZXRob2QpLHRoaXMubW9kZT1vcHRpb25zLm1vZGV8fHRoaXMubW9kZXx8bnVsbCx0aGlzLnNpZ25hbD1vcHRpb25zLnNpZ25hbHx8dGhpcy5zaWduYWwsdGhpcy5yZWZlcnJlcj1udWxsLChcXFwiR0VUXFxcIj09PXRoaXMubWV0aG9kfHxcXFwiSEVBRFxcXCI9PT10aGlzLm1ldGhvZCkmJmJvZHkpdGhyb3cgbmV3IFR5cGVFcnJvcihcXFwiQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHNcXFwiKTtpZih0aGlzLl9pbml0Qm9keShib2R5KSwhKFxcXCJHRVRcXFwiIT09dGhpcy5tZXRob2QmJlxcXCJIRUFEXFxcIiE9PXRoaXMubWV0aG9kfHxcXFwibm8tc3RvcmVcXFwiIT09b3B0aW9ucy5jYWNoZSYmXFxcIm5vLWNhY2hlXFxcIiE9PW9wdGlvbnMuY2FjaGUpKXt2YXIgcmVQYXJhbVNlYXJjaD0vKFs/Jl0pXz1bXiZdKi87aWYocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSl0aGlzLnVybD10aGlzLnVybC5yZXBsYWNlKHJlUGFyYW1TZWFyY2gsXFxcIiQxXz1cXFwiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKTtlbHNle3RoaXMudXJsKz0oL1xcXFw/Ly50ZXN0KHRoaXMudXJsKT9cXFwiJlxcXCI6XFxcIj9cXFwiKStcXFwiXz1cXFwiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpfX19ZnVuY3Rpb24gZGVjb2RlKGJvZHkpe3ZhciBmb3JtPW5ldyBGb3JtRGF0YTtyZXR1cm4gYm9keS50cmltKCkuc3BsaXQoXFxcIiZcXFwiKS5mb3JFYWNoKChmdW5jdGlvbihieXRlcyl7aWYoYnl0ZXMpe3ZhciBzcGxpdD1ieXRlcy5zcGxpdChcXFwiPVxcXCIpLG5hbWU9c3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXFxcKy9nLFxcXCIgXFxcIiksdmFsdWU9c3BsaXQuam9pbihcXFwiPVxcXCIpLnJlcGxhY2UoL1xcXFwrL2csXFxcIiBcXFwiKTtmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSl9fSkpLGZvcm19ZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsb3B0aW9ucyl7aWYoISh0aGlzIGluc3RhbmNlb2YgUmVzcG9uc2UpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFxcXCJuZXdcXFwiIG9wZXJhdG9yLCB0aGlzIERPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLicpO29wdGlvbnN8fChvcHRpb25zPXt9KSx0aGlzLnR5cGU9XFxcImRlZmF1bHRcXFwiLHRoaXMuc3RhdHVzPXZvaWQgMD09PW9wdGlvbnMuc3RhdHVzPzIwMDpvcHRpb25zLnN0YXR1cyx0aGlzLm9rPXRoaXMuc3RhdHVzPj0yMDAmJnRoaXMuc3RhdHVzPDMwMCx0aGlzLnN0YXR1c1RleHQ9dm9pZCAwPT09b3B0aW9ucy5zdGF0dXNUZXh0P1xcXCJcXFwiOlxcXCJcXFwiK29wdGlvbnMuc3RhdHVzVGV4dCx0aGlzLmhlYWRlcnM9bmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKSx0aGlzLnVybD1vcHRpb25zLnVybHx8XFxcIlxcXCIsdGhpcy5faW5pdEJvZHkoYm9keUluaXQpfVJlcXVlc3QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMse2JvZHk6dGhpcy5fYm9keUluaXR9KX0sQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKSxCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKSxSZXNwb25zZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LHtzdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0aGlzLnN0YXR1c1RleHQsaGVhZGVyczpuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLHVybDp0aGlzLnVybH0pfSxSZXNwb25zZS5lcnJvcj1mdW5jdGlvbigpe3ZhciByZXNwb25zZT1uZXcgUmVzcG9uc2UobnVsbCx7c3RhdHVzOjAsc3RhdHVzVGV4dDpcXFwiXFxcIn0pO3JldHVybiByZXNwb25zZS50eXBlPVxcXCJlcnJvclxcXCIscmVzcG9uc2V9O3ZhciByZWRpcmVjdFN0YXR1c2VzPVszMDEsMzAyLDMwMywzMDcsMzA4XTtSZXNwb25zZS5yZWRpcmVjdD1mdW5jdGlvbih1cmwsc3RhdHVzKXtpZigtMT09PXJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpKXRocm93IG5ldyBSYW5nZUVycm9yKFxcXCJJbnZhbGlkIHN0YXR1cyBjb2RlXFxcIik7cmV0dXJuIG5ldyBSZXNwb25zZShudWxsLHtzdGF0dXM6c3RhdHVzLGhlYWRlcnM6e2xvY2F0aW9uOnVybH19KX0sZXhwb3J0cy5ET01FeGNlcHRpb249Z2xvYmFsLkRPTUV4Y2VwdGlvbjt0cnl7bmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9ufWNhdGNoKGVycil7ZXhwb3J0cy5ET01FeGNlcHRpb249ZnVuY3Rpb24obWVzc2FnZSxuYW1lKXt0aGlzLm1lc3NhZ2U9bWVzc2FnZSx0aGlzLm5hbWU9bmFtZTt2YXIgZXJyb3I9RXJyb3IobWVzc2FnZSk7dGhpcy5zdGFjaz1lcnJvci5zdGFja30sZXhwb3J0cy5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxleHBvcnRzLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZXhwb3J0cy5ET01FeGNlcHRpb259ZnVuY3Rpb24gZmV0Y2goaW5wdXQsaW5pdCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7dmFyIHJlcXVlc3Q9bmV3IFJlcXVlc3QoaW5wdXQsaW5pdCk7aWYocmVxdWVzdC5zaWduYWwmJnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpcmV0dXJuIHJlamVjdChuZXcgZXhwb3J0cy5ET01FeGNlcHRpb24oXFxcIkFib3J0ZWRcXFwiLFxcXCJBYm9ydEVycm9yXFxcIikpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Z1bmN0aW9uIGFib3J0WGhyKCl7eGhyLmFib3J0KCl9eGhyLm9ubG9hZD1mdW5jdGlvbigpe3ZhciByYXdIZWFkZXJzLGhlYWRlcnMsb3B0aW9ucz17c3RhdHVzOnhoci5zdGF0dXMsc3RhdHVzVGV4dDp4aHIuc3RhdHVzVGV4dCxoZWFkZXJzOihyYXdIZWFkZXJzPXhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKXx8XFxcIlxcXCIsaGVhZGVycz1uZXcgSGVhZGVycyxyYXdIZWFkZXJzLnJlcGxhY2UoL1xcXFxyP1xcXFxuW1xcXFx0IF0rL2csXFxcIiBcXFwiKS5zcGxpdChcXFwiXFxcXHJcXFwiKS5tYXAoKGZ1bmN0aW9uKGhlYWRlcil7cmV0dXJuIDA9PT1oZWFkZXIuaW5kZXhPZihcXFwiXFxcXG5cXFwiKT9oZWFkZXIuc3Vic3RyKDEsaGVhZGVyLmxlbmd0aCk6aGVhZGVyfSkpLmZvckVhY2goKGZ1bmN0aW9uKGxpbmUpe3ZhciBwYXJ0cz1saW5lLnNwbGl0KFxcXCI6XFxcIiksa2V5PXBhcnRzLnNoaWZ0KCkudHJpbSgpO2lmKGtleSl7dmFyIHZhbHVlPXBhcnRzLmpvaW4oXFxcIjpcXFwiKS50cmltKCk7aGVhZGVycy5hcHBlbmQoa2V5LHZhbHVlKX19KSksaGVhZGVycyl9O29wdGlvbnMudXJsPVxcXCJyZXNwb25zZVVSTFxcXCJpbiB4aHI/eGhyLnJlc3BvbnNlVVJMOm9wdGlvbnMuaGVhZGVycy5nZXQoXFxcIlgtUmVxdWVzdC1VUkxcXFwiKTt2YXIgYm9keT1cXFwicmVzcG9uc2VcXFwiaW4geGhyP3hoci5yZXNwb25zZTp4aHIucmVzcG9uc2VUZXh0O3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSxvcHRpb25zKSl9KSwwKX0seGhyLm9uZXJyb3I9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3JlamVjdChuZXcgVHlwZUVycm9yKFxcXCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkXFxcIikpfSksMCl9LHhoci5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3JlamVjdChuZXcgVHlwZUVycm9yKFxcXCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkXFxcIikpfSksMCl9LHhoci5vbmFib3J0PWZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZWplY3QobmV3IGV4cG9ydHMuRE9NRXhjZXB0aW9uKFxcXCJBYm9ydGVkXFxcIixcXFwiQWJvcnRFcnJvclxcXCIpKX0pLDApfSx4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCxmdW5jdGlvbih1cmwpe3RyeXtyZXR1cm5cXFwiXFxcIj09PXVybCYmZ2xvYmFsLmxvY2F0aW9uLmhyZWY/Z2xvYmFsLmxvY2F0aW9uLmhyZWY6dXJsfWNhdGNoKGUpe3JldHVybiB1cmx9fShyZXF1ZXN0LnVybCksITApLFxcXCJpbmNsdWRlXFxcIj09PXJlcXVlc3QuY3JlZGVudGlhbHM/eGhyLndpdGhDcmVkZW50aWFscz0hMDpcXFwib21pdFxcXCI9PT1yZXF1ZXN0LmNyZWRlbnRpYWxzJiYoeGhyLndpdGhDcmVkZW50aWFscz0hMSksXFxcInJlc3BvbnNlVHlwZVxcXCJpbiB4aHImJihzdXBwb3J0X2Jsb2I/eGhyLnJlc3BvbnNlVHlwZT1cXFwiYmxvYlxcXCI6c3VwcG9ydF9hcnJheUJ1ZmZlciYmcmVxdWVzdC5oZWFkZXJzLmdldChcXFwiQ29udGVudC1UeXBlXFxcIikmJi0xIT09cmVxdWVzdC5oZWFkZXJzLmdldChcXFwiQ29udGVudC1UeXBlXFxcIikuaW5kZXhPZihcXFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXFxcIikmJih4aHIucmVzcG9uc2VUeXBlPVxcXCJhcnJheWJ1ZmZlclxcXCIpKSwhaW5pdHx8XFxcIm9iamVjdFxcXCIhPXR5cGVvZiBpbml0LmhlYWRlcnN8fGluaXQuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnM/cmVxdWVzdC5oZWFkZXJzLmZvckVhY2goKGZ1bmN0aW9uKHZhbHVlLG5hbWUpe3hoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsdmFsdWUpfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluaXQuaGVhZGVycykuZm9yRWFjaCgoZnVuY3Rpb24obmFtZSl7eGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSxub3JtYWxpemVWYWx1ZShpbml0LmhlYWRlcnNbbmFtZV0pKX0pKSxyZXF1ZXN0LnNpZ25hbCYmKHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXFxcImFib3J0XFxcIixhYm9ydFhocikseGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT14aHIucmVhZHlTdGF0ZSYmcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcXFwiYWJvcnRcXFwiLGFib3J0WGhyKX0pLHhoci5zZW5kKHZvaWQgMD09PXJlcXVlc3QuX2JvZHlJbml0P251bGw6cmVxdWVzdC5fYm9keUluaXQpfSkpfWZldGNoLnBvbHlmaWxsPSEwLGdsb2JhbC5mZXRjaHx8KGdsb2JhbC5mZXRjaD1mZXRjaCxnbG9iYWwuSGVhZGVycz1IZWFkZXJzLGdsb2JhbC5SZXF1ZXN0PVJlcXVlc3QsZ2xvYmFsLlJlc3BvbnNlPVJlc3BvbnNlKSxleHBvcnRzLkhlYWRlcnM9SGVhZGVycyxleHBvcnRzLlJlcXVlc3Q9UmVxdWVzdCxleHBvcnRzLlJlc3BvbnNlPVJlc3BvbnNlLGV4cG9ydHMuZmV0Y2g9ZmV0Y2gsT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsXFxcIl9fZXNNb2R1bGVcXFwiLHt2YWx1ZTohMH0pfSkpO1wiO1xuZXhwb3J0IGNvbnN0IHByb21pc2VQb2x5ZmlsbDogc3RyaW5nID0gXCIhZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe1xcXCJvYmplY3RcXFwiPT10eXBlb2YgZXhwb3J0cyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBtb2R1bGU/ZmFjdG9yeSgpOlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGZhY3RvcnkpOmZhY3RvcnkoKX0oMCwoZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7ZnVuY3Rpb24gZmluYWxseUNvbnN0cnVjdG9yKGNhbGxiYWNrKXt2YXIgY29uc3RydWN0b3I9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdGhpcy50aGVuKChmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdmFsdWV9KSl9KSwoZnVuY3Rpb24ocmVhc29uKXtyZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBjb25zdHJ1Y3Rvci5yZWplY3QocmVhc29uKX0pKX0pKX1mdW5jdGlvbiBhbGxTZXR0bGVkKGFycil7cmV0dXJuIG5ldyB0aGlzKChmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7aWYoIWFycnx8dm9pZCAwPT09YXJyLmxlbmd0aClyZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IodHlwZW9mIGFycitcXFwiIFxcXCIrYXJyK1xcXCIgaXMgbm90IGl0ZXJhYmxlKGNhbm5vdCByZWFkIHByb3BlcnR5IFN5bWJvbChTeW1ib2wuaXRlcmF0b3IpKVxcXCIpKTt2YXIgYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnIpO2lmKDA9PT1hcmdzLmxlbmd0aClyZXR1cm4gcmVzb2x2ZShbXSk7dmFyIHJlbWFpbmluZz1hcmdzLmxlbmd0aDtmdW5jdGlvbiByZXMoaSx2YWwpe2lmKHZhbCYmKFxcXCJvYmplY3RcXFwiPT10eXBlb2YgdmFsfHxcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgdmFsKSl7dmFyIHRoZW49dmFsLnRoZW47aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHRoZW4pcmV0dXJuIHZvaWQgdGhlbi5jYWxsKHZhbCwoZnVuY3Rpb24odmFsKXtyZXMoaSx2YWwpfSksKGZ1bmN0aW9uKGUpe2FyZ3NbaV09e3N0YXR1czpcXFwicmVqZWN0ZWRcXFwiLHJlYXNvbjplfSwwPT0tLXJlbWFpbmluZyYmcmVzb2x2ZShhcmdzKX0pKX1hcmdzW2ldPXtzdGF0dXM6XFxcImZ1bGZpbGxlZFxcXCIsdmFsdWU6dmFsfSwwPT0tLXJlbWFpbmluZyYmcmVzb2x2ZShhcmdzKX1mb3IodmFyIGk9MDtpPGFyZ3MubGVuZ3RoO2krKylyZXMoaSxhcmdzW2ldKX0pKX12YXIgc2V0VGltZW91dEZ1bmM9c2V0VGltZW91dDtmdW5jdGlvbiBpc0FycmF5KHgpe3JldHVybiBCb29sZWFuKHgmJnZvaWQgMCE9PXgubGVuZ3RoKX1mdW5jdGlvbiBub29wKCl7fWZ1bmN0aW9uIFByb21pc2UoZm4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKXRocm93IG5ldyBUeXBlRXJyb3IoXFxcIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ld1xcXCIpO2lmKFxcXCJmdW5jdGlvblxcXCIhPXR5cGVvZiBmbil0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJub3QgYSBmdW5jdGlvblxcXCIpO3RoaXMuX3N0YXRlPTAsdGhpcy5faGFuZGxlZD0hMSx0aGlzLl92YWx1ZT12b2lkIDAsdGhpcy5fZGVmZXJyZWRzPVtdLGRvUmVzb2x2ZShm