@sheepit-ai/sdk-js 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ 'use strict';var h="0.1.0",l={apiUrl:"https://api.goatech.ai",environment:"production",flushInterval:5e3,flushSize:20,debug:false,configRefreshInterval:3e5,maxQueueSize:1e3,retryAttempts:3,retryBackoff:[1e3,5e3,15e3],diagnosticBufferSize:100},a={deviceId:"gt_device_id",anonymousId:"gt_anonymous_id",identity:"gt_identity",sdkConfig:"gt_config",offlineQueue:"gt_offline_queue",sessionId:"gt_session_id",sessionLastSeen:"gt_session_last_seen",experimentAssignments:"gt_exp_assignments",sessionAttribution:"gt_session_attribution",firstTouchAttribution:"gt_first_touch"},B=1800*1e3,P=1440*60*1e3;var K=200;var y=class{constructor(e,t){this.prefix="[GoaTech]";this.debugEnabled=e,this.bus=t??null;}debug(e,...t){this.debugEnabled&&console.debug(this.prefix,e,...t),this.emitDiagnostic("debug","lifecycle",e,t);}warn(e,...t){console.warn(this.prefix,e,...t),this.emitDiagnostic("warn","lifecycle",e,t);}error(e,...t){console.error(this.prefix,e,...t),this.emitDiagnostic("error","lifecycle",e,t);}diagnostic(e,t,i,r,s,o){this.bus?.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:i,message:r,data:s,requestId:o});}emitDiagnostic(e,t,i,r){if(!this.bus)return;let s=r.length>0?r.length===1&&typeof r[0]=="object"&&r[0]!==null?r[0]:{details:r}:void 0;this.bus.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:`${t}.${e}`,message:i,data:s});}};var $={debug:0,info:1,warn:2,error:3},f=class{constructor(e=100){this.listeners=[];this.writeIndex=0;this.count=0;this.counts={debug:0,info:0,warn:0,error:0};this.maxSize=Math.min(1e4,Math.max(1,e)),this.buffer=new Array(this.maxSize);}emit(e){let t=$[e.severity];if(t!==void 0){this.buffer[this.writeIndex]=e,this.writeIndex=(this.writeIndex+1)%this.maxSize,this.count<this.maxSize&&this.count++,this.counts[e.severity]++;for(let i of this.listeners)if(!(t<i.minSeverity)&&!(i.categories!==null&&!i.categories.includes(e.category)))try{i.fn(e);}catch{}}}subscribe(e,t){if(this.listeners.length>=100)return ()=>{};let i={fn:e,minSeverity:$[t?.minSeverity??"debug"],categories:t?.categories??null};return this.listeners.push(i),()=>{let r=this.listeners.indexOf(i);r!==-1&&this.listeners.splice(r,1);}}getRecentDiagnostics(){return this.count===0?[]:this.count<this.maxSize?this.buffer.slice(0,this.count):[...this.buffer.slice(this.writeIndex),...this.buffer.slice(0,this.writeIndex)]}getCounts(){return {...this.counts}}};function O(){try{return localStorage.getItem(a.deviceId)}catch{return null}}function H(n){try{localStorage.setItem(a.deviceId,n);}catch{}}function d(){try{return crypto.randomUUID()}catch{return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{let e=Math.random()*16|0;return (n==="x"?e:e&3|8).toString(16)})}}function V(){return {platform:typeof navigator<"u"?navigator.platform||"web":"server",userAgent:typeof navigator<"u"?navigator.userAgent:"",language:typeof navigator<"u"?navigator.language:"en",screenWidth:typeof screen<"u"?screen.width:0,screenHeight:typeof screen<"u"?screen.height:0,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}async function q(n,e,t,i,r,s){let o={anonymous_id:i,...{},platform:"web",locale:s.language,timezone:s.timezone},c=await fetch(`${n}/v1/devices/register`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`,"X-Environment":t,"X-SDK-Version":h},body:JSON.stringify(o)});if(!c.ok)throw new Error(`Device registration failed: ${c.status}`);return (await c.json()).data.device_id}var G=["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gclid","fbclid"];function b(){return typeof window<"u"&&typeof document<"u"}function te(n){if(n)try{return new URL(n).hostname}catch{return}}var ie=200,re=new RegExp("[\\x00-\\x1F\\x7F<>]","g");function S(n,e=ie){return n.replace(re,"").slice(0,e)}function ne(){if(!b())return;let n={};try{let t=new URLSearchParams(window.location.search);for(let i of G){let r=t.get(i);if(r){let s=S(r);s&&(n[i]=s);}}}catch{}let e=document.referrer||"";if(e){n.referrer=S(e,500);let t=te(e);t&&(n.referrer_host=S(t,256));}try{n.landing_page=S(window.location.pathname+window.location.search,500);}catch{}return n}function se(n){if(!n)return false;for(let e of G)if(n[e])return true;return !!n.referrer_host}function L(){if(!b())return;try{let e=sessionStorage.getItem(a.sessionAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}let n=ne();if(n){try{sessionStorage.setItem(a.sessionAttribution,JSON.stringify(n));}catch{}return n}}function Q(n){if(b()){try{let e=localStorage.getItem(a.firstTouchAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}if(se(n)){try{localStorage.setItem(a.firstTouchAttribution,JSON.stringify(n));}catch{}return n}}}function U(){if(b())try{sessionStorage.removeItem(a.sessionAttribution);}catch{}}var E=class{constructor(){this.userId=null;this.userTraits={};this.deviceId=null;this.anonymousId=this.loadOrCreateAnonymousId();let{sessionId:e,isNew:t}=this.loadOrCreateSession();this.sessionId=e,this.isNewSession=t,this.sessionAttribution=L(),this.firstTouch=Q(this.sessionAttribution),this.loadIdentity();}getContext(){return {device_id:this.deviceId??this.anonymousId,anonymous_id:this.anonymousId,session_id:this.sessionId,user_id:this.userId,platform:typeof navigator<"u"?"web":"server",locale:typeof navigator<"u"?navigator.language:"en",timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,sdk_version:h,...this.sessionAttribution?{attribution:this.sessionAttribution}:{},...this.firstTouch?{first_touch:this.firstTouch}:{}}}getSessionAttribution(){return this.sessionAttribution}getFirstTouch(){return this.firstTouch}setDeviceId(e){this.deviceId=e;}getDeviceId(){return this.deviceId}setUserId(e){this.userId=e;}getUserId(){return this.userId}getAnonymousId(){return this.anonymousId}updateUserProperties(e){this.userTraits={...this.userTraits,...e};}getUserTraits(){return {...this.userTraits}}resetIdentity(){this.userId=null,this.userTraits={},this.anonymousId=d(),this.sessionId=d();try{localStorage.setItem(a.anonymousId,this.anonymousId),sessionStorage.setItem(a.sessionId,this.sessionId),localStorage.removeItem(a.identity);}catch{}U(),this.sessionAttribution=L();}touchSession(){try{sessionStorage.setItem(a.sessionLastSeen,Date.now().toString());}catch{}}loadOrCreateAnonymousId(){try{let e=localStorage.getItem(a.anonymousId);if(e)return e;let t=d();return localStorage.setItem(a.anonymousId,t),t}catch{return d()}}loadOrCreateSession(){try{let e=sessionStorage.getItem(a.sessionLastSeen),t=sessionStorage.getItem(a.sessionId),i=Date.now();if(t&&e&&i-parseInt(e,10)<B)return {sessionId:t,isNew:!1};let r=d();return sessionStorage.setItem(a.sessionId,r),sessionStorage.setItem(a.sessionLastSeen,i.toString()),U(),{sessionId:r,isNew:!0}}catch{return {sessionId:d(),isNew:true}}}loadIdentity(){try{let e=localStorage.getItem(a.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.userTraits=t.traits??{};}catch{}}};var w=class{constructor(e){this.items=[];this.maxSize=e;}add(e){this.items.length>=this.maxSize&&this.items.shift(),this.items.push(e);}drain(){let e=this.items.slice();return this.items=[],e}size(){return this.items.length}};var M="lp_debug_overrides",x=class{constructor(){this.flagValues={};this.debugOverrides={};this.exposed=new Set;this.debugMode=false;}setEvaluatedFlags(e){this.flagValues=e,this.exposed.clear();}setDebugMode(e){this.debugMode=e,e&&this.loadDebugOverrides();}overrideFlag(e,t){this.debugOverrides[e]=t,this.saveDebugOverrides();}clearOverrides(){this.debugOverrides={};try{localStorage.removeItem(M);}catch{}}getOverrides(){return {...this.debugOverrides}}count(){return Object.keys(this.flagValues).length}evaluate(e,t,i,r,s){if(this.debugMode&&e in this.debugOverrides)return this.debugOverrides[e];if(e in this.flagValues){let o=this.flagValues[e];return this.exposed.has(e)||(this.exposed.add(e),s(e,o)),o}return t}clearExposed(){this.exposed.clear();}loadDebugOverrides(){try{let e=localStorage.getItem(M);e&&(this.debugOverrides=JSON.parse(e));}catch{}}saveDebugOverrides(){try{localStorage.setItem(M,JSON.stringify(this.debugOverrides));}catch{}}};var _=class{constructor(){this.assignments={};this.stickyAssignments={};this.exposed=new Set;this.loadStickyAssignments();}setAssignments(e){this.assignments=e;}count(){return Object.keys(this.assignments).length}resolve(e,t){let i=this.assignments[e];if(!i)return {variant:"control"};let r=i.variant_key;return this.stickyAssignments[e]!==r&&(this.stickyAssignments[e]=r,this.saveStickyAssignments()),this.exposed.has(e)||(this.exposed.add(e),t(e,r)),{variant:r,payload:i.payload}}clearAssignments(){this.stickyAssignments={},this.exposed.clear();try{localStorage.removeItem(a.experimentAssignments);}catch{}}loadStickyAssignments(){try{let e=localStorage.getItem(a.experimentAssignments);e&&(this.stickyAssignments=JSON.parse(e));}catch{this.stickyAssignments={};}}saveStickyAssignments(){try{localStorage.setItem(a.experimentAssignments,JSON.stringify(this.stickyAssignments));}catch{}}};var I=class{constructor(e){this.log=e;this.userId=null;this.traits={};this.loadFromStorage();}identify(e,t,i){let r=i.getCurrentUserId();if(r===e){t&&(this.traits={...this.traits,...t}),i.updateTraits(this.traits),this.persist(e,this.traits);return}let s=r;i.flush().catch(()=>{}),i.resetSession(),i.clearExperimentAssignments(),this.userId=e,this.traits=t??{},i.setUserId(e),i.updateTraits(this.traits),this.persist(e,this.traits),i.postIdentityResolve(e,s),this.log.debug("Identified",{userId:e,previousUserId:s});}reset(e){e.flush().catch(()=>{}),e.resetSession(),e.clearExperimentAssignments(),this.userId=null,this.traits={};try{localStorage.removeItem(a.identity);}catch{}this.log.debug("Reset identity.");}getUserId(){return this.userId}loadFromStorage(){try{let e=localStorage.getItem(a.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.traits=t.traits??{};}catch{}}persist(e,t){let i={userId:e,traits:t,identifiedAt:new Date().toISOString()};try{localStorage.setItem(a.identity,JSON.stringify(i));}catch{}}};var C=class{constructor(e,t,i,r,s,o){this.apiUrl=e;this.apiKey=t;this.environment=i;this.refreshInterval=r;this.log=s;this.onConfig=o;this.timer=null;this.etag=null;}start(e){let t=this.loadFromStorage();t&&this.onConfig(t.config),this.fetchConfig(e()).catch(i=>{this.log.warn("Config fetch failed",i);}),this.timer=setInterval(()=>{this.fetchConfig(e()).catch(i=>{this.log.warn("Config refresh failed",i);});},this.refreshInterval);}stop(){this.timer!==null&&(clearInterval(this.timer),this.timer=null);}async fetchConfig(e){if(!e){this.log.debug("Config fetch skipped \u2014 no device ID yet.");return}let t={Authorization:`Bearer ${this.apiKey}`,"X-Environment":this.environment,"X-Device-Id":e};this.etag&&(t["If-None-Match"]=this.etag);let i=await fetch(`${this.apiUrl}/v1/config`,{headers:t});if(i.status===304){this.log.debug("Config unchanged (304).");return}if(!i.ok)throw new Error(`Config fetch returned ${i.status}`);let r=i.headers.get("ETag");r&&(this.etag=r);let s=await i.json();this.onConfig(s.data),this.saveToStorage(s.data),this.log.debug("Config updated",{flags:Object.keys(s.data.flags).length,experiments:Object.keys(s.data.experiments).length});}loadFromStorage(){try{let e=localStorage.getItem(a.sdkConfig);if(!e)return null;let t=JSON.parse(e);return Date.now()-t.cachedAt>P?(this.log.debug("Cached config is stale (>24h), ignoring."),null):t}catch{return null}}saveToStorage(e){try{localStorage.setItem(a.sdkConfig,JSON.stringify({config:e,cachedAt:Date.now()}));}catch{}}};var oe={getSessionAttribution:()=>{},getFirstTouch:()=>{}},k=class{constructor(e,t,i,r,s,o,c,g,N=null,Ee=oe){this.apiUrl=e;this.apiKey=t;this.environment=i;this.retryAttempts=r;this.queue=s;this.offlineQueue=o;this.connectivity=c;this.log=g;this.appVersion=N;this.attribution=Ee;this.lastFlushAt=null;this.retryBackoff=l.retryBackoff;}getLastFlushAt(){return this.lastFlushAt}buildAttributionContext(){let e=this.attribution.getSessionAttribution(),t=this.attribution.getFirstTouch();return {...e?{attribution:e}:{},...t?{first_touch:t}:{}}}async flush(){let e=this.queue.drain();if(e.length===0)return;if(!this.connectivity.isOnline()){this.offlineQueue.enqueue(e);return}await this.sendWithRetry(e,0)&&(this.lastFlushAt=new Date);}flushWithBeacon(e){if(e.length===0||typeof navigator>"u"||!navigator.sendBeacon)return;let t=e[0],i={batch:e.map(c=>({type:"track",event:c.event_name,properties:c.event_properties??{},timestamp:c.timestamp})),context:t?{user:{id:t.user_id??void 0,anonymous_id:t.anonymous_id},device:{id:t.device_id,platform:t.platform,locale:t.locale},session:{id:t.session_id},...this.appVersion?{app:{version:this.appVersion}}:{},...this.buildAttributionContext()}:{},sent_at:new Date().toISOString()},r=JSON.stringify(i),s=`${this.apiUrl}/v1/ingest?api_key=${encodeURIComponent(this.apiKey)}&env=${encodeURIComponent(this.environment)}`;navigator.sendBeacon(s,new Blob([r],{type:"application/json"}))||this.log.warn("sendBeacon failed \u2014 events may be lost on page unload.");}async sendWithRetry(e,t){try{let{body:i,compressed:r}=await this.buildBody(e),s={Authorization:`Bearer ${this.apiKey}`,"X-Environment":this.environment,"Content-Type":"application/json"};r&&(s["Content-Encoding"]="gzip");let o=await fetch(`${this.apiUrl}/v1/ingest`,{method:"POST",headers:s,body:i});if(o.status===400)return this.log.error("Ingest 400: dropping batch.",await o.text()),!1;if(o.status===429){let c=parseInt(o.headers.get("Retry-After")??"5",10);this.log.warn(`Rate limited, retrying after ${c}s`);for(let g of e)this.queue.add(g);return !1}if(o.status>=500)throw new Error(`Ingest 5xx: ${o.status}`);return this.log.debug(`Flushed ${e.length} events.`),!0}catch(i){if(t<this.retryAttempts-1){let r=this.retryBackoff[t]??this.retryBackoff[this.retryBackoff.length-1]??15e3;return this.log.warn(`Flush attempt ${t+1} failed, retrying in ${r}ms`,i),await ae(r),this.sendWithRetry(e,t+1)}return this.log.error("Max retries exceeded, moving to offline queue.",i),this.offlineQueue.enqueue(e),false}}async buildBody(e){let t=e[0],i={batch:e.map(s=>({type:"track",event:s.event_name,properties:s.event_properties??{},timestamp:s.timestamp})),context:t?{user:{id:t.user_id??void 0,anonymous_id:t.anonymous_id},device:{id:t.device_id,platform:t.platform,locale:t.locale},session:{id:t.session_id},...this.appVersion?{app:{version:this.appVersion}}:{},...this.buildAttributionContext()}:{},sent_at:new Date().toISOString()},r=JSON.stringify(i);if(r.length<1024)return {body:r,compressed:false};try{let s=new CompressionStream("gzip"),o=s.writable.getWriter(),c=new TextEncoder;return o.write(c.encode(r)),o.close(),{body:await new Response(s.readable).blob(),compressed:!0}}catch{return {body:r,compressed:false}}}};function ae(n){return new Promise(e=>setTimeout(e,n))}var A=class{enqueue(e){let r=[...this.load(),...e].slice(-500);this.save(r);}drain(){let e=this.load();return this.clear(),e}size(){return this.load().length}clear(){try{localStorage.removeItem(a.offlineQueue);}catch{}}load(){try{let e=localStorage.getItem(a.offlineQueue);return e?JSON.parse(e):[]}catch{return []}}save(e){try{localStorage.setItem(a.offlineQueue,JSON.stringify(e));}catch(t){if(t instanceof DOMException&&t.name==="QuotaExceededError"){let i=e.slice(Math.floor(e.length/2));try{localStorage.setItem(a.offlineQueue,JSON.stringify(i));}catch{}}}}};var T=class{constructor(){this.onlineCallbacks=[];this.offlineCallbacks=[];this.onOnlineHandler=()=>{for(let e of this.onlineCallbacks)e();},this.onOfflineHandler=()=>{for(let e of this.offlineCallbacks)e();},typeof window<"u"&&(window.addEventListener("online",this.onOnlineHandler),window.addEventListener("offline",this.onOfflineHandler));}isOnline(){return typeof navigator>"u"?true:navigator.onLine}onOnline(e){this.onlineCallbacks.push(e);}onOffline(e){this.offlineCallbacks.push(e);}destroy(){typeof window<"u"&&(window.removeEventListener("online",this.onOnlineHandler),window.removeEventListener("offline",this.onOfflineHandler));}};var R=class{constructor(e,t,i,r){this.queue=e;this.transport=t;this.log=i;this.emitEvent=r;this.handlers=[];this.flushedOnExit=false;this.leaveEmitted=false;this.currentPath=null;this.entryTime=0;this.maxScrollPct=0;this.tabHiddenCount=0;this.hiddenSince=null;this.cumulativeHiddenMs=0;this.scrollThrottleTimer=null;}recordPageView(e){this.currentPath!==e&&(this.currentPath!==null&&!this.leaveEmitted&&this.emitPageLeave("spa_nav"),this.currentPath=e,this.entryTime=p(),this.maxScrollPct=0,this.tabHiddenCount=0,this.hiddenSince=null,this.cumulativeHiddenMs=0,this.leaveEmitted=false,this.flushedOnExit=false);}register(){if(typeof window>"u")return;let e=()=>{if(this.flushedOnExit)return;this.flushedOnExit=true,this.emitPageLeave("pagehide");let r=this.queue.drain();r.length>0&&this.transport.flushWithBeacon(r);},t=()=>{document.visibilityState==="hidden"&&(this.tabHiddenCount+=1,this.hiddenSince=p(),this.transport.flush().catch(()=>{})),document.visibilityState==="visible"&&(this.hiddenSince!==null&&(this.cumulativeHiddenMs+=p()-this.hiddenSince,this.hiddenSince=null),this.flushedOnExit=false);},i=()=>{this.scrollThrottleTimer===null&&(this.scrollThrottleTimer=setTimeout(()=>{this.scrollThrottleTimer=null;let r=ce();r>this.maxScrollPct&&(this.maxScrollPct=r);},250));};window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e),document.addEventListener("visibilitychange",t),window.addEventListener("scroll",i,{passive:true}),this.handlers.push(()=>window.removeEventListener("pagehide",e),()=>window.removeEventListener("beforeunload",e),()=>document.removeEventListener("visibilitychange",t),()=>window.removeEventListener("scroll",i),()=>{this.scrollThrottleTimer!==null&&(clearTimeout(this.scrollThrottleTimer),this.scrollThrottleTimer=null);}),this.log.debug("Lifecycle listeners registered.");}destroy(){for(let e of this.handlers)e();this.handlers=[];}emitPageLeave(e){if(this.leaveEmitted||this.currentPath===null||!this.emitEvent)return;this.leaveEmitted=true;let t=this.cumulativeHiddenMs;this.hiddenSince!==null&&(t+=p()-this.hiddenSince),this.emitEvent("$page_leave",{path:this.currentPath,time_on_page_ms:J(p()-this.entryTime),max_scroll_pct:this.maxScrollPct,tab_hidden_count:this.tabHiddenCount,cumulative_hidden_ms:J(t),exit_kind:e});}};function p(){return Date.now()}function J(n){return Math.max(0,Math.round(n/100)*100)}function ce(){if(typeof document>"u"||typeof window>"u")return 0;let n=window.scrollY??0,e=(document.documentElement?.scrollHeight??0)-(window.innerHeight??0);return e<=0?100:Math.min(100,Math.round(n/e*100))}var ue={errors:true,rejections:true,authEvents:true,stackLimit:4096,dedupeWindowMs:1e3},m=class{constructor(e,t,i){this.handlers=[];this.lastSignature=null;this.lastSignatureAt=0;this.track=e,this.log=t,this.cfg={...ue,...i??{}};}install(){if(typeof window>"u")return;let e=typeof navigator<"u"?navigator.userAgent:null,t=le(e);if(this.cfg.errors){let i=r=>{let s=r.error&&r.error.stack?String(r.error.stack).slice(0,this.cfg.stackLimit):null,o=`err:${r.message}:${r.filename}:${r.lineno}`;this.suppress(o)||this.safeTrack("$error",{message:r.message,source:r.filename??null,line:r.lineno??null,col:r.colno??null,stack:s,type:"uncaught_error",browser:t,user_agent:e});};window.addEventListener("error",i),this.handlers.push(()=>window.removeEventListener("error",i));}if(this.cfg.rejections){let i=r=>{let s=r.reason,o=s instanceof Error?s.message:typeof s=="string"?s:de(s),c=s instanceof Error&&s.stack?String(s.stack).slice(0,this.cfg.stackLimit):null,g=`rej:${o}`;this.suppress(g)||this.safeTrack("$error",{message:o,stack:c,type:"unhandled_rejection",browser:t,user_agent:e});};window.addEventListener("unhandledrejection",i),this.handlers.push(()=>window.removeEventListener("unhandledrejection",i));}if(this.cfg.authEvents){let i=r=>{let s=r.detail;s?.name&&this.safeTrack(s.name,{...s.properties??{},browser:t,user_agent:e});};window.addEventListener("goatech:auth-event",i),this.handlers.push(()=>window.removeEventListener("goatech:auth-event",i));}}uninstall(){for(let e of this.handlers)e();this.handlers.length=0;}suppress(e){let t=Date.now();return this.lastSignature===e&&t-this.lastSignatureAt<this.cfg.dedupeWindowMs?true:(this.lastSignature=e,this.lastSignatureAt=t,false)}safeTrack(e,t){try{this.track(e,t);}catch(i){this.log.warn("error capture track() threw",i);}}};function le(n){if(!n)return "unknown";let e=/Chrome\/\d/.test(n)&&!/Edg\//.test(n),t=/Firefox\/\d/.test(n),i=/Safari\//.test(n)&&!e&&!/CriOS|FxiOS|OPR\//.test(n);return e?"chrome":t?"firefox":i?"safari":"other"}function de(n){try{return JSON.stringify(n)??String(n)}catch{return String(n)}}var ge=["x-request-id","vary","content-type","access-control-allow-origin"],v=class{constructor(e,t,i){this.originalFetch=null;this.installed=false;this.lastSig=null;this.lastSigAt=0;this.track=e,this.log=t,this.cfg={enabled:i?.enabled??true,shouldCapture:i?.shouldCapture??(r=>r>=400),excludeUrlPatterns:i?.excludeUrlPatterns??[/\/v1\/ingest\b/,/\/v1\/config\b/],captureResponseHeaders:i?.captureResponseHeaders??ge,dedupeWindowMs:i?.dedupeWindowMs??1e3,onCapture:i?.onCapture??null};}install(){this.installed||!this.cfg.enabled||typeof window>"u"||typeof window.fetch!="function"||(this.originalFetch=window.fetch,window.fetch=async(e,t)=>{let i=Date.now(),r=he(e),s=(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase();try{let o=await this.originalFetch.call(window,e,t);return this.shouldSkip(r)||!this.cfg.shouldCapture(o.status)||this.emit({kind:"http_error",url:r,method:s,status:o.status,latency_ms:Date.now()-i,request_id:o.headers.get("x-request-id"),response_headers:this.pluckHeaders(o.headers),cookie_names:this.readCookieNames()}),o}catch(o){if(!this.shouldSkip(r)){let c=o instanceof Error&&o.name==="AbortError",g=o instanceof Error?o.name:"UnknownError",N=o instanceof Error?o.message:String(o);this.emit({kind:"network_failure",url:r,method:s,status:0,latency_ms:Date.now()-i,request_id:null,response_headers:{},cookie_names:this.readCookieNames(),error_name:g,error_message:N,aborted:c});}throw o}},this.installed=true);}uninstall(){this.installed&&(typeof window<"u"&&this.originalFetch&&(window.fetch=this.originalFetch),this.originalFetch=null,this.installed=false);}shouldSkip(e){return this.cfg.excludeUrlPatterns.some(t=>t.test(e))}emit(e){let t=`${e.method}:${e.url}:${e.status}`,i=Date.now();if(!(this.lastSig===t&&i-this.lastSigAt<this.cfg.dedupeWindowMs)){this.lastSig=t,this.lastSigAt=i;try{this.track("$http_error",{url:e.url,method:e.method,status:e.status,latency_ms:e.latency_ms,request_id:e.request_id,response_headers:e.response_headers,cookie_names:e.cookie_names,kind:e.kind,...e.error_name!==void 0?{error_name:e.error_name}:{},...e.error_message!==void 0?{error_message:e.error_message}:{},...e.aborted!==void 0?{aborted:e.aborted}:{}});}catch(r){this.log.warn("http-error-capture track() threw",r);}if(this.cfg.onCapture)try{this.cfg.onCapture(e);}catch(r){this.log.warn("http-error-capture onCapture() threw",r);}}}pluckHeaders(e){let t={};for(let i of this.cfg.captureResponseHeaders){let r=e.get(i);r!==null&&(t[i]=r);}return t}readCookieNames(){return typeof document>"u"||typeof document.cookie!="string"?[]:document.cookie.length===0?[]:document.cookie.split(";").map(e=>e.trim().split("=")[0]??"").filter(e=>e.length>0)}};function he(n){return typeof n=="string"?n:n instanceof URL?n.toString():n instanceof Request?n.url:String(n)}var fe={rage:true,dead:true,rageThreshold:3,rageWindowMs:1e3,rageRadiusPx:50,maxEmitsPerSec:5},pe=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA","LABEL","SUMMARY","OPTION","DETAILS"]),D=class{constructor(e,t,i){this.handlers=[];this.recent=[];this.rageCooldownUntil=0;this.emitsThisSecond=0;this.emitsSecondStartedAt=0;this.track=e,this.log=t,this.cfg={...fe,...i??{}};}install(){if(typeof window>"u")return;let e=t=>{let i=t.target;if(!(i instanceof Element))return;let r=Date.now();this.recent.push({t:r,x:t.clientX,y:t.clientY});let s=r-this.cfg.rageWindowMs;this.recent=this.recent.filter(o=>o.t>=s),this.cfg.rage&&this.maybeEmitRage(i,r),this.cfg.dead&&this.maybeEmitDead(t,i,r);};document.addEventListener("click",e,{passive:true}),this.handlers.push(()=>document.removeEventListener("click",e)),this.log.debug("Click-frustration listeners registered.");}uninstall(){for(let e of this.handlers)e();this.handlers.length=0,this.recent=[];}maybeEmitRage(e,t){if(t<this.rageCooldownUntil||this.recent.length<this.cfg.rageThreshold)return;let i=this.recent[this.recent.length-1],r=0;for(let s of this.recent){let o=s.x-i.x,c=s.y-i.y;o*o+c*c<=this.cfg.rageRadiusPx*this.cfg.rageRadiusPx&&(r+=1);}r<this.cfg.rageThreshold||this.tryEmit(t)&&(this.rageCooldownUntil=t+this.cfg.rageWindowMs,this.safeTrack("$rage_click",{target:X(e),cluster_size:r,x:i.x,y:i.y,path:typeof location<"u"?location.pathname:null}));}maybeEmitDead(e,t,i){e.defaultPrevented||me(t)||this.tryEmit(i)&&this.safeTrack("$dead_click",{target:X(t),x:e.clientX,y:e.clientY,path:typeof location<"u"?location.pathname:null});}tryEmit(e){return e-this.emitsSecondStartedAt>=1e3&&(this.emitsSecondStartedAt=e,this.emitsThisSecond=0),this.emitsThisSecond>=this.cfg.maxEmitsPerSec?false:(this.emitsThisSecond+=1,true)}safeTrack(e,t){try{this.track(e,t);}catch(i){this.log.warn("click-frustration track() threw",i);}}};function me(n){let e=n,t=0;for(;e&&t<8;){if(pe.has(e.tagName))return true;let i=e.getAttribute("role");if(i&&/^(button|link|tab|switch|checkbox|radio|menuitem|option)$/.test(i)||e.hasAttribute("tabindex")||e.hasAttribute("contenteditable")||e.hasAttribute("data-clickable"))return true;e=e.parentElement,t+=1;}return false}function X(n){let e=n.tagName.toLowerCase(),t=n.id?`#${n.id}`:"",i=n.classList.length>0?`.${Array.from(n.classList).slice(0,3).join(".")}`:"";return `${e}${t}${i}`.slice(0,120)}var W="gt_storage_migration_v1",Y="done",ve=[{storage:"local",legacy:"lp_device_id",current:"gt_device_id"},{storage:"local",legacy:"lp_anonymous_id",current:"gt_anonymous_id"},{storage:"local",legacy:"lp_identity",current:"gt_identity"},{storage:"local",legacy:"lp_config",current:"gt_config"},{storage:"local",legacy:"lp_offline_queue",current:"gt_offline_queue"},{storage:"local",legacy:"lp_exp_assignments",current:"gt_exp_assignments"},{storage:"local",legacy:"lp_first_touch",current:"gt_first_touch"},{storage:"session",legacy:"lp_session_id",current:"gt_session_id"},{storage:"session",legacy:"lp_session_last_seen",current:"gt_session_last_seen"},{storage:"session",legacy:"lp_session_attribution",current:"gt_session_attribution"}];function F(n,e){try{return n.getItem(e)}catch{return null}}function Z(n,e,t){try{n.setItem(e,t);}catch{}}function ye(n,e){try{n.removeItem(e);}catch{}}function ee(){if(typeof window>"u")return;let n=window.localStorage,e=window.sessionStorage;if(!(!n||!e)&&F(n,W)!==Y){for(let t of ve){let i=t.storage==="local"?n:e;if(F(i,t.current)!==null)continue;let s=F(i,t.legacy);s!==null&&(Z(i,t.current,s),ye(i,t.legacy));}Z(n,W,Y);}}var u=class u{constructor(e,t,i){this.flushTimer=null;this.destroyed=false;if(this.cfg=e,this.log=t,this.bus=i,this.context=new E,this.queue=new w(e.maxQueueSize),this.flagManager=new x,this.flagManager.setDebugMode(this.cfg.debug),this.experimentManager=new _,this.identityManager=new I(t),this.offlineQueue=new A,this.connectivity=new T,this.transport=new k(e.apiUrl,e.apiKey,e.environment,e.retryAttempts,this.queue,this.offlineQueue,this.connectivity,t,e.appVersion,{getSessionAttribution:()=>this.context.getSessionAttribution(),getFirstTouch:()=>this.context.getFirstTouch()}),this.lifecycle=new R(this.queue,this.transport,t,(r,s)=>this.track(r,s)),typeof window<"u"&&this.cfg.autoCaptureErrors!==false){let r=typeof this.cfg.autoCaptureErrors=="object"?this.cfg.autoCaptureErrors:void 0;this.errorCapture=new m((s,o)=>this.track(s,o),t,r);}else this.errorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureHttpErrors!==false){let r=typeof this.cfg.autoCaptureHttpErrors=="object"?this.cfg.autoCaptureHttpErrors:void 0;this.httpErrorCapture=new v((s,o)=>this.track(s,o),t,r);}else this.httpErrorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureClickFrustration!==false){let r=typeof this.cfg.autoCaptureClickFrustration=="object"?this.cfg.autoCaptureClickFrustration:void 0;this.clickFrustrationCapture=new D((s,o)=>this.track(s,o),t,r);}else this.clickFrustrationCapture=null;this.configSync=new C(e.apiUrl,e.apiKey,e.environment,e.configRefreshInterval,t,r=>this.applyConfig(r));}static create(e){if(ee(),!/^lp_pub_[a-z0-9]{3}_[a-f0-9]{64}$/.test(e.apiKey))throw /^lp_sec_/.test(e.apiKey)?new Error("[GoaTech] Secret keys (lp_sec_*) cannot be used with @sheepit-ai/sdk-js. This SDK is for client-side / publishable-key use. Use @sheepit-ai/server for server-side code."):/^lp_dev_/.test(e.apiKey)?new Error("[GoaTech] Developer keys (lp_dev_*) cannot be used with @sheepit-ai/sdk-js. Dev keys are for CLI / codegen use only. Use @goatech/cli for developer tooling."):new Error("[GoaTech] Invalid API key format. Expected lp_pub_... (publishable key).");let t={apiKey:e.apiKey,apiUrl:e.apiUrl??l.apiUrl,environment:e.environment??l.environment,flushInterval:e.flushInterval??l.flushInterval,flushSize:e.flushSize??l.flushSize,debug:e.debug??l.debug,configRefreshInterval:e.configRefreshInterval??l.configRefreshInterval,maxQueueSize:e.maxQueueSize??l.maxQueueSize,retryAttempts:e.retryAttempts??l.retryAttempts,onEvent:e.onEvent,onDiagnostic:e.onDiagnostic,diagnosticBufferSize:e.diagnosticBufferSize??l.diagnosticBufferSize,autoCaptureErrors:e.autoCaptureErrors??true,autoCaptureHttpErrors:e.autoCaptureHttpErrors??false,autoCaptureClickFrustration:e.autoCaptureClickFrustration??true,appVersion:e.appVersion??null},i=new f(t.diagnosticBufferSize);t.onDiagnostic&&i.subscribe(t.onDiagnostic);let r=new y(t.debug,i),s=new u(t,r,i);return s.start(),r.diagnostic("info","lifecycle","lifecycle.init_ok","SDK initialized",{environment:t.environment,apiUrl:t.apiUrl}),r.debug("Initialized",{apiKey:e.apiKey.slice(0,10)+"...",environment:t.environment,apiUrl:t.apiUrl}),s}static init(e){if(u.instance!==null)return u.instance.log.warn("init() called after already initialized. Call destroy() first to re-initialize. Returning existing instance."),u.instance;let t=u.create(e);return u.instance=t,t}static getInstance(){if(u.instance===null)throw new Error("[GoaTech] Not initialized. Call GoaTech.init() first.");return u.instance}static isInitialized(){return u.instance!==null}track(e,t){if(this.destroyed){this.log.warn("track() called after destroy(). Ignoring.");return}let i=Se(e),r=this.context.getContext(),s={event_id:d(),event_name:i,event_properties:t,device_id:r.device_id,anonymous_id:r.anonymous_id,session_id:r.session_id,user_id:r.user_id,platform:r.platform,app_version:this.cfg.appVersion??void 0,sdk_version:r.sdk_version,locale:r.locale,timezone:r.timezone,timestamp:new Date().toISOString()};this.queue.add(s),this.context.touchSession();try{this.cfg.onEvent?.(i,t);}catch(o){this.log.warn("onEvent callback threw",o);}this.queue.size()>=this.cfg.flushSize&&this.flush().catch(()=>{}),this.log.debug(`Tracked: ${i}`);}flag(e,t=false){return this.destroyed?(this.log.warn("flag() called after destroy(). Returning default."),t):this.flagManager.evaluate(e,t,this.context.getUserId(),this.context.getUserTraits(),(i,r)=>{this.track("$flag_exposure",{flag_key:i,flag_value:r});})}overrideFlag(e,t){this.flagManager.overrideFlag(e,t);}clearOverrides(){this.flagManager.clearOverrides();}getOverrides(){return this.flagManager.getOverrides()}experiment(e){return this.destroyed?(this.log.warn("experiment() called after destroy(). Returning control."),{variant:"control"}):this.experimentManager.resolve(e,(t,i)=>{this.track("$experiment_exposure",{experiment_key:t,variant:i});})}identify(e,t){if(this.destroyed){this.log.warn("identify() called after destroy(). Ignoring.");return}this.identityManager.identify(e,t,{getCurrentUserId:()=>this.context.getUserId(),setUserId:i=>this.context.setUserId(i),updateTraits:i=>this.context.updateUserProperties(i),resetSession:()=>this.context.resetIdentity(),clearExperimentAssignments:()=>this.experimentManager.clearAssignments(),flush:()=>this.flush(),postIdentityResolve:(i,r)=>{this.postIdentityResolve(i,r).catch(s=>{this.log.error("Identity resolve failed",s);});}});}reset(){this.identityManager.reset({resetSession:()=>this.context.resetIdentity(),clearExperimentAssignments:()=>this.experimentManager.clearAssignments(),flush:()=>this.flush()});}async flush(){await this.transport.flush();}recordPageView(e){this.destroyed||this.lifecycle.recordPageView(e);}status(){return {initialized:!this.destroyed,online:this.connectivity.isOnline(),queueDepth:this.queue.size(),offlineQueueDepth:this.offlineQueue.size(),lastFlushAt:this.transport.getLastFlushAt(),deviceId:this.context.getDeviceId(),userId:this.context.getUserId(),flagCount:this.flagManager.count(),experimentCount:this.experimentManager.count(),sdkVersion:h}}diagnostics(){return this.bus}getRecentDiagnostics(){return this.bus.getRecentDiagnostics()}destroy(){this.destroyed||(this.destroyed=true,this.flush().catch(()=>{}),this.flushTimer!==null&&(clearInterval(this.flushTimer),this.flushTimer=null),this.configSync.stop(),this.connectivity.destroy(),this.lifecycle.destroy(),this.errorCapture?.uninstall(),this.httpErrorCapture?.uninstall(),this.clickFrustrationCapture?.uninstall(),u.instance===this&&(u.instance=null),this.log.diagnostic("info","lifecycle","lifecycle.destroyed","SDK instance destroyed"),this.log.debug("Destroyed."));}start(){let e=O();if(e&&this.context.setDeviceId(e),this.configSync.start(()=>this.context.getDeviceId()),!e){let t=this.context.getAnonymousId(),i=V();q(this.cfg.apiUrl,this.cfg.apiKey,this.cfg.environment,t,null,i).then(r=>{H(r),this.context.setDeviceId(r),this.log.debug("Device registered",{deviceId:r});}).catch(r=>{this.log.warn("Device registration failed, using anonymous ID",r);});}if(this.flushTimer=setInterval(()=>{this.flush().catch(()=>{});},this.cfg.flushInterval),this.lifecycle.register(),this.errorCapture?.install(),this.httpErrorCapture?.install(),this.clickFrustrationCapture?.install(),this.connectivity.onOnline(()=>{let t=this.offlineQueue.drain();if(t.length>0){this.log.debug(`Back online \u2014 flushing ${t.length} offline events.`);for(let i of t)this.queue.add(i);this.flush().catch(()=>{});}}),this.context.isNewSession){let t=this.context.getSessionAttribution();this.track("$session_start",t);}}applyConfig(e){this.flagManager.setEvaluatedFlags(e.flags),this.experimentManager.setAssignments(e.experiments),this.log.debug("Config applied",{flags:Object.keys(e.flags).length,experiments:Object.keys(e.experiments).length});}async postIdentityResolve(e,t){let i=O();if(!i)return;let r=await fetch(`${this.cfg.apiUrl}/v1/devices/${encodeURIComponent(i)}/identify`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.cfg.apiKey}`,"X-Environment":this.cfg.environment},body:JSON.stringify({user_id:e})});if(!r.ok)throw new Error(`Identity resolve failed: ${r.status}`)}};u.instance=null;var j=u;function Se(n){if(!n||n.trim().length===0)throw new Error("[GoaTech] Event name must not be empty.");return n.trim().slice(0,K).replace(/\s+/g,"_")}function be(n){let e=JSON.stringify(n.endpoint),t=n.stackLimit??4096;return `(function(){
2
+ function post(p){
3
+ try {
4
+ var d = JSON.stringify(p);
5
+ if (navigator.sendBeacon) {
6
+ navigator.sendBeacon(${e}, new Blob([d],{type:"application/json"}));
7
+ } else {
8
+ fetch(${e},{method:"POST",body:d,keepalive:true,headers:{"Content-Type":"application/json"}}).catch(function(){});
9
+ }
10
+ } catch(e){}
11
+ }
12
+ function base(r){
13
+ return {reason:r,ua:navigator.userAgent,url:location.href,ts:Date.now(),pathname:location.pathname};
14
+ }
15
+ window.addEventListener("error",function(e){
16
+ var p=base("uncaught_error");
17
+ p.message=e&&e.message?String(e.message):"(no message)";
18
+ p.source=e&&e.filename?String(e.filename):null;
19
+ p.line=e&&typeof e.lineno==="number"?e.lineno:null;
20
+ p.col=e&&typeof e.colno==="number"?e.colno:null;
21
+ p.stack=e&&e.error&&e.error.stack?String(e.error.stack).slice(0,${t}):null;
22
+ post(p);
23
+ });
24
+ window.addEventListener("unhandledrejection",function(e){
25
+ var p=base("unhandled_rejection");
26
+ var r=e&&e.reason;
27
+ p.message=r&&r.message?String(r.message):String(r);
28
+ p.stack=r&&r.stack?String(r.stack).slice(0,${t}):null;
29
+ post(p);
30
+ });
31
+ })();`}exports.BrowserErrorCapture=m;exports.DiagnosticBus=f;exports.GoaTech=j;exports.HttpErrorCapture=v;exports.getBootErrorScript=be;//# sourceMappingURL=index.js.map
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWZhdWx0cy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvZGlhZ25vc3RpYy1idXMudHMiLCIuLi9zcmMvZGV2aWNlLnRzIiwiLi4vc3JjL2F0dHJpYnV0aW9uLnRzIiwiLi4vc3JjL2NvbnRleHQudHMiLCIuLi9zcmMvcXVldWUudHMiLCIuLi9zcmMvZmxhZ3MudHMiLCIuLi9zcmMvZXhwZXJpbWVudHMudHMiLCIuLi9zcmMvaWRlbnRpdHkudHMiLCIuLi9zcmMvY29uZmlnLXN5bmMudHMiLCIuLi9zcmMvdHJhbnNwb3J0LnRzIiwiLi4vc3JjL29mZmxpbmUudHMiLCIuLi9zcmMvY29ubmVjdGl2aXR5LnRzIiwiLi4vc3JjL2xpZmVjeWNsZS50cyIsIi4uL3NyYy9lcnJvci1jYXB0dXJlLnRzIiwiLi4vc3JjL2h0dHAtZXJyb3ItY2FwdHVyZS50cyIsIi4uL3NyYy9jbGljay1mcnVzdHJhdGlvbi50cyIsIi4uL3NyYy9zdG9yYWdlLW1pZ3JhdGlvbi50cyIsIi4uL3NyYy9jbGllbnQudHMiLCIuLi9zcmMvYm9vdC1lcnJvci50cyJdLCJuYW1lcyI6WyJTREtfVkVSU0lPTiIsIkRFRkFVTFRTIiwiU1RPUkFHRV9LRVlTIiwiU0VTU0lPTl9USU1FT1VUX01TIiwiQ09ORklHX01BWF9BR0VfTVMiLCJFVkVOVF9OQU1FX01BWF9MRU5HVEgiLCJMb2dnZXIiLCJkZWJ1ZyIsImJ1cyIsIm1lc3NhZ2UiLCJhcmdzIiwic2V2ZXJpdHkiLCJjYXRlZ29yeSIsImNvZGUiLCJkYXRhIiwicmVxdWVzdElkIiwiU0VWRVJJVFlfT1JERVIiLCJEaWFnbm9zdGljQnVzIiwiYnVmZmVyU2l6ZSIsImV2ZW50Iiwic2V2ZXJpdHlOdW0iLCJsaXN0ZW5lciIsImZuIiwib3B0aW9ucyIsImVudHJ5IiwiaWR4IiwiZ2V0RGV2aWNlSWQiLCJzZXREZXZpY2VJZCIsImlkIiwiZ2VuZXJhdGVBbm9ueW1vdXNJZCIsImMiLCJyIiwiZ2V0RGV2aWNlSW5mbyIsInJlZ2lzdGVyRGV2aWNlIiwiYXBpVXJsIiwiYXBpS2V5IiwiZW52aXJvbm1lbnQiLCJhbm9ueW1vdXNJZCIsImV4aXN0aW5nRGV2aWNlSWQiLCJpbmZvIiwiYm9keSIsInJlcyIsIlVUTV9LRVlTIiwiaXNCcm93c2VyIiwicGFyc2VSZWZlcnJlckhvc3QiLCJyZWZlcnJlciIsIkFUVFJJQlVUSU9OX1ZBTFVFX01BWCIsIlNUUklQX0NPTlRST0xTIiwic2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlIiwicmF3IiwibWF4TGVuIiwiY2FwdHVyZUZyb21XaW5kb3ciLCJvdXQiLCJwYXJhbXMiLCJrZXkiLCJ2YWx1ZSIsInNhbml0aXplZCIsImhvc3QiLCJoYXNBbnlBdHRyaWJ1dGlvbiIsImEiLCJnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbiIsImNhY2hlZCIsInBhcnNlZCIsImZyZXNoIiwiZ2V0T3JTZWVkRmlyc3RUb3VjaCIsImNsZWFyU2Vzc2lvbkF0dHJpYnV0aW9uIiwiQ29udGV4dE1hbmFnZXIiLCJzZXNzaW9uSWQiLCJpc05ldyIsInVzZXJJZCIsInRyYWl0cyIsInN0b3JlZCIsImxhc3RTZWVuIiwiZXhpc3RpbmciLCJub3ciLCJFdmVudFF1ZXVlIiwibWF4U2l6ZSIsImFsbCIsIkRFQlVHX09WRVJSSURFU19LRVkiLCJGbGFnTWFuYWdlciIsImZsYWdzIiwiZW5hYmxlZCIsImZsYWdLZXkiLCJkZWZhdWx0VmFsdWUiLCJfdXNlcklkIiwiX2F0dHJpYnV0ZXMiLCJvbkV4cG9zdXJlIiwiRXhwZXJpbWVudE1hbmFnZXIiLCJhc3NpZ25tZW50cyIsImV4cGVyaW1lbnRLZXkiLCJhc3NpZ25tZW50IiwidmFyaWFudEtleSIsIklkZW50aXR5TWFuYWdlciIsImxvZyIsImNhbGxiYWNrcyIsImN1cnJlbnRVc2VySWQiLCJwcmV2aW91c1VzZXJJZCIsInBheWxvYWQiLCJDb25maWdTeW5jIiwicmVmcmVzaEludGVydmFsIiwib25Db25maWciLCJlcnIiLCJkZXZpY2VJZCIsImhlYWRlcnMiLCJuZXdFdGFnIiwianNvbiIsImNvbmZpZyIsIk5PX0FUVFJJQlVUSU9OIiwiVHJhbnNwb3J0IiwicmV0cnlBdHRlbXB0cyIsInF1ZXVlIiwib2ZmbGluZVF1ZXVlIiwiY29ubmVjdGl2aXR5IiwiYXBwVmVyc2lvbiIsImF0dHJpYnV0aW9uIiwiZmlyc3RfdG91Y2giLCJldmVudHMiLCJmaXJzdCIsImUiLCJ1cmwiLCJhdHRlbXB0IiwiY29tcHJlc3NlZCIsInJldHJ5QWZ0ZXIiLCJkZWxheSIsInNsZWVwIiwic3RyZWFtIiwid3JpdGVyIiwiZW5jb2RlciIsIm1zIiwicmVzb2x2ZSIsIk9mZmxpbmVRdWV1ZSIsInRyaW1tZWQiLCJoYWxmIiwiQ29ubmVjdGl2aXR5TW9uaXRvciIsImNiIiwiTGlmZWN5Y2xlTWFuYWdlciIsInRyYW5zcG9ydCIsImVtaXRFdmVudCIsInBhdGgiLCJub3dNcyIsIm9uRXhpdCIsIm9uVmlzaWJpbGl0eUNoYW5nZSIsIm9uU2Nyb2xsIiwicGN0IiwiY29tcHV0ZVNjcm9sbFBjdCIsInJlbW92ZSIsImV4aXRLaW5kIiwiY3VtdWxhdGl2ZUhpZGRlbiIsInJvdW5kVG8xMDAiLCJzY3JvbGxUb3AiLCJkb2NIZWlnaHQiLCJCcm93c2VyRXJyb3JDYXB0dXJlIiwidHJhY2siLCJ1c2VyQWdlbnQiLCJicm93c2VyIiwiZGV0ZWN0QnJvd3NlclRhZyIsIm9uRXJyb3IiLCJzdGFjayIsInNpZ25hdHVyZSIsIm9uUmVqZWN0aW9uIiwicmVhc29uIiwic2FmZVN0cmluZ2lmeSIsIm9uQXV0aEV2ZW50IiwiZGV0YWlsIiwibmFtZSIsInByb3BlcnRpZXMiLCJ1YSIsImlzQ2hyb21lIiwiaXNGaXJlZm94IiwiaXNTYWZhcmkiLCJERUZBVUxUX0hFQURFUlMiLCJIdHRwRXJyb3JDYXB0dXJlIiwicyIsImlucHV0IiwiaW5pdCIsInN0YXJ0ZWQiLCJleHRyYWN0VXJsIiwibWV0aG9kIiwiYWJvcnRlZCIsImVyck5hbWUiLCJlcnJNZXNzYWdlIiwicCIsInYiLCJwYWlyIiwiSU5URVJBQ1RJVkVfVEFHUyIsIkNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlIiwib25DbGljayIsInRhcmdldCIsImN1dG9mZiIsImFuY2hvciIsImNsdXN0ZXIiLCJkeCIsImR5IiwidGFyZ2V0U2VsZWN0b3IiLCJpc0ludGVyYWN0aXZlIiwiZWwiLCJjdXIiLCJkZXB0aCIsInJvbGUiLCJ0YWciLCJjbGFzc2VzIiwiTUlHUkFUSU9OX01BUktFUl9LRVkiLCJNSUdSQVRJT05fTUFSS0VSX1ZBTFVFIiwiS0VZX01BUCIsInNhZmVHZXQiLCJzdG9yZSIsInNhZmVTZXQiLCJzYWZlUmVtb3ZlIiwibWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzIiwibG9jYWwiLCJzZXNzaW9uIiwibGVnYWN5IiwiX0dvYVRlY2giLCJwcm9wcyIsImNhcHR1cmVDZmciLCJodHRwQ2ZnIiwiY2xpY2tDZmciLCJjZmciLCJtZXJnZWQiLCJpbnN0YW5jZSIsImV2ZW50TmFtZSIsInZhbGlkYXRlRXZlbnROYW1lIiwiY3R4IiwidmFyaWFudCIsInQiLCJ1aWQiLCJwcmV2SWQiLCJxdWV1ZWQiLCJhdHRyIiwiX3ByZXZpb3VzVXNlcklkIiwiR29hVGVjaCIsImdldEJvb3RFcnJvclNjcmlwdCIsImVuZHBvaW50Iiwic3RhY2tMaW1pdCJdLCJtYXBwaW5ncyI6ImFBQU8sSUFBTUEsQ0FBQUEsQ0FBYyxRQUVkQyxDQUFBQSxDQUFXLENBQ3RCLE9BQVEsd0JBQUEsQ0FDUixXQUFBLENBQWEsYUFDYixhQUFBLENBQWUsR0FBQSxDQUNmLFVBQVcsRUFBQSxDQUNYLEtBQUEsQ0FBTyxNQUNQLHFCQUFBLENBQXVCLEdBQUEsQ0FDdkIsYUFBYyxHQUFBLENBQ2QsYUFBQSxDQUFlLENBQUEsQ0FDZixZQUFBLENBQWMsQ0FBQyxHQUFBLENBQU0sSUFBTSxJQUFNLENBQUEsQ0FDakMscUJBQXNCLEdBQ3hCLENBQUEsQ0FlYUMsRUFBZSxDQUMxQixRQUFBLENBQVUsZUFDVixXQUFBLENBQWEsaUJBQUEsQ0FDYixTQUFVLGFBQUEsQ0FDVixTQUFBLENBQVcsWUFDWCxZQUFBLENB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RUFBUUEsQ0FBQUEsQ0FBSyxNQUFLLENBQUUsTUFBQSxHQUFXLEVBQ2xDLE1BQU0sSUFBSSxNQUFNLHlDQUF5QyxDQUFBLENBRzNELE9BRGdCQSxDQUFBQSxDQUFLLElBQUEsRUFBSyxDQUFFLE1BQU0sQ0FBQSxDQUFHL0osQ0FBcUIsRUFDM0MsT0FBQSxDQUFRLE1BQUEsQ0FBUSxHQUFHLENBQ3BDLENDN2pCTyxTQUFTa08sRUFBQUEsQ0FBbUJoTixDQUFBQSxDQUF5QyxDQUMxRSxJQUFNaU4sQ0FBQUEsQ0FBVyxJQUFBLENBQUssVUFBVWpOLENBQUFBLENBQVEsUUFBUSxFQUMxQ2tOLENBQUFBLENBQWFsTixDQUFBQSxDQUFRLFVBQUEsRUFBYyxJQUFBLENBQ3pDLE9BQU8sQ0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUEsRUFLc0JpTixDQUFRLENBQUE7QUFBQTtBQUFBLGNBQUEsRUFFdkJBLENBQVEsQ0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9FQUFBLEVBYThDQyxDQUFVLENBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwrQ0FBQSxFQU8vQkEsQ0FBVSxDQUFBO0FBQUE7QUFBQTtBQUFBLEtBQUEsQ0FJM0QiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSBcIjAuMS4wXCI7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUUyA9IHtcbiAgYXBpVXJsOiBcImh0dHBzOi8vYXBpLmdvYXRlY2guYWlcIixcbiAgZW52aXJvbm1lbnQ6IFwicHJvZHVjdGlvblwiLFxuICBmbHVzaEludGVydmFsOiA1MDAwLFxuICBmbHVzaFNpemU6IDIwLFxuICBkZWJ1ZzogZmFsc2UsXG4gIGNvbmZpZ1JlZnJlc2hJbnRlcnZhbDogMzAwXzAwMCxcbiAgbWF4UXVldWVTaXplOiAxMDAwLFxuICByZXRyeUF0dGVtcHRzOiAzLFxuICByZXRyeUJhY2tvZmY6IFsxMDAwLCA1MDAwLCAxNV8wMDBdIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgZGlhZ25vc3RpY0J1ZmZlclNpemU6IDEwMCxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQnJvd3NlciBzdG9yYWdlIGtleXMuXG4gKlxuICogQXVkaXQgRS0wMTAg4oCUIHJlbmFtZWQgZnJvbSBgbHBfKmAgdG8gYGd0XypgIHRvIG1hdGNoIHRoZSByZXN0IG9mIHRoZVxuICogR29hVGVjaCByZW5hbWUuIGBtaWdyYXRlTGVnYWN5U3RvcmFnZUtleXMoKWAgKHNlZSBgLi9zdG9yYWdlLW1pZ3JhdGlvbi50c2ApXG4gKiBydW5zIG9uY2Ugb24gU0RLIGluaXQgYW5kIGNvcGllcyBhbnkgcHJlLWV4aXN0aW5nIGBscF8qYCB2YWx1ZSBpbnRvXG4gKiB0aGUgbmV3IGBndF8qYCBzbG90LCBzbyBleGlzdGluZyB0ZXN0ZXJzIGRvbid0IGxvc2UgdGhlaXIgZGV2aWNlIGlkLFxuICogaWRlbnRpdHksIG9mZmxpbmUgcXVldWUsIGF0dHJpYnV0aW9uLCBvciBleHBlcmltZW50IGFzc2lnbm1lbnRzLlxuICpcbiAqIFNvdXJjZXMgb2YgdHJ1dGg6IG5ldmVyIGhhcmRjb2RlIHRoZSBgZ3RfKmAgc3RyaW5ncyBpbiBjb25zdW1lcnMg4oCUXG4gKiBhbHdheXMgaW1wb3J0IGBTVE9SQUdFX0tFWVMuPG5hbWU+YC4gVGhlIGxlZ2FjeSBzdHJpbmdzIGxpdmUgb25seSBpblxuICogYHN0b3JhZ2UtbWlncmF0aW9uLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUT1JBR0VfS0VZUyA9IHtcbiAgZGV2aWNlSWQ6IFwiZ3RfZGV2aWNlX2lkXCIsXG4gIGFub255bW91c0lkOiBcImd0X2Fub255bW91c19pZFwiLFxuICBpZGVudGl0eTogXCJndF9pZGVudGl0eVwiLFxuICBzZGtDb25maWc6IFwiZ3RfY29uZmlnXCIsXG4gIG9mZmxpbmVRdWV1ZTogXCJndF9vZmZsaW5lX3F1ZXVlXCIsXG4gIHNlc3Npb25JZDogXCJndF9zZXNzaW9uX2lkXCIsXG4gIHNlc3Npb25MYXN0U2VlbjogXCJndF9zZXNzaW9uX2xhc3Rfc2VlblwiLFxuICBleHBlcmltZW50QXNzaWdubWVudHM6IFwiZ3RfZXhwX2Fzc2lnbm1lbnRzXCIsXG4gIC8qKiBQZXItc2Vzc2lvbiBhdHRyaWJ1dGlvbiBzbmFwc2hvdCAoVVRNICsgcmVmZXJyZXIgKyBsYW5kaW5nIHBhZ2UpLlxuICAgKiAgQ2FwdHVyZWQgb24gc2Vzc2lvbiBjcmVhdGlvbjsgcGVyc2lzdHMgZm9yIHRoZSBzZXNzaW9uJ3MgbGlmZXRpbWUgc29cbiAgICogIGV2ZXJ5IGV2ZW50IGluIHRoYXQgc2Vzc2lvbiBjYXJyaWVzIHRoZSBzYW1lIGZpcnN0LXRvdWNoIGNvbnRleHQuICovXG4gIHNlc3Npb25BdHRyaWJ1dGlvbjogXCJndF9zZXNzaW9uX2F0dHJpYnV0aW9uXCIsXG4gIC8qKiBGaXJzdC1ldmVyLXRvdWNoIGF0dHJpYnV0aW9uIGFjcm9zcyB0aGUgd2hvbGUgYnJvd3NlciBsaWZldGltZS5cbiAgICogIFdyaXR0ZW4gb25jZSBvbiB0aGUgZmlyc3Qgc2Vzc2lvbiB3aGVyZSBVVE0gb3IgcmVmZXJyZXIgaXMgcHJlc2VudDtcbiAgICogIG5ldmVyIG92ZXJ3cml0dGVuLiBVc2VmdWwgZm9yIFwiaG93IGRpZCB0aGlzIHVzZXIgRklSU1QgZmluZCB1c1wiLiAqL1xuICBmaXJzdFRvdWNoQXR0cmlidXRpb246IFwiZ3RfZmlyc3RfdG91Y2hcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBTRVNTSU9OX1RJTUVPVVRfTVMgPSAzMCAqIDYwICogMTAwMDtcbmV4cG9ydCBjb25zdCBDT05GSUdfTUFYX0FHRV9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5leHBvcnQgY29uc3QgT0ZGTElORV9RVUVVRV9NQVggPSA1MDA7XG5leHBvcnQgY29uc3QgQVRUUklCVVRFX01BWF9LRVlTID0gNTA7XG5leHBvcnQgY29uc3QgRVZFTlRfTkFNRV9NQVhfTEVOR1RIID0gMjAwO1xuIiwiaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljQnVzIH0gZnJvbSBcIi4vZGlhZ25vc3RpYy1idXMuanNcIjtcbmltcG9ydCB0eXBlIHsgRGlhZ25vc3RpY0NhdGVnb3J5LCBEaWFnbm9zdGljU2V2ZXJpdHkgfSBmcm9tIFwiLi9kaWFnbm9zdGljcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0VuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4ID0gXCJbR29hVGVjaF1cIjtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IERpYWdub3N0aWNCdXMgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRlYnVnOiBib29sZWFuLCBidXM/OiBEaWFnbm9zdGljQnVzKSB7XG4gICAgdGhpcy5kZWJ1Z0VuYWJsZWQgPSBkZWJ1ZztcbiAgICB0aGlzLmJ1cyA9IGJ1cyA/PyBudWxsO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWJ1Z0VuYWJsZWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5wcmVmaXgsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICB0aGlzLmVtaXREaWFnbm9zdGljKFwiZGVidWdcIiwgXCJsaWZlY3ljbGVcIiwgbWVzc2FnZSwgYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgY29uc29sZS53YXJuKHRoaXMucHJlZml4LCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB0aGlzLmVtaXREaWFnbm9zdGljKFwid2FyblwiLCBcImxpZmVjeWNsZVwiLCBtZXNzYWdlLCBhcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcih0aGlzLnByZWZpeCwgbWVzc2FnZSwgLi4uYXJncyk7XG4gICAgdGhpcy5lbWl0RGlhZ25vc3RpYyhcImVycm9yXCIsIFwibGlmZWN5Y2xlXCIsIG1lc3NhZ2UsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBkaWFnbm9zdGljIGV2ZW50IHdpdGggZXhwbGljaXQgY2F0ZWdvcnkgYW5kIGNvZGUuXG4gICAqIFVzZSB0aGlzIGluc3RlYWQgb2YgZGVidWcvd2Fybi9lcnJvciB3aGVuIHlvdSB3YW50IGZpbmUtZ3JhaW5lZCBjb250cm9sLlxuICAgKi9cbiAgZGlhZ25vc3RpYyhcbiAgICBzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5LFxuICAgIGNhdGVnb3J5OiBEaWFnbm9zdGljQ2F0ZWdvcnksXG4gICAgY29kZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcmVxdWVzdElkPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1cz8uZW1pdCh7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHNldmVyaXR5LFxuICAgICAgY2F0ZWdvcnksXG4gICAgICBjb2RlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgICByZXF1ZXN0SWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREaWFnbm9zdGljKFxuICAgIHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHksXG4gICAgY2F0ZWdvcnk6IERpYWdub3N0aWNDYXRlZ29yeSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYXJnczogdW5rbm93bltdLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnVzKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9XG4gICAgICBhcmdzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIiAmJiBhcmdzWzBdICE9PSBudWxsXG4gICAgICAgICAgPyAoYXJnc1swXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICA6IHsgZGV0YWlsczogYXJncyB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVzLmVtaXQoe1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzZXZlcml0eSxcbiAgICAgIGNhdGVnb3J5LFxuICAgICAgY29kZTogYCR7Y2F0ZWdvcnl9LiR7c2V2ZXJpdHl9YCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkYXRhLFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIERpYWdub3N0aWNFdmVudCxcbiAgRGlhZ25vc3RpY0NhdGVnb3J5LFxuICBEaWFnbm9zdGljU2V2ZXJpdHksXG4gIERpYWdub3N0aWNMaXN0ZW5lcixcbn0gZnJvbSBcIi4vZGlhZ25vc3RpY3MuanNcIjtcblxuY29uc3QgREVGQVVMVF9CVUZGRVJfU0laRSA9IDEwMDtcbmNvbnN0IE1BWF9CVUZGRVJfU0laRSA9IDEwXzAwMDtcbmNvbnN0IE1BWF9TVUJTQ1JJQkVSUyA9IDEwMDtcblxuY29uc3QgU0VWRVJJVFlfT1JERVI6IFJlY29yZDxEaWFnbm9zdGljU2V2ZXJpdHksIG51bWJlcj4gPSB7XG4gIGRlYnVnOiAwLFxuICBpbmZvOiAxLFxuICB3YXJuOiAyLFxuICBlcnJvcjogMyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlT3B0aW9ucyB7XG4gIC8qKiBPbmx5IHJlY2VpdmUgZXZlbnRzIGF0IG9yIGFib3ZlIHRoaXMgc2V2ZXJpdHkuIERlZmF1bHQ6IFwiZGVidWdcIiAoYWxsKS4gKi9cbiAgbWluU2V2ZXJpdHk/OiBEaWFnbm9zdGljU2V2ZXJpdHk7XG4gIC8qKiBPbmx5IHJlY2VpdmUgZXZlbnRzIGluIHRoZXNlIGNhdGVnb3JpZXMuIERlZmF1bHQ6IGFsbC4gKi9cbiAgY2F0ZWdvcmllcz86IERpYWdub3N0aWNDYXRlZ29yeVtdO1xufVxuXG5leHBvcnQgY2xhc3MgRGlhZ25vc3RpY0J1cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBBcnJheTx7XG4gICAgZm46IERpYWdub3N0aWNMaXN0ZW5lcjtcbiAgICBtaW5TZXZlcml0eTogbnVtYmVyO1xuICAgIGNhdGVnb3JpZXM6IERpYWdub3N0aWNDYXRlZ29yeVtdIHwgbnVsbDtcbiAgfT4gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IERpYWdub3N0aWNFdmVudFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSB3cml0ZUluZGV4ID0gMDtcbiAgcHJpdmF0ZSBjb3VudCA9IDA7XG4gIHByaXZhdGUgY291bnRzOiBSZWNvcmQ8RGlhZ25vc3RpY1NldmVyaXR5LCBudW1iZXI+ID0ge1xuICAgIGRlYnVnOiAwLFxuICAgIGluZm86IDAsXG4gICAgd2FybjogMCxcbiAgICBlcnJvcjogMCxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihidWZmZXJTaXplOiBudW1iZXIgPSBERUZBVUxUX0JVRkZFUl9TSVpFKSB7XG4gICAgdGhpcy5tYXhTaXplID0gTWF0aC5taW4oTUFYX0JVRkZFUl9TSVpFLCBNYXRoLm1heCgxLCBidWZmZXJTaXplKSk7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXk8RGlhZ25vc3RpY0V2ZW50Pih0aGlzLm1heFNpemUpO1xuICB9XG5cbiAgZW1pdChldmVudDogRGlhZ25vc3RpY0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc2V2ZXJpdHlOdW0gPSBTRVZFUklUWV9PUkRFUltldmVudC5zZXZlcml0eV07XG4gICAgaWYgKHNldmVyaXR5TnVtID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gaWdub3JlIGludmFsaWQgc2V2ZXJpdHlcblxuICAgIHRoaXMuYnVmZmVyW3RoaXMud3JpdGVJbmRleF0gPSBldmVudDtcbiAgICB0aGlzLndyaXRlSW5kZXggPSAodGhpcy53cml0ZUluZGV4ICsgMSkgJSB0aGlzLm1heFNpemU7XG4gICAgaWYgKHRoaXMuY291bnQgPCB0aGlzLm1heFNpemUpIHRoaXMuY291bnQrKztcbiAgICB0aGlzLmNvdW50c1tldmVudC5zZXZlcml0eV0rKztcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICBpZiAoc2V2ZXJpdHlOdW0gPCBsaXN0ZW5lci5taW5TZXZlcml0eSkgY29udGludWU7XG4gICAgICBpZiAobGlzdGVuZXIuY2F0ZWdvcmllcyAhPT0gbnVsbCAmJiAhbGlzdGVuZXIuY2F0ZWdvcmllcy5pbmNsdWRlcyhldmVudC5jYXRlZ29yeSkpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGlzdGVuZXIuZm4oZXZlbnQpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG5ldmVyIGxldCBhIHN1YnNjcmliZXIgYnJlYWsgdGhlIGJ1c1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1YnNjcmliZShmbjogRGlhZ25vc3RpY0xpc3RlbmVyLCBvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyk6ICgpID0+IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3RlbmVycy5sZW5ndGggPj0gTUFYX1NVQlNDUklCRVJTKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgZm4sXG4gICAgICBtaW5TZXZlcml0eTogU0VWRVJJVFlfT1JERVJbb3B0aW9ucz8ubWluU2V2ZXJpdHkgPz8gXCJkZWJ1Z1wiXSxcbiAgICAgIGNhdGVnb3JpZXM6IG9wdGlvbnM/LmNhdGVnb3JpZXMgPz8gbnVsbCxcbiAgICB9O1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLmxpc3RlbmVycy5pbmRleE9mKGVudHJ5KTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmVjZW50RGlhZ25vc3RpY3MoKTogRGlhZ25vc3RpY0V2ZW50W10ge1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSByZXR1cm4gW107XG4gICAgaWYgKHRoaXMuY291bnQgPCB0aGlzLm1heFNpemUpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCB0aGlzLmNvdW50KTtcbiAgICB9XG4gICAgLy8gUmluZyBidWZmZXIgaXMgZnVsbCDigJQgcmV0dXJuIGluIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICByZXR1cm4gWy4uLnRoaXMuYnVmZmVyLnNsaWNlKHRoaXMud3JpdGVJbmRleCksIC4uLnRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMud3JpdGVJbmRleCldO1xuICB9XG5cbiAgZ2V0Q291bnRzKCk6IFJlY29yZDxEaWFnbm9zdGljU2V2ZXJpdHksIG51bWJlcj4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuY291bnRzIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUywgU0RLX1ZFUlNJT04gfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUlkKCk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuZGV2aWNlSWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGV2aWNlSWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5kZXZpY2VJZCwgaWQpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBsb2NhbFN0b3JhZ2UgdW5hdmFpbGFibGUgKHByaXZhdGUgYnJvd3NpbmcgcXVvdGEsIGV0Yy4pIOKAlCBjb250aW51ZSB3aXRob3V0IHBlcnNpc3RlbmNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuIFwieHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4XCIucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICAgIGNvbnN0IHYgPSBjID09PSBcInhcIiA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERldmljZUluZm8oKTogRGV2aWNlSW5mbyB7XG4gIHJldHVybiB7XG4gICAgcGxhdGZvcm06IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgXCJ3ZWJcIiA6IFwic2VydmVyXCIsXG4gICAgdXNlckFnZW50OiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IFwiXCIsXG4gICAgbGFuZ3VhZ2U6IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IubGFuZ3VhZ2UgOiBcImVuXCIsXG4gICAgc2NyZWVuV2lkdGg6IHR5cGVvZiBzY3JlZW4gIT09IFwidW5kZWZpbmVkXCIgPyBzY3JlZW4ud2lkdGggOiAwLFxuICAgIHNjcmVlbkhlaWdodDogdHlwZW9mIHNjcmVlbiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNjcmVlbi5oZWlnaHQgOiAwLFxuICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckRldmljZShcbiAgYXBpVXJsOiBzdHJpbmcsXG4gIGFwaUtleTogc3RyaW5nLFxuICBlbnZpcm9ubWVudDogc3RyaW5nLFxuICBhbm9ueW1vdXNJZDogc3RyaW5nLFxuICBleGlzdGluZ0RldmljZUlkOiBzdHJpbmcgfCBudWxsLFxuICBpbmZvOiBEZXZpY2VJbmZvLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYm9keSA9IHtcbiAgICBhbm9ueW1vdXNfaWQ6IGFub255bW91c0lkLFxuICAgIC4uLihleGlzdGluZ0RldmljZUlkID8geyBkZXZpY2VfaWQ6IGV4aXN0aW5nRGV2aWNlSWQgfSA6IHt9KSxcbiAgICBwbGF0Zm9ybTogXCJ3ZWJcIiBhcyBjb25zdCxcbiAgICBsb2NhbGU6IGluZm8ubGFuZ3VhZ2UsXG4gICAgdGltZXpvbmU6IGluZm8udGltZXpvbmUsXG4gIH07XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2FwaVVybH0vdjEvZGV2aWNlcy9yZWdpc3RlcmAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLFxuICAgICAgXCJYLUVudmlyb25tZW50XCI6IGVudmlyb25tZW50LFxuICAgICAgXCJYLVNESy1WZXJzaW9uXCI6IFNES19WRVJTSU9OLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHsgZGF0YTogeyBkZXZpY2VfaWQ6IHN0cmluZyB9IH07XG4gIHJldHVybiBqc29uLmRhdGEuZGV2aWNlX2lkO1xufVxuIiwiLyoqXG4gKiBGaXJzdC10b3VjaCBhdHRyaWJ1dGlvbiBjYXB0dXJlIGZvciB0aGUgYnJvd3NlciBTREsuXG4gKlxuICogUGFyc2VzIFVUTSBwYXJhbXMsIGFkLWNsaWNrIElEcywgcmVmZXJyZXIsIGFuZCBsYW5kaW5nIHBhZ2UgZnJvbSB0aGVcbiAqIGN1cnJlbnQgYnJvd3NlciBjb250ZXh0LiBDYWxsZWQgb25jZSBwZXIgc2Vzc2lvbiBhdCBjcmVhdGlvbiB0aW1lOyB0aGVcbiAqIHJlc3VsdGluZyBzbmFwc2hvdCBpcyBzdGFzaGVkIGluIHNlc3Npb25TdG9yYWdlIGFuZCBhdHRhY2hlZCB0byBldmVyeVxuICogZXZlbnQncyBjb250ZXh0IHVudGlsIHRoZSBzZXNzaW9uIHJvbGxzIG92ZXIgKDMwLW1pbiBpbmFjdGl2aXR5KS5cbiAqXG4gKiBBbHNvIG1haW50YWlucyBhIGxvbmdlci1saXZlZCBcImZpcnN0X3RvdWNoXCIgc25hcHNob3QgaW4gbG9jYWxTdG9yYWdlIOKAlFxuICogd3JpdHRlbiBvbmNlIG9uIHRoZSBmaXJzdCBzZXNzaW9uIHRoYXQgaGFzIEFOWSBhdHRyaWJ1dGlvbiBzaWduYWwsXG4gKiBuZXZlciBvdmVyd3JpdHRlbi4gUG93ZXJzIFwiaG93IGRpZCB0aGlzIHVzZXIgZmlyc3QgYXJyaXZlXCIgc2VnbWVudHNcbiAqIGV2ZW4gbW9udGhzIGxhdGVyLlxuICpcbiAqIERlZmVuc2l2ZTpcbiAqIC0gTm8tb3BzICsgcmV0dXJucyBgdW5kZWZpbmVkYCBvdXRzaWRlIGJyb3dzZXJzIChzZXJ2ZXIgU0RLIHNoYXJlc1xuICogICB0aGlzIGZpbGUgdmlhIHRoZSBjb21tb24gQ29udGV4dE1hbmFnZXIpLlxuICogLSBTdG9yYWdlIGFjY2VzcyB3cmFwcGVkIGluIHRyeS9jYXRjaCAocHJpdmF0ZSBtb2RlIC8gU2FmYXJpIHF1b3RhKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBTVE9SQUdFX0tFWVMgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuXG5jb25zdCBVVE1fS0VZUyA9IFtcbiAgXCJ1dG1fc291cmNlXCIsXG4gIFwidXRtX21lZGl1bVwiLFxuICBcInV0bV9jYW1wYWlnblwiLFxuICBcInV0bV9jb250ZW50XCIsXG4gIFwidXRtX3Rlcm1cIixcbiAgXCJnY2xpZFwiLFxuICBcImZiY2xpZFwiLFxuXSBhcyBjb25zdDtcbnR5cGUgVXRtS2V5ID0gKHR5cGVvZiBVVE1fS0VZUylbbnVtYmVyXTtcblxuZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVmZXJyZXJIb3N0KHJlZmVycmVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXJlZmVycmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHJlZmVycmVyKS5ob3N0bmFtZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vLyBTdHJpcCBDMCBjb250cm9scyAoVSswMDAwLVUrMDAxRikgKyBERUwgKFUrMDA3RikgYmVmb3JlIHBlcnNpc3RpbmcgYW5cbi8vIGF0dHJpYnV0aW9uIHZhbHVlLiBVVE0gdmFsdWVzIGJ1YmJsZSBhbGwgdGhlIHdheSB1cCB0aHJvdWdoIGV2ZW50c19yYXdcbi8vIOKGkiBNQ1AgaW5zaWdodHNfcXVlcnkg4oaSIExMTSBjb250ZXh0ICh2ZWN0b3IgQiBpbiB0aGUgTUNQIGF1ZGl0IFBSIDMvNSksXG4vLyBzbyBhIGNhbXBhaWduIFVSTCBjcmFmdGVkIHdpdGggZW1iZWRkZWQgbmV3bGluZXMgLyBjb250cm9sIHNlcXVlbmNlc1xuLy8gY291bGQgb3RoZXJ3aXNlIHBsYW50IHByb21wdC1pbmplY3Rpb24gdGV4dCBpbiBhbnkgYWdlbnQgcmVhZGluZyB0aGVcbi8vIGRhc2hib2FyZCBzdW1tYXJ5LiBMZW5ndGggY2FwIGlzIHRoZSBzZWNvbmQgbGluZSBvZiBkZWZlbmNlLlxuLy9cbi8vIFdlIGRvIE5PVCBzdHJpcCBvcmRpbmFyeSBwcmludGFibGUgY2hhcnMgKGVtb2ppcywgcHVuY3R1YXRpb24sXG4vLyBub24tQVNDSUkgbGV0dGVycykg4oCUIGxlZ2l0aW1hdGUgbG9jYWxpc2VkIGNhbXBhaWducyByZWx5IG9uIHRoZW0sIGFuZFxuLy8gdGhlIHNlcnZlci1zaWRlIGB3cmFwVW50cnVzdGVkYCBpbiBNQ1AgdG9vbHMgYWxyZWFkeSBoYW5kbGVzIHRoZVxuLy8gYWdlbnQtY29udGV4dCBjb25jZXJuIHZpYSBkZWxpbWl0ZXJzLlxuLy8gTGVuZ3RoIGNhcCBtaXJyb3JzIHRoZSBwcmUtUFIgc2xpY2UgKDIwMCBjaGFycykgc28gYWZmaWxpYXRlLW5ldHdvcmtcbi8vIGB1dG1fY29udGVudGAgaGFzaGVzIChJbXBhY3QgLyBBd2luIC8gQ0ogLyBGYWNlYm9vayBhZHMgZW1pdCAxNTAtMjAwK1xuLy8gY2hhciB0cmFja2luZyBzdHJpbmdzKSBrZWVwIHRoZWlyIGNhcmRpbmFsaXR5IHRocm91Z2ggdGhlIFNESy4gVGhlXG4vLyBzZWN1cml0eSBoYWxmIG9mIHRoZSBQUiAoY29udHJvbC1jaGFyIHN0cmlwKSBpcyB0aGUgb25seSBiZWhhdmlvclxuLy8gY2hhbmdlOyBsZW5ndGgtY2FwIGNoYW5nZSB3YXMgdW5pbnRlbnRpb25hbCBkcmlmdCBjYXVnaHQgYnlcbi8vIHNkay1hdWRpdG9yIE0tMi5cbmNvbnN0IEFUVFJJQlVUSU9OX1ZBTFVFX01BWCA9IDIwMDtcbi8vIFJlZ0V4cCBjb25zdHJ1Y3RvciAobm90IGxpdGVyYWwpIHNvIHRoZSBXcml0ZSB0b29sIGNhbid0IHRydW5jYXRlXG4vLyB0aGUgY2hhci1jbGFzcyBhdCB0aGUgY29udHJvbC1jaGFyIHJhbmdlLlxuLy8gU3RyaXAgQzAgY29udHJvbHMgKFUrMDAwMC1VKzAwMUYpLCBERUwgKFUrMDA3RiksIGFuZCBhbmdsZSBicmFja2V0c1xuLy8gKFUrMDAzQyAvIFUrMDAzRSkuIFRoZSBhbmdsZS1icmFja2V0IHN0cmlwIG1pcnJvcnMgdGhlIE1DUC1zaWRlXG4vLyBgdW50cnVzdC50c2Agc28gYSBmdXR1cmUgZXZlbnRzX3JhdyBjb25zdW1lciB0aGF0IHN1cmZhY2VzIFVUTSByYXdcbi8vICh3aXRob3V0IHRoZSBNQ1Agd3JhcCBsYXllcikgaW5oZXJpdHMgdGhlIGRlZmVuc2UgYnkgZGVmYXVsdC4gUFJcbi8vICMzNDYgcmV2aWV3ZXIgU0YtNi4gTGVnaXRpbWF0ZSBVVE0gdmFsdWVzIG5ldmVyIGNhcnJ5IGA8YCAvIGA+YC5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBTVFJJUF9DT05UUk9MUyA9IG5ldyBSZWdFeHAoXCJbXFxcXHgwMC1cXFxceDFGXFxcXHg3Rjw+XVwiLCBcImdcIik7XG5cbmZ1bmN0aW9uIHNhbml0aXplQXR0cmlidXRpb25WYWx1ZShyYXc6IHN0cmluZywgbWF4TGVuID0gQVRUUklCVVRJT05fVkFMVUVfTUFYKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhdy5yZXBsYWNlKFNUUklQX0NPTlRST0xTLCBcIlwiKS5zbGljZSgwLCBtYXhMZW4pO1xufVxuXG4vKiogQ2FwdHVyZSBmcm9tIHRoZSBjdXJyZW50IHBhZ2UuIFJldHVybnMgYHVuZGVmaW5lZGAgaW4gbm9uLWJyb3dzZXIgZW52cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRnJvbVdpbmRvdygpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG91dDogQXR0cmlidXRpb25Db250ZXh0ID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBVVE1fS0VZUykge1xuICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXMuZ2V0KGtleSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlKHZhbHVlKTtcbiAgICAgICAgaWYgKHNhbml0aXplZCkgb3V0W2tleSBhcyBVdG1LZXldID0gc2FuaXRpemVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTWFsZm9ybWVkIFVSTCDigJQgcmFyZSwgYnV0IG5ldmVyIGxldCBpdCB0aHJvdy5cbiAgfVxuXG4gIGNvbnN0IHJlZmVycmVyID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgXCJcIjtcbiAgaWYgKHJlZmVycmVyKSB7XG4gICAgb3V0LnJlZmVycmVyID0gc2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlKHJlZmVycmVyLCA1MDApO1xuICAgIGNvbnN0IGhvc3QgPSBwYXJzZVJlZmVycmVySG9zdChyZWZlcnJlcik7XG4gICAgaWYgKGhvc3QpIG91dC5yZWZlcnJlcl9ob3N0ID0gc2FuaXRpemVBdHRyaWJ1dGlvblZhbHVlKGhvc3QsIDI1Nik7XG4gIH1cblxuICB0cnkge1xuICAgIG91dC5sYW5kaW5nX3BhZ2UgPSBzYW5pdGl6ZUF0dHJpYnV0aW9uVmFsdWUoXG4gICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoLFxuICAgICAgNTAwLFxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucmVhY2hhYmxlIGluIG5vcm1hbCBicm93c2Vycy5cbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUcnVlIGlmIHRoZSBzbmFwc2hvdCBoYXMgYXQgbGVhc3Qgb25lIG1lYW5pbmdmdWwgc2lnbmFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0FueUF0dHJpYnV0aW9uKGE6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIWEpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgVVRNX0tFWVMpIHtcbiAgICBpZiAoYVtrZXkgYXMgVXRtS2V5XSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGEucmVmZXJyZXJfaG9zdCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBMb2FkIHRoZSBzZXNzaW9uLXNjb3BlZCBzbmFwc2hvdCBmcm9tIHNlc3Npb25TdG9yYWdlIGlmIGl0IGV4aXN0cyxcbiAqIG90aGVyd2lzZSBjYXB0dXJlIGEgZnJlc2ggb25lIGZyb20gYHdpbmRvd2AgYW5kIHBlcnNpc3QgaXQuIFNhbWUgY2FsbFxuICogdHdpY2UgaW4gdGhlIHNhbWUgc2Vzc2lvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCDigJQgZmlyc3QtdG91Y2ggb2ZcbiAqIFRISVMgc2Vzc2lvbiBuZXZlciBzaGlmdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkF0dHJpYnV0aW9uKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZCkgYXMgQXR0cmlidXRpb25Db250ZXh0O1xuICAgICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiKSByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQ29ycnVwdCBzdG9yYWdlIOKAlCByZS1jYXB0dXJlIGJlbG93LlxuICB9XG5cbiAgY29uc3QgZnJlc2ggPSBjYXB0dXJlRnJvbVdpbmRvdygpO1xuICBpZiAoIWZyZXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25BdHRyaWJ1dGlvbiwgSlNPTi5zdHJpbmdpZnkoZnJlc2gpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gUXVvdGEgLyBkaXNhYmxlZCDigJQgc3RpbGwgcmV0dXJuIHRoZSBpbi1tZW1vcnkgdmFsdWUuXG4gIH1cbiAgcmV0dXJuIGZyZXNoO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGRldmljZSdzIGZpcnN0LXRvdWNoIHNuYXBzaG90IChsb2NhbFN0b3JhZ2UpLiBXcml0ZXMgYGZyZXNoYFxuICogb25seSBpZiBubyBmaXJzdC10b3VjaCBoYXMgYmVlbiByZWNvcmRlZCBBTkQgYGZyZXNoYCBoYXMgYXQgbGVhc3Qgb25lXG4gKiBtZWFuaW5nZnVsIHNpZ25hbCDigJQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgYSByZWFsIGZpcnN0LXRvdWNoXG4gKiBtb250aHMgbGF0ZXIsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGJ1cm4gYSBmaXJzdC10b3VjaCBzbG90IG9uIGFuIGVtcHR5XG4gKiBkaXJlY3QtdHJhZmZpYyBzZXNzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JTZWVkRmlyc3RUb3VjaChcbiAgZnJlc2g6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCxcbik6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuZmlyc3RUb3VjaEF0dHJpYnV0aW9uKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZCkgYXMgQXR0cmlidXRpb25Db250ZXh0O1xuICAgICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiKSByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQ29ycnVwdCBzdG9yYWdlIOKAlCBmYWxsIHRocm91Z2ggdG8gc2VlZC5cbiAgfVxuXG4gIGlmICghaGFzQW55QXR0cmlidXRpb24oZnJlc2gpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5maXJzdFRvdWNoQXR0cmlidXRpb24sIEpTT04uc3RyaW5naWZ5KGZyZXNoKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFF1b3RhIC8gZGlzYWJsZWQuXG4gIH1cbiAgcmV0dXJuIGZyZXNoO1xufVxuXG4vKiogQ2xlYXIgdGhlIHNlc3Npb24gc25hcHNob3QuIENhbGxlZCB3aGVuIGEgbmV3IHNlc3Npb24gcm9sbHMgb3ZlciBzb1xuICogIHRoZSBuZXh0IHBhZ2V2aWV3IHJlY2FwdHVyZXMgZnJlc2ggVVRNICsgcmVmZXJyZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTZXNzaW9uQXR0cmlidXRpb24oKTogdm9pZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUuXG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUywgU0VTU0lPTl9USU1FT1VUX01TLCBTREtfVkVSU0lPTiB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFub255bW91c0lkIH0gZnJvbSBcIi4vZGV2aWNlLmpzXCI7XG5pbXBvcnQge1xuICBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbixcbiAgZ2V0T3JDcmVhdGVTZXNzaW9uQXR0cmlidXRpb24sXG4gIGdldE9yU2VlZEZpcnN0VG91Y2gsXG59IGZyb20gXCIuL2F0dHJpYnV0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0aW9uQ29udGV4dCwgRXZlbnRDb250ZXh0IH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXJUcmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIHByaXZhdGUgZGV2aWNlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFub255bW91c0lkOiBzdHJpbmc7XG4gIHByaXZhdGUgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBGaXJzdC10b3VjaCBhdHRyaWJ1dGlvbiBmb3IgdGhlIENVUlJFTlQgc2Vzc2lvbi4gQ2FwdHVyZWQgb24gc2Vzc2lvblxuICAgKiAgY3JlYXRlLCByb2xsZWQgb3ZlciB3aGVuIHRoZSAzMC1taW4gd2luZG93IGV4cGlyZXMuICovXG4gIHByaXZhdGUgc2Vzc2lvbkF0dHJpYnV0aW9uOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQ7XG4gIC8qKiBFdmVyLWZpcnN0LXRvdWNoIGF0dHJpYnV0aW9uIGFjcm9zcyB0aGUgZGV2aWNlLiBQZXJzaXN0cyBpblxuICAgKiAgbG9jYWxTdG9yYWdlOyB3cml0dGVuIG9uY2UuICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaDogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkO1xuICAvKiogVHJ1ZSB3aGVuIGBsb2FkT3JDcmVhdGVTZXNzaW9uYCBtaW50ZWQgYSBicmFuZC1uZXcgc2Vzc2lvbiBpZCBvblxuICAgKiAgdGhpcyBpbnN0YW5jZSAodnMuIHJlc3VtaW5nIGFuIGV4aXN0aW5nIG9uZSkuIENvbnN1bWVycyB1c2UgdGhpcyB0b1xuICAgKiAgZGVjaWRlIHdoZXRoZXIgdG8gZmlyZSBhIGAkc2Vzc2lvbl9zdGFydGAgZXZlbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBpc05ld1Nlc3Npb246IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hbm9ueW1vdXNJZCA9IHRoaXMubG9hZE9yQ3JlYXRlQW5vbnltb3VzSWQoKTtcbiAgICBjb25zdCB7IHNlc3Npb25JZCwgaXNOZXcgfSA9IHRoaXMubG9hZE9yQ3JlYXRlU2Vzc2lvbigpO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMuaXNOZXdTZXNzaW9uID0gaXNOZXc7XG4gICAgdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gPSBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgIHRoaXMuZmlyc3RUb3VjaCA9IGdldE9yU2VlZEZpcnN0VG91Y2godGhpcy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICAgIHRoaXMubG9hZElkZW50aXR5KCk7XG4gIH1cblxuICBnZXRDb250ZXh0KCk6IEV2ZW50Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZV9pZDogdGhpcy5kZXZpY2VJZCA/PyB0aGlzLmFub255bW91c0lkLFxuICAgICAgYW5vbnltb3VzX2lkOiB0aGlzLmFub255bW91c0lkLFxuICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcbiAgICAgIHBsYXRmb3JtOiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gXCJ3ZWJcIiA6IFwic2VydmVyXCIsXG4gICAgICBsb2NhbGU6IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IubGFuZ3VhZ2UgOiBcImVuXCIsXG4gICAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgICAgc2RrX3ZlcnNpb246IFNES19WRVJTSU9OLFxuICAgICAgLi4uKHRoaXMuc2Vzc2lvbkF0dHJpYnV0aW9uID8geyBhdHRyaWJ1dGlvbjogdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLmZpcnN0VG91Y2ggPyB7IGZpcnN0X3RvdWNoOiB0aGlzLmZpcnN0VG91Y2ggfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHNlc3Npb24ncyBhdHRyaWJ1dGlvbi4gRW1pdCBhcyBwcm9wcyBvbiB0aGVcbiAgICogIGAkc2Vzc2lvbl9zdGFydGAgZXZlbnQg4oCUIHRoZXNlIGZpZWxkcyBBUkUgYWxyZWFkeSBvbiBjb250ZXh0IG9mXG4gICAqICBldmVyeSBldmVudCwgYnV0IGhhdmluZyB0aGVtIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIHN0YXJ0IGV2ZW50XG4gICAqICBtYWtlcyBmdW5uZWxzICsgZGFzaGJvYXJkcyBlYXNpZXIgdG8gYnVpbGQuICovXG4gIGdldFNlc3Npb25BdHRyaWJ1dGlvbigpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbjtcbiAgfVxuXG4gIC8qKiBFdmVyLWZpcnN0LXRvdWNoIHNuYXBzaG90IGFjcm9zcyB0aGUgZGV2aWNlIGxpZmV0aW1lLiBTYW1lIHNoYXBlIGFzXG4gICAqICBzZXNzaW9uIGF0dHJpYnV0aW9uOyBwZXJzaXN0cyBpbiBsb2NhbFN0b3JhZ2Ugc28gcmV0dXJuaW5nIHZpc2l0b3JzXG4gICAqICBjYW4gYmUgc2VnbWVudGVkIGJ5IHRoZWlyIG9yaWdpbmFsIGFjcXVpc2l0aW9uIHNvdXJjZS4gKi9cbiAgZ2V0Rmlyc3RUb3VjaCgpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpcnN0VG91Y2g7XG4gIH1cblxuICBzZXREZXZpY2VJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXZpY2VJZCA9IGlkO1xuICB9XG5cbiAgZ2V0RGV2aWNlSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlSWQ7XG4gIH1cblxuICBzZXRVc2VySWQodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDtcbiAgfVxuXG4gIGdldFVzZXJJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy51c2VySWQ7XG4gIH1cblxuICBnZXRBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFub255bW91c0lkO1xuICB9XG5cbiAgdXBkYXRlVXNlclByb3BlcnRpZXModHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMudXNlclRyYWl0cyA9IHsgLi4udGhpcy51c2VyVHJhaXRzLCAuLi50cmFpdHMgfTtcbiAgfVxuXG4gIGdldFVzZXJUcmFpdHMoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMudXNlclRyYWl0cyB9O1xuICB9XG5cbiAgcmVzZXRJZGVudGl0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnVzZXJJZCA9IG51bGw7XG4gICAgdGhpcy51c2VyVHJhaXRzID0ge307XG4gICAgdGhpcy5hbm9ueW1vdXNJZCA9IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmFub255bW91c0lkLCB0aGlzLmFub255bW91c0lkKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25JZCwgdGhpcy5zZXNzaW9uSWQpO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICAgIC8vIFRyZWF0IGlkZW50aXR5IHJlc2V0IGxpa2UgYSBuZXcgc2Vzc2lvbiBmb3IgYXR0cmlidXRpb24gcHVycG9zZXMg4oCUXG4gICAgLy8gdGhlIG5leHQgcGFnZXZpZXcgcmUtY2FwdHVyZXMgVVRNICsgcmVmZXJyZXIuIEZpcnN0LXRvdWNoIGlzIGxlZnRcbiAgICAvLyBhbG9uZTsgdGhhdCBiZWxvbmdzIHRvIHRoZSBkZXZpY2UsIG5vdCB0aGUgbG9nZ2VkLWluIHVzZXIuXG4gICAgY2xlYXJTZXNzaW9uQXR0cmlidXRpb24oKTtcbiAgICB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbiA9IGdldE9yQ3JlYXRlU2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gIH1cblxuICB0b3VjaFNlc3Npb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25MYXN0U2VlbiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkT3JDcmVhdGVBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuYW5vbnltb3VzSWQpO1xuICAgICAgaWYgKHN0b3JlZCkgcmV0dXJuIHN0b3JlZDtcbiAgICAgIGNvbnN0IGlkID0gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmFub255bW91c0lkLCBpZCk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZE9yQ3JlYXRlU2Vzc2lvbigpOiB7IHNlc3Npb25JZDogc3RyaW5nOyBpc05ldzogYm9vbGVhbiB9IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFzdFNlZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uTGFzdFNlZW4pO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uSWQpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChleGlzdGluZyAmJiBsYXN0U2VlbiAmJiBub3cgLSBwYXJzZUludChsYXN0U2VlbiwgMTApIDwgU0VTU0lPTl9USU1FT1VUX01TKSB7XG4gICAgICAgIHJldHVybiB7IHNlc3Npb25JZDogZXhpc3RpbmcsIGlzTmV3OiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgY29uc3QgaWQgPSBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uSWQsIGlkKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25MYXN0U2Vlbiwgbm93LnRvU3RyaW5nKCkpO1xuICAgICAgLy8gU2Vzc2lvbiByb2xsZWQgb3ZlciAob3IgZmlyc3QgdmlzaXQpLiBDbGVhciBhbnkgc3RhbGUgc2Vzc2lvbi1cbiAgICAgIC8vIGF0dHJpYnV0aW9uIHNuYXBzaG90IHNvIHRoZSBuZXh0IGNhcHR1cmUgcmVhZHMgZnJlc2ggVVRNK3JlZmVycmVyXG4gICAgICAvLyBmcm9tIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkOiBpZCwgaXNOZXc6IHRydWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHNlc3Npb25JZDogZ2VuZXJhdGVBbm9ueW1vdXNJZCgpLCBpc05ldzogdHJ1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZElkZW50aXR5KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7XG4gICAgICAgIHVzZXJJZDogc3RyaW5nO1xuICAgICAgICB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfTtcbiAgICAgIHRoaXMudXNlcklkID0gcGFyc2VkLnVzZXJJZCA/PyBudWxsO1xuICAgICAgdGhpcy51c2VyVHJhaXRzID0gcGFyc2VkLnRyYWl0cyA/PyB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvcnJ1cHQgc3RvcmFnZSDigJQgaWdub3JlXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRRdWV1ZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIGl0ZW1zOiBFbnJpY2hlZEV2ZW50W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xuICB9XG5cbiAgYWRkKGV2ZW50OiBFbnJpY2hlZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID49IHRoaXMubWF4U2l6ZSkge1xuICAgICAgLy8gRHJvcCB0aGUgb2xkZXN0IGV2ZW50IChGSUZPIG92ZXJmbG93KVxuICAgICAgdGhpcy5pdGVtcy5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgZHJhaW4oKTogRW5yaWNoZWRFdmVudFtdIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLml0ZW1zLnNsaWNlKCk7XG4gICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIHJldHVybiBhbGw7XG4gIH1cblxuICBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEZsYWdWYWx1ZSB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmNvbnN0IERFQlVHX09WRVJSSURFU19LRVkgPSBcImxwX2RlYnVnX292ZXJyaWRlc1wiO1xuXG4vKipcbiAqIEZsYWdNYW5hZ2VyIHN0b3JlcyBzZXJ2ZXItZXZhbHVhdGVkIEZsYWcgdmFsdWVzIGFuZCBleHBvc2VzIHRoZW0gdG8gU0RLXG4gKiBjb25zdW1lcnMuIEV2YWx1YXRpb24gaGFwcGVucyBvbiB0aGUgQVBJIChzZWUgYC92MS9jb25maWdgKTsgdGhlIFNESyBvbmx5XG4gKiBjYWNoZXMgdGhlIHJlc3VsdCBhbmQgdHJhY2tzIGV4cG9zdXJlIG9uY2UgcGVyIGZsYWcgcGVyIHNlc3Npb24uXG4gKlxuICogRGVidWcgb3ZlcnJpZGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHNlcnZlciB2YWx1ZXMgd2hlbiBkZWJ1ZyBtb2RlIGlzXG4gKiBhY3RpdmUsIHNvIGRldmVsb3BlcnMgY2FuIHRlc3QgZGlmZmVyZW50IGJyYW5jaGVzIHdpdGhvdXQgdG91Y2hpbmcgdGhlXG4gKiBzZXJ2ZXIuIE92ZXJyaWRlcyBhcmUgcGVyc2lzdGVkIGluIGxvY2FsU3RvcmFnZSB1bmRlciBERUJVR19PVkVSUklERVNfS0VZLlxuICovXG5leHBvcnQgY2xhc3MgRmxhZ01hbmFnZXIge1xuICBwcml2YXRlIGZsYWdWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIHByaXZhdGUgZGVidWdPdmVycmlkZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIHByaXZhdGUgZXhwb3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGRlYnVnTW9kZSA9IGZhbHNlO1xuXG4gIC8qKiBBcHBseSB0aGUgbGF0ZXN0IGV2YWx1YXRlZCBmbGFnIHZhbHVlcyBmcm9tIGAvdjEvY29uZmlnYC4gKi9cbiAgc2V0RXZhbHVhdGVkRmxhZ3MoZmxhZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5mbGFnVmFsdWVzID0gZmxhZ3M7XG4gICAgdGhpcy5leHBvc2VkLmNsZWFyKCk7XG4gIH1cblxuICBzZXREZWJ1Z01vZGUoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGVidWdNb2RlID0gZW5hYmxlZDtcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5sb2FkRGVidWdPdmVycmlkZXMoKTtcbiAgfVxuXG4gIC8qKiBPdmVycmlkZSBhIGZsYWcgdmFsdWUgZm9yIGxvY2FsIHRlc3RpbmcuIE9ubHkgYWN0aXZlIHdoZW4gZGVidWc9dHJ1ZS4gKi9cbiAgb3ZlcnJpZGVGbGFnKGtleTogc3RyaW5nLCB2YWx1ZTogRmxhZ1ZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5kZWJ1Z092ZXJyaWRlc1trZXldID0gdmFsdWU7XG4gICAgdGhpcy5zYXZlRGVidWdPdmVycmlkZXMoKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgZGVidWcgb3ZlcnJpZGVzLiAqL1xuICBjbGVhck92ZXJyaWRlcygpOiB2b2lkIHtcbiAgICB0aGlzLmRlYnVnT3ZlcnJpZGVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKERFQlVHX09WRVJSSURFU19LRVkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8gbG9jYWxTdG9yYWdlXG4gICAgfVxuICB9XG5cbiAgLyoqIEdldCBhbGwgY3VycmVudCBkZWJ1ZyBvdmVycmlkZXMgKGZvciBkZWJ1ZyBtZW51IFVJKS4gKi9cbiAgZ2V0T3ZlcnJpZGVzKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi50aGlzLmRlYnVnT3ZlcnJpZGVzIH07XG4gIH1cblxuICBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZsYWdWYWx1ZXMpLmxlbmd0aDtcbiAgfVxuXG4gIGV2YWx1YXRlKFxuICAgIGZsYWdLZXk6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IEZsYWdWYWx1ZSxcbiAgICBfdXNlcklkOiBzdHJpbmcgfCBudWxsLFxuICAgIF9hdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBvbkV4cG9zdXJlOiAoZmxhZ0tleTogc3RyaW5nLCB2YWx1ZTogRmxhZ1ZhbHVlKSA9PiB2b2lkLFxuICApOiBGbGFnVmFsdWUge1xuICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiBmbGFnS2V5IGluIHRoaXMuZGVidWdPdmVycmlkZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlYnVnT3ZlcnJpZGVzW2ZsYWdLZXldIGFzIEZsYWdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoZmxhZ0tleSBpbiB0aGlzLmZsYWdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mbGFnVmFsdWVzW2ZsYWdLZXldIGFzIEZsYWdWYWx1ZTtcbiAgICAgIGlmICghdGhpcy5leHBvc2VkLmhhcyhmbGFnS2V5KSkge1xuICAgICAgICB0aGlzLmV4cG9zZWQuYWRkKGZsYWdLZXkpO1xuICAgICAgICBvbkV4cG9zdXJlKGZsYWdLZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgY2xlYXJFeHBvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuZXhwb3NlZC5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGVidWdPdmVycmlkZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKERFQlVHX09WRVJSSURFU19LRVkpO1xuICAgICAgaWYgKHN0b3JlZCkgdGhpcy5kZWJ1Z092ZXJyaWRlcyA9IEpTT04ucGFyc2Uoc3RvcmVkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vIGxvY2FsU3RvcmFnZSBvciBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVEZWJ1Z092ZXJyaWRlcygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oREVCVUdfT1ZFUlJJREVTX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Z092ZXJyaWRlcykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8gbG9jYWxTdG9yYWdlXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTVE9SQUdFX0tFWVMgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFeHBlcmltZW50QXNzaWdubWVudCwgRXhwZXJpbWVudFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbnR5cGUgQXNzaWdubWVudFN0b3JlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBFeHBlcmltZW50cyBhcmUgYnVja2V0ZWQgc2VydmVyLXNpZGUuIFRoZSBgL3YxL2NvbmZpZ2AgZW5kcG9pbnQgcmV0dXJuc1xuICogYGV4cGVyaW1lbnRzOiB7IFtleHBlcmltZW50S2V5XTogeyB2YXJpYW50X2tleSwgcGF5bG9hZCB9IH1gIOKAlCBvbmUgZW50cnlcbiAqIHBlciBleHBlcmltZW50IHRoZSBjYWxsZXIncyBkZXZpY2UgaXMgZW5yb2xsZWQgaW4uIFRoZSBTREsncyBqb2IgaXMgdG9cbiAqIGNhY2hlIHRoZSBhc3NpZ25tZW50LCBlbWl0IGEgc2luZ2xlIGV4cG9zdXJlIGV2ZW50IHBlciBzZXNzaW9uLCBhbmRcbiAqIHN1cmZhY2UgdGhlIHZhcmlhbnQgdG8gY2FsbGluZyBjb2RlLlxuICpcbiAqIE5vIGNsaWVudC1zaWRlIGJ1Y2tldGluZy4gTm8gdHJhZmZpYyBnYXRlcy4gTm8gY3VtdWxhdGl2ZSB3ZWlnaHRzLiBBbGxcbiAqIG9mIHRoYXQgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNvIGV2ZXJ5IHBsYXRmb3JtICh3ZWIsIGlPUywgc2VydmVyIFNESylcbiAqIGFncmVlcyBvbiB0aGUgYXNzaWdubWVudCBmb3IgYSBnaXZlbiBkZXZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHBlcmltZW50TWFuYWdlciB7XG4gIHByaXZhdGUgYXNzaWdubWVudHM6IFJlY29yZDxzdHJpbmcsIEV4cGVyaW1lbnRBc3NpZ25tZW50PiA9IHt9O1xuICAvKiogUGVyc2lzdGVkIHBlci1zZXNzaW9uOiByZW1lbWJlcnMgd2hpY2ggdmFyaWFudCB3ZSBsYXN0IHN1cmZhY2VkLiAqL1xuICBwcml2YXRlIHN0aWNreUFzc2lnbm1lbnRzOiBBc3NpZ25tZW50U3RvcmUgPSB7fTtcbiAgcHJpdmF0ZSBleHBvc2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2FkU3RpY2t5QXNzaWdubWVudHMoKTtcbiAgfVxuXG4gIHNldEFzc2lnbm1lbnRzKGFzc2lnbm1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBFeHBlcmltZW50QXNzaWdubWVudD4pOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbm1lbnRzID0gYXNzaWdubWVudHM7XG4gIH1cblxuICBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFzc2lnbm1lbnRzKS5sZW5ndGg7XG4gIH1cblxuICByZXNvbHZlKFxuICAgIGV4cGVyaW1lbnRLZXk6IHN0cmluZyxcbiAgICBvbkV4cG9zdXJlOiAoa2V5OiBzdHJpbmcsIHZhcmlhbnQ6IHN0cmluZykgPT4gdm9pZCxcbiAgKTogRXhwZXJpbWVudFJlc3VsdCB7XG4gICAgY29uc3QgYXNzaWdubWVudCA9IHRoaXMuYXNzaWdubWVudHNbZXhwZXJpbWVudEtleV07XG4gICAgaWYgKCFhc3NpZ25tZW50KSB7XG4gICAgICByZXR1cm4geyB2YXJpYW50OiBcImNvbnRyb2xcIiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhbnRLZXkgPSBhc3NpZ25tZW50LnZhcmlhbnRfa2V5O1xuXG4gICAgLy8gUGVyc2lzdCBzbyB0aGUgdmFyaWFudCBpcyBzdGFibGUgZXZlbiBpZiB0aGUgc2VydmVyIHJlc3BvbnNlIGlzXG4gICAgLy8gYnJpZWZseSB1bmF2YWlsYWJsZSBhZnRlciBhIGNhY2hlIG1pc3MuXG4gICAgaWYgKHRoaXMuc3RpY2t5QXNzaWdubWVudHNbZXhwZXJpbWVudEtleV0gIT09IHZhcmlhbnRLZXkpIHtcbiAgICAgIHRoaXMuc3RpY2t5QXNzaWdubWVudHNbZXhwZXJpbWVudEtleV0gPSB2YXJpYW50S2V5O1xuICAgICAgdGhpcy5zYXZlU3RpY2t5QXNzaWdubWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZXhwb3NlZC5oYXMoZXhwZXJpbWVudEtleSkpIHtcbiAgICAgIHRoaXMuZXhwb3NlZC5hZGQoZXhwZXJpbWVudEtleSk7XG4gICAgICBvbkV4cG9zdXJlKGV4cGVyaW1lbnRLZXksIHZhcmlhbnRLZXkpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHZhcmlhbnQ6IHZhcmlhbnRLZXksIHBheWxvYWQ6IGFzc2lnbm1lbnQucGF5bG9hZCB9O1xuICB9XG5cbiAgY2xlYXJBc3NpZ25tZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnN0aWNreUFzc2lnbm1lbnRzID0ge307XG4gICAgdGhpcy5leHBvc2VkLmNsZWFyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZUy5leHBlcmltZW50QXNzaWdubWVudHMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8gbG9jYWxTdG9yYWdlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU3RpY2t5QXNzaWdubWVudHMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5leHBlcmltZW50QXNzaWdubWVudHMpO1xuICAgICAgaWYgKHJhdykge1xuICAgICAgICB0aGlzLnN0aWNreUFzc2lnbm1lbnRzID0gSlNPTi5wYXJzZShyYXcpIGFzIEFzc2lnbm1lbnRTdG9yZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuc3RpY2t5QXNzaWdubWVudHMgPSB7fTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVTdGlja3lBc3NpZ25tZW50cygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIFNUT1JBR0VfS0VZUy5leHBlcmltZW50QXNzaWdubWVudHMsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RpY2t5QXNzaWdubWVudHMpLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vIGxvY2FsU3RvcmFnZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbmludGVyZmFjZSBTdG9yZWRJZGVudGl0eSB7XG4gIHVzZXJJZDogc3RyaW5nO1xuICB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZGVudGlmaWVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5TWFuYWdlciB7XG4gIHByaXZhdGUgdXNlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcikge1xuICAgIHRoaXMubG9hZEZyb21TdG9yYWdlKCk7XG4gIH1cblxuICBpZGVudGlmeShcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgIGNhbGxiYWNrczoge1xuICAgICAgZ2V0Q3VycmVudFVzZXJJZDogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICAgIHNldFVzZXJJZDogKGlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICB1cGRhdGVUcmFpdHM6ICh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcbiAgICAgIHJlc2V0U2Vzc2lvbjogKCkgPT4gdm9pZDtcbiAgICAgIGNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzOiAoKSA9PiB2b2lkO1xuICAgICAgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD47XG4gICAgICBwb3N0SWRlbnRpdHlSZXNvbHZlOiAodXNlcklkOiBzdHJpbmcsIHByZXZpb3VzSWQ6IHN0cmluZyB8IG51bGwpID0+IHZvaWQ7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFVzZXJJZCA9IGNhbGxiYWNrcy5nZXRDdXJyZW50VXNlcklkKCk7XG5cbiAgICBpZiAoY3VycmVudFVzZXJJZCA9PT0gdXNlcklkKSB7XG4gICAgICAvLyBTYW1lIHVzZXIg4oCUIG1lcmdlIHRyYWl0cyBvbmx5IGlmIHByb3ZpZGVkXG4gICAgICBpZiAodHJhaXRzKSB7XG4gICAgICAgIHRoaXMudHJhaXRzID0geyAuLi50aGlzLnRyYWl0cywgLi4udHJhaXRzIH07XG4gICAgICB9XG4gICAgICBjYWxsYmFja3MudXBkYXRlVHJhaXRzKHRoaXMudHJhaXRzKTtcbiAgICAgIHRoaXMucGVyc2lzdCh1c2VySWQsIHRoaXMudHJhaXRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c1VzZXJJZCA9IGN1cnJlbnRVc2VySWQ7XG5cbiAgICAvLyBOZXcgdXNlciBvciByZS1pZGVudGlmaWNhdGlvbiB3aXRoIGRpZmZlcmVudCB1c2VySWQ6XG4gICAgLy8gZmx1c2ggcXVldWVkIGV2ZW50cyBhdHRyaWJ1dGVkIHRvIHRoZSBvbGQgaWRlbnRpdHkgYmVmb3JlIHN3aXRjaGluZ1xuICAgIGNhbGxiYWNrcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcblxuICAgIC8vIFJlc2V0IHNlc3Npb24gc3RhdGUgc28gbmV3IHNlc3Npb24gc3RhcnRzIGNsZWFuXG4gICAgY2FsbGJhY2tzLnJlc2V0U2Vzc2lvbigpO1xuICAgIGNhbGxiYWNrcy5jbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50cygpO1xuXG4gICAgdGhpcy51c2VySWQgPSB1c2VySWQ7XG4gICAgdGhpcy50cmFpdHMgPSB0cmFpdHMgPz8ge307XG4gICAgY2FsbGJhY2tzLnNldFVzZXJJZCh1c2VySWQpO1xuICAgIGNhbGxiYWNrcy51cGRhdGVUcmFpdHModGhpcy50cmFpdHMpO1xuICAgIHRoaXMucGVyc2lzdCh1c2VySWQsIHRoaXMudHJhaXRzKTtcblxuICAgIC8vIE5vdGlmeSBzZXJ2ZXIgKGZpcmUtYW5kLWZvcmdldClcbiAgICBjYWxsYmFja3MucG9zdElkZW50aXR5UmVzb2x2ZSh1c2VySWQsIHByZXZpb3VzVXNlcklkKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKFwiSWRlbnRpZmllZFwiLCB7IHVzZXJJZCwgcHJldmlvdXNVc2VySWQgfSk7XG4gIH1cblxuICByZXNldChjYWxsYmFja3M6IHtcbiAgICByZXNldFNlc3Npb246ICgpID0+IHZvaWQ7XG4gICAgY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHM6ICgpID0+IHZvaWQ7XG4gICAgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIH0pOiB2b2lkIHtcbiAgICBjYWxsYmFja3MuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgY2FsbGJhY2tzLnJlc2V0U2Vzc2lvbigpO1xuICAgIGNhbGxiYWNrcy5jbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50cygpO1xuICAgIHRoaXMudXNlcklkID0gbnVsbDtcbiAgICB0aGlzLnRyYWl0cyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29udGludWVcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoXCJSZXNldCBpZGVudGl0eS5cIik7XG4gIH1cblxuICBnZXRVc2VySWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudXNlcklkO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRnJvbVN0b3JhZ2UoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5pZGVudGl0eSk7XG4gICAgICBpZiAoIXJhdykgcmV0dXJuO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIFN0b3JlZElkZW50aXR5O1xuICAgICAgdGhpcy51c2VySWQgPSBwYXJzZWQudXNlcklkID8/IG51bGw7XG4gICAgICB0aGlzLnRyYWl0cyA9IHBhcnNlZC50cmFpdHMgPz8ge307XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb3JydXB0IOKAlCBpZ25vcmVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBlcnNpc3QodXNlcklkOiBzdHJpbmcsIHRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCBwYXlsb2FkOiBTdG9yZWRJZGVudGl0eSA9IHtcbiAgICAgIHVzZXJJZCxcbiAgICAgIHRyYWl0cyxcbiAgICAgIGlkZW50aWZpZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5pZGVudGl0eSwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29udGludWVcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUywgQ09ORklHX01BWF9BR0VfTVMgfSBmcm9tIFwiLi9kZWZhdWx0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTREtDb25maWcgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIENvbmZpZ1N5bmMge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBldGFnOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaVVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBpS2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaEludGVydmFsOiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uQ29uZmlnOiAoY29uZmlnOiBTREtDb25maWcpID0+IHZvaWQsXG4gICkge31cblxuICBzdGFydChnZXREZXZpY2VJZDogKCkgPT4gc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIDEuIExvYWQgZnJvbSBsb2NhbFN0b3JhZ2Ugc3luY2hyb25vdXNseSDigJQgemVyby1sYXRlbmN5IGZpcnN0IHBhaW50XG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5sb2FkRnJvbVN0b3JhZ2UoKTtcbiAgICBpZiAoc3RvcmVkKSB7XG4gICAgICB0aGlzLm9uQ29uZmlnKHN0b3JlZC5jb25maWcpO1xuICAgIH1cbiAgICAvLyAyLiBGZXRjaCBmcm9tIEFQSSBhc3luY2hyb25vdXNseVxuICAgIHRoaXMuZmV0Y2hDb25maWcoZ2V0RGV2aWNlSWQoKSkuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgdGhpcy5sb2cud2FybihcIkNvbmZpZyBmZXRjaCBmYWlsZWRcIiwgZXJyKTtcbiAgICB9KTtcbiAgICAvLyAzLiBTdGFydCByZWZyZXNoIHRpbWVyIOKAlCBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdCBkZXZpY2VJZFxuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmZldGNoQ29uZmlnKGdldERldmljZUlkKCkpLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhpcy5sb2cud2FybihcIkNvbmZpZyByZWZyZXNoIGZhaWxlZFwiLCBlcnIpO1xuICAgICAgfSk7XG4gICAgfSwgdGhpcy5yZWZyZXNoSW50ZXJ2YWwpO1xuICB9XG5cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZldGNoQ29uZmlnKGRldmljZUlkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQVBJIHJlcXVpcmVzIFgtRGV2aWNlLUlEIOKAlCBza2lwIGZldGNoIHVudGlsIGRldmljZSByZWdpc3RyYXRpb24gY29tcGxldGVzLlxuICAgIC8vIFRoZSByZWZyZXNoIHRpbWVyIHdpbGwgcGljayBpdCB1cCBvbiB0aGUgbmV4dCBjeWNsZS5cbiAgICBpZiAoIWRldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNvbmZpZyBmZXRjaCBza2lwcGVkIOKAlCBubyBkZXZpY2UgSUQgeWV0LlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYXBpS2V5fWAsXG4gICAgICBcIlgtRW52aXJvbm1lbnRcIjogdGhpcy5lbnZpcm9ubWVudCxcbiAgICAgIFwiWC1EZXZpY2UtSWRcIjogZGV2aWNlSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5ldGFnKSBoZWFkZXJzW1wiSWYtTm9uZS1NYXRjaFwiXSA9IHRoaXMuZXRhZztcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuYXBpVXJsfS92MS9jb25maWdgLCB7IGhlYWRlcnMgfSk7XG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNvbmZpZyB1bmNoYW5nZWQgKDMwNCkuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZyBmZXRjaCByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3RXRhZyA9IHJlcy5oZWFkZXJzLmdldChcIkVUYWdcIik7XG4gICAgaWYgKG5ld0V0YWcpIHRoaXMuZXRhZyA9IG5ld0V0YWc7XG5cbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHsgZGF0YTogU0RLQ29uZmlnIH07XG4gICAgdGhpcy5vbkNvbmZpZyhqc29uLmRhdGEpO1xuICAgIHRoaXMuc2F2ZVRvU3RvcmFnZShqc29uLmRhdGEpO1xuICAgIHRoaXMubG9nLmRlYnVnKFwiQ29uZmlnIHVwZGF0ZWRcIiwge1xuICAgICAgZmxhZ3M6IE9iamVjdC5rZXlzKGpzb24uZGF0YS5mbGFncykubGVuZ3RoLFxuICAgICAgZXhwZXJpbWVudHM6IE9iamVjdC5rZXlzKGpzb24uZGF0YS5leHBlcmltZW50cykubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgbG9hZEZyb21TdG9yYWdlKCk6IHsgY29uZmlnOiBTREtDb25maWc7IGNhY2hlZEF0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuc2RrQ29uZmlnKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7XG4gICAgICAgIGNvbmZpZzogU0RLQ29uZmlnO1xuICAgICAgICBjYWNoZWRBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBwYXJzZWQuY2FjaGVkQXQ7XG4gICAgICBpZiAoYWdlID4gQ09ORklHX01BWF9BR0VfTVMpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXCJDYWNoZWQgY29uZmlnIGlzIHN0YWxlICg+MjRoKSwgaWdub3JpbmcuXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzYXZlVG9TdG9yYWdlKGNvbmZpZzogU0RLQ29uZmlnKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICBTVE9SQUdFX0tFWVMuc2RrQ29uZmlnLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7IGNvbmZpZywgY2FjaGVkQXQ6IERhdGUubm93KCkgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUXVvdGFFeGNlZWRlZEVycm9yIG9yIHVuYXZhaWxhYmxlIOKAlCBjb250aW51ZSB3aXRob3V0IGNhY2hpbmdcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IERFRkFVTFRTIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgQXR0cmlidXRpb25Db250ZXh0LCBFbnJpY2hlZEV2ZW50IH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgRXZlbnRRdWV1ZSB9IGZyb20gXCIuL3F1ZXVlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE9mZmxpbmVRdWV1ZSB9IGZyb20gXCIuL29mZmxpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29ubmVjdGl2aXR5TW9uaXRvciB9IGZyb20gXCIuL2Nvbm5lY3Rpdml0eS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxuLyoqIEF0dHJpYnV0aW9uICsgZmlyc3QtdG91Y2ggc25hcHNob3RzIGFyZSBzZXNzaW9uLWxldmVsIHN0YXRlIChub3RcbiAqICBwZXItZXZlbnQpLCBzbyB0aGUgVHJhbnNwb3J0IGFza3MgdGhlIENvbnRleHRNYW5hZ2VyIHZpYSB0aGVzZVxuICogIGdldHRlcnMgYXQgYnVpbGQtdGltZSByYXRoZXIgdGhhbiB0aHJlYWRpbmcgdGhlbSB0aHJvdWdoIGV2ZXJ5XG4gKiAgZW5yaWNoZWQgZXZlbnQuIEVpdGhlciBnZXR0ZXIgbWF5IHJldHVybiB1bmRlZmluZWQgZm9yIHZpc2l0cyB3aXRoXG4gKiAgbm8gdGFnZ2VkIGNhbXBhaWduICsgZW1wdHkgcmVmZXJyZXIgKG1vc3Qgb3JnYW5pYyB0cmFmZmljKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRpb25HZXR0ZXJzIHtcbiAgZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uOiAoKSA9PiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQ7XG4gIGdldEZpcnN0VG91Y2g6ICgpID0+IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZDtcbn1cblxuY29uc3QgTk9fQVRUUklCVVRJT046IEF0dHJpYnV0aW9uR2V0dGVycyA9IHtcbiAgZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uOiAoKSA9PiB1bmRlZmluZWQsXG4gIGdldEZpcnN0VG91Y2g6ICgpID0+IHVuZGVmaW5lZCxcbn07XG5cbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnQge1xuICBwcml2YXRlIGxhc3RGbHVzaEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmV0cnlCYWNrb2ZmID0gREVGQVVMVFMucmV0cnlCYWNrb2ZmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBpVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlLZXk6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXRyeUF0dGVtcHRzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBxdWV1ZTogRXZlbnRRdWV1ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVRdWV1ZTogT2ZmbGluZVF1ZXVlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGl2aXR5OiBDb25uZWN0aXZpdHlNb25pdG9yLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBWZXJzaW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF0dHJpYnV0aW9uOiBBdHRyaWJ1dGlvbkdldHRlcnMgPSBOT19BVFRSSUJVVElPTixcbiAgKSB7fVxuXG4gIGdldExhc3RGbHVzaEF0KCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Rmx1c2hBdDtcbiAgfVxuXG4gIC8qKiBTcHJlYWQtZnJpZW5kbHkgc25hcHNob3Qgb2Ygc2Vzc2lvbi1sZXZlbCBhdHRyaWJ1dGlvbiArIGZpcnN0LXRvdWNoXG4gICAqICBzdGF0ZSBmb3IgaW5jbHVzaW9uIGluIHRoZSBgY29udGV4dGAgYmxvY2sgb2YgZXZlcnkgd2lyZSBwYXlsb2FkLlxuICAgKiAgRW1wdHkgb2JqZWN0IHdoZW4gbmVpdGhlciBpcyBzZXQgc28gdGhlIHNwcmVhZCBpcyBhIG5vLW9wIGZvclxuICAgKiAgcHJpdmFjeS1tb2RlIC8gZGlyZWN0LXRyYWZmaWMgdmlzaXRvcnMuICovXG4gIHByaXZhdGUgYnVpbGRBdHRyaWJ1dGlvbkNvbnRleHQoKToge1xuICAgIGF0dHJpYnV0aW9uPzogQXR0cmlidXRpb25Db250ZXh0O1xuICAgIGZpcnN0X3RvdWNoPzogQXR0cmlidXRpb25Db250ZXh0O1xuICB9IHtcbiAgICBjb25zdCBhdHRyaWJ1dGlvbiA9IHRoaXMuYXR0cmlidXRpb24uZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gICAgY29uc3QgZmlyc3RfdG91Y2ggPSB0aGlzLmF0dHJpYnV0aW9uLmdldEZpcnN0VG91Y2goKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKGF0dHJpYnV0aW9uID8geyBhdHRyaWJ1dGlvbiB9IDoge30pLFxuICAgICAgLi4uKGZpcnN0X3RvdWNoID8geyBmaXJzdF90b3VjaCB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudHMgPSB0aGlzLnF1ZXVlLmRyYWluKCk7XG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIElmIG9mZmxpbmUsIG1vdmUgZXZlbnRzIGRpcmVjdGx5IHRvIG9mZmxpbmUgcXVldWVcbiAgICBpZiAoIXRoaXMuY29ubmVjdGl2aXR5LmlzT25saW5lKCkpIHtcbiAgICAgIHRoaXMub2ZmbGluZVF1ZXVlLmVucXVldWUoZXZlbnRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZW50ID0gYXdhaXQgdGhpcy5zZW5kV2l0aFJldHJ5KGV2ZW50cywgMCk7XG4gICAgaWYgKHNlbnQpIHtcbiAgICAgIHRoaXMubGFzdEZsdXNoQXQgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZsdXNoV2l0aEJlYWNvbihldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIGlmIChldmVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgfHwgIW5hdmlnYXRvci5zZW5kQmVhY29uKSByZXR1cm47XG4gICAgY29uc3QgZmlyc3QgPSBldmVudHNbMF07XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJhdGNoOiBldmVudHMubWFwKChlKSA9PiAoe1xuICAgICAgICB0eXBlOiBcInRyYWNrXCIgYXMgY29uc3QsXG4gICAgICAgIGV2ZW50OiBlLmV2ZW50X25hbWUsXG4gICAgICAgIHByb3BlcnRpZXM6IGUuZXZlbnRfcHJvcGVydGllcyA/PyB7fSxcbiAgICAgICAgdGltZXN0YW1wOiBlLnRpbWVzdGFtcCxcbiAgICAgIH0pKSxcbiAgICAgIGNvbnRleHQ6IGZpcnN0XG4gICAgICAgID8ge1xuICAgICAgICAgICAgdXNlcjogeyBpZDogZmlyc3QudXNlcl9pZCA/PyB1bmRlZmluZWQsIGFub255bW91c19pZDogZmlyc3QuYW5vbnltb3VzX2lkIH0sXG4gICAgICAgICAgICBkZXZpY2U6IHtcbiAgICAgICAgICAgICAgaWQ6IGZpcnN0LmRldmljZV9pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGZpcnN0LnBsYXRmb3JtIGFzIFwid2ViXCIgfCBcImlvc1wiIHwgXCJhbmRyb2lkXCIsXG4gICAgICAgICAgICAgIGxvY2FsZTogZmlyc3QubG9jYWxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlc3Npb246IHsgaWQ6IGZpcnN0LnNlc3Npb25faWQgfSxcbiAgICAgICAgICAgIC4uLih0aGlzLmFwcFZlcnNpb24gPyB7IGFwcDogeyB2ZXJzaW9uOiB0aGlzLmFwcFZlcnNpb24gfSB9IDoge30pLFxuICAgICAgICAgICAgLi4udGhpcy5idWlsZEF0dHJpYnV0aW9uQ29udGV4dCgpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSxcbiAgICAgIHNlbnRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAvLyBzZW5kQmVhY29uIGRvZXMgbm90IHN1cHBvcnQgY3VzdG9tIGhlYWRlcnMg4oCUIHBhc3MgYXV0aCB2aWEgcXVlcnkgcGFyYW1zXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L3YxL2luZ2VzdD9hcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX0mZW52PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZW52aXJvbm1lbnQpfWA7XG4gICAgY29uc3Qgc2VudCA9IG5hdmlnYXRvci5zZW5kQmVhY29uKHVybCwgbmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKTtcbiAgICBpZiAoIXNlbnQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJzZW5kQmVhY29uIGZhaWxlZCDigJQgZXZlbnRzIG1heSBiZSBsb3N0IG9uIHBhZ2UgdW5sb2FkLlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRXaXRoUmV0cnkoZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10sIGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJvZHksIGNvbXByZXNzZWQgfSA9IGF3YWl0IHRoaXMuYnVpbGRCb2R5KGV2ZW50cyk7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YCxcbiAgICAgICAgXCJYLUVudmlyb25tZW50XCI6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfTtcbiAgICAgIGlmIChjb21wcmVzc2VkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUVuY29kaW5nXCJdID0gXCJnemlwXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuYXBpVXJsfS92MS9pbmdlc3RgLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAvLyBNYWxmb3JtZWQgYmF0Y2gg4oCUIGRyb3AsIGRvIG5vdCByZXRyeVxuICAgICAgICB0aGlzLmxvZy5lcnJvcihcIkluZ2VzdCA0MDA6IGRyb3BwaW5nIGJhdGNoLlwiLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBwYXJzZUludChyZXMuaGVhZGVycy5nZXQoXCJSZXRyeS1BZnRlclwiKSA/PyBcIjVcIiwgMTApO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBSYXRlIGxpbWl0ZWQsIHJldHJ5aW5nIGFmdGVyICR7cmV0cnlBZnRlcn1zYCk7XG4gICAgICAgIC8vIFJlLXF1ZXVlIGV2ZW50cyBmb3IgbmV4dCBmbHVzaCBjeWNsZVxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB0aGlzLnF1ZXVlLmFkZChlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmdlc3QgNXh4OiAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGbHVzaGVkICR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzLmApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA8IHRoaXMucmV0cnlBdHRlbXB0cyAtIDEpIHtcbiAgICAgICAgY29uc3QgZGVsYXkgPVxuICAgICAgICAgIHRoaXMucmV0cnlCYWNrb2ZmW2F0dGVtcHRdID8/IHRoaXMucmV0cnlCYWNrb2ZmW3RoaXMucmV0cnlCYWNrb2ZmLmxlbmd0aCAtIDFdID8/IDE1MDAwO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBGbHVzaCBhdHRlbXB0ICR7YXR0ZW1wdCArIDF9IGZhaWxlZCwgcmV0cnlpbmcgaW4gJHtkZWxheX1tc2AsIGVycik7XG4gICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFdpdGhSZXRyeShldmVudHMsIGF0dGVtcHQgKyAxKTtcbiAgICAgIH1cbiAgICAgIC8vIE1heCByZXRyaWVzIGV4Y2VlZGVkIOKAlCBtb3ZlIHRvIG9mZmxpbmUgcXVldWVcbiAgICAgIHRoaXMubG9nLmVycm9yKFwiTWF4IHJldHJpZXMgZXhjZWVkZWQsIG1vdmluZyB0byBvZmZsaW5lIHF1ZXVlLlwiLCBlcnIpO1xuICAgICAgdGhpcy5vZmZsaW5lUXVldWUuZW5xdWV1ZShldmVudHMpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRCb2R5KFxuICAgIGV2ZW50czogRW5yaWNoZWRFdmVudFtdLFxuICApOiBQcm9taXNlPHsgYm9keTogc3RyaW5nIHwgQmxvYjsgY29tcHJlc3NlZDogYm9vbGVhbiB9PiB7XG4gICAgLy8gVHJhbnNmb3JtIGVucmljaGVkIGV2ZW50cyBpbnRvIHRoZSBBUEkncyBpbmdlc3RCYXRjaFNjaGVtYSBmb3JtYXQuXG4gICAgLy8gVGhlIEFQSSBleHBlY3RzIHsgYmF0Y2g6IFt7dHlwZSxldmVudCxwcm9wZXJ0aWVzLHRpbWVzdGFtcH1dLCBjb250ZXh0OiB7Li4ufSwgc2VudF9hdCB9XG4gICAgLy8gd2hpbGUgaW50ZXJuYWxseSB3ZSBzdG9yZSBmbGF0IGVucmljaGVkIGV2ZW50cy5cbiAgICBjb25zdCBmaXJzdCA9IGV2ZW50c1swXTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmF0Y2g6IGV2ZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidHJhY2tcIiBhcyBjb25zdCxcbiAgICAgICAgZXZlbnQ6IGUuZXZlbnRfbmFtZSxcbiAgICAgICAgcHJvcGVydGllczogZS5ldmVudF9wcm9wZXJ0aWVzID8/IHt9LFxuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgfSkpLFxuICAgICAgY29udGV4dDogZmlyc3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB1c2VyOiB7IGlkOiBmaXJzdC51c2VyX2lkID8/IHVuZGVmaW5lZCwgYW5vbnltb3VzX2lkOiBmaXJzdC5hbm9ueW1vdXNfaWQgfSxcbiAgICAgICAgICAgIGRldmljZToge1xuICAgICAgICAgICAgICBpZDogZmlyc3QuZGV2aWNlX2lkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZmlyc3QucGxhdGZvcm0gYXMgXCJ3ZWJcIiB8IFwiaW9zXCIgfCBcImFuZHJvaWRcIixcbiAgICAgICAgICAgICAgbG9jYWxlOiBmaXJzdC5sb2NhbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2Vzc2lvbjogeyBpZDogZmlyc3Quc2Vzc2lvbl9pZCB9LFxuICAgICAgICAgICAgLi4uKHRoaXMuYXBwVmVyc2lvbiA/IHsgYXBwOiB7IHZlcnNpb246IHRoaXMuYXBwVmVyc2lvbiB9IH0gOiB7fSksXG4gICAgICAgICAgICAuLi50aGlzLmJ1aWxkQXR0cmlidXRpb25Db250ZXh0KCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9LFxuICAgICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIGlmIChqc29uLmxlbmd0aCA8IDEwMjQpIHJldHVybiB7IGJvZHk6IGpzb24sIGNvbXByZXNzZWQ6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBDb21wcmVzc2lvblN0cmVhbShcImd6aXBcIik7XG4gICAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICB2b2lkIHdyaXRlci53cml0ZShlbmNvZGVyLmVuY29kZShqc29uKSk7XG4gICAgICB2b2lkIHdyaXRlci5jbG9zZSgpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBSZXNwb25zZShzdHJlYW0ucmVhZGFibGUpLmJsb2IoKTtcbiAgICAgIHJldHVybiB7IGJvZHk6IGJsb2IsIGNvbXByZXNzZWQ6IHRydWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbXByZXNzaW9uU3RyZWFtIG5vdCBzdXBwb3J0ZWQg4oCUIHNlbmQgdW5jb21wcmVzc2VkXG4gICAgICByZXR1cm4geyBib2R5OiBqc29uLCBjb21wcmVzc2VkOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTLCBPRkZMSU5FX1FVRVVFX01BWCB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgT2ZmbGluZVF1ZXVlIHtcbiAgZW5xdWV1ZShldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgY29tYmluZWQgPSBbLi4uZXhpc3RpbmcsIC4uLmV2ZW50c107XG4gICAgLy8gS2VlcCBvbmx5IHRoZSBtb3N0IHJlY2VudCBPRkZMSU5FX1FVRVVFX01BWCBldmVudHNcbiAgICBjb25zdCB0cmltbWVkID0gY29tYmluZWQuc2xpY2UoLU9GRkxJTkVfUVVFVUVfTUFYKTtcbiAgICB0aGlzLnNhdmUodHJpbW1lZCk7XG4gIH1cblxuICBkcmFpbigpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMubG9hZCgpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKS5sZW5ndGg7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZCgpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMub2ZmbGluZVF1ZXVlKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gW107XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIEVucmljaGVkRXZlbnRbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmUoZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSwgSlNPTi5zdHJpbmdpZnkoZXZlbnRzKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBRdW90YUV4Y2VlZGVkRXJyb3Ig4oCUIHJlbW92ZSBoYWxmIHRoZSBvbGRlc3QgZXZlbnRzIGFuZCByZXRyeSBvbmNlXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIGVyci5uYW1lID09PSBcIlF1b3RhRXhjZWVkZWRFcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBldmVudHMuc2xpY2UoTWF0aC5mbG9vcihldmVudHMubGVuZ3RoIC8gMikpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5vZmZsaW5lUXVldWUsIEpTT04uc3RyaW5naWZ5KGhhbGYpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZ2l2ZSB1cFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29ubmVjdGl2aXR5TW9uaXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25saW5lQ2FsbGJhY2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVDYWxsYmFja3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgb25PbmxpbmVIYW5kbGVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uT2ZmbGluZUhhbmRsZXI6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vbk9ubGluZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNiIG9mIHRoaXMub25saW5lQ2FsbGJhY2tzKSBjYigpO1xuICAgIH07XG4gICAgdGhpcy5vbk9mZmxpbmVIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBjYiBvZiB0aGlzLm9mZmxpbmVDYWxsYmFja3MpIGNiKCk7XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy5vbk9ubGluZUhhbmRsZXIpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvZmZsaW5lXCIsIHRoaXMub25PZmZsaW5lSGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgaXNPbmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyB0cnVlIDogbmF2aWdhdG9yLm9uTGluZTtcbiAgfVxuXG4gIG9uT25saW5lKGNiOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbmxpbmVDYWxsYmFja3MucHVzaChjYik7XG4gIH1cblxuICBvbk9mZmxpbmUoY2I6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZmxpbmVDYWxsYmFja3MucHVzaChjYik7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLm9uT25saW5lSGFuZGxlcik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9mZmxpbmVcIiwgdGhpcy5vbk9mZmxpbmVIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRXZlbnRRdWV1ZSB9IGZyb20gXCIuL3F1ZXVlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zcG9ydCB9IGZyb20gXCIuL3RyYW5zcG9ydC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxuLyoqXG4gKiBPd25zIHBhZ2UtbGlmZWN5Y2xlIG9ic2VydmFiaWxpdHk6XG4gKlxuICogICAtIExpc3RlbnMgZm9yIGBwYWdlaGlkZWAgLyBgYmVmb3JldW5sb2FkYCBhbmQgZmx1c2hlcyB0aGUgZXZlbnRcbiAqICAgICBxdWV1ZSB2aWEgYmVhY29uIHNvIGluLWZsaWdodCBldmVudHMgc3Vydml2ZSB0YWIgY2xvc2UuXG4gKiAgIC0gVHJhY2tzIHBlci1wYWdlIHN0YXRlIChgZW50cnlUaW1lYCwgYG1heFNjcm9sbFBjdGAsXG4gKiAgICAgYHRhYkhpZGRlbkNvdW50YCwgYGN1bXVsYXRpdmVIaWRkZW5Nc2ApIGFuZCBlbWl0cyBhIHNpbmdsZVxuICogICAgIGAkcGFnZV9sZWF2ZWAgZXZlbnQgcGVyIHBhZ2Ugb24gcmVhbCBleGl0LlxuICpcbiAqIFRoZSBob3N0IFNQQSBtdXN0IGNhbGwgYHJlY29yZFBhZ2VWaWV3KHBhdGgpYCBvbiBldmVyeSByb3V0ZSBjaGFuZ2VcbiAqICh0aGUgUmVhY3QgYDxQYWdlVmlld1RyYWNrZXI+YCBkb2VzIHRoaXMpLiBUaGUgZmlyc3QgY2FsbCBhZnRlclxuICogcmVnaXN0ZXIgc3RhcnRzIHRoZSBwYWdlLWxlYXZlIHRpbWVyOyBzdWJzZXF1ZW50IGNhbGxzIGVtaXQgYVxuICogc3ludGhldGljIGAkcGFnZV9sZWF2ZXtleGl0X2tpbmQ6IFwic3BhX25hdlwifWAgZm9yIHRoZSBwcmV2aW91cyBwYXRoXG4gKiBiZWZvcmUgcmVzZXR0aW5nIHN0YXRlIGZvciB0aGUgbmV3IG9uZS5cbiAqXG4gKiBgdGltZV9vbl9wYWdlX21zYCBhbmQgYGN1bXVsYXRpdmVfaGlkZGVuX21zYCBhcmUgcm91bmRlZCB0byAxMDBtcyDigJRcbiAqIHRoZSBjb25zdW1lciBoYXMgbm8gdXNlIGZvciBzdWItMTAwbXMgcHJlY2lzaW9uIGFuZCByb3VuZGluZyBtYWtlc1xuICogZmluZ2VycHJpbnRzIGhhcmRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZU1hbmFnZXIge1xuICBwcml2YXRlIGhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIGZsdXNoZWRPbkV4aXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsZWF2ZUVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBQZXItcGFnZSBzdGF0ZS4gYGN1cnJlbnRQYXRoID09PSBudWxsYCBtZWFucyByZWNvcmRQYWdlVmlldygpIGhhc1xuICAvLyBuZXZlciBiZWVuIGNhbGxlZCBhbmQgd2UgaGF2ZSBub3RoaW5nIHRvIGVtaXQgYSBsZWF2ZSBldmVudCBmb3IuXG4gIHByaXZhdGUgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVudHJ5VGltZSA9IDA7XG4gIHByaXZhdGUgbWF4U2Nyb2xsUGN0ID0gMDtcbiAgcHJpdmF0ZSB0YWJIaWRkZW5Db3VudCA9IDA7XG4gIHByaXZhdGUgaGlkZGVuU2luY2U6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1bXVsYXRpdmVIaWRkZW5NcyA9IDA7XG4gIHByaXZhdGUgc2Nyb2xsVGhyb3R0bGVUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlOiBFdmVudFF1ZXVlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBUcmFuc3BvcnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVtaXRFdmVudD86IChuYW1lOiBzdHJpbmcsIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBzdGFydCBvZiBhIG5ldyBwYWdlIHZpZXcuIEVtaXRzIGAkcGFnZV9sZWF2ZWAgZm9yIGFueVxuICAgKiBwcmV2aW91cyBwYWdlIGZpcnN0ICh3aXRoIGBleGl0X2tpbmQ6IFwic3BhX25hdlwiYCksIHRoZW4gcmVzZXRzXG4gICAqIHN0YXRlIGZvciB0aGUgbmV3IHBhZ2UuIElkZW1wb3RlbnQgZm9yIHJlcGVhdCBjYWxscyB3aXRoIHRoZSBzYW1lXG4gICAqIHBhdGguXG4gICAqL1xuICByZWNvcmRQYWdlVmlldyhwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aCA9PT0gcGF0aCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoICE9PSBudWxsICYmICF0aGlzLmxlYXZlRW1pdHRlZCkge1xuICAgICAgdGhpcy5lbWl0UGFnZUxlYXZlKFwic3BhX25hdlwiKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGF0aCA9IHBhdGg7XG4gICAgdGhpcy5lbnRyeVRpbWUgPSBub3dNcygpO1xuICAgIHRoaXMubWF4U2Nyb2xsUGN0ID0gMDtcbiAgICB0aGlzLnRhYkhpZGRlbkNvdW50ID0gMDtcbiAgICB0aGlzLmhpZGRlblNpbmNlID0gbnVsbDtcbiAgICB0aGlzLmN1bXVsYXRpdmVIaWRkZW5NcyA9IDA7XG4gICAgdGhpcy5sZWF2ZUVtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZsdXNoZWRPbkV4aXQgPSBmYWxzZTtcbiAgfVxuXG4gIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG5cbiAgICAvLyBVc2UgcGFnZWhpZGUgYXMgdGhlIHByaW1hcnkgZXhpdCBldmVudCAocmVjb21tZW5kZWQgbW9kZXJuIEFQSSkuXG4gICAgLy8gYmVmb3JldW5sb2FkIGlzIGtlcHQgYXMgYSBmYWxsYmFjayBmb3Igb2xkZXIgYnJvd3NlcnMsIGJ1dCBndWFyZGVkXG4gICAgLy8gYWdhaW5zdCBkb3VibGUtZHJhaW5pbmcgdmlhIGBmbHVzaGVkT25FeGl0YC5cbiAgICBjb25zdCBvbkV4aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5mbHVzaGVkT25FeGl0KSByZXR1cm47XG4gICAgICB0aGlzLmZsdXNoZWRPbkV4aXQgPSB0cnVlO1xuICAgICAgdGhpcy5lbWl0UGFnZUxlYXZlKFwicGFnZWhpZGVcIik7XG4gICAgICBjb25zdCBldmVudHMgPSB0aGlzLnF1ZXVlLmRyYWluKCk7XG4gICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuZmx1c2hXaXRoQmVhY29uKGV2ZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uVmlzaWJpbGl0eUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09IFwiaGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy50YWJIaWRkZW5Db3VudCArPSAxO1xuICAgICAgICB0aGlzLmhpZGRlblNpbmNlID0gbm93TXMoKTtcbiAgICAgICAgLy8gQXN5bmMgZmx1c2ggb24gdGFiIGhpZGUgKG5vdCBwYWdlIGNsb3NlKSDigJQgbWF5IG5vdCBjb21wbGV0ZSBidXQgYmVzdC1lZmZvcnRcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSBcInZpc2libGVcIikge1xuICAgICAgICBpZiAodGhpcy5oaWRkZW5TaW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuY3VtdWxhdGl2ZUhpZGRlbk1zICs9IG5vd01zKCkgLSB0aGlzLmhpZGRlblNpbmNlO1xuICAgICAgICAgIHRoaXMuaGlkZGVuU2luY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGV4aXQgZmxhZyB3aGVuIHBhZ2UgYmVjb21lcyB2aXNpYmxlIGFnYWluIChiZmNhY2hlIHJlc3RvcmUpXG4gICAgICAgIHRoaXMuZmx1c2hlZE9uRXhpdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnNjcm9sbFRocm90dGxlVGltZXIgIT09IG51bGwpIHJldHVybjtcbiAgICAgIHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNjcm9sbFRocm90dGxlVGltZXIgPSBudWxsO1xuICAgICAgICBjb25zdCBwY3QgPSBjb21wdXRlU2Nyb2xsUGN0KCk7XG4gICAgICAgIGlmIChwY3QgPiB0aGlzLm1heFNjcm9sbFBjdCkgdGhpcy5tYXhTY3JvbGxQY3QgPSBwY3Q7XG4gICAgICB9LCAyNTApO1xuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIG9uRXhpdCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgb25FeGl0KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCBvblZpc2liaWxpdHlDaGFuZ2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goXG4gICAgICAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIG9uRXhpdCksXG4gICAgICAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBvbkV4aXQpLFxuICAgICAgKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgb25WaXNpYmlsaXR5Q2hhbmdlKSxcbiAgICAgICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIG9uU2Nyb2xsKSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRocm90dGxlVGltZXIpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsVGhyb3R0bGVUaW1lciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKFwiTGlmZWN5Y2xlIGxpc3RlbmVycyByZWdpc3RlcmVkLlwiKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgcmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFBhZ2VMZWF2ZShleGl0S2luZDogXCJwYWdlaGlkZVwiIHwgXCJzcGFfbmF2XCIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sZWF2ZUVtaXR0ZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5jdXJyZW50UGF0aCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbWl0RXZlbnQpIHJldHVybjtcbiAgICB0aGlzLmxlYXZlRW1pdHRlZCA9IHRydWU7XG5cbiAgICBsZXQgY3VtdWxhdGl2ZUhpZGRlbiA9IHRoaXMuY3VtdWxhdGl2ZUhpZGRlbk1zO1xuICAgIGlmICh0aGlzLmhpZGRlblNpbmNlICE9PSBudWxsKSB7XG4gICAgICBjdW11bGF0aXZlSGlkZGVuICs9IG5vd01zKCkgLSB0aGlzLmhpZGRlblNpbmNlO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEV2ZW50KFwiJHBhZ2VfbGVhdmVcIiwge1xuICAgICAgcGF0aDogdGhpcy5jdXJyZW50UGF0aCxcbiAgICAgIHRpbWVfb25fcGFnZV9tczogcm91bmRUbzEwMChub3dNcygpIC0gdGhpcy5lbnRyeVRpbWUpLFxuICAgICAgbWF4X3Njcm9sbF9wY3Q6IHRoaXMubWF4U2Nyb2xsUGN0LFxuICAgICAgdGFiX2hpZGRlbl9jb3VudDogdGhpcy50YWJIaWRkZW5Db3VudCxcbiAgICAgIGN1bXVsYXRpdmVfaGlkZGVuX21zOiByb3VuZFRvMTAwKGN1bXVsYXRpdmVIaWRkZW4pLFxuICAgICAgZXhpdF9raW5kOiBleGl0S2luZCxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBVc2UgRGF0ZS5ub3coKSByYXRoZXIgdGhhbiBwZXJmb3JtYW5jZS5ub3coKSDigJQgd2Ugcm91bmQgdG8gMTAwbXMgc29cbi8vIHRoZSBzdWItbXMgcHJlY2lzaW9uIGlzIHVudXNlZCwgYW5kIERhdGUubm93KCkgaW50ZXJvcGVyYXRlcyBjbGVhbmx5XG4vLyB3aXRoIGB2aS51c2VGYWtlVGltZXJzKClgIHdoaWNoIGRvZXNuJ3QgbW9jayBwZXJmb3JtYW5jZS5ub3coKSBieVxuLy8gZGVmYXVsdC5cbmZ1bmN0aW9uIG5vd01zKCk6IG51bWJlciB7XG4gIHJldHVybiBEYXRlLm5vdygpO1xufVxuXG5mdW5jdGlvbiByb3VuZFRvMTAwKG1zOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChtcyAvIDEwMCkgKiAxMDApO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsUGN0KCk6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIDA7XG4gIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZID8/IDA7XG4gIGNvbnN0IGRvY0hlaWdodCA9IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LnNjcm9sbEhlaWdodCA/PyAwKSAtICh3aW5kb3cuaW5uZXJIZWlnaHQgPz8gMCk7XG4gIGlmIChkb2NIZWlnaHQgPD0gMCkgcmV0dXJuIDEwMDtcbiAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCgoc2Nyb2xsVG9wIC8gZG9jSGVpZ2h0KSAqIDEwMCkpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tIFwiLi9sb2dnZXIuanNcIjtcblxudHlwZSBUcmFja2VyID0gKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JDYXB0dXJlQ29uZmlnIHtcbiAgLyoqIENhcHR1cmUgdW5jYXVnaHQgZXJyb3JzIHZpYSBgd2luZG93Lm9uZXJyb3JgLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBlcnJvcnM/OiBib29sZWFuO1xuICAvKiogQ2FwdHVyZSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zLiBEZWZhdWx0OiB0cnVlLiAqL1xuICByZWplY3Rpb25zPzogYm9vbGVhbjtcbiAgLyoqIEZvcndhcmQgYGdvYXRlY2g6YXV0aC1ldmVudGAgQ3VzdG9tRXZlbnRzIHZlcmJhdGltIGFzIHRyYWNrZWQgZXZlbnRzLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBhdXRoRXZlbnRzPzogYm9vbGVhbjtcbiAgLyoqIE1heCBzdGFjayBmcmFtZXMgbGVuZ3RoIGluIGNoYXJhY3RlcnMuIERlZmF1bHQ6IDQwOTYuICovXG4gIHN0YWNrTGltaXQ/OiBudW1iZXI7XG4gIC8qKiBEZS1kdXAgd2luZG93IGluIG1zIOKAlCBpZGVudGljYWwgZXJyb3JzIHdpdGhpbiB0aGlzIHdpbmRvdyBhcmUgZHJvcHBlZC4gRGVmYXVsdDogMTAwMC4gKi9cbiAgZGVkdXBlV2luZG93TXM/OiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRTOiBSZXF1aXJlZDxFcnJvckNhcHR1cmVDb25maWc+ID0ge1xuICBlcnJvcnM6IHRydWUsXG4gIHJlamVjdGlvbnM6IHRydWUsXG4gIGF1dGhFdmVudHM6IHRydWUsXG4gIHN0YWNrTGltaXQ6IDQwOTYsXG4gIGRlZHVwZVdpbmRvd01zOiAxMDAwLFxufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJFcnJvckNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrOiBUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNmZzogUmVxdWlyZWQ8RXJyb3JDYXB0dXJlQ29uZmlnPjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBsYXN0U2lnbmF0dXJlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2lnbmF0dXJlQXQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHRyYWNrOiBUcmFja2VyLCBsb2c6IExvZ2dlciwgY29uZmlnPzogRXJyb3JDYXB0dXJlQ29uZmlnKSB7XG4gICAgdGhpcy50cmFjayA9IHRyYWNrO1xuICAgIHRoaXMubG9nID0gbG9nO1xuICAgIHRoaXMuY2ZnID0geyAuLi5ERUZBVUxUUywgLi4uKGNvbmZpZyA/PyB7fSkgfTtcbiAgfVxuXG4gIGluc3RhbGwoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG4gICAgY29uc3QgYnJvd3NlciA9IGRldGVjdEJyb3dzZXJUYWcodXNlckFnZW50KTtcblxuICAgIGlmICh0aGlzLmNmZy5lcnJvcnMpIHtcbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXZlbnQ6IEVycm9yRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPVxuICAgICAgICAgIGV2ZW50LmVycm9yICYmIGV2ZW50LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA/IFN0cmluZyhldmVudC5lcnJvci5zdGFjaykuc2xpY2UoMCwgdGhpcy5jZmcuc3RhY2tMaW1pdClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYGVycjoke2V2ZW50Lm1lc3NhZ2V9OiR7ZXZlbnQuZmlsZW5hbWV9OiR7ZXZlbnQubGluZW5vfWA7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzKHNpZ25hdHVyZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zYWZlVHJhY2soXCIkZXJyb3JcIiwge1xuICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICAgICAgc291cmNlOiBldmVudC5maWxlbmFtZSA/PyBudWxsLFxuICAgICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyA/PyBudWxsLFxuICAgICAgICAgIGNvbDogZXZlbnQuY29sbm8gPz8gbnVsbCxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICB0eXBlOiBcInVuY2F1Z2h0X2Vycm9yXCIsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICB1c2VyX2FnZW50OiB1c2VyQWdlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICB0aGlzLmhhbmRsZXJzLnB1c2goKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2ZnLnJlamVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9uUmVqZWN0aW9uID0gKGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXZlbnQucmVhc29uO1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICByZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyByZWFzb24ubWVzc2FnZVxuICAgICAgICAgICAgOiB0eXBlb2YgcmVhc29uID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gcmVhc29uXG4gICAgICAgICAgICAgIDogc2FmZVN0cmluZ2lmeShyZWFzb24pO1xuICAgICAgICBjb25zdCBzdGFjayA9XG4gICAgICAgICAgcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgJiYgcmVhc29uLnN0YWNrXG4gICAgICAgICAgICA/IFN0cmluZyhyZWFzb24uc3RhY2spLnNsaWNlKDAsIHRoaXMuY2ZnLnN0YWNrTGltaXQpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGByZWo6JHttZXNzYWdlfWA7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzKHNpZ25hdHVyZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zYWZlVHJhY2soXCIkZXJyb3JcIiwge1xuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgdHlwZTogXCJ1bmhhbmRsZWRfcmVqZWN0aW9uXCIsXG4gICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICB1c2VyX2FnZW50OiB1c2VyQWdlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIG9uUmVqZWN0aW9uKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMucHVzaCgoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCBvblJlamVjdGlvbikpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNmZy5hdXRoRXZlbnRzKSB7XG4gICAgICBjb25zdCBvbkF1dGhFdmVudCA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gKFxuICAgICAgICAgIGV2ZW50IGFzIEN1c3RvbUV2ZW50PHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICB9PlxuICAgICAgICApLmRldGFpbDtcbiAgICAgICAgaWYgKCFkZXRhaWw/Lm5hbWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zYWZlVHJhY2soZGV0YWlsLm5hbWUsIHtcbiAgICAgICAgICAuLi4oZGV0YWlsLnByb3BlcnRpZXMgPz8ge30pLFxuICAgICAgICAgIGJyb3dzZXIsXG4gICAgICAgICAgdXNlcl9hZ2VudDogdXNlckFnZW50LFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImdvYXRlY2g6YXV0aC1ldmVudFwiLCBvbkF1dGhFdmVudCBhcyBFdmVudExpc3RlbmVyKTtcbiAgICAgIHRoaXMuaGFuZGxlcnMucHVzaCgoKSA9PlxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImdvYXRlY2g6YXV0aC1ldmVudFwiLCBvbkF1dGhFdmVudCBhcyBFdmVudExpc3RlbmVyKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdW5pbnN0YWxsKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVtb3ZlIG9mIHRoaXMuaGFuZGxlcnMpIHJlbW92ZSgpO1xuICAgIHRoaXMuaGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgc3VwcHJlc3Moc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLmxhc3RTaWduYXR1cmUgPT09IHNpZ25hdHVyZSAmJiBub3cgLSB0aGlzLmxhc3RTaWduYXR1cmVBdCA8IHRoaXMuY2ZnLmRlZHVwZVdpbmRvd01zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5sYXN0U2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgIHRoaXMubGFzdFNpZ25hdHVyZUF0ID0gbm93O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc2FmZVRyYWNrKG5hbWU6IHN0cmluZywgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy50cmFjayhuYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJlcnJvciBjYXB0dXJlIHRyYWNrKCkgdGhyZXdcIiwgZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZWN0QnJvd3NlclRhZyh1YTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghdWEpIHJldHVybiBcInVua25vd25cIjtcbiAgY29uc3QgaXNDaHJvbWUgPSAvQ2hyb21lXFwvXFxkLy50ZXN0KHVhKSAmJiAhL0VkZ1xcLy8udGVzdCh1YSk7XG4gIGNvbnN0IGlzRmlyZWZveCA9IC9GaXJlZm94XFwvXFxkLy50ZXN0KHVhKTtcbiAgY29uc3QgaXNTYWZhcmkgPSAvU2FmYXJpXFwvLy50ZXN0KHVhKSAmJiAhaXNDaHJvbWUgJiYgIS9DcmlPU3xGeGlPU3xPUFJcXC8vLnRlc3QodWEpO1xuICByZXR1cm4gaXNDaHJvbWUgPyBcImNocm9tZVwiIDogaXNGaXJlZm94ID8gXCJmaXJlZm94XCIgOiBpc1NhZmFyaSA/IFwic2FmYXJpXCIgOiBcIm90aGVyXCI7XG59XG5cbmZ1bmN0aW9uIHNhZmVTdHJpbmdpZnkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPz8gU3RyaW5nKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cbiIsIi8qKlxuICogSFRUUCBlcnJvciBhdXRvLWNhcHR1cmUg4oCUIHdyYXBzIGB3aW5kb3cuZmV0Y2hgIGFuZCBlbWl0cyBhIHN0cnVjdHVyZWRcbiAqIGAkaHR0cF9lcnJvcmAgZXZlbnQgZm9yIGV2ZXJ5IDR4eC81eHggcmVzcG9uc2Ugb3IgbmV0d29yayBmYWlsdXJlLlxuICpcbiAqIFdoeTogd2l0aG91dCB0aGlzLCBjdXN0b21lcnMgaGF2ZSB0byBoYW5kLWluc3RydW1lbnQgZXZlcnkgZW5kcG9pbnQgdGhhdFxuICogbWlnaHQgcmV0dXJuIGFuIGVycm9yICh0aGUgMDQtMjIgc2lnbi1vdXQgZGVidWcgc2Vzc2lvbiBpcyB0aGUgY2Fub25pY2FsXG4gKiBleGFtcGxlIOKAlCB3ZSBzcGVudCBob3VycyB0aGVvcml6aW5nIGFib3V0IGNvb2tpZSBiZWhhdmlvciBpbnN0ZWFkIG9mXG4gKiByZWFkaW5nIGBjb29raWVfa2V5cz1bXWAgb2ZmIGEgc3RydWN0dXJlZCBldmVudCkuIFdpdGggaXQsIGV2ZXJ5IGZhaWxpbmdcbiAqIHJlcXVlc3QgYmVjb21lcyBhIHF1ZXJ5YWJsZSBldmVudCBvbiB0aGUgR29hVGVjaCBkYXNoYm9hcmQgd2l0aCBlbm91Z2hcbiAqIGNvbnRleHQgdG8gZGlhZ25vc2UgYXV0aCwgQ09SUywgQ0ROLCBhbmQgcHJveHkgYnVncyB3aXRob3V0IHRvdWNoaW5nXG4gKiBjdXN0b21lciBjb2RlLlxuICpcbiAqIERlc2lnbjpcbiAqIC0gTW9ua2V5LXBhdGNoZXMgYHdpbmRvdy5mZXRjaGAgd2l0aCBhbiBpZGVtcG90ZW50IGluc3RhbGwg4oCUIGEgc2Vjb25kXG4gKiAgIGluc3RhbGwoKSBjYWxsIGlzIGEgbm8tb3AuXG4gKiAtIENhcHR1cmVzIENPUlMtZXhwb3NlZCByZXNwb25zZSBoZWFkZXJzIG9ubHkgKFNldC1Db29raWUgaXMgaGlkZGVuIGZyb21cbiAqICAgSmF2YVNjcmlwdCBwZXIgc3BlYywgc28gd2UgY2FwdHVyZSBjb29raWUgKm5hbWVzKiB2aWEgYGRvY3VtZW50LmNvb2tpZWBcbiAqICAgYXMgYSBwcm94eSBmb3IgXCJkaWQgdGhlIHNlcnZlcidzIFNldC1Db29raWUgbGFuZFwiKS5cbiAqIC0gRGVkdXBlIHdpbmRvdyBwcmV2ZW50cyBlcnJvciBsb29wcyAoaWRlbnRpY2FsICh1cmwsIHN0YXR1cykgd2l0aGluXG4gKiAgIGBkZWR1cGVXaW5kb3dNc2AgaXMgZHJvcHBlZCkuXG4gKiAtIE5FVkVSIGNhcHR1cmVzIHJlcXVlc3Qgb3IgcmVzcG9uc2UgYm9kaWVzIOKAlCB0aG9zZSBtYXkgY2Fycnkgc2VjcmV0cy5cbiAqICAgSWYgYSBjdXN0b21lciBuZWVkcyBib2RpZXMgdGhleSBjYW4gZXh0ZW5kIHZpYSB0aGUgYG9uQ2FwdHVyZWAgaG9vay5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG50eXBlIFRyYWNrZXIgPSAoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3JDYXB0dXJlQ29uZmlnIHtcbiAgLyoqIE1hc3RlciBzd2l0Y2guIERlZmF1bHQ6IHRydWUuICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU3RhdHVzIHByZWRpY2F0ZSDigJQgcmV0dXJuIHRydWUgdG8gY2FwdHVyZS4gRGVmYXVsdDogYHMgPj0gNDAwYC5cbiAgICogTmV0d29yayBmYWlsdXJlcyAoZmV0Y2ggcmVqZWN0aW9ucykgYXJlIEFMV0FZUyBjYXB0dXJlZCByZWdhcmRsZXNzLlxuICAgKi9cbiAgc2hvdWxkQ2FwdHVyZT86IChzdGF0dXM6IG51bWJlcikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIFVSTCBwYXR0ZXJucyB0byBleGNsdWRlICh0ZXN0ZWQgd2l0aCBgLnRlc3QodXJsKWApLiBVc2VmdWwgdG8gc2tpcFxuICAgKiBhbmFseXRpY3MvbW9uaXRvcmluZyBlbmRwb2ludHMgdGhhdCB3b3VsZCBvdGhlcndpc2UgcmVjdXJzZS5cbiAgICogRGVmYXVsdDogZXhjbHVkZXMgYC92MS9pbmdlc3RgIGFuZCBgL3YxL2NvbmZpZ2Agb24gdGhlIFNESydzIG93biBBUEkgVVJMLlxuICAgKi9cbiAgZXhjbHVkZVVybFBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKlxuICAgKiBDT1JTLWV4cG9zZWQgcmVzcG9uc2UgaGVhZGVycyB0byBjYXB0dXJlIChsb3dlcmNhc2VkKS4gRGVmYXVsdDpcbiAgICogW1wieC1yZXF1ZXN0LWlkXCIsIFwidmFyeVwiLCBcImNvbnRlbnQtdHlwZVwiLCBcImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpblwiXS5cbiAgICovXG4gIGNhcHR1cmVSZXNwb25zZUhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgLyoqIERlZHVwZSB3aW5kb3cgaW4gbXMg4oCUIGlkZW50aWNhbCAodXJsLCBzdGF0dXMpIGluc2lkZSBpcyBkcm9wcGVkLiBEZWZhdWx0OiAxMDAwLiAqL1xuICBkZWR1cGVXaW5kb3dNcz86IG51bWJlcjtcbiAgLyoqIENhbGxlZCBBRlRFUiB0aGUgZXZlbnQgaXMgdHJhY2tlZCDigJQgaG9vayBmb3IgY3VzdG9tIGVucmljaG1lbnQgb3Igc2lua3MuICovXG4gIG9uQ2FwdHVyZT86IChkZXRhaWw6IEh0dHBFcnJvckV2ZW50RGV0YWlsKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvckV2ZW50RGV0YWlsIHtcbiAgdXJsOiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBzdGF0dXM6IG51bWJlcjsgLy8gMCBmb3IgbmV0d29yayBmYWlsdXJlXG4gIGxhdGVuY3lfbXM6IG51bWJlcjtcbiAgcmVxdWVzdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgcmVzcG9uc2VfaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIE5vbi1IdHRwT25seSBjb29raWUgTkFNRVMgcHJlc2VudCBvbiBkb2N1bWVudC5jb29raWUgYXQgdGhlIHRpbWUgb2ZcbiAgICogdGhlIGVycm9yLiBWYWx1ZXMgYXJlIG5ldmVyIGNhcHR1cmVkLiBUaGlzIGlzIHRoZSBjbGllbnQtc2lkZSBwcm94eVxuICAgKiBmb3IgXCJkaWQgdGhlIHNlcnZlcidzIFNldC1Db29raWUgZ2V0IGFjY2VwdGVkXCIg4oCUIGlmIGFuIGF1dGggZW5kcG9pbnRcbiAgICogNDAxcyBhbmQgdGhlcmUgYXJlIHplcm8gY29va2llcyBvbiB0aGUgb3JpZ2luIHRoYXQgKnNob3VsZCogaGF2ZSBzZXRcbiAgICogb25lLCB0aGUgY29va2llIHdhcyByZWplY3RlZCBieSB0aGUgYnJvd3Nlci5cbiAgICovXG4gIGNvb2tpZV9uYW1lczogc3RyaW5nW107XG4gIC8qKiBcIm5ldHdvcmtfZmFpbHVyZVwiIHwgXCJodHRwX2Vycm9yXCIuICovXG4gIGtpbmQ6IFwibmV0d29ya19mYWlsdXJlXCIgfCBcImh0dHBfZXJyb3JcIjtcbiAgLyoqIFByZXNlbnQgb24ga2luZD1uZXR3b3JrX2ZhaWx1cmUuICovXG4gIGVycm9yX25hbWU/OiBzdHJpbmc7XG4gIC8qKiBQcmVzZW50IG9uIGtpbmQ9bmV0d29ya19mYWlsdXJlLiAqL1xuICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAvKiogVHJ1ZSBpZiB0aGUgZmV0Y2ggd2FzIGFib3J0ZWQgKGUuZy4sIHRpbWVvdXQpLiAqL1xuICBhYm9ydGVkPzogYm9vbGVhbjtcbn1cblxuY29uc3QgREVGQVVMVF9IRUFERVJTID0gW1wieC1yZXF1ZXN0LWlkXCIsIFwidmFyeVwiLCBcImNvbnRlbnQtdHlwZVwiLCBcImFjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpblwiXTtcblxuZXhwb3J0IGNsYXNzIEh0dHBFcnJvckNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYWNrOiBUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNmZzogUmVxdWlyZWQ8XG4gICAgT21pdDxIdHRwRXJyb3JDYXB0dXJlQ29uZmlnLCBcImV4Y2x1ZGVVcmxQYXR0ZXJuc1wiIHwgXCJvbkNhcHR1cmVcIj5cbiAgPiAmIHtcbiAgICBleGNsdWRlVXJsUGF0dGVybnM6IFJlZ0V4cFtdO1xuICAgIG9uQ2FwdHVyZTogKChkZXRhaWw6IEh0dHBFcnJvckV2ZW50RGV0YWlsKSA9PiB2b2lkKSB8IG51bGw7XG4gIH07XG4gIHByaXZhdGUgb3JpZ2luYWxGZXRjaDogdHlwZW9mIGZldGNoIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5zdGFsbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdFNpZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNpZ0F0ID0gMDtcblxuICBjb25zdHJ1Y3Rvcih0cmFjazogVHJhY2tlciwgbG9nOiBMb2dnZXIsIGNvbmZpZz86IEh0dHBFcnJvckNhcHR1cmVDb25maWcpIHtcbiAgICB0aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5jZmcgPSB7XG4gICAgICBlbmFibGVkOiBjb25maWc/LmVuYWJsZWQgPz8gdHJ1ZSxcbiAgICAgIHNob3VsZENhcHR1cmU6IGNvbmZpZz8uc2hvdWxkQ2FwdHVyZSA/PyAoKHMpID0+IHMgPj0gNDAwKSxcbiAgICAgIGV4Y2x1ZGVVcmxQYXR0ZXJuczogY29uZmlnPy5leGNsdWRlVXJsUGF0dGVybnMgPz8gWy9cXC92MVxcL2luZ2VzdFxcYi8sIC9cXC92MVxcL2NvbmZpZ1xcYi9dLFxuICAgICAgY2FwdHVyZVJlc3BvbnNlSGVhZGVyczogY29uZmlnPy5jYXB0dXJlUmVzcG9uc2VIZWFkZXJzID8/IERFRkFVTFRfSEVBREVSUyxcbiAgICAgIGRlZHVwZVdpbmRvd01zOiBjb25maWc/LmRlZHVwZVdpbmRvd01zID8/IDEwMDAsXG4gICAgICBvbkNhcHR1cmU6IGNvbmZpZz8ub25DYXB0dXJlID8/IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGluc3RhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5zdGFsbGVkIHx8ICF0aGlzLmNmZy5lbmFibGVkKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIHdpbmRvdy5mZXRjaCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSB0aGUgdW5ib3VuZCBvcmlnaW5hbCBzbyB1bmluc3RhbGwgY2FuIHJlc3RvcmUgYnkgcmVmZXJlbmNlIOKAlFxuICAgIC8vIGJ1dCBjYWxsIGl0IHdpdGggYC5jYWxsKHdpbmRvdywgLi4uKWAgc28gbmF0aXZlIGJyb3dzZXIgZmV0Y2hcbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgKHdoaWNoIHRocm93IFwiSWxsZWdhbCBpbnZvY2F0aW9uXCIgLyBcIkNhbiBvbmx5IGNhbGxcbiAgICAvLyBXaW5kb3cuZmV0Y2ggb24gaW5zdGFuY2VzIG9mIFdpbmRvd1wiIHdoZW4gaW52b2tlZCBiYXJlKSB3b3JrLlxuICAgIC8vIGpzZG9tJ3MgcG9seWZpbGwgaXMgbG9vc2UgYWJvdXQgYHRoaXNgLCBzbyB0aGUgdW5pdCB0ZXN0cyBkb24ndFxuICAgIC8vIGNhdGNoIHRoaXMg4oCUIG9ubHkgcmVhbCBTYWZhcmkgLyBDaHJvbWUgZG8uXG4gICAgdGhpcy5vcmlnaW5hbEZldGNoID0gd2luZG93LmZldGNoO1xuXG4gICAgLy8gQXJyb3cgcHJlc2VydmVzIGB0aGlzYCB3aXRob3V0IGFsaWFzaW5nOyB0aGUgbGludCBydWxlIGNhdGNoZXMgZXhwbGljaXRcbiAgICAvLyBgY29uc3Qgc2VsZiA9IHRoaXNgIHBhdHRlcm5zIHRoYXQgYXJlIGVycm9yLXByb25lIGluIGNsYXNzIG1ldGhvZHMuXG4gICAgd2luZG93LmZldGNoID0gYXN5bmMgKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCwgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3Qgc3RhcnRlZCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cmwgPSBleHRyYWN0VXJsKGlucHV0KTtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IChcbiAgICAgICAgaW5pdD8ubWV0aG9kID8/IChpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dC5tZXRob2QgOiBcIkdFVFwiKVxuICAgICAgKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9yaWdpbmFsRmV0Y2ghLmNhbGwod2luZG93LCBpbnB1dCwgaW5pdCk7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFNraXAodXJsKSkgcmV0dXJuIHJlcztcbiAgICAgICAgaWYgKCF0aGlzLmNmZy5zaG91bGRDYXB0dXJlKHJlcy5zdGF0dXMpKSByZXR1cm4gcmVzO1xuICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgIGtpbmQ6IFwiaHR0cF9lcnJvclwiLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICAgIGxhdGVuY3lfbXM6IERhdGUubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAgIHJlcXVlc3RfaWQ6IHJlcy5oZWFkZXJzLmdldChcIngtcmVxdWVzdC1pZFwiKSxcbiAgICAgICAgICByZXNwb25zZV9oZWFkZXJzOiB0aGlzLnBsdWNrSGVhZGVycyhyZXMuaGVhZGVycyksXG4gICAgICAgICAgY29va2llX25hbWVzOiB0aGlzLnJlYWRDb29raWVOYW1lcygpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkU2tpcCh1cmwpKSB7XG4gICAgICAgICAgY29uc3QgYWJvcnRlZCA9IGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIjtcbiAgICAgICAgICBjb25zdCBlcnJOYW1lID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6IFwiVW5rbm93bkVycm9yXCI7XG4gICAgICAgICAgY29uc3QgZXJyTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTtcbiAgICAgICAgICB0aGlzLmVtaXQoe1xuICAgICAgICAgICAga2luZDogXCJuZXR3b3JrX2ZhaWx1cmVcIixcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICAgIGxhdGVuY3lfbXM6IERhdGUubm93KCkgLSBzdGFydGVkLFxuICAgICAgICAgICAgcmVxdWVzdF9pZDogbnVsbCxcbiAgICAgICAgICAgIHJlc3BvbnNlX2hlYWRlcnM6IHt9LFxuICAgICAgICAgICAgY29va2llX25hbWVzOiB0aGlzLnJlYWRDb29raWVOYW1lcygpLFxuICAgICAgICAgICAgZXJyb3JfbmFtZTogZXJyTmFtZSxcbiAgICAgICAgICAgIGVycm9yX21lc3NhZ2U6IGVyck1lc3NhZ2UsXG4gICAgICAgICAgICBhYm9ydGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pbnN0YWxsZWQgPSB0cnVlO1xuICB9XG5cbiAgdW5pbnN0YWxsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnN0YWxsZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLm9yaWdpbmFsRmV0Y2gpIHtcbiAgICAgIHdpbmRvdy5mZXRjaCA9IHRoaXMub3JpZ2luYWxGZXRjaDtcbiAgICB9XG4gICAgdGhpcy5vcmlnaW5hbEZldGNoID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbGxlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRTa2lwKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2ZnLmV4Y2x1ZGVVcmxQYXR0ZXJucy5zb21lKChwKSA9PiBwLnRlc3QodXJsKSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXQoZGV0YWlsOiBIdHRwRXJyb3JFdmVudERldGFpbCk6IHZvaWQge1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGAke2RldGFpbC5tZXRob2R9OiR7ZGV0YWlsLnVybH06JHtkZXRhaWwuc3RhdHVzfWA7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5sYXN0U2lnID09PSBzaWduYXR1cmUgJiYgbm93IC0gdGhpcy5sYXN0U2lnQXQgPCB0aGlzLmNmZy5kZWR1cGVXaW5kb3dNcykgcmV0dXJuO1xuICAgIHRoaXMubGFzdFNpZyA9IHNpZ25hdHVyZTtcbiAgICB0aGlzLmxhc3RTaWdBdCA9IG5vdztcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnRyYWNrKFwiJGh0dHBfZXJyb3JcIiwge1xuICAgICAgICB1cmw6IGRldGFpbC51cmwsXG4gICAgICAgIG1ldGhvZDogZGV0YWlsLm1ldGhvZCxcbiAgICAgICAgc3RhdHVzOiBkZXRhaWwuc3RhdHVzLFxuICAgICAgICBsYXRlbmN5X21zOiBkZXRhaWwubGF0ZW5jeV9tcyxcbiAgICAgICAgcmVxdWVzdF9pZDogZGV0YWlsLnJlcXVlc3RfaWQsXG4gICAgICAgIHJlc3BvbnNlX2hlYWRlcnM6IGRldGFpbC5yZXNwb25zZV9oZWFkZXJzLFxuICAgICAgICBjb29raWVfbmFtZXM6IGRldGFpbC5jb29raWVfbmFtZXMsXG4gICAgICAgIGtpbmQ6IGRldGFpbC5raW5kLFxuICAgICAgICAuLi4oZGV0YWlsLmVycm9yX25hbWUgIT09IHVuZGVmaW5lZCA/IHsgZXJyb3JfbmFtZTogZGV0YWlsLmVycm9yX25hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRldGFpbC5lcnJvcl9tZXNzYWdlICE9PSB1bmRlZmluZWQgPyB7IGVycm9yX21lc3NhZ2U6IGRldGFpbC5lcnJvcl9tZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIC4uLihkZXRhaWwuYWJvcnRlZCAhPT0gdW5kZWZpbmVkID8geyBhYm9ydGVkOiBkZXRhaWwuYWJvcnRlZCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiaHR0cC1lcnJvci1jYXB0dXJlIHRyYWNrKCkgdGhyZXdcIiwgZXJyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jZmcub25DYXB0dXJlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNmZy5vbkNhcHR1cmUoZGV0YWlsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKFwiaHR0cC1lcnJvci1jYXB0dXJlIG9uQ2FwdHVyZSgpIHRocmV3XCIsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwbHVja0hlYWRlcnMoaGVhZGVyczogSGVhZGVycyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmNmZy5jYXB0dXJlUmVzcG9uc2VIZWFkZXJzKSB7XG4gICAgICBjb25zdCB2ID0gaGVhZGVycy5nZXQobmFtZSk7XG4gICAgICBpZiAodiAhPT0gbnVsbCkgb3V0W25hbWVdID0gdjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZENvb2tpZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBkb2N1bWVudC5jb29raWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBbXTtcbiAgICBpZiAoZG9jdW1lbnQuY29va2llLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBkb2N1bWVudC5jb29raWVcbiAgICAgIC5zcGxpdChcIjtcIilcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXIudHJpbSgpLnNwbGl0KFwiPVwiKVswXSA/PyBcIlwiKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gbmFtZS5sZW5ndGggPiAwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0VXJsKGlucHV0OiBSZXF1ZXN0SW5mbyB8IFVSTCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBpbnB1dDtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgVVJMKSByZXR1cm4gaW5wdXQudG9TdHJpbmcoKTtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkgcmV0dXJuIGlucHV0LnVybDtcbiAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG4vKipcbiAqIENsaWNrLWZydXN0cmF0aW9uIGRldGVjdG9yIOKAlCBlbWl0cyB0d28gZGlhZ25vc3RpYyBldmVudHM6XG4gKlxuICogICAtIGAkcmFnZV9jbGlja2A6IOKJpTMgY2xpY2tzIHdpdGhpbiBgcmFnZVdpbmRvd01zYCAoMXMgZGVmYXVsdCkgYW5kXG4gKiAgICAgYHJhZ2VSYWRpdXNQeGAgKDUwcHggZGVmYXVsdCkgb2YgZWFjaCBvdGhlci4gSW5kaWNhdGVzIHRoZSB1c2VyXG4gKiAgICAgaGFtbWVyZWQgdGhlIHNhbWUgVUkgZWxlbWVudCBleHBlY3RpbmcgYSByZXNwb25zZS5cbiAqICAgLSBgJGRlYWRfY2xpY2tgOiBjbGljayBvbiBhbiBlbGVtZW50IHRoYXQgaGFzIG5vIGludGVyYWN0aXZlXG4gKiAgICAgYW5jZXN0b3IgKGJ1dHRvbiAvIGEgLyBpbnB1dCAvIHNlbGVjdCAvIHRleHRhcmVhIC8gW3JvbGU9YnV0dG9uXSAvXG4gKiAgICAgW3RhYmluZGV4XSAvIFtjb250ZW50ZWRpdGFibGVdKS4gSW5kaWNhdGVzIHRoZSB1c2VyIGV4cGVjdGVkIHRoZVxuICogICAgIHRhcmdldCB0byBiZSBjbGlja2FibGUuXG4gKlxuICogQm90aCBzaWduYWxzIGFyZSBiZXN0LWVmZm9ydCBoZXVyaXN0aWNzIOKAlCB0aGUgZ29hbCBpcyB0byBzdXJmYWNlXG4gKiBmcnVzdHJhdGVkIFVYIHBhdHRlcm5zIGF0IHRoZSBkYXNoYm9hcmQgbGF5ZXIsIG5vdCB0byBiZSAxMDAlXG4gKiBhY2N1cmF0ZS4gUGVyLXNlY29uZCBlbWl0IGNhcCAoYG1heEVtaXRzUGVyU2VjYCkgcHJldmVudHMgYW5cbiAqIGFuZ3J5LWNsaWNrIHN0b3JtIGZyb20gZHJvd25pbmcgdGhlIHF1ZXVlLlxuICpcbiAqIFByaXZhY3k6IHdlIGNhcHR1cmUgY29vcmRpbmF0ZXMgKyBhIHN0YWJsZSB0YXJnZXQgc2VsZWN0b3JcbiAqIChgdGFnTmFtZSArICNpZCArIC5jbGFzcy5saXN0YCkg4oCUIG5ldmVyIGlubmVyIHRleHQsIGF0dHJpYnV0ZVxuICogdmFsdWVzLCBvciBmb3JtIGRhdGEuXG4gKi9cbnR5cGUgVHJhY2tlciA9IChldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaWNrRnJ1c3RyYXRpb25Db25maWcge1xuICAvKiogRGV0ZWN0IHJhZ2UgY2xpY2tzLiBEZWZhdWx0OiB0cnVlLiAqL1xuICByYWdlPzogYm9vbGVhbjtcbiAgLyoqIERldGVjdCBkZWFkIGNsaWNrcy4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgZGVhZD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY2xpY2tzIHdpdGhpbiB3aW5kb3crcmFkaXVzIHRoYXQgY29uc3RpdHV0ZSByYWdlLiBEZWZhdWx0OiAzLiAqL1xuICByYWdlVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogVGltZSB3aW5kb3cgZm9yIHJhZ2UgY2x1c3RlcmluZy4gRGVmYXVsdDogMTAwMG1zLiAqL1xuICByYWdlV2luZG93TXM/OiBudW1iZXI7XG4gIC8qKiBQaXhlbCByYWRpdXMgZm9yIHJhZ2UgY2x1c3RlcmluZy4gRGVmYXVsdDogNTAuICovXG4gIHJhZ2VSYWRpdXNQeD86IG51bWJlcjtcbiAgLyoqIENhcCB0aGUgZW1pc3Npb24gcmF0ZSAoY29tYmluZWQgcmFnZStkZWFkKS4gRGVmYXVsdDogNS9zZWMuICovXG4gIG1heEVtaXRzUGVyU2VjPzogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUUzogUmVxdWlyZWQ8Q2xpY2tGcnVzdHJhdGlvbkNvbmZpZz4gPSB7XG4gIHJhZ2U6IHRydWUsXG4gIGRlYWQ6IHRydWUsXG4gIHJhZ2VUaHJlc2hvbGQ6IDMsXG4gIHJhZ2VXaW5kb3dNczogMTAwMCxcbiAgcmFnZVJhZGl1c1B4OiA1MCxcbiAgbWF4RW1pdHNQZXJTZWM6IDUsXG59O1xuXG5jb25zdCBJTlRFUkFDVElWRV9UQUdTID0gbmV3IFNldChbXG4gIFwiQVwiLFxuICBcIkJVVFRPTlwiLFxuICBcIklOUFVUXCIsXG4gIFwiU0VMRUNUXCIsXG4gIFwiVEVYVEFSRUFcIixcbiAgXCJMQUJFTFwiLFxuICBcIlNVTU1BUllcIixcbiAgXCJPUFRJT05cIixcbiAgXCJERVRBSUxTXCIsXG5dKTtcblxuaW50ZXJmYWNlIENsaWNrUmVjb3JkIHtcbiAgdDogbnVtYmVyO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrRnJ1c3RyYXRpb25DYXB0dXJlIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFjazogVHJhY2tlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjZmc6IFJlcXVpcmVkPENsaWNrRnJ1c3RyYXRpb25Db25maWc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIHJlY2VudDogQ2xpY2tSZWNvcmRbXSA9IFtdO1xuICBwcml2YXRlIHJhZ2VDb29sZG93blVudGlsID0gMDtcbiAgcHJpdmF0ZSBlbWl0c1RoaXNTZWNvbmQgPSAwO1xuICBwcml2YXRlIGVtaXRzU2Vjb25kU3RhcnRlZEF0ID0gMDtcblxuICBjb25zdHJ1Y3Rvcih0cmFjazogVHJhY2tlciwgbG9nOiBMb2dnZXIsIGNvbmZpZz86IENsaWNrRnJ1c3RyYXRpb25Db25maWcpIHtcbiAgICB0aGlzLnRyYWNrID0gdHJhY2s7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5jZmcgPSB7IC4uLkRFRkFVTFRTLCAuLi4oY29uZmlnID8/IHt9KSB9O1xuICB9XG5cbiAgaW5zdGFsbCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuXG4gICAgY29uc3Qgb25DbGljayA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIEJvb2trZWVwaW5nIGZvciByYWdlIGRldGVjdGlvbiDigJQga2VlcCBvbmx5IGNsaWNrcyBpbnNpZGUgdGhlIHdpbmRvdy5cbiAgICAgIHRoaXMucmVjZW50LnB1c2goeyB0OiBub3csIHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfSk7XG4gICAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB0aGlzLmNmZy5yYWdlV2luZG93TXM7XG4gICAgICB0aGlzLnJlY2VudCA9IHRoaXMucmVjZW50LmZpbHRlcigoYykgPT4gYy50ID49IGN1dG9mZik7XG5cbiAgICAgIGlmICh0aGlzLmNmZy5yYWdlKSB0aGlzLm1heWJlRW1pdFJhZ2UodGFyZ2V0LCBub3cpO1xuICAgICAgaWYgKHRoaXMuY2ZnLmRlYWQpIHRoaXMubWF5YmVFbWl0RGVhZChldmVudCwgdGFyZ2V0LCBub3cpO1xuICAgIH07XG5cbiAgICAvLyBCdWJibGUgcGhhc2UgKGNhcHR1cmU6IGZhbHNlKSBzbyBhcHAgaGFuZGxlcnMgaGF2ZSBhbHJlYWR5IHJ1biBieVxuICAgIC8vIHRoZSB0aW1lIHdlIG9ic2VydmUgdGhlIGV2ZW50LiBUaGF0IGxldHMgdXMgcmVhZCBgZGVmYXVsdFByZXZlbnRlZGBcbiAgICAvLyBhbmQgc2tpcCAkZGVhZF9jbGljayBmb3IgY2xpY2tzIHRoZSBwYWdlIGFjdHVhbGx5IGhhbmRsZWQuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2ssIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG9uQ2xpY2spKTtcblxuICAgIHRoaXMubG9nLmRlYnVnKFwiQ2xpY2stZnJ1c3RyYXRpb24gbGlzdGVuZXJzIHJlZ2lzdGVyZWQuXCIpO1xuICB9XG5cbiAgdW5pbnN0YWxsKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVtb3ZlIG9mIHRoaXMuaGFuZGxlcnMpIHJlbW92ZSgpO1xuICAgIHRoaXMuaGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlY2VudCA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXliZUVtaXRSYWdlKHRhcmdldDogRWxlbWVudCwgbm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAobm93IDwgdGhpcy5yYWdlQ29vbGRvd25VbnRpbCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlY2VudC5sZW5ndGggPCB0aGlzLmNmZy5yYWdlVGhyZXNob2xkKSByZXR1cm47XG5cbiAgICAvLyBBbmNob3Igb24gdGhlIG1vc3QgcmVjZW50IGNsaWNrIGFuZCBjb3VudCBjbHVzdGVyIG1lbWJlcnMuXG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5yZWNlbnRbdGhpcy5yZWNlbnQubGVuZ3RoIC0gMV0hO1xuICAgIGxldCBjbHVzdGVyID0gMDtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5yZWNlbnQpIHtcbiAgICAgIGNvbnN0IGR4ID0gYy54IC0gYW5jaG9yLng7XG4gICAgICBjb25zdCBkeSA9IGMueSAtIGFuY2hvci55O1xuICAgICAgaWYgKGR4ICogZHggKyBkeSAqIGR5IDw9IHRoaXMuY2ZnLnJhZ2VSYWRpdXNQeCAqIHRoaXMuY2ZnLnJhZ2VSYWRpdXNQeCkgY2x1c3RlciArPSAxO1xuICAgIH1cbiAgICBpZiAoY2x1c3RlciA8IHRoaXMuY2ZnLnJhZ2VUaHJlc2hvbGQpIHJldHVybjtcbiAgICBpZiAoIXRoaXMudHJ5RW1pdChub3cpKSByZXR1cm47XG5cbiAgICAvLyBDb29sZG93biBzbyBhIDUtY2xpY2sgYnVyc3QgZG9lc24ndCBmaXJlIDMgdGltZXMuXG4gICAgdGhpcy5yYWdlQ29vbGRvd25VbnRpbCA9IG5vdyArIHRoaXMuY2ZnLnJhZ2VXaW5kb3dNcztcblxuICAgIHRoaXMuc2FmZVRyYWNrKFwiJHJhZ2VfY2xpY2tcIiwge1xuICAgICAgdGFyZ2V0OiB0YXJnZXRTZWxlY3Rvcih0YXJnZXQpLFxuICAgICAgY2x1c3Rlcl9zaXplOiBjbHVzdGVyLFxuICAgICAgeDogYW5jaG9yLngsXG4gICAgICB5OiBhbmNob3IueSxcbiAgICAgIHBhdGg6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLnBhdGhuYW1lIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWF5YmVFbWl0RGVhZChldmVudDogTW91c2VFdmVudCwgdGFyZ2V0OiBFbGVtZW50LCBub3c6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFByZXZlbnQtZGVmYXVsdCBjb3VudHMgYXMgXCJ0aGUgcGFnZSBoYW5kbGVkIGl0XCIg4oCUIGRvbid0IGVtaXQuXG4gICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcbiAgICBpZiAoaXNJbnRlcmFjdGl2ZSh0YXJnZXQpKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnRyeUVtaXQobm93KSkgcmV0dXJuO1xuXG4gICAgdGhpcy5zYWZlVHJhY2soXCIkZGVhZF9jbGlja1wiLCB7XG4gICAgICB0YXJnZXQ6IHRhcmdldFNlbGVjdG9yKHRhcmdldCksXG4gICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgeTogZXZlbnQuY2xpZW50WSxcbiAgICAgIHBhdGg6IHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLnBhdGhuYW1lIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5RW1pdChub3c6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChub3cgLSB0aGlzLmVtaXRzU2Vjb25kU3RhcnRlZEF0ID49IDEwMDApIHtcbiAgICAgIHRoaXMuZW1pdHNTZWNvbmRTdGFydGVkQXQgPSBub3c7XG4gICAgICB0aGlzLmVtaXRzVGhpc1NlY29uZCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmVtaXRzVGhpc1NlY29uZCA+PSB0aGlzLmNmZy5tYXhFbWl0c1BlclNlYykgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZW1pdHNUaGlzU2Vjb25kICs9IDE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNhZmVUcmFjayhuYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudHJhY2sobmFtZSwgcHJvcGVydGllcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiY2xpY2stZnJ1c3RyYXRpb24gdHJhY2soKSB0aHJld1wiLCBlcnIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIGxldCBjdXI6IEVsZW1lbnQgfCBudWxsID0gZWw7XG4gIGxldCBkZXB0aCA9IDA7XG4gIHdoaWxlIChjdXIgJiYgZGVwdGggPCA4KSB7XG4gICAgaWYgKElOVEVSQUNUSVZFX1RBR1MuaGFzKGN1ci50YWdOYW1lKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgcm9sZSA9IGN1ci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgIGlmIChyb2xlICYmIC9eKGJ1dHRvbnxsaW5rfHRhYnxzd2l0Y2h8Y2hlY2tib3h8cmFkaW98bWVudWl0ZW18b3B0aW9uKSQvLnRlc3Qocm9sZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY3VyLmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGN1ci5oYXNBdHRyaWJ1dGUoXCJkYXRhLWNsaWNrYWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgY3VyID0gY3VyLnBhcmVudEVsZW1lbnQ7XG4gICAgZGVwdGggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRhcmdldFNlbGVjdG9yKGVsOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBpZCA9IGVsLmlkID8gYCMke2VsLmlkfWAgOiBcIlwiO1xuICBjb25zdCBjbGFzc2VzID1cbiAgICBlbC5jbGFzc0xpc3QubGVuZ3RoID4gMCA/IGAuJHtBcnJheS5mcm9tKGVsLmNsYXNzTGlzdCkuc2xpY2UoMCwgMykuam9pbihcIi5cIil9YCA6IFwiXCI7XG4gIHJldHVybiBgJHt0YWd9JHtpZH0ke2NsYXNzZXN9YC5zbGljZSgwLCAxMjApO1xufVxuIiwiLyoqXG4gKiBBdWRpdCBFLTAxMCDigJQgb25lLXBhc3MgbWlncmF0aW9uIGZvciB0aGUgTGF1bmNoUGFkIOKGkiBHb2FUZWNoIHN0b3JhZ2VcbiAqIGtleSByZW5hbWUuIFJ1bnMgb25jZSBhdCBTREsgaW5pdC4gRm9yIGV2ZXJ5IGBndF8qYCBrZXkgdGhhdCdzIGVtcHR5XG4gKiBidXQgaGFzIGEgcG9wdWxhdGVkIGBscF8qYCBsZWdhY3kgc2libGluZywgY29weSB0aGUgdmFsdWUgYWNyb3NzIHNvXG4gKiBleGlzdGluZyB1c2VycyBkb24ndCBsb3NlIHRoZWlyIGRldmljZSBpZCwgaWRlbnRpdHksIG9mZmxpbmUgZXZlbnRcbiAqIHF1ZXVlLCBhdHRyaWJ1dGlvbiwgb3IgZXhwZXJpbWVudCBhc3NpZ25tZW50cy5cbiAqXG4gKiBJZGVtcG90ZW50OiBhIG1hcmtlciBrZXkgKGBndF9zdG9yYWdlX21pZ3JhdGlvbl92MWApIHJlY29yZHMgdGhlIHJ1blxuICogc28gc3Vic2VxdWVudCBpbml0cyBza2lwIHRoZSB3b3JrLiBTYWZlIHRvIHJlLXJ1biB3aXRoIG5vIHNpZGVcbiAqIGVmZmVjdHMgaWYgdGhlIG1hcmtlciBpcyB3aXBlZC5cbiAqXG4gKiBEZWZlbnNpdmU6IGV2ZXJ5IHN0b3JhZ2UgY2FsbCBpcyB3cmFwcGVkIOKAlCBTYWZhcmkgUHJpdmF0ZSBNb2RlLCBsb3dcbiAqIGRpc2ssIGFuZCBzdG9yYWdlLXF1b3RhIERPTUV4Y2VwdGlvbnMgZG9uJ3QgYWJvcnQgU0RLIGluaXQuXG4gKlxuICogVGhlIGxlZ2FjeSBgbHBfKmAgc3RyaW5ncyBsaXZlIE9OTFkgaW4gdGhpcyBmaWxlLiBDb25zdW1lcnMgYWx3YXlzXG4gKiBpbXBvcnQgYFNUT1JBR0VfS0VZUy48bmFtZT5gIGZyb20gYGRlZmF1bHRzLnRzYC5cbiAqL1xuXG5jb25zdCBNSUdSQVRJT05fTUFSS0VSX0tFWSA9IFwiZ3Rfc3RvcmFnZV9taWdyYXRpb25fdjFcIjtcbmNvbnN0IE1JR1JBVElPTl9NQVJLRVJfVkFMVUUgPSBcImRvbmVcIjtcblxuaW50ZXJmYWNlIEtleU1pZ3JhdGlvbiB7XG4gIHJlYWRvbmx5IHN0b3JhZ2U6IFwibG9jYWxcIiB8IFwic2Vzc2lvblwiO1xuICByZWFkb25seSBsZWdhY3k6IHN0cmluZztcbiAgcmVhZG9ubHkgY3VycmVudDogc3RyaW5nO1xufVxuXG5jb25zdCBLRVlfTUFQOiByZWFkb25seSBLZXlNaWdyYXRpb25bXSA9IFtcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9kZXZpY2VfaWRcIiwgY3VycmVudDogXCJndF9kZXZpY2VfaWRcIiB9LFxuICB7IHN0b3JhZ2U6IFwibG9jYWxcIiwgbGVnYWN5OiBcImxwX2Fub255bW91c19pZFwiLCBjdXJyZW50OiBcImd0X2Fub255bW91c19pZFwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfaWRlbnRpdHlcIiwgY3VycmVudDogXCJndF9pZGVudGl0eVwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfY29uZmlnXCIsIGN1cnJlbnQ6IFwiZ3RfY29uZmlnXCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9vZmZsaW5lX3F1ZXVlXCIsIGN1cnJlbnQ6IFwiZ3Rfb2ZmbGluZV9xdWV1ZVwiIH0sXG4gIHsgc3RvcmFnZTogXCJsb2NhbFwiLCBsZWdhY3k6IFwibHBfZXhwX2Fzc2lnbm1lbnRzXCIsIGN1cnJlbnQ6IFwiZ3RfZXhwX2Fzc2lnbm1lbnRzXCIgfSxcbiAgeyBzdG9yYWdlOiBcImxvY2FsXCIsIGxlZ2FjeTogXCJscF9maXJzdF90b3VjaFwiLCBjdXJyZW50OiBcImd0X2ZpcnN0X3RvdWNoXCIgfSxcbiAgeyBzdG9yYWdlOiBcInNlc3Npb25cIiwgbGVnYWN5OiBcImxwX3Nlc3Npb25faWRcIiwgY3VycmVudDogXCJndF9zZXNzaW9uX2lkXCIgfSxcbiAgeyBzdG9yYWdlOiBcInNlc3Npb25cIiwgbGVnYWN5OiBcImxwX3Nlc3Npb25fbGFzdF9zZWVuXCIsIGN1cnJlbnQ6IFwiZ3Rfc2Vzc2lvbl9sYXN0X3NlZW5cIiB9LFxuICB7IHN0b3JhZ2U6IFwic2Vzc2lvblwiLCBsZWdhY3k6IFwibHBfc2Vzc2lvbl9hdHRyaWJ1dGlvblwiLCBjdXJyZW50OiBcImd0X3Nlc3Npb25fYXR0cmlidXRpb25cIiB9LFxuXTtcblxuZnVuY3Rpb24gc2FmZUdldChzdG9yZTogU3RvcmFnZSwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RvcmUuZ2V0SXRlbShrZXkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlU2V0KHN0b3JlOiBTdG9yYWdlLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIHN0b3JlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIC8qIHN3YWxsb3cg4oCUIHF1b3RhIGV4Y2VlZGVkIC8gcHJpdmF0ZSBtb2RlIC8gZXRjLiAqL1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVSZW1vdmUoc3RvcmU6IFN0b3JhZ2UsIGtleTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgc3RvcmUucmVtb3ZlSXRlbShrZXkpO1xuICB9IGNhdGNoIHtcbiAgICAvKiBzd2FsbG93ICovXG4gIH1cbn1cblxuLyoqXG4gKiBNaWdyYXRlIGBscF8qYCDihpIgYGd0XypgIG9uY2UuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIsIG5vLW9wIHdoZW5cbiAqIHRoZSBtYXJrZXIgaXMgc2V0LiBQdWJsaWMgc28gdGVzdHMgKyBmdXR1cmUgbWlncmF0aW9ucyBjYW4gc3R1Yi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGVMZWdhY3lTdG9yYWdlS2V5cygpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgY29uc3QgbG9jYWwgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICBjb25zdCBzZXNzaW9uID0gd2luZG93LnNlc3Npb25TdG9yYWdlO1xuICBpZiAoIWxvY2FsIHx8ICFzZXNzaW9uKSByZXR1cm47XG5cbiAgLy8gSWRlbXBvdGVuY3kgbWFya2VyIOKAlCByZWFkIGZyb20gbG9jYWxTdG9yYWdlIChzdGlja3kgYWNyb3NzIHRhYnMpLlxuICBpZiAoc2FmZUdldChsb2NhbCwgTUlHUkFUSU9OX01BUktFUl9LRVkpID09PSBNSUdSQVRJT05fTUFSS0VSX1ZBTFVFKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBLRVlfTUFQKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBlbnRyeS5zdG9yYWdlID09PSBcImxvY2FsXCIgPyBsb2NhbCA6IHNlc3Npb247XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzYWZlR2V0KHN0b3JlLCBlbnRyeS5jdXJyZW50KTtcbiAgICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1pZ3JhdGVkIG9yIGZyZXNobHktd3JpdHRlblxuICAgIGNvbnN0IGxlZ2FjeSA9IHNhZmVHZXQoc3RvcmUsIGVudHJ5LmxlZ2FjeSk7XG4gICAgaWYgKGxlZ2FjeSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgc2FmZVNldChzdG9yZSwgZW50cnkuY3VycmVudCwgbGVnYWN5KTtcbiAgICAvLyBSZW1vdmUgdGhlIGxlZ2FjeSBrZXkgc28gRGV2VG9vbHMgc2hvd3MgYSBjbGVhbiBcImd0XypcIiBzdXJmYWNlLlxuICAgIC8vIFNhZmU6IHRoZSBuZXcga2V5IGhvbGRzIHRoZSB2YWx1ZTsgbm90aGluZyBlbHNlIHJlYWRzIGBscF8qYCBhZnRlclxuICAgIC8vIHRoaXMgcG9pbnQuXG4gICAgc2FmZVJlbW92ZShzdG9yZSwgZW50cnkubGVnYWN5KTtcbiAgfVxuXG4gIHNhZmVTZXQobG9jYWwsIE1JR1JBVElPTl9NQVJLRVJfS0VZLCBNSUdSQVRJT05fTUFSS0VSX1ZBTFVFKTtcbn1cbiIsImltcG9ydCB7IERFRkFVTFRTLCBFVkVOVF9OQU1FX01BWF9MRU5HVEgsIFNES19WRVJTSU9OIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0J1cyB9IGZyb20gXCIuL2RpYWdub3N0aWMtYnVzLmpzXCI7XG5pbXBvcnQgeyBDb250ZXh0TWFuYWdlciB9IGZyb20gXCIuL2NvbnRleHQuanNcIjtcbmltcG9ydCB7IEV2ZW50UXVldWUgfSBmcm9tIFwiLi9xdWV1ZS5qc1wiO1xuaW1wb3J0IHsgRmxhZ01hbmFnZXIgfSBmcm9tIFwiLi9mbGFncy5qc1wiO1xuaW1wb3J0IHsgRXhwZXJpbWVudE1hbmFnZXIgfSBmcm9tIFwiLi9leHBlcmltZW50cy5qc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4vaWRlbnRpdHkuanNcIjtcbmltcG9ydCB7IENvbmZpZ1N5bmMgfSBmcm9tIFwiLi9jb25maWctc3luYy5qc1wiO1xuaW1wb3J0IHsgVHJhbnNwb3J0IH0gZnJvbSBcIi4vdHJhbnNwb3J0LmpzXCI7XG5pbXBvcnQgeyBPZmZsaW5lUXVldWUgfSBmcm9tIFwiLi9vZmZsaW5lLmpzXCI7XG5pbXBvcnQgeyBDb25uZWN0aXZpdHlNb25pdG9yIH0gZnJvbSBcIi4vY29ubmVjdGl2aXR5LmpzXCI7XG5pbXBvcnQgeyBMaWZlY3ljbGVNYW5hZ2VyIH0gZnJvbSBcIi4vbGlmZWN5Y2xlLmpzXCI7XG5pbXBvcnQgeyBCcm93c2VyRXJyb3JDYXB0dXJlIH0gZnJvbSBcIi4vZXJyb3ItY2FwdHVyZS5qc1wiO1xuaW1wb3J0IHsgSHR0cEVycm9yQ2FwdHVyZSB9IGZyb20gXCIuL2h0dHAtZXJyb3ItY2FwdHVyZS5qc1wiO1xuaW1wb3J0IHsgQ2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUgfSBmcm9tIFwiLi9jbGljay1mcnVzdHJhdGlvbi5qc1wiO1xuaW1wb3J0IHsgbWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzIH0gZnJvbSBcIi4vc3RvcmFnZS1taWdyYXRpb24uanNcIjtcbmltcG9ydCB7XG4gIGdldERldmljZUlkLFxuICBzZXREZXZpY2VJZCxcbiAgZ2V0RGV2aWNlSW5mbyxcbiAgZ2VuZXJhdGVBbm9ueW1vdXNJZCxcbiAgcmVnaXN0ZXJEZXZpY2UsXG59IGZyb20gXCIuL2RldmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljRXZlbnQgfSBmcm9tIFwiLi9kaWFnbm9zdGljcy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBHb2FUZWNoQ29uZmlnLFxuICBSZXNvbHZlZENvbmZpZyxcbiAgRmxhZ1ZhbHVlLFxuICBFeHBlcmltZW50UmVzdWx0LFxuICBTREtTdGF0dXMsXG4gIFNES0NvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgSUdvYVRlY2ggfSBmcm9tIFwiLi9pbnRlcmZhY2VzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBHb2FUZWNoIGltcGxlbWVudHMgSUdvYVRlY2gge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogR29hVGVjaCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2ZnOiBSZXNvbHZlZENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IERpYWdub3N0aWNCdXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dE1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEV2ZW50UXVldWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmxhZ01hbmFnZXI6IEZsYWdNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cGVyaW1lbnRNYW5hZ2VyOiBFeHBlcmltZW50TWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpZGVudGl0eU1hbmFnZXI6IElkZW50aXR5TWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTeW5jOiBDb25maWdTeW5jO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydDogVHJhbnNwb3J0O1xuICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVRdWV1ZTogT2ZmbGluZVF1ZXVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpdml0eTogQ29ubmVjdGl2aXR5TW9uaXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBsaWZlY3ljbGU6IExpZmVjeWNsZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JDYXB0dXJlOiBCcm93c2VyRXJyb3JDYXB0dXJlIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwRXJyb3JDYXB0dXJlOiBIdHRwRXJyb3JDYXB0dXJlIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGlja0ZydXN0cmF0aW9uQ2FwdHVyZTogQ2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUgfCBudWxsO1xuXG4gIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IFJlc29sdmVkQ29uZmlnLCBsb2c6IExvZ2dlciwgYnVzOiBEaWFnbm9zdGljQnVzKSB7XG4gICAgdGhpcy5jZmcgPSBjb25maWc7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5idXMgPSBidXM7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHRNYW5hZ2VyKCk7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBFdmVudFF1ZXVlKGNvbmZpZy5tYXhRdWV1ZVNpemUpO1xuICAgIHRoaXMuZmxhZ01hbmFnZXIgPSBuZXcgRmxhZ01hbmFnZXIoKTtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLnNldERlYnVnTW9kZSh0aGlzLmNmZy5kZWJ1Zyk7XG4gICAgdGhpcy5leHBlcmltZW50TWFuYWdlciA9IG5ldyBFeHBlcmltZW50TWFuYWdlcigpO1xuICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyID0gbmV3IElkZW50aXR5TWFuYWdlcihsb2cpO1xuICAgIHRoaXMub2ZmbGluZVF1ZXVlID0gbmV3IE9mZmxpbmVRdWV1ZSgpO1xuICAgIHRoaXMuY29ubmVjdGl2aXR5ID0gbmV3IENvbm5lY3Rpdml0eU1vbml0b3IoKTtcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUcmFuc3BvcnQoXG4gICAgICBjb25maWcuYXBpVXJsLFxuICAgICAgY29uZmlnLmFwaUtleSxcbiAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIGNvbmZpZy5yZXRyeUF0dGVtcHRzLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHRoaXMub2ZmbGluZVF1ZXVlLFxuICAgICAgdGhpcy5jb25uZWN0aXZpdHksXG4gICAgICBsb2csXG4gICAgICBjb25maWcuYXBwVmVyc2lvbixcbiAgICAgIHtcbiAgICAgICAgZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uOiAoKSA9PiB0aGlzLmNvbnRleHQuZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uKCksXG4gICAgICAgIGdldEZpcnN0VG91Y2g6ICgpID0+IHRoaXMuY29udGV4dC5nZXRGaXJzdFRvdWNoKCksXG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5saWZlY3ljbGUgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcih0aGlzLnF1ZXVlLCB0aGlzLnRyYW5zcG9ydCwgbG9nLCAobmFtZSwgcHJvcHMpID0+XG4gICAgICB0aGlzLnRyYWNrKG5hbWUsIHByb3BzKSxcbiAgICApO1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMuY2ZnLmF1dG9DYXB0dXJlRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgY2FwdHVyZUNmZyA9XG4gICAgICAgIHR5cGVvZiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUVycm9ycyA9PT0gXCJvYmplY3RcIiA/IHRoaXMuY2ZnLmF1dG9DYXB0dXJlRXJyb3JzIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5lcnJvckNhcHR1cmUgPSBuZXcgQnJvd3NlckVycm9yQ2FwdHVyZShcbiAgICAgICAgKG5hbWUsIHByb3BzKSA9PiB0aGlzLnRyYWNrKG5hbWUsIHByb3BzKSxcbiAgICAgICAgbG9nLFxuICAgICAgICBjYXB0dXJlQ2ZnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvckNhcHR1cmUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUh0dHBFcnJvcnMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBodHRwQ2ZnID1cbiAgICAgICAgdHlwZW9mIHRoaXMuY2ZnLmF1dG9DYXB0dXJlSHR0cEVycm9ycyA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gdGhpcy5jZmcuYXV0b0NhcHR1cmVIdHRwRXJyb3JzXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmh0dHBFcnJvckNhcHR1cmUgPSBuZXcgSHR0cEVycm9yQ2FwdHVyZShcbiAgICAgICAgKG5hbWUsIHByb3BzKSA9PiB0aGlzLnRyYWNrKG5hbWUsIHByb3BzKSxcbiAgICAgICAgbG9nLFxuICAgICAgICBodHRwQ2ZnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5odHRwRXJyb3JDYXB0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5jZmcuYXV0b0NhcHR1cmVDbGlja0ZydXN0cmF0aW9uICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgY2xpY2tDZmcgPVxuICAgICAgICB0eXBlb2YgdGhpcy5jZmcuYXV0b0NhcHR1cmVDbGlja0ZydXN0cmF0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyB0aGlzLmNmZy5hdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb25cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUgPSBuZXcgQ2xpY2tGcnVzdHJhdGlvbkNhcHR1cmUoXG4gICAgICAgIChuYW1lLCBwcm9wcykgPT4gdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgICAgIGxvZyxcbiAgICAgICAgY2xpY2tDZmcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb25maWdTeW5jID0gbmV3IENvbmZpZ1N5bmMoXG4gICAgICBjb25maWcuYXBpVXJsLFxuICAgICAgY29uZmlnLmFwaUtleSxcbiAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIGNvbmZpZy5jb25maWdSZWZyZXNoSW50ZXJ2YWwsXG4gICAgICBsb2csXG4gICAgICAoY2ZnOiBTREtDb25maWcpID0+IHRoaXMuYXBwbHlDb25maWcoY2ZnKSxcbiAgICApO1xuICB9XG5cbiAgLy8gLS0tIFN0YXRpYyBBUEkgLS0tXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldywgaW5kZXBlbmRlbnQgR29hVGVjaCBpbnN0YW5jZS5cbiAgICogVGhlIGNhbGxlciBvd25zIHRoZSBpbnN0YW5jZSBsaWZlY3ljbGUg4oCUIG5vIGdsb2JhbCBzdGF0ZS5cbiAgICogUHJlZmVycmVkIGZvciBSZWFjdCBhcHBzIChwYXNzIGluc3RhbmNlIHRvIENvbnRleHQpLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShjb25maWc6IEdvYVRlY2hDb25maWcpOiBHb2FUZWNoIHtcbiAgICAvLyBBdWRpdCBFLTAxMCDigJQgY29weSBhbnkgcHJlLWV4aXN0aW5nIGBscF8qYCBzdG9yYWdlIGVudHJpZXMgaW50b1xuICAgIC8vIHRoZSBuZXcgYGd0XypgIHNsb3RzIGJlZm9yZSBhbnkgb3RoZXIgaW5pdCBjb2RlIHRvdWNoZXMgc3RvcmFnZS5cbiAgICAvLyBJZGVtcG90ZW50ICsgYnJvd3Nlci1vbmx5OyBuby1vcCBvbiBOb2RlIC8gc2Vjb25kIGNhbGwuXG4gICAgbWlncmF0ZUxlZ2FjeVN0b3JhZ2VLZXlzKCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBBUEkga2V5IGZvcm1hdC4gT25seSBwdWJsaXNoYWJsZSBrZXlzIChscF9wdWJfKikgYXJlIGFjY2VwdGVkIOKAlFxuICAgIC8vIHNlY3JldCBrZXlzIGJlbG9uZyBpbiBAZ29hdGVjaC9zZXJ2ZXIsIGRldiBrZXlzIGluIEBnb2F0ZWNoL2NsaS5cbiAgICAvLyBDYW5vbmljYWwgcGF0dGVybjogcGFja2FnZXMvc2RrLWF1dGgtanMvc3JjL2F1dGgtY2xpZW50LnRzIFBVQkxJU0hBQkxFX0tFWV9SRUdFWC5cbiAgICBpZiAoIS9ebHBfcHViX1thLXowLTldezN9X1thLWYwLTldezY0fSQvLnRlc3QoY29uZmlnLmFwaUtleSkpIHtcbiAgICAgIC8vIEdpdmUgYSB0YXJnZXRlZCBtZXNzYWdlIGZvciB0aGUgdHdvIG1vc3QgY29tbW9uIG1pcy1jb25maWd1cmF0aW9uc1xuICAgICAgLy8gKHBhc3RpbmcgYSBzZWNyZXQga2V5LCBwYXN0aW5nIGEgZGV2IGtleSkgdnMuIGEgZnVsbHktbWFsZm9ybWVkIHN0cmluZy5cbiAgICAgIC8vIEFsbCB0aHJlZSBhcmUgaGFyZCBlcnJvcnMg4oCUIHRoZXJlIGlzIG5vIHJ1bnRpbWUgd2hlcmUgYSBub24tcHVibGlzaGFibGVcbiAgICAgIC8vIGtleSBpcyBzYWZlIHRvIHVzZSB3aXRoIHRoaXMgU0RLLlxuICAgICAgaWYgKC9ebHBfc2VjXy8udGVzdChjb25maWcuYXBpS2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJbR29hVGVjaF0gU2VjcmV0IGtleXMgKGxwX3NlY18qKSBjYW5ub3QgYmUgdXNlZCB3aXRoIEBzaGVlcGl0LWFpL3Nkay1qcy4gXCIgK1xuICAgICAgICAgICAgXCJUaGlzIFNESyBpcyBmb3IgY2xpZW50LXNpZGUgLyBwdWJsaXNoYWJsZS1rZXkgdXNlLiBcIiArXG4gICAgICAgICAgICBcIlVzZSBAc2hlZXBpdC1haS9zZXJ2ZXIgZm9yIHNlcnZlci1zaWRlIGNvZGUuXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoL15scF9kZXZfLy50ZXN0KGNvbmZpZy5hcGlLZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIltHb2FUZWNoXSBEZXZlbG9wZXIga2V5cyAobHBfZGV2XyopIGNhbm5vdCBiZSB1c2VkIHdpdGggQHNoZWVwaXQtYWkvc2RrLWpzLiBcIiArXG4gICAgICAgICAgICBcIkRldiBrZXlzIGFyZSBmb3IgQ0xJIC8gY29kZWdlbiB1c2Ugb25seS4gXCIgK1xuICAgICAgICAgICAgXCJVc2UgQGdvYXRlY2gvY2xpIGZvciBkZXZlbG9wZXIgdG9vbGluZy5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltHb2FUZWNoXSBJbnZhbGlkIEFQSSBrZXkgZm9ybWF0LiBFeHBlY3RlZCBscF9wdWJfLi4uIChwdWJsaXNoYWJsZSBrZXkpLlwiKTtcbiAgICB9XG4gICAgLy8gTWVyZ2UgZGVmYXVsdHNcbiAgICBjb25zdCBtZXJnZWQ6IFJlc29sdmVkQ29uZmlnID0ge1xuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxuICAgICAgYXBpVXJsOiBjb25maWcuYXBpVXJsID8/IERFRkFVTFRTLmFwaVVybCxcbiAgICAgIGVudmlyb25tZW50OiBjb25maWcuZW52aXJvbm1lbnQgPz8gREVGQVVMVFMuZW52aXJvbm1lbnQsXG4gICAgICBmbHVzaEludGVydmFsOiBjb25maWcuZmx1c2hJbnRlcnZhbCA/PyBERUZBVUxUUy5mbHVzaEludGVydmFsLFxuICAgICAgZmx1c2hTaXplOiBjb25maWcuZmx1c2hTaXplID8/IERFRkFVTFRTLmZsdXNoU2l6ZSxcbiAgICAgIGRlYnVnOiBjb25maWcuZGVidWcgPz8gREVGQVVMVFMuZGVidWcsXG4gICAgICBjb25maWdSZWZyZXNoSW50ZXJ2YWw6IGNvbmZpZy5jb25maWdSZWZyZXNoSW50ZXJ2YWwgPz8gREVGQVVMVFMuY29uZmlnUmVmcmVzaEludGVydmFsLFxuICAgICAgbWF4UXVldWVTaXplOiBjb25maWcubWF4UXVldWVTaXplID8/IERFRkFVTFRTLm1heFF1ZXVlU2l6ZSxcbiAgICAgIHJldHJ5QXR0ZW1wdHM6IGNvbmZpZy5yZXRyeUF0dGVtcHRzID8/IERFRkFVTFRTLnJldHJ5QXR0ZW1wdHMsXG4gICAgICBvbkV2ZW50OiBjb25maWcub25FdmVudCxcbiAgICAgIG9uRGlhZ25vc3RpYzogY29uZmlnLm9uRGlhZ25vc3RpYyxcbiAgICAgIGRpYWdub3N0aWNCdWZmZXJTaXplOiBjb25maWcuZGlhZ25vc3RpY0J1ZmZlclNpemUgPz8gREVGQVVMVFMuZGlhZ25vc3RpY0J1ZmZlclNpemUsXG4gICAgICBhdXRvQ2FwdHVyZUVycm9yczogY29uZmlnLmF1dG9DYXB0dXJlRXJyb3JzID8/IHRydWUsXG4gICAgICAvLyBEZWZhdWx0IE9GRiB1bnRpbCBiYXR0bGUtdGVzdGVkIGluIHRoZSB3aWxkLiBPcHQtaW4gZm9yIGFwcHMgdGhhdCB3YW50IGl0LlxuICAgICAgLy8gTW9ua2V5LXBhdGNoaW5nIHdpbmRvdy5mZXRjaCBpcyByaXNreSDigJQganNkb20gZG9lc24ndCBlbmZvcmNlIG5hdGl2ZSdzXG4gICAgICAvLyBgdGhpcyA9PT0gd2luZG93YCBjb250cmFjdCwgc28gdW5pdCB0ZXN0cyBjYW4gbWlzcyByZWFsLWJyb3dzZXIgYnVncy5cbiAgICAgIGF1dG9DYXB0dXJlSHR0cEVycm9yczogY29uZmlnLmF1dG9DYXB0dXJlSHR0cEVycm9ycyA/PyBmYWxzZSxcbiAgICAgIGF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvbjogY29uZmlnLmF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvbiA/PyB0cnVlLFxuICAgICAgYXBwVmVyc2lvbjogY29uZmlnLmFwcFZlcnNpb24gPz8gbnVsbCxcbiAgICB9O1xuICAgIGNvbnN0IGJ1cyA9IG5ldyBEaWFnbm9zdGljQnVzKG1lcmdlZC5kaWFnbm9zdGljQnVmZmVyU2l6ZSk7XG4gICAgaWYgKG1lcmdlZC5vbkRpYWdub3N0aWMpIHtcbiAgICAgIGJ1cy5zdWJzY3JpYmUobWVyZ2VkLm9uRGlhZ25vc3RpYyk7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IG5ldyBMb2dnZXIobWVyZ2VkLmRlYnVnLCBidXMpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEdvYVRlY2gobWVyZ2VkLCBsb2csIGJ1cyk7XG4gICAgaW5zdGFuY2Uuc3RhcnQoKTtcbiAgICBsb2cuZGlhZ25vc3RpYyhcImluZm9cIiwgXCJsaWZlY3ljbGVcIiwgXCJsaWZlY3ljbGUuaW5pdF9va1wiLCBcIlNESyBpbml0aWFsaXplZFwiLCB7XG4gICAgICBlbnZpcm9ubWVudDogbWVyZ2VkLmVudmlyb25tZW50LFxuICAgICAgYXBpVXJsOiBtZXJnZWQuYXBpVXJsLFxuICAgIH0pO1xuICAgIGxvZy5kZWJ1ZyhcIkluaXRpYWxpemVkXCIsIHtcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleS5zbGljZSgwLCAxMCkgKyBcIi4uLlwiLFxuICAgICAgZW52aXJvbm1lbnQ6IG1lcmdlZC5lbnZpcm9ubWVudCxcbiAgICAgIGFwaVVybDogbWVyZ2VkLmFwaVVybCxcbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2luZ2xldG9uIGluc3RhbmNlLiBSZXR1cm5zIGV4aXN0aW5nIGluc3RhbmNlIGlmIGFscmVhZHlcbiAgICogaW5pdGlhbGl6ZWQgKGxvZ3MgYSB3YXJuaW5nKS4gQ2FsbCBgZGVzdHJveSgpYCBmaXJzdCB0byByZS1pbml0aWFsaXplLlxuICAgKlxuICAgKiBGb3IgUmVhY3QgYXBwcywgcHJlZmVyIGBHb2FUZWNoLmNyZWF0ZSgpYCArIENvbnRleHQgaW5zdGVhZC5cbiAgICovXG4gIHN0YXRpYyBpbml0KGNvbmZpZzogR29hVGVjaENvbmZpZyk6IEdvYVRlY2gge1xuICAgIGlmIChHb2FUZWNoLmluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICBHb2FUZWNoLmluc3RhbmNlLmxvZy53YXJuKFxuICAgICAgICBcImluaXQoKSBjYWxsZWQgYWZ0ZXIgYWxyZWFkeSBpbml0aWFsaXplZC4gQ2FsbCBkZXN0cm95KCkgZmlyc3QgdG8gcmUtaW5pdGlhbGl6ZS4gUmV0dXJuaW5nIGV4aXN0aW5nIGluc3RhbmNlLlwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBHb2FUZWNoLmluc3RhbmNlO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IEdvYVRlY2guY3JlYXRlKGNvbmZpZyk7XG4gICAgR29hVGVjaC5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4gVGhyb3dzIGlmIGBpbml0KClgIHdhcyBuZXZlciBjYWxsZWQuICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBHb2FUZWNoIHtcbiAgICBpZiAoR29hVGVjaC5pbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0dvYVRlY2hdIE5vdCBpbml0aWFsaXplZC4gQ2FsbCBHb2FUZWNoLmluaXQoKSBmaXJzdC5cIik7XG4gICAgfVxuICAgIHJldHVybiBHb2FUZWNoLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2luZ2xldG9uIGhhcyBiZWVuIGluaXRpYWxpemVkIHZpYSBgaW5pdCgpYC5cbiAgICogVXNlZnVsIGZvciBITVIgZ3VhcmRzIGFuZCBjb25kaXRpb25hbCBpbml0aWFsaXphdGlvbi5cbiAgICovXG4gIHN0YXRpYyBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBHb2FUZWNoLmluc3RhbmNlICE9PSBudWxsO1xuICB9XG5cbiAgLy8gLS0tIEluc3RhbmNlIEFQSSAtLS1cblxuICAvKipcbiAgICogUXVldWUgYW4gYW5hbHl0aWNzIGV2ZW50LiBBdXRvLWZsdXNoZXMgd2hlbiB0aGUgcXVldWUgcmVhY2hlc1xuICAgKiBgZmx1c2hTaXplYCAoZGVmYXVsdCAyMCkgb3Igd2hlbiB0aGUgcGVyaW9kaWMgZmx1c2ggdGltZXIgZmlyZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGd0LnRyYWNrKFwiY291cnNlX3ZpZXdlZFwiLCB7IGNvdXJzZV9pZDogXCJjXzEyM1wiLCBzb3VyY2U6IFwiY2F0YWxvZ1wiIH0pO1xuICAgKi9cbiAgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5sb2cud2FybihcInRyYWNrKCkgY2FsbGVkIGFmdGVyIGRlc3Ryb3koKS4gSWdub3JpbmcuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdmFsaWRhdGVFdmVudE5hbWUoZXZlbnROYW1lKTtcbiAgICBjb25zdCBjdHggPSB0aGlzLmNvbnRleHQuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgZXZlbnRfaWQ6IGdlbmVyYXRlQW5vbnltb3VzSWQoKSxcbiAgICAgIGV2ZW50X25hbWU6IG5hbWUsXG4gICAgICBldmVudF9wcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuICAgICAgZGV2aWNlX2lkOiBjdHguZGV2aWNlX2lkLFxuICAgICAgYW5vbnltb3VzX2lkOiBjdHguYW5vbnltb3VzX2lkLFxuICAgICAgc2Vzc2lvbl9pZDogY3R4LnNlc3Npb25faWQsXG4gICAgICB1c2VyX2lkOiBjdHgudXNlcl9pZCxcbiAgICAgIHBsYXRmb3JtOiBjdHgucGxhdGZvcm0sXG4gICAgICBhcHBfdmVyc2lvbjogdGhpcy5jZmcuYXBwVmVyc2lvbiA/PyB1bmRlZmluZWQsXG4gICAgICBzZGtfdmVyc2lvbjogY3R4LnNka192ZXJzaW9uLFxuICAgICAgbG9jYWxlOiBjdHgubG9jYWxlLFxuICAgICAgdGltZXpvbmU6IGN0eC50aW1lem9uZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgdGhpcy5xdWV1ZS5hZGQoZXZlbnQpO1xuICAgIHRoaXMuY29udGV4dC50b3VjaFNlc3Npb24oKTtcbiAgICAvLyBOb3RpZnkgb25FdmVudCBjYWxsYmFjayAod3JhcHBlZCB0byBwcmV2ZW50IGNhbGxlciBlcnJvcnMgZnJvbSBicmVha2luZyB0cmFjaylcbiAgICB0cnkge1xuICAgICAgdGhpcy5jZmcub25FdmVudD8uKG5hbWUsIHByb3BlcnRpZXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihcIm9uRXZlbnQgY2FsbGJhY2sgdGhyZXdcIiwgZXJyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVldWUuc2l6ZSgpID49IHRoaXMuY2ZnLmZsdXNoU2l6ZSkge1xuICAgICAgdGhpcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFRyYWNrZWQ6ICR7bmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgZmVhdHVyZSBmbGFnIGZvciB0aGUgY3VycmVudCBkZXZpY2UgKyBpZGVudGl0eS4gUmVhZHNcbiAgICogdGhlIGNhY2hlZCBzZXJ2ZXItZXZhbHVhdGVkIHZhbHVlIGZyb20gYC92MS9jb25maWdgIChyZWZyZXNoZWQgb25cbiAgICogYGNvbmZpZ1JlZnJlc2hJbnRlcnZhbGApLiBGaXJlcyBgJGZsYWdfZXhwb3N1cmVgIG9uY2UgcGVyIHNlc3Npb25cbiAgICogcGVyIGZsYWcuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGlmIChndC5mbGFnKFwibmV3X2NoZWNrb3V0X2Zsb3dcIiwgZmFsc2UpKSB7XG4gICAqICAgcmVuZGVyTmV3Q2hlY2tvdXQoKTtcbiAgICogfVxuICAgKi9cbiAgZmxhZyhmbGFnS2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogRmxhZ1ZhbHVlID0gZmFsc2UpOiBGbGFnVmFsdWUge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5sb2cud2FybihcImZsYWcoKSBjYWxsZWQgYWZ0ZXIgZGVzdHJveSgpLiBSZXR1cm5pbmcgZGVmYXVsdC5cIik7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mbGFnTWFuYWdlci5ldmFsdWF0ZShcbiAgICAgIGZsYWdLZXksXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICB0aGlzLmNvbnRleHQuZ2V0VXNlcklkKCksXG4gICAgICB0aGlzLmNvbnRleHQuZ2V0VXNlclRyYWl0cygpLFxuICAgICAgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy50cmFjayhcIiRmbGFnX2V4cG9zdXJlXCIsIHsgZmxhZ19rZXk6IGtleSwgZmxhZ192YWx1ZTogdmFsdWUgfSk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZUZsYWcoa2V5OiBzdHJpbmcsIHZhbHVlOiBGbGFnVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLm92ZXJyaWRlRmxhZyhrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyT3ZlcnJpZGVzKCk6IHZvaWQge1xuICAgIHRoaXMuZmxhZ01hbmFnZXIuY2xlYXJPdmVycmlkZXMoKTtcbiAgfVxuXG4gIGdldE92ZXJyaWRlcygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ01hbmFnZXIuZ2V0T3ZlcnJpZGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYnVja2V0ZWQgdmFyaWFudCArIHBheWxvYWQgZm9yIGFuIGV4cGVyaW1lbnQuIFN0aWNreVxuICAgKiBwZXIgZGV2aWNlLiBGaXJlcyBgJGV4cGVyaW1lbnRfZXhwb3N1cmVgIG9uY2UgcGVyIHNlc3Npb24gcGVyXG4gICAqIGV4cGVyaW1lbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHsgdmFyaWFudCwgcGF5bG9hZCB9ID0gZ3QuZXhwZXJpbWVudChcImhlcm9faDFfY29weV92MVwiKTtcbiAgICogaWYgKHZhcmlhbnQgIT09IFwiY29udHJvbFwiKSBzZXRIZWFkbGluZSgocGF5bG9hZCBhcyB7IGhlYWRsaW5lOiBzdHJpbmcgfSkuaGVhZGxpbmUpO1xuICAgKi9cbiAgZXhwZXJpbWVudChleHBlcmltZW50S2V5OiBzdHJpbmcpOiBFeHBlcmltZW50UmVzdWx0IHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJleHBlcmltZW50KCkgY2FsbGVkIGFmdGVyIGRlc3Ryb3koKS4gUmV0dXJuaW5nIGNvbnRyb2wuXCIpO1xuICAgICAgcmV0dXJuIHsgdmFyaWFudDogXCJjb250cm9sXCIgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwZXJpbWVudE1hbmFnZXIucmVzb2x2ZShleHBlcmltZW50S2V5LCAoa2V5LCB2YXJpYW50KSA9PiB7XG4gICAgICB0aGlzLnRyYWNrKFwiJGV4cGVyaW1lbnRfZXhwb3N1cmVcIiwge1xuICAgICAgICBleHBlcmltZW50X2tleToga2V5LFxuICAgICAgICB2YXJpYW50LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGllIHRoZSBjdXJyZW50IGRldmljZSB0byBhIHN0YWJsZSB1c2VyIGlkIGFuZCBtZXJnZSB0cmFpdHMgb250b1xuICAgKiB0aGUgR29hVGVjaCB1c2VyIHJlY29yZC4gUmUtaWRlbnRpZnlpbmcgd2l0aCBhIGRpZmZlcmVudCB1c2VySWRcbiAgICogY2xlYXJzIHRoZSBjYWNoZWQgZXhwZXJpbWVudCBhc3NpZ25tZW50cyBzbyB0aGUgbmV3IGlkZW50aXR5XG4gICAqIGdldHMgZnJlc2ggYnVja2V0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgYXBpLmxvZ2luKGZvcm0pO1xuICAgKiBndC5pZGVudGlmeShcInVzZXJfYWJjMTIzXCIsIHsgZW1haWw6IFwiamFuZUBleGFtcGxlLmNvbVwiLCBwbGFuOiBcInByb1wiIH0pO1xuICAgKi9cbiAgaWRlbnRpZnkodXNlcklkOiBzdHJpbmcsIHRyYWl0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiaWRlbnRpZnkoKSBjYWxsZWQgYWZ0ZXIgZGVzdHJveSgpLiBJZ25vcmluZy5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyLmlkZW50aWZ5KHVzZXJJZCwgdHJhaXRzLCB7XG4gICAgICBnZXRDdXJyZW50VXNlcklkOiAoKSA9PiB0aGlzLmNvbnRleHQuZ2V0VXNlcklkKCksXG4gICAgICBzZXRVc2VySWQ6IChpZCkgPT4gdGhpcy5jb250ZXh0LnNldFVzZXJJZChpZCksXG4gICAgICB1cGRhdGVUcmFpdHM6ICh0KSA9PiB0aGlzLmNvbnRleHQudXBkYXRlVXNlclByb3BlcnRpZXModCksXG4gICAgICByZXNldFNlc3Npb246ICgpID0+IHRoaXMuY29udGV4dC5yZXNldElkZW50aXR5KCksXG4gICAgICBjbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50czogKCkgPT4gdGhpcy5leHBlcmltZW50TWFuYWdlci5jbGVhckFzc2lnbm1lbnRzKCksXG4gICAgICBmbHVzaDogKCkgPT4gdGhpcy5mbHVzaCgpLFxuICAgICAgcG9zdElkZW50aXR5UmVzb2x2ZTogKHVpZCwgcHJldklkKSA9PiB7XG4gICAgICAgIHRoaXMucG9zdElkZW50aXR5UmVzb2x2ZSh1aWQsIHByZXZJZCkuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKFwiSWRlbnRpdHkgcmVzb2x2ZSBmYWlsZWRcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmdldCB0aGUgY3VycmVudCBpZGVudGl0eSArIGV4cGVyaW1lbnQgYXNzaWdubWVudHMgYW5kIHN0YXJ0IGFcbiAgICogZnJlc2ggYW5vbnltb3VzIHNlc3Npb24uIENhbGwgb24gbG9nb3V0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBhd2FpdCBhcGkubG9nb3V0KCk7XG4gICAqIGd0LnJlc2V0KCk7XG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmlkZW50aXR5TWFuYWdlci5yZXNldCh7XG4gICAgICByZXNldFNlc3Npb246ICgpID0+IHRoaXMuY29udGV4dC5yZXNldElkZW50aXR5KCksXG4gICAgICBjbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50czogKCkgPT4gdGhpcy5leHBlcmltZW50TWFuYWdlci5jbGVhckFzc2lnbm1lbnRzKCksXG4gICAgICBmbHVzaDogKCkgPT4gdGhpcy5mbHVzaCgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWluIGFueSBxdWV1ZWQgZXZlbnRzIHRvIHRoZSBHb2FUZWNoIGluZ2VzdCBlbmRwb2ludC4gVXNlZnVsXG4gICAqIGJlZm9yZSBuYXZpZ2F0aW9uIGluIHNpbmdsZS1wYWdlIGFwcHMgYW5kIHJlcXVpcmVkIGJlZm9yZVxuICAgKiBWZXJjZWwvTGFtYmRhIGZ1bmN0aW9uIGV4aXRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByb3V0ZXIuYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAqICAgYXdhaXQgZ3QuZmx1c2goKTtcbiAgICogfSk7XG4gICAqL1xuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5mbHVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmeSB0aGUgU0RLIG9mIGEgcm91dGUgY2hhbmdlLiBUaGUgZmlyc3QgY2FsbCBzdGFydHMgYSBwYWdlLWxlYXZlXG4gICAqIHRpbWVyOyBzdWJzZXF1ZW50IGNhbGxzIGVtaXQgYSBzeW50aGV0aWMgYCRwYWdlX2xlYXZlYCBmb3IgdGhlIHByaW9yXG4gICAqIHJvdXRlICh3aXRoIGBleGl0X2tpbmQ6IFwic3BhX25hdlwiYCkgYmVmb3JlIHJlc2V0dGluZyBzdGF0ZS4gV2lyZVxuICAgKiB0aGlzIGludG8geW91ciByb3V0ZXIg4oCUIGZvciBOZXh0LmpzLCB1c2UgYDxQYWdlVmlld1RyYWNrZXI+YCBmcm9tXG4gICAqIGBAc2hlZXBpdC1haS9yZWFjdGAsIHdoaWNoIGNhbGxzIHRoaXMgZm9yIHlvdS5cbiAgICpcbiAgICogSWRlbXBvdGVudCBmb3IgcmVwZWF0IGNhbGxzIHdpdGggdGhlIHNhbWUgcGF0aC5cbiAgICovXG4gIHJlY29yZFBhZ2VWaWV3KHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMubGlmZWN5Y2xlLnJlY29yZFBhZ2VWaWV3KHBhdGgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IFNES1N0YXR1cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXRpYWxpemVkOiAhdGhpcy5kZXN0cm95ZWQsXG4gICAgICBvbmxpbmU6IHRoaXMuY29ubmVjdGl2aXR5LmlzT25saW5lKCksXG4gICAgICBxdWV1ZURlcHRoOiB0aGlzLnF1ZXVlLnNpemUoKSxcbiAgICAgIG9mZmxpbmVRdWV1ZURlcHRoOiB0aGlzLm9mZmxpbmVRdWV1ZS5zaXplKCksXG4gICAgICBsYXN0Rmx1c2hBdDogdGhpcy50cmFuc3BvcnQuZ2V0TGFzdEZsdXNoQXQoKSxcbiAgICAgIGRldmljZUlkOiB0aGlzLmNvbnRleHQuZ2V0RGV2aWNlSWQoKSxcbiAgICAgIHVzZXJJZDogdGhpcy5jb250ZXh0LmdldFVzZXJJZCgpLFxuICAgICAgZmxhZ0NvdW50OiB0aGlzLmZsYWdNYW5hZ2VyLmNvdW50KCksXG4gICAgICBleHBlcmltZW50Q291bnQ6IHRoaXMuZXhwZXJpbWVudE1hbmFnZXIuY291bnQoKSxcbiAgICAgIHNka1ZlcnNpb246IFNES19WRVJTSU9OLFxuICAgIH07XG4gIH1cblxuICBkaWFnbm9zdGljcygpOiBEaWFnbm9zdGljQnVzIHtcbiAgICByZXR1cm4gdGhpcy5idXM7XG4gIH1cblxuICBnZXRSZWNlbnREaWFnbm9zdGljcygpOiBEaWFnbm9zdGljRXZlbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVzLmdldFJlY2VudERpYWdub3N0aWNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBhbGwgdGltZXJzLCBkcmFpbiByZW1haW5pbmcgZXZlbnRzLCBhbmQgdGVhciBkb3duIGF1dG8tZXJyb3JcbiAgICogKyBsaWZlY3ljbGUgbGlzdGVuZXJzLiBBZnRlciBgZGVzdHJveSgpYCBmdXJ0aGVyIGB0cmFjaygpYCAvXG4gICAqIGBmbGFnKClgIGNhbGxzIGFyZSBuby1vcHMuIElkZW1wb3RlbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFJlcGxhY2luZyB0aGUgU0RLIGluc3RhbmNlIChyYXJlOyB1c3VhbGx5IGp1c3QgY2FsbCBvbmNlKVxuICAgKiBjb25zdCBvbGQgPSBHb2FUZWNoLmdldEluc3RhbmNlKCk7XG4gICAqIG9sZC5kZXN0cm95KCk7XG4gICAqIGNvbnN0IGZyZXNoID0gR29hVGVjaC5pbml0KHsgYXBpS2V5OiBuZXh0S2V5IH0pO1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgLy8gZmlyZS1hbmQtZm9yZ2V0IGZsdXNoXG4gICAgdGhpcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZmx1c2hUaW1lcik7XG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZ1N5bmMuc3RvcCgpO1xuICAgIHRoaXMuY29ubmVjdGl2aXR5LmRlc3Ryb3koKTtcbiAgICB0aGlzLmxpZmVjeWNsZS5kZXN0cm95KCk7XG4gICAgdGhpcy5lcnJvckNhcHR1cmU/LnVuaW5zdGFsbCgpO1xuICAgIHRoaXMuaHR0cEVycm9yQ2FwdHVyZT8udW5pbnN0YWxsKCk7XG4gICAgdGhpcy5jbGlja0ZydXN0cmF0aW9uQ2FwdHVyZT8udW5pbnN0YWxsKCk7XG4gICAgLy8gT25seSBjbGVhciBzaW5nbGV0b24gcmVmIGlmIHRoaXMgSVMgdGhlIHNpbmdsZXRvblxuICAgIGlmIChHb2FUZWNoLmluc3RhbmNlID09PSB0aGlzKSB7XG4gICAgICBHb2FUZWNoLmluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGlhZ25vc3RpYyhcImluZm9cIiwgXCJsaWZlY3ljbGVcIiwgXCJsaWZlY3ljbGUuZGVzdHJveWVkXCIsIFwiU0RLIGluc3RhbmNlIGRlc3Ryb3llZFwiKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIkRlc3Ryb3llZC5cIik7XG4gIH1cblxuICAvLyAtLS0gUHJpdmF0ZSAtLS1cblxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIExvYWQgc3RvcmVkIGRldmljZSBJRFxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpO1xuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmNvbnRleHQuc2V0RGV2aWNlSWQoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgY29uZmlnIHN5bmMgKG5vbi1ibG9ja2luZyDigJQgbG9hZHMgZnJvbSBjYWNoZSBmaXJzdCwgdGhlbiBmZXRjaGVzKVxuICAgIC8vIFBhc3MgYSBnZXR0ZXIgc28gcmVmcmVzaCBpbnRlcnZhbHMgYWx3YXlzIHVzZSB0aGUgbGF0ZXN0IGRldmljZSBJRFxuICAgIHRoaXMuY29uZmlnU3luYy5zdGFydCgoKSA9PiB0aGlzLmNvbnRleHQuZ2V0RGV2aWNlSWQoKSk7XG5cbiAgICAvLyBSZWdpc3RlciBkZXZpY2UgaWYgbmVlZGVkIChub24tYmxvY2tpbmcpXG4gICAgaWYgKCFleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICBjb25zdCBhbm9ueW1vdXNJZCA9IHRoaXMuY29udGV4dC5nZXRBbm9ueW1vdXNJZCgpO1xuICAgICAgY29uc3QgaW5mbyA9IGdldERldmljZUluZm8oKTtcbiAgICAgIHJlZ2lzdGVyRGV2aWNlKFxuICAgICAgICB0aGlzLmNmZy5hcGlVcmwsXG4gICAgICAgIHRoaXMuY2ZnLmFwaUtleSxcbiAgICAgICAgdGhpcy5jZmcuZW52aXJvbm1lbnQsXG4gICAgICAgIGFub255bW91c0lkLFxuICAgICAgICBudWxsLFxuICAgICAgICBpbmZvLFxuICAgICAgKVxuICAgICAgICAudGhlbigoZGV2aWNlSWQpID0+IHtcbiAgICAgICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7XG4gICAgICAgICAgdGhpcy5jb250ZXh0LnNldERldmljZUlkKGRldmljZUlkKTtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcIkRldmljZSByZWdpc3RlcmVkXCIsIHsgZGV2aWNlSWQgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihcIkRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkLCB1c2luZyBhbm9ueW1vdXMgSURcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgZmx1c2ggdGltZXJcbiAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH0sIHRoaXMuY2ZnLmZsdXNoSW50ZXJ2YWwpO1xuXG4gICAgLy8gUmVnaXN0ZXIgbGlmZWN5Y2xlIGxpc3RlbmVycyAoYmVmb3JldW5sb2FkLCBwYWdlaGlkZSwgdmlzaWJpbGl0eWNoYW5nZSlcbiAgICB0aGlzLmxpZmVjeWNsZS5yZWdpc3RlcigpO1xuXG4gICAgLy8gSW5zdGFsbCBicm93c2VyIGVycm9yIGNhcHR1cmUgKHdpbmRvdy5vbmVycm9yLCB1bmhhbmRsZWRyZWplY3Rpb24sXG4gICAgLy8gZ29hdGVjaDphdXRoLWV2ZW50KS4gTm8tb3Agb3V0c2lkZSB0aGUgYnJvd3NlciBvciB3aGVuIGRpc2FibGVkLlxuICAgIHRoaXMuZXJyb3JDYXB0dXJlPy5pbnN0YWxsKCk7XG5cbiAgICAvLyBJbnN0YWxsIEhUVFAgZXJyb3IgY2FwdHVyZSDigJQgd3JhcHMgd2luZG93LmZldGNoLCBlbWl0cyAkaHR0cF9lcnJvciBvblxuICAgIC8vIGV2ZXJ5IDR4eC81eHggKyBuZXR3b3JrIGZhaWx1cmUuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIgLyBkaXNhYmxlZC5cbiAgICB0aGlzLmh0dHBFcnJvckNhcHR1cmU/Lmluc3RhbGwoKTtcblxuICAgIC8vIEluc3RhbGwgY2xpY2stZnJ1c3RyYXRpb24gY2FwdHVyZSDigJQgZW1pdHMgJHJhZ2VfY2xpY2sgKyAkZGVhZF9jbGlja1xuICAgIC8vIHdoZW4gdGhlIHVzZXIgaGFtbWVycyB0aGUgc2FtZSBzcG90IG9yIGNsaWNrcyBhIG5vbi1pbnRlcmFjdGl2ZVxuICAgIC8vIHRhcmdldC4gTm8tb3Agb3V0c2lkZSB0aGUgYnJvd3NlciAvIGRpc2FibGVkLlxuICAgIHRoaXMuY2xpY2tGcnVzdHJhdGlvbkNhcHR1cmU/Lmluc3RhbGwoKTtcblxuICAgIC8vIERyYWluIG9mZmxpbmUgcXVldWUgd2hlbiBiYWNrIG9ubGluZVxuICAgIHRoaXMuY29ubmVjdGl2aXR5Lm9uT25saW5lKCgpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXVlZCA9IHRoaXMub2ZmbGluZVF1ZXVlLmRyYWluKCk7XG4gICAgICBpZiAocXVldWVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYEJhY2sgb25saW5lIOKAlCBmbHVzaGluZyAke3F1ZXVlZC5sZW5ndGh9IG9mZmxpbmUgZXZlbnRzLmApO1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgcXVldWVkKSB0aGlzLnF1ZXVlLmFkZChlKTtcbiAgICAgICAgdGhpcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEVtaXQgYCRzZXNzaW9uX3N0YXJ0YCBvbmNlIHBlciBzZXNzaW9uLiBUaGUgQ29udGV4dE1hbmFnZXInc1xuICAgIC8vIGBpc05ld1Nlc3Npb25gIGZsYWcgaXMgdHJ1ZSBvbiB0aGUgZmlyc3QgU0RLIGluaXQgd2l0aGluIGEgbmV3XG4gICAgLy8gc2Vzc2lvbiAoY29sZCBzdGFydCwgb3IgYWZ0ZXIgdGhlIDMwLW1pbiBpZGxlIHdpbmRvdyByb2xsZWQgb3ZlcikuXG4gICAgLy8gRXZlcnkgc3Vic2VxdWVudCBldmVudCBhbHJlYWR5IGNhcnJpZXMgYGNvbnRleHQuYXR0cmlidXRpb25gLCBidXRcbiAgICAvLyB0aGUgZGVkaWNhdGVkIHN0YXJ0IGV2ZW50IG1ha2VzIGl0IHRyaXZpYWwgdG8gYnVpbGQgZnVubmVscyBsaWtlXG4gICAgLy8gXCJzZXNzaW9ucyB0aGF0IGNhbWUgZnJvbSB1dG1fc291cmNlPXR3aXR0ZXIgYW5kIHRoZW4gc2lnbmVkIHVwXCIuXG4gICAgaWYgKHRoaXMuY29udGV4dC5pc05ld1Nlc3Npb24pIHtcbiAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLmNvbnRleHQuZ2V0U2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gICAgICB0aGlzLnRyYWNrKFwiJHNlc3Npb25fc3RhcnRcIiwgYXR0ciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUNvbmZpZyhjb25maWc6IFNES0NvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuZmxhZ01hbmFnZXIuc2V0RXZhbHVhdGVkRmxhZ3MoY29uZmlnLmZsYWdzKTtcbiAgICB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLnNldEFzc2lnbm1lbnRzKGNvbmZpZy5leHBlcmltZW50cyk7XG4gICAgdGhpcy5sb2cuZGVidWcoXCJDb25maWcgYXBwbGllZFwiLCB7XG4gICAgICBmbGFnczogT2JqZWN0LmtleXMoY29uZmlnLmZsYWdzKS5sZW5ndGgsXG4gICAgICBleHBlcmltZW50czogT2JqZWN0LmtleXMoY29uZmlnLmV4cGVyaW1lbnRzKS5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBvc3RJZGVudGl0eVJlc29sdmUodXNlcklkOiBzdHJpbmcsIF9wcmV2aW91c1VzZXJJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZUlkID0gZ2V0RGV2aWNlSWQoKTtcbiAgICBpZiAoIWRldmljZUlkKSByZXR1cm47XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICBgJHt0aGlzLmNmZy5hcGlVcmx9L3YxL2RldmljZXMvJHtlbmNvZGVVUklDb21wb25lbnQoZGV2aWNlSWQpfS9pZGVudGlmeWAsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jZmcuYXBpS2V5fWAsXG4gICAgICAgICAgXCJYLUVudmlyb25tZW50XCI6IHRoaXMuY2ZnLmVudmlyb25tZW50LFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJfaWQ6IHVzZXJJZCB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZGVudGl0eSByZXNvbHZlIGZhaWxlZDogJHtyZXMuc3RhdHVzfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV2ZW50TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW0dvYVRlY2hdIEV2ZW50IG5hbWUgbXVzdCBub3QgYmUgZW1wdHkuXCIpO1xuICB9XG4gIGNvbnN0IHRyaW1tZWQgPSBuYW1lLnRyaW0oKS5zbGljZSgwLCBFVkVOVF9OQU1FX01BWF9MRU5HVEgpO1xuICByZXR1cm4gdHJpbW1lZC5yZXBsYWNlKC9cXHMrL2csIFwiX1wiKTtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQm9vdEVycm9yU2NyaXB0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVUkwgdGhlIHVsdHJhLWVhcmx5IGVycm9yIHNjcmlwdCBwb3N0cyB0by4gTXVzdCBiZSBzYW1lLW9yaWdpbiByZWxhdGl2ZVxuICAgKiAoZS5nLiBcIi9hcGkvbG9nLWJvb3QtZXJyb3JcIikgc28gYG5hdmlnYXRvci5zZW5kQmVhY29uYCB3b3JrcyBvbiBwYWdlIHVubG9hZC5cbiAgICogQ3VzdG9tZXJzIHdpcmUgYSBjb3JyZXNwb25kaW5nIHNlcnZlciByb3V0ZSB0aGF0IGZvcndhcmRzIHRvIEdvYVRlY2ggb3JcbiAgICogbG9ncyB0byB0aGVpciBpbmZyYS4gKFNlZSBSRUFETUUgZm9yIGEgTmV4dC5qcyBleGFtcGxlLilcbiAgICovXG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIC8qKiBTdGFjay10cmFjZSBsZW5ndGggY2FwIGluIGNoYXJzLiBEZWZhdWx0OiA0MDk2LiAqL1xuICBzdGFja0xpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gSUlGRSBzdHJpbmcgdG8gaW5saW5lIGluIGA8aGVhZD5gIEJFRk9SRSBhbnkgYnVuZGxlIGxvYWRzLlxuICogQ2FwdHVyZXMgZXJyb3JzIHRoYXQgaGFwcGVuIGJlZm9yZSBSZWFjdCAvIHRoZSBTREsgaHlkcmF0ZXMg4oCUIGEgcmVuZGVyXG4gKiBjcmFzaCBpbiB0aGF0IHdpbmRvdyBuZXZlciByZWFjaGVzIHRoZSBub3JtYWwgZXZlbnQgcGlwZWxpbmUuXG4gKlxuICogVXNhZ2UgKE5leHQuanMgQXBwIFJvdXRlcik6XG4gKlxuICogICBpbXBvcnQgeyBnZXRCb290RXJyb3JTY3JpcHQgfSBmcm9tIFwiQHNoZWVwaXQtYWkvc2RrLWpzL2Jvb3QtZXJyb3JcIjtcbiAqICAgLi4uXG4gKiAgIDxoZWFkPlxuICogICAgIDxzY3JpcHQgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBnZXRCb290RXJyb3JTY3JpcHQoeyBlbmRwb2ludDogXCIvYXBpL2xvZy1ib290LWVycm9yXCIgfSkgfX0gLz5cbiAqICAgPC9oZWFkPlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vdEVycm9yU2NyaXB0KG9wdGlvbnM6IEJvb3RFcnJvclNjcmlwdE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBlbmRwb2ludCA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZW5kcG9pbnQpO1xuICBjb25zdCBzdGFja0xpbWl0ID0gb3B0aW9ucy5zdGFja0xpbWl0ID8/IDQwOTY7XG4gIHJldHVybiBgKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIHBvc3QocCl7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkID0gSlNPTi5zdHJpbmdpZnkocCk7XG4gICAgICBpZiAobmF2aWdhdG9yLnNlbmRCZWFjb24pIHtcbiAgICAgICAgbmF2aWdhdG9yLnNlbmRCZWFjb24oJHtlbmRwb2ludH0sIG5ldyBCbG9iKFtkXSx7dHlwZTpcImFwcGxpY2F0aW9uL2pzb25cIn0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZldGNoKCR7ZW5kcG9pbnR9LHttZXRob2Q6XCJQT1NUXCIsYm9keTpkLGtlZXBhbGl2ZTp0cnVlLGhlYWRlcnM6e1wiQ29udGVudC1UeXBlXCI6XCJhcHBsaWNhdGlvbi9qc29uXCJ9fSkuY2F0Y2goZnVuY3Rpb24oKXt9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpe31cbiAgfVxuICBmdW5jdGlvbiBiYXNlKHIpe1xuICAgIHJldHVybiB7cmVhc29uOnIsdWE6bmF2aWdhdG9yLnVzZXJBZ2VudCx1cmw6bG9jYXRpb24uaHJlZix0czpEYXRlLm5vdygpLHBhdGhuYW1lOmxvY2F0aW9uLnBhdGhuYW1lfTtcbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsZnVuY3Rpb24oZSl7XG4gICAgdmFyIHA9YmFzZShcInVuY2F1Z2h0X2Vycm9yXCIpO1xuICAgIHAubWVzc2FnZT1lJiZlLm1lc3NhZ2U/U3RyaW5nKGUubWVzc2FnZSk6XCIobm8gbWVzc2FnZSlcIjtcbiAgICBwLnNvdXJjZT1lJiZlLmZpbGVuYW1lP1N0cmluZyhlLmZpbGVuYW1lKTpudWxsO1xuICAgIHAubGluZT1lJiZ0eXBlb2YgZS5saW5lbm89PT1cIm51bWJlclwiP2UubGluZW5vOm51bGw7XG4gICAgcC5jb2w9ZSYmdHlwZW9mIGUuY29sbm89PT1cIm51bWJlclwiP2UuY29sbm86bnVsbDtcbiAgICBwLnN0YWNrPWUmJmUuZXJyb3ImJmUuZXJyb3Iuc3RhY2s/U3RyaW5nKGUuZXJyb3Iuc3RhY2spLnNsaWNlKDAsJHtzdGFja0xpbWl0fSk6bnVsbDtcbiAgICBwb3N0KHApO1xuICB9KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIixmdW5jdGlvbihlKXtcbiAgICB2YXIgcD1iYXNlKFwidW5oYW5kbGVkX3JlamVjdGlvblwiKTtcbiAgICB2YXIgcj1lJiZlLnJlYXNvbjtcbiAgICBwLm1lc3NhZ2U9ciYmci5tZXNzYWdlP1N0cmluZyhyLm1lc3NhZ2UpOlN0cmluZyhyKTtcbiAgICBwLnN0YWNrPXImJnIuc3RhY2s/U3RyaW5nKHIuc3RhY2spLnNsaWNlKDAsJHtzdGFja0xpbWl0fSk6bnVsbDtcbiAgICBwb3N0KHApO1xuICB9KTtcbn0pKCk7YDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290RXJyb3JQYXlsb2FkIHtcbiAgcmVhc29uOiBcInVuY2F1Z2h0X2Vycm9yXCIgfCBcInVuaGFuZGxlZF9yZWplY3Rpb25cIjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzb3VyY2U/OiBzdHJpbmcgfCBudWxsO1xuICBsaW5lPzogbnVtYmVyIHwgbnVsbDtcbiAgY29sPzogbnVtYmVyIHwgbnVsbDtcbiAgc3RhY2s/OiBzdHJpbmcgfCBudWxsO1xuICB1YTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgcGF0aG5hbWU6IHN0cmluZztcbiAgdHM6IG51bWJlcjtcbn1cbiJdfQ==