UNPKG

amazon-connect-streams

Version:
1 lines 995 kB
(()=>{var l={94(){!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.lily=Z;var b=navigator.userAgent,d=["bubbles","cancelBubble","cancelable","composed","data","defaultPrevented","eventPhase","isTrusted","lastEventId","origin","returnValue","timeStamp","type"];Z.sprintf=l.sprintf,Z.vsprintf=l.vsprintf,delete l.sprintf,delete l.vsprintf,Z.HTTP_STATUS_CODES={SUCCESS:200,UNAUTHORIZED:401,ACCESS_DENIED:403,TOO_MANY_REQUESTS:429,INTERNAL_SERVER_ERROR:500},Z.TRANSPORT_TYPES={CHAT_TOKEN:"chat_token",WEB_SOCKET:"web_socket",AGENT_DISCOVERY:"agent_discovery",WEB_RTC:"web_rtc"},Z.hitch=function(){var l=Array.prototype.slice.call(arguments),b=l.shift(),d=l.shift();return Z.assertNotNull(b,"scope"),Z.assertNotNull(d,"method"),Z.assertTrue(Z.isFunction(d),"method must be a function"),function(){var Z=Array.prototype.slice.call(arguments);return d.apply(b,l.concat(Z))}},Z.isFunction=function(l){return!!(l&&l.constructor&&l.call&&l.apply)},Z.isArray=function(l){return"[object Array]"===Object.prototype.toString.call(l)},Z.keys=function(l){var b=[];for(var d in Z.assertNotNull(l,"map"),l)b.push(d);return b},Z.values=function(l){var b=[];for(var d in Z.assertNotNull(l,"map"),l)b.push(l[d]);return b},Z.entries=function(l){var Z=[];for(var b in l)Z.push({key:b,value:l[b]});return Z},Z.merge=function(){var l=Array.prototype.slice.call(arguments,0),b={};return l.forEach(function(l){Z.entries(l).forEach(function(l){b[l.key]=l.value})}),b},Z.now=function(){return(new Date).getTime()},Z.find=function(l,Z){for(var b=0;b<l.length;b++)if(Z(l[b]))return l[b];return null},Z.contains=function(l,b){return l instanceof Array?null!=Z.find(l,function(l){return l===b}):b in l},Z.containsValue=function(l,b){return l instanceof Array?null!=Z.find(l,function(l){return l===b}):null!=Z.find(Z.values(l),function(l){return l===b})},Z.randomId=function(){return Z.sprintf("%s-%s",Z.now(),Math.random().toString(36).slice(2))},Z.makeEnum=function(l){var Z={};return l.forEach(function(l){var b=l.replace(/\.?([a-z]+)_?/g,function(l,Z){return Z.toUpperCase()+"_"}).replace(/_$/,"");Z[b]=l}),Z},Z.makeNamespacedEnum=function(l,b){var d=Z.makeEnum(b);return Z.keys(d).forEach(function(b){d[b]=Z.sprintf("%s::%s",l,d[b])}),d},Z.makeGenericNamespacedEnum=function(l,b,d){var m=Z.makeEnum(b);return Z.keys(m).forEach(function(b){m[b]=Z.sprintf("%s"+d+"%s",l,m[b])}),m},Z.isChromeBrowser=function(){return-1!==b.indexOf("Chrome")},Z.isFirefoxBrowser=function(){return-1!==b.indexOf("Firefox")},Z.isOperaBrowser=function(){return-1!==b.indexOf("Opera")},Z.isEdgeBrowser=function(){return-1!==b.indexOf("Edg")},Z.getChromeBrowserVersion=function(){var l=b.substring(b.indexOf("Chrome")+7);return l?parseFloat(l):-1},Z.getFirefoxBrowserVersion=function(){var l=b.substring(b.indexOf("Firefox")+8);return l?parseFloat(l):-1},Z.isValidLocale=function(l){return[{id:"en_US",label:"English"},{id:"de_DE",label:"Deutsch"},{id:"es_ES",label:"Español"},{id:"fr_FR",label:"Français"},{id:"ja_JP",label:"日本語"},{id:"it_IT",label:"Italiano"},{id:"ko_KR",label:"한국어"},{id:"pt_BR",label:"Português"},{id:"zh_CN",label:"中文(简体)"},{id:"zh_TW",label:"中文(繁體)"}].map(function(l){return l.id}).includes(l)},Z.getOperaBrowserVersion=function(){var l=b.indexOf("Opera"),Z=-1!==b.indexOf("Version")?b.substring(l+8):b.substring(l+6);return Z?parseFloat(Z):-1},Z.index=function(l,Z){var b={};return l.forEach(function(l){b[Z(l)]=l}),b},Z.set=function(l){var Z={};return l.forEach(function(l){Z[l]=1}),Z},Z.relativeComplement=function(l,b){var d={};return Z.keys(b).forEach(function(Z){Z in l||(d[Z]=b[Z])}),d},Z.assertTrue=function(l,b){if(!l)throw new Z.ValueError(b)},Z.assertNotNull=function(l,b){return Z.assertTrue(null!=l&&void 0!==typeof l,Z.sprintf("%s must be provided",b||"A value")),l},Z.deepcopy=function(l){return JSON.parse(JSON.stringify(l))},Z.deepcopyCrossOriginEvent=function(l){const b={};return d.forEach(d=>{try{b[d]=l[d]}catch(l){Z.getLog().info("deepcopyCrossOriginEvent failed on key: ",d).sendInternalLogToServer()}}),Z.deepcopy(b)},Z.getBaseUrl=function(){var b=l.location;return Z.sprintf("%s//%s:%s",b.protocol,b.hostname,b.port)},Z.getUrlWithProtocol=function(b){var d=l.location.protocol;return b.substr(0,d.length)!==d?Z.sprintf("%s//%s",d,b):b},Z.isFramed=function(){try{return window.self!==window.top}catch(l){return!0}},Z.hasOtherConnectedCCPs=function(){return Z.numberOfConnectedCCPs>1},Z.fetch=function(l,b,d,m){return m=m||5,d=d||1e3,b=b||{},new Promise(function(W,c){!function m(G){fetch(l,b).then(function(l){l.status===Z.HTTP_STATUS_CODES.SUCCESS?l.json().then(l=>W(l)).catch(()=>W({})):1!==G&&(l.status>=Z.HTTP_STATUS_CODES.INTERNAL_SERVER_ERROR||l.status===Z.HTTP_STATUS_CODES.TOO_MANY_REQUESTS)?setTimeout(function(){m(--G)},d):c(l)}).catch(function(l){c(l)})}(m)})},Z.fetchWithTimeout=async function(l,b,d,m,W){if(d=d||{},!b)return Z.fetch(l,d,m,W);const c=new AbortController,G=setTimeout(()=>c.abort(),b),V=await Z.fetch(l,{...d,signal:c.signal},m,W);return clearTimeout(G),V},Z.backoff=function(b,d,m,W){Z.assertTrue(Z.isFunction(b),"func must be a Function");var c=this;b({success:function(l){W&&W.success&&W.success(l)},failure:function(Z,G){if(m>0){var V=2*d*Math.random();l.setTimeout(function(){c.backoff(b,2*V,--m,W)},V)}else W&&W.failure&&W.failure(Z,G)}})},Z.publishMetric=function(l){Z.core.getUpstream().sendUpstream(Z.EventType.BROADCAST,{event:Z.EventType.CLIENT_METRIC,data:l})},Z.publishSoftphoneStats=function(l){Z.core.getUpstream().sendUpstream(Z.EventType.BROADCAST,{event:Z.EventType.SOFTPHONE_STATS,data:l})},Z.publishSoftphoneReport=function(l){Z.core.getUpstream().sendUpstream(Z.EventType.BROADCAST,{event:Z.EventType.SOFTPHONE_REPORT,data:l})},Z.publishClickStreamData=function(l){Z.core.getUpstream().sendUpstream(Z.EventType.BROADCAST,{event:Z.EventType.CLICK_STREAM_DATA,data:l})},Z.publishClientSideLogs=function(l){Z.core.getEventBus().trigger(Z.EventType.CLIENT_SIDE_LOGS,l)},Z.addNamespaceToLogs=function(l){["log","error","warn","info","debug"].forEach(Z=>{const b=window.console[Z];window.console[Z]=function(){const Z=Array.from(arguments);Z.unshift(`[${l}]`),b.apply(window.console,Z)}})},Z.PopupManager=function(){this.windows={},this.windowUrls={}},Z.PopupManager.prototype.open=function(l,b,d){var m="";if(d){var W=d.height||578;m="width="+(d.width||433)+", height="+W+", top="+(d.top||0)+", left="+(d.left||0)}var c=this.windows[b],G=this.windowUrls[b];if(c)try{if(c.closed)delete this.windows[b],delete this.windowUrls[b];else if(G===l){try{c.focus()}catch(l){}return Z.getLog().info("[PopupManager] Reusing existing popup window").sendInternalLogToServer(),c}}catch(l){delete this.windows[b],delete this.windowUrls[b]}var V=window.open(l,b,m);if(V)try{V.closed||(this.windows[b]=V,this.windowUrls[b]=l,Z.getLog().info("[PopupManager] Opened popup window").withObject({url:l,name:b}).sendInternalLogToServer())}catch(l){}return V},Z.PopupManager.prototype.clear=function(Z){delete this.windows[Z],delete this.windowUrls[Z];var b=this._getLocalStorageKey(Z);l.localStorage.removeItem(b)},Z.PopupManager.prototype._getLastOpenedTimestamp=function(Z){var b=this._getLocalStorageKey(Z),d=l.localStorage.getItem(b);return d?parseInt(d,10):0},Z.PopupManager.prototype._setLastOpenedTimestamp=function(Z,b){var d=this._getLocalStorageKey(Z);l.localStorage.setItem(d,""+b)},Z.PopupManager.prototype._getLocalStorageKey=function(l){return"connectPopupManager::"+l};var m=Z.makeEnum(["granted","denied","default"]);Z.NotificationManager=function(){this.queue=[],this.permission=m.DEFAULT},Z.NotificationManager.prototype.requestPermission=function(){var b=this;"Notification"in l?l.Notification.permission===m.DENIED?(Z.getLog().warn("The user has requested to not receive notifications.").sendInternalLogToServer(),this.permission=m.DENIED):this.permission!==m.GRANTED&&l.Notification.requestPermission().then(function(l){b.permission=l,l===m.GRANTED?b._showQueued():b.queue=[]}):(Z.getLog().warn("This browser doesn't support notifications.").sendInternalLogToServer(),this.permission=m.DENIED)},Z.NotificationManager.prototype.show=function(l,b){if(this.permission===m.GRANTED)return this._showImpl({title:l,options:b});if(this.permission===m.DENIED)Z.getLog().warn("Unable to show notification.").sendInternalLogToServer().withObject({title:l,options:b});else{var d={title:l,options:b};Z.getLog().warn("Deferring notification until user decides to allow or deny.").withObject(d).sendInternalLogToServer(),this.queue.push(d)}},Z.NotificationManager.prototype._showQueued=function(){var l=this,Z=this.queue.map(function(Z){return l._showImpl(Z)});return this.queue=[],Z},Z.NotificationManager.prototype._showImpl=function(Z){var b=new l.Notification(Z.title,Z.options);return Z.options.clicked&&(b.onclick=function(){Z.options.clicked.call(b)}),b},Z.ValueError=function(){var l=Array.prototype.slice.call(arguments,0),b=l.shift(),d=new Error(Z.vsprintf(b,l));return Object.setPrototypeOf(d,Z.ValueError.prototype),d},Object.setPrototypeOf(Z.ValueError.prototype,Error.prototype),Object.setPrototypeOf(Z.ValueError,Error),Z.ValueError.prototype.name="ValueError",Z.NotImplementedError=function(){var l=Array.prototype.slice.call(arguments,0),b=l.shift(),d=new Error(Z.vsprintf(b,l));return Object.setPrototypeOf(d,Z.NotImplementedError.prototype),d},Object.setPrototypeOf(Z.NotImplementedError.prototype,Error.prototype),Object.setPrototypeOf(Z.NotImplementedError,Error),Z.NotImplementedError.prototype.name="NotImplementedError",Z.StateError=function(){var l=Array.prototype.slice.call(arguments,0),b=l.shift(),d=new Error(Z.vsprintf(b,l));return Object.setPrototypeOf(d,Z.StateError.prototype),d},Object.setPrototypeOf(Z.StateError.prototype,Error.prototype),Object.setPrototypeOf(Z.StateError,Error),Z.StateError.prototype.name="StateError",Z.VoiceIdError=function(l,Z,b){var d={};return d.type=l,d.message=Z,d.stack=Error(Z).stack,d.err=b,d},Z.isCCP=function(){return!!Z.core.upstream&&"ConnectSharedWorkerConduit"===Z.core.getUpstream().name},Z.isSharedWorker=function(){return Z.worker&&!!Z.worker.clientEngine},Z.isCRM=function(){return!!Z.core.upstream&&(Z.core.getUpstream()instanceof Z.IFrameConduit||Z.core.getUpstream()instanceof Z.GRProxyIframeConduit)},Z.isActiveConduit=function(l){const b=Z.core.getUpstream();return b instanceof Z.GRProxyIframeConduit?l.name===b.activeRegionUrl:(Z.getLog().debug("connect.isActiveConduit is called but there is no GR proxy conduit").sendInternalLogToServer(),!0)}}()},96(){!function(){var l=this||globalThis,Z=l.connect||{},b=l.globalConnect||{};l.connect=Z,l.globalConnect=b,l.lily=Z,b.core={};var d="globalCCP",m="465px";b.extractCcpRegionParams=function(l,b){Z.assertNotNull(b.standByRegion,"ccpBackupResource"),Z.assertNotNull(b.standByRegion.ccpUrl,"ccpUrl"),Z.assertNotNull(b.standByRegion.region,"region"),b.pollForFailover&&(Z.assertNotNull(b.loginUrl,"loginUrl"),Z.assertNotNull(b.instanceArn,"primary ARN"),b.otherArn=Z.assertNotNull(b.standByRegion.instanceArn,"backup ARN"));var d=b,c=Object.assign({},b,{ccpUrl:b.standByRegion.ccpUrl,region:b.standByRegion.region,instanceArn:b.standByRegion.instanceArn,otherArn:b.instanceArn,loginPopup:!1}),G=W(l);return parseInt(G.height)<=0&&(l.style.height=m,G.height=m),[d,c].map(function(l){return Z.assertNotNull(l.ccpUrl,"ccpUrl"),Z.assertNotNull(l.region,"region"),delete l.standByRegion,l.disasterRecoveryOn=!0,l.iframe_style="margin: 0; border: 0; padding:0px;width: 0px;height: 0px",l.height=G.height,l})};var W=function(l){var Z=window.getComputedStyle(l);return{height:Z.getPropertyValue("height"),width:Z.getPropertyValue("width"),display:Z.getPropertyValue("display")}},c=function(l,d){if(Z.assertTrue("string"==typeof l,"Region provided "+l+" is not a valid string"),!(d||b.core.regions).hasOwnProperty(l)){var m="Region provided "+l+" is not found!";throw new Z.ValueError(m)}};b.core.initCCP=function(l,m){Z.assertNotNull(m.getPrimaryRegion,"getPrimaryRegion"),Z.assertTrue(Z.isFunction(m.getPrimaryRegion),"getPrimaryRegion must be a function");var W=m.getPrimaryRegion;delete m.getPrimaryRegion,delete m.provider,delete m.plugins;var u=b.extractCcpRegionParams(l,m);W(function(W){return new Promise(R=>{var p;p=m.pollForFailover?W||m.region:Z.assertNotNull(W),b.core.regions=u.reduce(function(l,Z){return l[Z.region]={ccpParams:Z},l},{});var Y=u.reduce(function(l,Z){return l[Z.instanceArn]=Z.region,l},{});c(p,b.core.regions),b.core.primaryRegion=p,b.core.secondaryRegion=Object.keys(b.core.regions).find(function(l){return l!=b.core.primaryRegion});var y=u.map(function(l){return l.region===b.core.primaryRegion&&(l.isPrimary=!0),new b.Container(l)}),i=y.map(function(l){return l.ccp.outerHTML}),h=document.createElement("iframe");h.style="margin: 0; border: 0; padding:0px;width: 100%;height: 100%",h.allow="microphone; camera; autoplay; clipboard-write; identity-credentials-get",h.id=d,h.scrolling="no",h.onload=function(){X(b.core.primaryRegion),V(b.core.secondaryRegion),y.map(function(l){var Z=h.contentDocument.getElementById(l.id),d=Z.contentDocument,W=Z.contentWindow;m.additionalScripts&&Array.isArray(m.additionalScripts)&&m.additionalScripts.forEach(l=>{var Z=d.createElement("script");Z.src=l,d.body.appendChild(Z)}),W.init();var c=W.connect;b.core.regions[l.id].connect=c,c.core.getUpstream().onUpstream(c.DisasterRecoveryEvents.FAILOVER,function(Z){if(Z.nextActiveArn&&b.core.secondaryRegion===Y[Z.nextActiveArn])G(Y[Z.nextActiveArn],b.core.primaryRegion);else{if(!1!==Z.isPrimary||l.id!==b.core.primaryRegion)return;G(b.core.secondaryRegion,l.id)}delete b._failoverPending,b._triggerFailoverCompleteHandlers({activeRegion:b.core.primaryRegion,activeCcpUrl:b.core.regions[b.core.primaryRegion].ccpParams.ccpUrl})}),c.core.getUpstream().onUpstream(c.DisasterRecoveryEvents.FAILOVER_PENDING,function({nextActiveArn:l}){b._failoverPending||(b._triggerFailoverPendingHandlers({nextActiveArn:l}),b._failoverPending=!0)}),l.id===b.core.primaryRegion&&(window.connect=c),b._triggerInitHandlers(c,l.id)}),R(b.core.regions[b.core.primaryRegion].connect)},h.srcdoc=["<!DOCTYPE html>","<meta charset='UTF-8'>","<html>","<head>","<style>","html, body { width: 100%;height: 100%;margin: 0px;padding: 0px; border: 0px;}","</style>","</head>","<body>",i.join(""),"</body>","</html>"].join(""),l.appendChild(h)})},function(l){console.error("[Disaster Recovery] An error occured, while attempting to retrieve your primary region;"),l()})};var G=function(l,Z){b.core.primaryRegion=l,b.core.secondaryRegion=Z,window.connect=b.core.regions[l].connect,b.core.activate(l),X(l),V(Z)},V=function(l){document.getElementById(d).contentDocument.getElementById(l).style="height: 0; width: 0; border: 0px"},X=function(l){document.getElementById(d).contentDocument.getElementById(l).style="height:100%;width:100%;border:0px"};b.core.onInit=function(l){b.core._onInitHandlers=b.core._onInitHandlers||{};const d=Z.randomId();return b.core._onInitHandlers[d]=l,()=>delete b.core._onInitHandlers[d]},b._triggerInitHandlers=function(l,Z){const d=b.core._onInitHandlers;d&&Object.values(d).forEach(b=>b(l,Z))},b.core.onFailoverComplete=function(l){b.core._failoverCompleteHandlers=b.core._failoverCompleteHandlers||{};const d=Z.randomId();return b.core._failoverCompleteHandlers[d]=l,()=>delete b.core._failoverCompleteHandlers[d]},b._triggerFailoverCompleteHandlers=function(l){const Z=b.core._failoverCompleteHandlers;Z&&Object.values(Z).forEach(Z=>Z(l))},b.core.onFailoverPending=function(l){b.core._failoverPendingHandlers=b.core._failoverPendingHandlers||{};const d=Z.randomId();return b.core._failoverPendingHandlers[d]=l,()=>delete b.core._failoverPendingHandlers[d]},b._triggerFailoverPendingHandlers=function(l){const Z=b.core._failoverPendingHandlers;Z&&Object.values(Z).forEach(Z=>Z(l))},b.core.downloadLogs=function(l){if(!(b.core.regions&&b.core.regions[b.core.primaryRegion]&&b.core.regions[b.core.primaryRegion].connect))throw new Error("CCP is not initialized yet. Please call initCCP() first and wait until the getPrimaryRegion promise resolves.");Object.entries(b.core.regions).forEach(([Z,{connect:b}])=>{const d=`${Z}-${l&&l.logName||"agent-log"}`;b.getLog().download({logName:d,filterByLogLevel:l&&l.filterByLogLevel})})},b.core.failover=function(l){b.core.failoverTo(b.core.secondaryRegion,l)},b.core.failoverTo=function(l,d){c(l),l===b.core.primaryRegion?Z.getLog().info(`[Disaster Recovery] Ignoring request to fail over to region ${l} since it is already the currently active region.`).sendInternalLogToServer():b.core.deactivate(b.core.primaryRegion,d)},b.core.deactivate=function(l,Z){var d=b.core.regions[l].connect;d.getLog().info("[Disaster Recovery] Deactivating %s region.",l).sendInternalLogToServer(),d.core.suppressContacts&&d.core.forceOffline?(d.core.suppressContacts(!0),d.core.forceOffline({softFailover:Z})):d.getLog().error("[Disaster Recovery] CCP did not load successfully for region %s; unable to deactivate region",l)},b.core.activate=function(l){var Z=b.core.regions[l].connect;Z.getLog().info("[Disaster Recovery] Activating %s region.",l).sendInternalLogToServer(),Z.core.suppressContacts?Z.core.suppressContacts(!1):Z.getLog().error("[Disaster Recovery] CCP did not load successfully for region %s; unable to activate region",l)}}()},236(){!function(){function l(l,Z){var b=(65535&l)+(65535&Z);return(l>>16)+(Z>>16)+(b>>16)<<16|65535&b}function Z(Z,b,d,m,W,c){return l((G=l(l(b,Z),l(m,c)))<<(V=W)|G>>>32-V,d);var G,V}function b(l,b,d,m,W,c,G){return Z(b&d|~b&m,l,b,W,c,G)}function d(l,b,d,m,W,c,G){return Z(b&m|d&~m,l,b,W,c,G)}function m(l,b,d,m,W,c,G){return Z(b^d^m,l,b,W,c,G)}function W(l,b,d,m,W,c,G){return Z(d^(b|~m),l,b,W,c,G)}function c(Z,c){var G,V,X,u,R;Z[c>>5]|=128<<c%32,Z[14+(c+64>>>9<<4)]=c;var p=1732584193,Y=-271733879,y=-1732584194,i=271733878;for(G=0;G<Z.length;G+=16)V=p,X=Y,u=y,R=i,p=b(p,Y,y,i,Z[G],7,-680876936),i=b(i,p,Y,y,Z[G+1],12,-389564586),y=b(y,i,p,Y,Z[G+2],17,606105819),Y=b(Y,y,i,p,Z[G+3],22,-1044525330),p=b(p,Y,y,i,Z[G+4],7,-176418897),i=b(i,p,Y,y,Z[G+5],12,1200080426),y=b(y,i,p,Y,Z[G+6],17,-1473231341),Y=b(Y,y,i,p,Z[G+7],22,-45705983),p=b(p,Y,y,i,Z[G+8],7,1770035416),i=b(i,p,Y,y,Z[G+9],12,-1958414417),y=b(y,i,p,Y,Z[G+10],17,-42063),Y=b(Y,y,i,p,Z[G+11],22,-1990404162),p=b(p,Y,y,i,Z[G+12],7,1804603682),i=b(i,p,Y,y,Z[G+13],12,-40341101),y=b(y,i,p,Y,Z[G+14],17,-1502002290),p=d(p,Y=b(Y,y,i,p,Z[G+15],22,1236535329),y,i,Z[G+1],5,-165796510),i=d(i,p,Y,y,Z[G+6],9,-1069501632),y=d(y,i,p,Y,Z[G+11],14,643717713),Y=d(Y,y,i,p,Z[G],20,-373897302),p=d(p,Y,y,i,Z[G+5],5,-701558691),i=d(i,p,Y,y,Z[G+10],9,38016083),y=d(y,i,p,Y,Z[G+15],14,-660478335),Y=d(Y,y,i,p,Z[G+4],20,-405537848),p=d(p,Y,y,i,Z[G+9],5,568446438),i=d(i,p,Y,y,Z[G+14],9,-1019803690),y=d(y,i,p,Y,Z[G+3],14,-187363961),Y=d(Y,y,i,p,Z[G+8],20,1163531501),p=d(p,Y,y,i,Z[G+13],5,-1444681467),i=d(i,p,Y,y,Z[G+2],9,-51403784),y=d(y,i,p,Y,Z[G+7],14,1735328473),p=m(p,Y=d(Y,y,i,p,Z[G+12],20,-1926607734),y,i,Z[G+5],4,-378558),i=m(i,p,Y,y,Z[G+8],11,-2022574463),y=m(y,i,p,Y,Z[G+11],16,1839030562),Y=m(Y,y,i,p,Z[G+14],23,-35309556),p=m(p,Y,y,i,Z[G+1],4,-1530992060),i=m(i,p,Y,y,Z[G+4],11,1272893353),y=m(y,i,p,Y,Z[G+7],16,-155497632),Y=m(Y,y,i,p,Z[G+10],23,-1094730640),p=m(p,Y,y,i,Z[G+13],4,681279174),i=m(i,p,Y,y,Z[G],11,-358537222),y=m(y,i,p,Y,Z[G+3],16,-722521979),Y=m(Y,y,i,p,Z[G+6],23,76029189),p=m(p,Y,y,i,Z[G+9],4,-640364487),i=m(i,p,Y,y,Z[G+12],11,-421815835),y=m(y,i,p,Y,Z[G+15],16,530742520),p=W(p,Y=m(Y,y,i,p,Z[G+2],23,-995338651),y,i,Z[G],6,-198630844),i=W(i,p,Y,y,Z[G+7],10,1126891415),y=W(y,i,p,Y,Z[G+14],15,-1416354905),Y=W(Y,y,i,p,Z[G+5],21,-57434055),p=W(p,Y,y,i,Z[G+12],6,1700485571),i=W(i,p,Y,y,Z[G+3],10,-1894986606),y=W(y,i,p,Y,Z[G+10],15,-1051523),Y=W(Y,y,i,p,Z[G+1],21,-2054922799),p=W(p,Y,y,i,Z[G+8],6,1873313359),i=W(i,p,Y,y,Z[G+15],10,-30611744),y=W(y,i,p,Y,Z[G+6],15,-1560198380),Y=W(Y,y,i,p,Z[G+13],21,1309151649),p=W(p,Y,y,i,Z[G+4],6,-145523070),i=W(i,p,Y,y,Z[G+11],10,-1120210379),y=W(y,i,p,Y,Z[G+2],15,718787259),Y=W(Y,y,i,p,Z[G+9],21,-343485551),p=l(p,V),Y=l(Y,X),y=l(y,u),i=l(i,R);return[p,Y,y,i]}function G(l){var Z,b="",d=32*l.length;for(Z=0;Z<d;Z+=8)b+=String.fromCharCode(l[Z>>5]>>>Z%32&255);return b}function V(l){var Z,b=[];for(b[(l.length>>2)-1]=void 0,Z=0;Z<b.length;Z+=1)b[Z]=0;var d=8*l.length;for(Z=0;Z<d;Z+=8)b[Z>>5]|=(255&l.charCodeAt(Z/8))<<Z%32;return b}function X(l){var Z,b,d="0123456789abcdef",m="";for(b=0;b<l.length;b+=1)Z=l.charCodeAt(b),m+=d.charAt(Z>>>4&15)+d.charAt(15&Z);return m}function u(l){return unescape(encodeURIComponent(l))}function R(l){return function(l){return G(c(V(l),8*l.length))}(u(l))}function p(l,Z){return function(l,Z){var b,d,m=V(l),W=[],X=[];for(W[15]=X[15]=void 0,m.length>16&&(m=c(m,8*l.length)),b=0;b<16;b+=1)W[b]=909522486^m[b],X[b]=1549556828^m[b];return d=c(W.concat(V(Z)),512+8*Z.length),G(c(X.concat(d),640))}(u(l),u(Z))}(this||globalThis).md5=function(l,Z,b){return Z?b?p(Z,l):X(p(Z,l)):b?R(l):X(R(l))}}()},296(){!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezE5KGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSx0LG4pe2lmKCFuKXJldHVybiBmZXRjaChlLHQpO2NvbnN0IGk9byhlLG4pLGE9cih0LG4pO3JldHVybiBmZXRjaChpLGEpfWZ1bmN0aW9uIHIoZSx0KXtyZXR1cm4obnVsbD09dD92b2lkIDA6dC5oZWFkZXJzKT9lP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7aGVhZGVyczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZS5oZWFkZXJzfHx7fSksdC5oZWFkZXJzKX0pOntoZWFkZXJzOnQuaGVhZGVyc306ZX1mdW5jdGlvbiBvKGUsdCl7aWYoIShudWxsPT10P3ZvaWQgMDp0LmVzY2FwZWRRdWVyeVN0cmluZykpcmV0dXJuIGU7Y29uc3Qgbj0tMSE9PWUubGFzdEluZGV4T2YoIj8iKTtyZXR1cm5gJHtlfSR7bj8iJiI6Ij8ifSR7dC5lc2NhcGVkUXVlcnlTdHJpbmd9YH1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5pc1ZhbGlkUmV2aXNpb25JRD10LmlzVmFsaWRBc3NldEdyb3VwPXQucmVzb2x2ZVVSTD10LmFkZFF1ZXJ5UGFyYW1zPXQud2l0aFF1ZXJ5U3RyaW5nPXQud2l0aFJlcXVlc3RIZWFkZXJzPXQuZmV0Y2hXaXRoQmVoYXZpb3I9dm9pZCAwLHQuZmV0Y2hXaXRoQmVoYXZpb3I9bix0LndpdGhSZXF1ZXN0SGVhZGVycz1yLHQud2l0aFF1ZXJ5U3RyaW5nPW8sdC5hZGRRdWVyeVBhcmFtcz1mdW5jdGlvbihlLHQpe2NvbnN0IG49T2JqZWN0LmtleXModCk7aWYoIW4ubGVuZ3RoKXJldHVybiBlO2NvbnN0IHI9bmV3IFVSTFNlYXJjaFBhcmFtcyhudWxsPT1lP3ZvaWQgMDplLmVzY2FwZWRRdWVyeVN0cmluZyk7Zm9yKGNvbnN0IGUgb2YgbilyLmFwcGVuZChlLHRbZV0pO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2VzY2FwZWRRdWVyeVN0cmluZzpyLnRvU3RyaW5nKCl9KX07Y29uc3QgaT17bWV0aG9kOiJIRUFEIixtb2RlOiJjb3JzIixjcmVkZW50aWFsczoib21pdCIscmVkaXJlY3Q6ImZvbGxvdyIscmVmZXJyZXJQb2xpY3k6Im9yaWdpbiJ9O3QucmVzb2x2ZVVSTD1mdW5jdGlvbihlLHQpe3JldHVybiBuKGUsaSx0KS50aGVuKHQ9PnQucmVkaXJlY3RlZD90LnVybDplKX0sdC5pc1ZhbGlkQXNzZXRHcm91cD1mdW5jdGlvbihlKXtyZXR1cm4hIWUmJi9eWy0uYS16QS1aMC05XSskLy50ZXN0KGUpfSx0LmlzVmFsaWRSZXZpc2lvbklEPWZ1bmN0aW9uKGUpe3JldHVybiEhZSYmL15bMTIzNDU2Nzg5YWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5ekFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWl17MjJ9JC8udGVzdChlKX19LDYwKCl7ZnVuY3Rpb24gZSgpe3ZhciBuLHIsbz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxpPW8uaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixhPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiBzKGUsbyxpLGEpe3ZhciBzPW8mJm8ucHJvdG90eXBlIGluc3RhbmNlb2YgdT9vOnUsbD1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKTtyZXR1cm4gdChsLCJfaW52b2tlIixmdW5jdGlvbihlLHQsbyl7dmFyIGksYSxzLHU9MCxsPW98fFtdLGQ9ITEscD17cDowLG46MCx2Om4sYTpoLGY6aC5iaW5kKG4sNCksZDpmdW5jdGlvbihlLHQpe3JldHVybiBpPWUsYT0wLHM9bixwLm49dCxjfX07ZnVuY3Rpb24gaChlLHQpe2ZvcihhPWUscz10LHI9MDshZCYmdSYmIW8mJnI8bC5sZW5ndGg7cisrKXt2YXIgbyxpPWxbcl0saD1wLnAsZj1pWzJdO2U+Mz8obz1mPT09dCkmJihzPWlbKGE9aVs0XSk/NTooYT0zLDMpXSxpWzRdPWlbNV09bik6aVswXTw9aCYmKChvPWU8MiYmaDxpWzFdKT8oYT0wLHAudj10LHAubj1pWzFdKTpoPGYmJihvPWU8M3x8aVswXT50fHx0PmYpJiYoaVs0XT1lLGlbNV09dCxwLm49ZixhPTApKX1pZihvfHxlPjEpcmV0dXJuIGM7dGhyb3cgZD0hMCx0fXJldHVybiBmdW5jdGlvbihvLGwsZil7aWYodT4xKXRocm93IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2ZvcihkJiYxPT09bCYmaChsLGYpLGE9bCxzPWY7KHI9YTwyP246cyl8fCFkOyl7aXx8KGE/YTwzPyhhPjEmJihwLm49LTEpLGgoYSxzKSk6cC5uPXM6cC52PXMpO3RyeXtpZih1PTIsaSl7aWYoYXx8KG89Im5leHQiKSxyPWlbb10pe2lmKCEocj1yLmNhbGwoaSxzKSkpdGhyb3cgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpO2lmKCFyLmRvbmUpcmV0dXJuIHI7cz1yLnZhbHVlLGE8MiYmKGE9MCl9ZWxzZSAxPT09YSYmKHI9aS5yZXR1cm4pJiZyLmNhbGwoaSksYTwyJiYocz1UeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIrbysiJyBtZXRob2QiKSxhPTEpO2k9bn1lbHNlIGlmKChyPShkPXAubjwwKT9zOmUuY2FsbCh0LHApKSE9PWMpYnJlYWt9Y2F0Y2goZSl7aT1uLGE9MSxzPWV9ZmluYWxseXt1PTF9fXJldHVybnt2YWx1ZTpyLGRvbmU6ZH19fShlLGksYSksITApLGx9dmFyIGM9e307ZnVuY3Rpb24gdSgpe31mdW5jdGlvbiBsKCl7fWZ1bmN0aW9uIGQoKXt9cj1PYmplY3QuZ2V0UHJvdG90eXBlT2Y7dmFyIHA9W11baV0/cihyKFtdW2ldKCkpKToodChyPXt9LGksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHIpLGg9ZC5wcm90b3R5cGU9dS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwKTtmdW5jdGlvbiBmKGUpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsZCk6KGUuX19wcm90b19fPWQsdChlLGEsIkdlbmVyYXRvckZ1bmN0aW9uIikpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaCksZX1yZXR1cm4gbC5wcm90b3R5cGU9ZCx0KGgsImNvbnN0cnVjdG9yIixkKSx0KGQsImNvbnN0cnVjdG9yIixsKSxsLmRpc3BsYXlOYW1lPSJHZW5lcmF0b3JGdW5jdGlvbiIsdChkLGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksdChoKSx0KGgsYSwiR2VuZXJhdG9yIiksdChoLGksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQoaCwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSwoZT1mdW5jdGlvbigpe3JldHVybnt3OnMsbTpmfX0pKCl9ZnVuY3Rpb24gdChlLG4scixvKXt2YXIgaT1PYmplY3QuZGVmaW5lUHJvcGVydHk7dHJ5e2koe30sIiIse30pfWNhdGNoKGUpe2k9MH10PWZ1bmN0aW9uKGUsbixyLG8pe2Z1bmN0aW9uIGEobixyKXt0KGUsbixmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW52b2tlKG4scixlKX0pfW4/aT9pKGUsbix7dmFsdWU6cixlbnVtZXJhYmxlOiFvLGNvbmZpZ3VyYWJsZTohbyx3cml0YWJsZTohb30pOmVbbl09cjooYSgibmV4dCIsMCksYSgidGhyb3ciLDEpLGEoInJldHVybiIsMikpfSx0KGUsbixyLG8pfWZ1bmN0aW9uIG4oZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiByKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciByPW51bGwhPWFyZ3VtZW50c1t0XT9hcmd1bWVudHNbdF06e307dCUyP24oT2JqZWN0KHIpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe28oZSx0LHJbdF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6bihPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsdCkpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gbyhlLHQsbil7cmV0dXJuKHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9YShlKXx8IWUpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PW4pe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPWEocikpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT10P1N0cmluZzpOdW1iZXIpKGUpfShlLCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09YSh0KT90OnQrIiJ9KHQpKWluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIGkoZSx0LG4scixvLGksYSl7dHJ5e3ZhciBzPWVbaV0oYSksYz1zLnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIG4oZSl9cy5kb25lP3QoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4ocixvKX1mdW5jdGlvbiBhKGUpe3JldHVybiBhPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxhKGUpfSFmdW5jdGlvbigpe3ZhciB0PXRoaXN8fGdsb2JhbFRoaXMsbj10LmNvbm5lY3R8fHt9O3QuY29ubmVjdD1uLHQubGlseT1uO3ZhciBvPW5hdmlnYXRvci51c2VyQWdlbnQscz1bImJ1YmJsZXMiLCJjYW5jZWxCdWJibGUiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJkYXRhIiwiZGVmYXVsdFByZXZlbnRlZCIsImV2ZW50UGhhc2UiLCJpc1RydXN0ZWQiLCJsYXN0RXZlbnRJZCIsIm9yaWdpbiIsInJldHVyblZhbHVlIiwidGltZVN0YW1wIiwidHlwZSJdO24uc3ByaW50Zj10LnNwcmludGYsbi52c3ByaW50Zj10LnZzcHJpbnRmLGRlbGV0ZSB0LnNwcmludGYsZGVsZXRlIHQudnNwcmludGYsbi5IVFRQX1NUQVRVU19DT0RFUz17U1VDQ0VTUzoyMDAsVU5BVVRIT1JJWkVEOjQwMSxBQ0NFU1NfREVOSUVEOjQwMyxUT09fTUFOWV9SRVFVRVNUUzo0MjksSU5URVJOQUxfU0VSVkVSX0VSUk9SOjUwMH0sbi5UUkFOU1BPUlRfVFlQRVM9e0NIQVRfVE9LRU46ImNoYXRfdG9rZW4iLFdFQl9TT0NLRVQ6IndlYl9zb2NrZXQiLEFHRU5UX0RJU0NPVkVSWToiYWdlbnRfZGlzY292ZXJ5IixXRUJfUlRDOiJ3ZWJfcnRjIn0sbi5oaXRjaD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdD1lLnNoaWZ0KCkscj1lLnNoaWZ0KCk7cmV0dXJuIG4uYXNzZXJ0Tm90TnVsbCh0LCJzY29wZSIpLG4uYXNzZXJ0Tm90TnVsbChyLCJtZXRob2QiKSxuLmFzc2VydFRydWUobi5pc0Z1bmN0aW9uKHIpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZnVuY3Rpb24oKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiByLmFwcGx5KHQsZS5jb25jYXQobikpfX0sbi5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LG4uaXNBcnJheT1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfSxuLmtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciByIGluIG4uYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKXQucHVzaChyKTtyZXR1cm4gdH0sbi52YWx1ZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciByIGluIG4uYXNzZXJ0Tm90TnVsbChlLCJtYXAiKSxlKXQucHVzaChlW3JdKTtyZXR1cm4gdH0sbi5lbnRyaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaCh7a2V5Om4sdmFsdWU6ZVtuXX0pO3JldHVybiB0fSxuLm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHQ9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtuLmVudHJpZXMoZSkuZm9yRWFjaChmdW5jdGlvbihlKXt0W2Uua2V5XT1lLnZhbHVlfSl9KSx0fSxuLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxuLmZpbmQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0KGVbbl0pKXJldHVybiBlW25dO3JldHVybiBudWxsfSxuLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9udWxsIT1uLmZpbmQoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KTp0IGluIGV9LG4uY29udGFpbnNWYWx1ZT1mdW5jdGlvbihlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/bnVsbCE9bi5maW5kKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSk6bnVsbCE9bi5maW5kKG4udmFsdWVzKGUpLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pfSxuLnJhbmRvbUlkPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc3ByaW50ZigiJXMtJXMiLG4ubm93KCksTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMikpfSxuLm1ha2VFbnVtPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKC9cLj8oW2Etel0rKV8/L2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpKyJfIn0pLnJlcGxhY2UoL18kLywiIik7dFtuXT1lfSksdH0sbi5tYWtlTmFtZXNwYWNlZEVudW09ZnVuY3Rpb24oZSx0KXt2YXIgcj1uLm1ha2VFbnVtKHQpO3JldHVybiBuLmtleXMocikuZm9yRWFjaChmdW5jdGlvbih0KXtyW3RdPW4uc3ByaW50ZigiJXM6OiVzIixlLHJbdF0pfSkscn0sbi5tYWtlR2VuZXJpY05hbWVzcGFjZWRFbnVtPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbz1uLm1ha2VFbnVtKHQpO3JldHVybiBuLmtleXMobykuZm9yRWFjaChmdW5jdGlvbih0KXtvW3RdPW4uc3ByaW50ZigiJXMiK3IrIiVzIixlLG9bdF0pfSksb30sbi5pc0Nocm9tZUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW8uaW5kZXhPZigiQ2hyb21lIil9LG4uaXNGaXJlZm94QnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09by5pbmRleE9mKCJGaXJlZm94Iil9LG4uaXNPcGVyYUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PW8uaW5kZXhPZigiT3BlcmEiKX0sbi5pc0VkZ2VCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1vLmluZGV4T2YoIkVkZyIpfSxuLmdldENocm9tZUJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9by5zdWJzdHJpbmcoby5pbmRleE9mKCJDaHJvbWUiKSs3KTtyZXR1cm4gZT9wYXJzZUZsb2F0KGUpOi0xfSxuLmdldEZpcmVmb3hCcm93c2VyVmVyc2lvbj1mdW5jdGlvbigpe3ZhciBlPW8uc3Vic3RyaW5nKG8uaW5kZXhPZigiRmlyZWZveCIpKzgpO3JldHVybiBlP3BhcnNlRmxvYXQoZSk6LTF9LG4uaXNWYWxpZExvY2FsZT1mdW5jdGlvbihlKXtyZXR1cm5be2lkOiJlbl9VUyIsbGFiZWw6IkVuZ2xpc2gifSx7aWQ6ImRlX0RFIixsYWJlbDoiRGV1dHNjaCJ9LHtpZDoiZXNfRVMiLGxhYmVsOiJFc3Bhw7FvbCJ9LHtpZDoiZnJfRlIiLGxhYmVsOiJGcmFuw6dhaXMifSx7aWQ6ImphX0pQIixsYWJlbDoi5pel5pys6KqeIn0se2lkOiJpdF9JVCIsbGFiZWw6Ikl0YWxpYW5vIn0se2lkOiJrb19LUiIsbGFiZWw6Iu2VnOq1reyWtCJ9LHtpZDoicHRfQlIiLGxhYmVsOiJQb3J0dWd1w6pzIn0se2lkOiJ6aF9DTiIsbGFiZWw6IuS4reaWhyjnroDkvZMpIn0se2lkOiJ6aF9UVyIsbGFiZWw6IuS4reaWhyjnuYHpq5QpIn1dLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pLmluY2x1ZGVzKGUpfSxuLmdldE9wZXJhQnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1vLmluZGV4T2YoIk9wZXJhIiksdD0tMSE9PW8uaW5kZXhPZigiVmVyc2lvbiIpP28uc3Vic3RyaW5nKGUrOCk6by5zdWJzdHJpbmcoZSs2KTtyZXR1cm4gdD9wYXJzZUZsb2F0KHQpOi0xfSxuLmluZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXtuW3QoZSldPWV9KSxufSxuLnNldD1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09MX0pLHR9LG4ucmVsYXRpdmVDb21wbGVtZW50PWZ1bmN0aW9uKGUsdCl7dmFyIHI9e307cmV0dXJuIG4ua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24gaW4gZXx8KHJbbl09dFtuXSl9KSxyfSxuLmFzc2VydFRydWU9ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgbi5WYWx1ZUVycm9yKHQpfSxuLmFzc2VydE5vdE51bGw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5hc3NlcnRUcnVlKG51bGwhPWUmJnZvaWQgMCE9PWEoZSksbi5zcHJpbnRmKCIlcyBtdXN0IGJlIHByb3ZpZGVkIix0fHwiQSB2YWx1ZSIpKSxlfSxuLmRlZXBjb3B5PWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKX0sbi5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHMuZm9yRWFjaChmdW5jdGlvbihyKXt0cnl7dFtyXT1lW3JdfWNhdGNoKGUpe24uZ2V0TG9nKCkuaW5mbygiZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50IGZhaWxlZCBvbiBrZXk6ICIscikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSxuLmRlZXBjb3B5KHQpfSxuLmdldEJhc2VVcmw9ZnVuY3Rpb24oKXt2YXIgZT10LmxvY2F0aW9uO3JldHVybiBuLnNwcmludGYoIiVzLy8lczolcyIsZS5wcm90b2NvbCxlLmhvc3RuYW1lLGUucG9ydCl9LG4uZ2V0VXJsV2l0aFByb3RvY29sPWZ1bmN0aW9uKGUpe3ZhciByPXQubG9jYXRpb24ucHJvdG9jb2w7cmV0dXJuIGUuc3Vic3RyKDAsci5sZW5ndGgpIT09cj9uLnNwcmludGYoIiVzLy8lcyIscixlKTplfSxuLmlzRnJhbWVkPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB3aW5kb3cuc2VsZiE9PXdpbmRvdy50b3B9Y2F0Y2goZSl7cmV0dXJuITB9fSxuLmhhc090aGVyQ29ubmVjdGVkQ0NQcz1mdW5jdGlvbigpe3JldHVybiBuLm51bWJlck9mQ29ubmVjdGVkQ0NQcz4xfSxuLmZldGNoPWZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvPW98fDUscj1yfHwxZTMsdD10fHx7fSxuZXcgUHJvbWlzZShmdW5jdGlvbihpLGEpeyFmdW5jdGlvbiBvKHMpe2ZldGNoKGUsdCkudGhlbihmdW5jdGlvbihlKXtlLnN0YXR1cz09PW4uSFRUUF9TVEFUVVNfQ09ERVMuU1VDQ0VTUz9lLmpzb24oKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gaSh7fSl9KToxIT09cyYmKGUuc3RhdHVzPj1uLkhUVFBfU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUnx8ZS5zdGF0dXM9PT1uLkhUVFBfU1RBVFVTX0NPREVTLlRPT19NQU5ZX1JFUVVFU1RTKT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bygtLXMpfSxyKTphKGUpfSkuY2F0Y2goZnVuY3Rpb24oZSl7YShlKX0pfShvKX0pfSxuLmZldGNoV2l0aFRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgdCxvPSh0PWUoKS5tKGZ1bmN0aW9uIHQobyxpLGEscyxjKXt2YXIgdSxsLGQ7cmV0dXJuIGUoKS53KGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5uKXtjYXNlIDA6aWYoYT1hfHx7fSxpKXtlLm49MTticmVha31yZXR1cm4gZS5hKDIsbi5mZXRjaChvLGEscyxjKSk7Y2FzZSAxOnJldHVybiB1PW5ldyBBYm9ydENvbnRyb2xsZXIsbD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHUuYWJvcnQoKX0saSksZS5uPTIsbi5mZXRjaChvLHIocih7fSxhKSx7fSx7c2lnbmFsOnUuc2lnbmFsfSkscyxjKTtjYXNlIDI6cmV0dXJuIGQ9ZS52LGNsZWFyVGltZW91dChsKSxlLmEoMixkKX19LHQpfSksZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLG8pe3ZhciBhPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBzKGUpe2koYSxyLG8scyxjLCJuZXh0IixlKX1mdW5jdGlvbiBjKGUpe2koYSxyLG8scyxjLCJ0aHJvdyIsZSl9cyh2b2lkIDApfSl9KTtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLG4uYmFja29mZj1mdW5jdGlvbihlLHIsbyxpKXtuLmFzc2VydFRydWUobi5pc0Z1bmN0aW9uKGUpLCJmdW5jIG11c3QgYmUgYSBGdW5jdGlvbiIpO3ZhciBhPXRoaXM7ZSh7c3VjY2VzczpmdW5jdGlvbihlKXtpJiZpLnN1Y2Nlc3MmJmkuc3VjY2VzcyhlKX0sZmFpbHVyZTpmdW5jdGlvbihuLHMpe2lmKG8+MCl7dmFyIGM9MipyKk1hdGgucmFuZG9tKCk7dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5iYWNrb2ZmKGUsMipjLC0tbyxpKX0sYyl9ZWxzZSBpJiZpLmZhaWx1cmUmJmkuZmFpbHVyZShuLHMpfX0pfSxuLnB1Ymxpc2hNZXRyaWM9ZnVuY3Rpb24oZSl7bi5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKG4uRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6bi5FdmVudFR5cGUuQ0xJRU5UX01FVFJJQyxkYXRhOmV9KX0sbi5wdWJsaXNoU29mdHBob25lU3RhdHM9ZnVuY3Rpb24oZSl7bi5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKG4uRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6bi5FdmVudFR5cGUuU09GVFBIT05FX1NUQVRTLGRhdGE6ZX0pfSxuLnB1Ymxpc2hTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24oZSl7bi5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKG4uRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6bi5FdmVudFR5cGUuU09GVFBIT05FX1JFUE9SVCxkYXRhOmV9KX0sbi5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhPWZ1bmN0aW9uKGUpe24uY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShuLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50Om4uRXZlbnRUeXBlLkNMSUNLX1NUUkVBTV9EQVRBLGRhdGE6ZX0pfSxuLnB1Ymxpc2hDbGllbnRTaWRlTG9ncz1mdW5jdGlvbihlKXtuLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKG4uRXZlbnRUeXBlLkNMSUVOVF9TSURFX0xPR1MsZSl9LG4uYWRkTmFtZXNwYWNlVG9Mb2dzPWZ1bmN0aW9uKGUpe1sibG9nIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIl0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj13aW5kb3cuY29uc29sZVt0XTt3aW5kb3cuY29uc29sZVt0XT1mdW5jdGlvbigpe3ZhciB0PUFycmF5LmZyb20oYXJndW1lbnRzKTt0LnVuc2hpZnQoIlsiLmNvbmNhdChlLCJdIikpLG4uYXBwbHkod2luZG93LmNvbnNvbGUsdCl9fSl9LG4uUG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy53aW5kb3dzPXt9LHRoaXMud2luZG93VXJscz17fX0sbi5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPSIiO2lmKHIpe3ZhciBpPXIuaGVpZ2h0fHw1Nzg7bz0id2lkdGg9Iisoci53aWR0aHx8NDMzKSsiLCBoZWlnaHQ9IitpKyIsIHRvcD0iKyhyLnRvcHx8MCkrIiwgbGVmdD0iKyhyLmxlZnR8fDApfXZhciBhPXRoaXMud2luZG93c1t0XSxzPXRoaXMud2luZG93VXJsc1t0XTtpZihhKXRyeXtpZihhLmNsb3NlZClkZWxldGUgdGhpcy53aW5kb3dzW3RdLGRlbGV0ZSB0aGlzLndpbmRvd1VybHNbdF07ZWxzZSBpZihzPT09ZSl7dHJ5e2EuZm9jdXMoKX1jYXRjaChlKXt9cmV0dXJuIG4uZ2V0TG9nKCkuaW5mbygiW1BvcHVwTWFuYWdlcl0gUmV1c2luZyBleGlzdGluZyBwb3B1cCB3aW5kb3ciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGF9fWNhdGNoKGUpe2RlbGV0ZSB0aGlzLndpbmRvd3NbdF0sZGVsZXRlIHRoaXMud2luZG93VXJsc1t0XX12YXIgYz13aW5kb3cub3BlbihlLHQsbyk7aWYoYyl0cnl7Yy5jbG9zZWR8fCh0aGlzLndpbmRvd3NbdF09Yyx0aGlzLndpbmRvd1VybHNbdF09ZSxuLmdldExvZygpLmluZm8oIltQb3B1cE1hbmFnZXJdIE9wZW5lZCBwb3B1cCB3aW5kb3ciKS53aXRoT2JqZWN0KHt1cmw6ZSxuYW1lOnR9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX1jYXRjaChlKXt9cmV0dXJuIGN9LG4uUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy53aW5kb3dzW2VdLGRlbGV0ZSB0aGlzLndpbmRvd1VybHNbZV07dmFyIG49dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KGUpO3QubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0obil9LG4uUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkoZSkscj10LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG4pO3JldHVybiByP3BhcnNlSW50KHIsMTApOjB9LG4uUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fc2V0TGFzdE9wZW5lZFRpbWVzdGFtcD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleShlKTt0LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHIsIiIrbil9LG4uUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5fZ2V0TG9jYWxTdG9yYWdlS2V5PWZ1bmN0aW9uKGUpe3JldHVybiJjb25uZWN0UG9wdXBNYW5hZ2VyOjoiK2V9O3ZhciBjPW4ubWFrZUVudW0oWyJncmFudGVkIiwiZGVuaWVkIiwiZGVmYXVsdCJdKTtuLk5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXt0aGlzLnF1ZXVlPVtdLHRoaXMucGVybWlzc2lvbj1jLkRFRkFVTFR9LG4uTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUucmVxdWVzdFBlcm1pc3Npb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzOyJOb3RpZmljYXRpb24iaW4gdD90Lk5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uPT09Yy5ERU5JRUQ/KG4uZ2V0TG9nKCkud2FybigiVGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0byBub3QgcmVjZWl2ZSBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPWMuREVOSUVEKTp0aGlzLnBlcm1pc3Npb24hPT1jLkdSQU5URUQmJnQuTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbihmdW5jdGlvbih0KXtlLnBlcm1pc3Npb249dCx0PT09Yy5HUkFOVEVEP2UuX3Nob3dRdWV1ZWQoKTplLnF1ZXVlPVtdfSk6KG4uZ2V0TG9nKCkud2FybigiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBub3RpZmljYXRpb25zLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5wZXJtaXNzaW9uPWMuREVOSUVEKX0sbi5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5wZXJtaXNzaW9uPT09Yy5HUkFOVEVEKXJldHVybiB0aGlzLl9zaG93SW1wbCh7dGl0bGU6ZSxvcHRpb25zOnR9KTtpZih0aGlzLnBlcm1pc3Npb249PT1jLkRFTklFRCluLmdldExvZygpLndhcm4oIlVuYWJsZSB0byBzaG93IG5vdGlmaWNhdGlvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe3RpdGxlOmUsb3B0aW9uczp0fSk7ZWxzZXt2YXIgcj17dGl0bGU6ZSxvcHRpb25zOnR9O24uZ2V0TG9nKCkud2FybigiRGVmZXJyaW5nIG5vdGlmaWNhdGlvbiB1bnRpbCB1c2VyIGRlY2lkZXMgdG8gYWxsb3cgb3IgZGVueS4iKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5xdWV1ZS5wdXNoKHIpfX0sbi5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5fc2hvd1F1ZXVlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzLnF1ZXVlLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZS5fc2hvd0ltcGwodCl9KTtyZXR1cm4gdGhpcy5xdWV1ZT1bXSx0fSxuLk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLl9zaG93SW1wbD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdC5Ob3RpZmljYXRpb24oZS50aXRsZSxlLm9wdGlvbnMpO3JldHVybiBlLm9wdGlvbnMuY2xpY2tlZCYmKG4ub25jbGljaz1mdW5jdGlvbigpe2Uub3B0aW9ucy5jbGlja2VkLmNhbGwobil9KSxufSxuLlZhbHVlRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksdD1lLnNoaWZ0KCkscj1uZXcgRXJyb3Iobi52c3ByaW50Zih0LGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsbi5WYWx1ZUVycm9yLnByb3RvdHlwZSkscn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKG4uVmFsdWVFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2Yobi5WYWx1ZUVycm9yLEVycm9yKSxuLlZhbHVlRXJyb3IucHJvdG90eXBlLm5hbWU9IlZhbHVlRXJyb3IiLG4uTm90SW1wbGVtZW50ZWRFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSx0PWUuc2hpZnQoKSxyPW5ldyBFcnJvcihuLnZzcHJpbnRmKHQsZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YocixuLk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlKSxyfSxPYmplY3Quc2V0UHJvdG90eXBlT2Yobi5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihuLk5vdEltcGxlbWVudGVkRXJyb3IsRXJyb3IpLG4uTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUubmFtZT0iTm90SW1wbGVtZW50ZWRFcnJvciIsbi5TdGF0ZUVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHQ9ZS5zaGlmdCgpLHI9bmV3IEVycm9yKG4udnNwcmludGYodCxlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihyLG4uU3RhdGVFcnJvci5wcm90b3R5cGUpLHJ9LE9iamVjdC5zZXRQcm90b3R5cGVPZihuLlN0YXRlRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKG4uU3RhdGVFcnJvcixFcnJvciksbi5TdGF0ZUVycm9yLnByb3RvdHlwZS5uYW1lPSJTdGF0ZUVycm9yIixuLlZvaWNlSWRFcnJvcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9e307cmV0dXJuIHIudHlwZT1lLHIubWVzc2FnZT10LHIuc3RhY2s9RXJyb3IodCkuc3RhY2ssci5lcnI9bixyfSxuLmlzQ0NQPWZ1bmN0aW9uKCl7cmV0dXJuISFuLmNvcmUudXBzdHJlYW0mJiJDb25uZWN0U2hhcmVkV29ya2VyQ29uZHVpdCI9PT1uLmNvcmUuZ2V0VXBzdHJlYW0oKS5uYW1lfSxuLmlzU2hhcmVkV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG4ud29ya2VyJiYhIW4ud29ya2VyLmNsaWVudEVuZ2luZX0sbi5pc0NSTT1mdW5jdGlvbigpe3JldHVybiEhbi5jb3JlLnVwc3RyZWFtJiYobi5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIG4uSUZyYW1lQ29uZHVpdHx8bi5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIG4uR1JQcm94eUlmcmFtZUNvbmR1aXQpfSxuLmlzQWN0aXZlQ29uZHVpdD1mdW5jdGlvbihlKXt2YXIgdD1uLmNvcmUuZ2V0VXBzdHJlYW0oKTtyZXR1cm4gdCBpbnN0YW5jZW9mIG4uR1JQcm94eUlmcmFtZUNvbmR1aXQ/ZS5uYW1lPT09dC5hY3RpdmVSZWdpb25Vcmw6KG4uZ2V0TG9nKCkuZGVidWcoImNvbm5lY3QuaXNBY3RpdmVDb25kdWl0IGlzIGNhbGxlZCBidXQgdGhlcmUgaXMgbm8gR1IgcHJveHkgY29uZHVpdCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksITApfX0oKX0sOTUoKXtmdW5jdGlvbiBlKHQpe3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxlKHQpfSFmdW5jdGlvbih0KXt2YXIgbj17fTtmdW5jdGlvbiByKGUpe2lmKG5bZV0pcmV0dXJuIG5bZV0uZXhwb3J0czt2YXIgbz1uW2VdPXtpOmUsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtlXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxyKSxvLmw9ITAsby5leHBvcnRzfXIubT10LHIuYz1uLHIuZD1mdW5jdGlvbihlLHQsbil7ci5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0Om59KX0sci5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LHIudD1mdW5jdGlvbih0LG4pe2lmKDEmbiYmKHQ9cih0KSksOCZuKXJldHVybiB0O2lmKDQmbiYmIm9iamVjdCI9PWUodCkmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHIucihvKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImbiYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KXIuZChvLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIG99LHIubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gci5kKHQsImEiLHQpLHR9LHIubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sci5wPSIiLHIoci5zPTIpfShbZnVuY3Rpb24odCxuLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbz1yKDEpLGk9IkRFQlVHIixhPSJBTVpfV0VCX1NPQ0tFVF9NQU5BR0VSOiIscz0iTmV0d29yayBvZmZsaW5lIixjPSJOZXR3b3JrIG9ubGluZSwgY29ubmVjdGluZyB0byBXZWJTb2NrZXQgc2VydmVyIix1PSJOZXR3b3JrIG9mZmxpbmUsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0IixsPSJIZWFydGJlYXQgcmVzcG9uc2Ugbm90IHJlY2VpdmVkIixkPSJGYWlsZWQgdG8gc2VuZCBoZWFydGJlYXQgc2luY2UgV2ViU29ja2V0IGlzIG5vdCBvcGVuIixwPSJXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCEiLGg9IldlYlNvY2tldCBjb25uZWN0aW9uIGlzIGNsb3NlZCIsZj0iV2ViU29ja2V0TWFuYWdlciBFcnJvciwgZXJyb3JfZXZlbnQ6ICIsZz0iU2NoZWR1bGluZyBXZWJTb2NrZXQgcmVpbml0aWFsaXphdGlvbiwgYWZ0ZXIgZGVsYXkgIixtPSJXZWJTb2NrZXQgVVJMIGNhbm5vdCBiZSB1c2VkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIix2PSJXZWJTb2NrZXQgSW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gVGVybWluYXRpbmcgYW5kIGNsZWFuaW5nIHN1YnNjcmlwdGlvbnMiLHk9IkZldGNoaW5nIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixiPSJTdWNjZXNzZnVsbHkgZmV0Y2hlZCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixTPSJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsQz0iUmV0cnlpbmcgZmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLEU9IkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciIsST0iV2ViU29ja2V0TWFuYWdlciBNZXNzYWdlIEVycm9yIixUPSJNZXNzYWdlIHJlY2VpdmVkIGZvciB0b3BpYyAiLHc9IkludmFsaWQgaW5jb21pbmcgbWVzc2FnZSIsQT0iYXdzL3N1YnNjcmliZSIsXz0iYXdzL2hlYXJ0YmVhdCIsUj0iZGlzY29ubmVjdGVkIjtmdW5jdGlvbiBPKHQpe3JldHVybihPPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT1lKFN5bWJvbC5pdGVyYXRvcik/ZnVuY3Rpb24odCl7cmV0dXJuIGUodCl9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjplKHQpfSkodCl9dmFyIGs9e2Fzc2VydFRydWU6ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9LGFzc2VydE5vdE51bGw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gay5hc3NlcnRUcnVlKG51bGwhPT1lJiZ2b2lkIDAhPT1PKGUpLE9iamVjdChvLnNwcmludGYpKCIlcyBtdXN0IGJlIHByb3ZpZGVkIix0fHwiQSB2YWx1ZSIpKSxlfSxpc05vbkVtcHR5U3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGg+MH0sYXNzZXJ0SXNMaXN0OmZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYW4gYXJyYXkiKX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLmNvbnN0cnVjdG9yJiZlLmNhbGwmJmUuYXBwbHkpfSxpc09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4hKCJvYmplY3QiIT09TyhlKXx8bnVsbD09PWUpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX19LEw9bmV3IFJlZ0V4cCgiXih3c3M6Ly8pXFx3KiIpO2sudmFsaWRXU1VybD1mdW5jdGlvbihlKXtyZXR1cm4gTC50ZXN0KGUpfSxrLmdldFN1YnNjcmlwdGlvblJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57dG9waWM6ZSxjb250ZW50OntzdGF0dXM6dD8ic3VjY2VzcyI6ImZhaWx1cmUiLHRvcGljczpufX19LGsuYXNzZXJ0SXNPYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZighay5pc09iamVjdChlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBvYmplY3QhIil9LGsuYWRkSml0dGVyPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxO3Q9TWF0aC5taW4odCwxKTt2YXIgbj1NYXRoLnJhbmRvbSgpPi41PzE6LTE7cmV0dXJuIE1hdGguZmxvb3IoZStuKmUqTWF0aC5yYW5kb20oKSp0KX0say5pc05ldHdvcmtPbmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLm9uTGluZX0say5pc05ldHdvcmtGYWlsdXJlPWZ1bmN0aW9uKGUpe3JldHVybiEoIWUuX2RlYnVnfHwhZS5fZGVidWcudHlwZSkmJiJOZXR3b3JraW5nRXJyb3IiPT09ZS5fZGVidWcudHlwZX07dmFyIFA9aztmdW5jdGlvbiBOKGUpe3JldHVybihOPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX1mdW5jdGlvbiBEKGUsdCl7cmV0dXJuKEQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlLHQpe3JldHVybiBlLl9fcHJvdG9fXz10LGV9KShlLHQpfWZ1bmN0aW9uIHgodCl7cmV0dXJuKHg9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PWUoU3ltYm9sLml0ZXJhdG9yKT9mdW5jdGlvbih0KXtyZXR1cm4gZSh0KX06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOmUodCl9KSh0KX1mdW5jdGlvbiBNKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gVShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fWZ1bmN0aW9uIEYoZSx0LG4pe3JldHVybiB0JiZVKGUucHJvdG90eXBlLHQpLG4mJlUoZSxuKSxlfXZhciBqPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe00odGhpcyxlKX1yZXR1cm4gRihlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKGUpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXt9fV0pLGV9KCkscT1hLEI9e0RFQlVHOjEwLElORk86MjAsV0FSTjozMCxFUlJPUjo0MCxBRFZBTkNFRF9MT0c6NTB9LFY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7TSh0aGlzLGUpLHRoaXMudXBkYXRlTG9nZ2VyQ29uZmlnKCksdGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcj1IKCl9cmV0dXJuIEYoZSxbe2tleToid3JpdGVUb0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmhhc0NsaWVudExvZ2dlcigpKXN3aXRjaChlKXtjYXNlIEIuREVCVUc6cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci5kZWJ1Zyh0KXx8dDtjYXNlIEIuSU5GTzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmluZm8odCl8fHQ7Y2FzZSBCLldBUk46cmV0dXJuIHRoaXMuX2NsaWVudExvZ2dlci53YXJuKHQpfHx0O2Nhc2UgQi5FUlJPUjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmVycm9yKHQpfHx0O2Nhc2UgQi5BRFZBTkNFRF9MT0c6cmV0dXJuIHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyP3RoaXMuX2NsaWVudExvZ2dlclt0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcl0odCl8fHQ6IiJ9fX0se2tleToiaXNMZXZlbEVuYWJsZWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLl9sZXZlbH19LHtrZXk6Imhhc0NsaWVudExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2NsaWVudExvZ2dlcn19LHtrZXk6ImdldExvZ2dlciIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcmVmaXh8fHE7cmV0dXJuIHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj09PWk/dGhpcy5jb25zb2xlTG9nZ2VyV3JhcHBlcjpuZXcgVyh0KX19LHtrZXk6InVwZGF0ZUxvZ2dlckNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e307dGhpcy5fbGV2ZWw9dC5sZXZlbHx8Qi5JTkZPLHRoaXMuX2FkdmFuY2VkTG9nV3JpdGVyPSJ3YXJuIix0LmFkdmFuY2VkTG9nV3JpdGVyJiYodGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9dC5hZHZhbmNlZExvZ1dyaXRlciksdC5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PXgodC5jdXN0b21pemVkTG9nZ2VyKSYmKHRoaXMudXNlQ2xpZW50TG9nZ2VyPSEwKSx0aGlzLl9jbGllbnRMb2dnZXI9dC5sb2dnZXJ8fHRoaXMuc2VsZWN0TG9nZ2VyKHQpLHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iTlVMTCIsdC5kZWJ1ZyYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj1pKSx0LmxvZ2dlciYmKHRoaXMuX2xvZ3NEZXN0aW5hdGlvbj0iQ0xJRU5UX0xPR0dFUiIpfX0se2tleToic2VsZWN0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5jdXN0b21pemVkTG9nZ2VyJiYib2JqZWN0Ij09PXgoZS5jdXN0b21pemVkTG9nZ2VyKT9lLmN1c3RvbWl6ZWRMb2dnZXI6ZS51c2VEZWZhdWx0TG9nZ2VyPyh0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUgoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyKTpudWxsfX1dKSxlfSgpLEc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7TSh0aGlzLGUpfXJldHVybiBGKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImluZm8iLHZhbHVlOmZ1bmN0a