@goatech/sdk-js 0.1.0 → 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/README.md +21 -83
- package/dist/boot-error.d.mts +1 -39
- package/dist/boot-error.d.ts +1 -39
- package/dist/boot-error.js +12 -32
- package/dist/boot-error.mjs +1 -2
- package/dist/experiments.d.mts +1 -29
- package/dist/experiments.d.ts +1 -29
- package/dist/experiments.js +12 -2
- package/dist/experiments.mjs +1 -2
- package/dist/flags.d.mts +1 -34
- package/dist/flags.d.ts +1 -34
- package/dist/flags.js +12 -2
- package/dist/flags.mjs +1 -2
- package/dist/index.d.mts +4 -170
- package/dist/index.d.ts +4 -170
- package/dist/index.js +18 -31
- package/dist/index.mjs +10 -3
- package/package.json +21 -24
- package/dist/chunk-6BNLBHZS.mjs +0 -2
- package/dist/chunk-BQTMRKY5.mjs +0 -32
- package/dist/chunk-X5MDWZGR.mjs +0 -3
- package/dist/types-CxAq_Cds.d.mts +0 -371
- package/dist/types-CxAq_Cds.d.ts +0 -371
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import {a}from'./chunk-6BNLBHZS.mjs';import {h,b as b$1,a as a$1,g,c,d as d$1,f as f$1,e}from'./chunk-X5MDWZGR.mjs';export{a as getBootErrorScript}from'./chunk-BQTMRKY5.mjs';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,r,i,s,o){this.bus?.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:r,message:i,data:s,requestId:o});}emitDiagnostic(e,t,r,i){if(!this.bus)return;let s=i.length>0?i.length===1&&typeof i[0]=="object"&&i[0]!==null?i[0]:{details:i}:void 0;this.bus.emit({timestamp:new Date().toISOString(),severity:e,category:t,code:`${t}.${e}`,message:r,data:s});}};var B={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=B[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 r of this.listeners)if(!(t<r.minSeverity)&&!(r.categories!==null&&!r.categories.includes(e.category)))try{r.fn(e);}catch{}}}subscribe(e,t){if(this.listeners.length>=100)return ()=>{};let r={fn:e,minSeverity:B[t?.minSeverity??"debug"],categories:t?.categories??null};return this.listeners.push(r),()=>{let i=this.listeners.indexOf(r);i!==-1&&this.listeners.splice(i,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 A(){try{return localStorage.getItem(c.deviceId)}catch{return null}}function H(n){try{localStorage.setItem(c.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 z(){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 $(n,e,t,r,i,s){let o={anonymous_id:r,...{},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":a$1},body:JSON.stringify(o)});if(!c.ok)throw new Error(`Device registration failed: ${c.status}`);return (await c.json()).data.device_id}var q=["utm_source","utm_medium","utm_campaign","utm_content","utm_term","gclid","fbclid"];function w(){return typeof window<"u"&&typeof document<"u"}function ee(n){if(n)try{return new URL(n).hostname}catch{return}}function te(){if(!w())return;let n={};try{let t=new URLSearchParams(window.location.search);for(let r of q){let i=t.get(r);i&&(n[r]=i.slice(0,200));}}catch{}let e=document.referrer||"";if(e){n.referrer=e.slice(0,500);let t=ee(e);t&&(n.referrer_host=t);}try{n.landing_page=(window.location.pathname+window.location.search).slice(0,500);}catch{}return n}function re(n){if(!n)return false;for(let e of q)if(n[e])return true;return !!n.referrer_host}function D(){if(!w())return;try{let e=sessionStorage.getItem(c.sessionAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}let n=te();if(n){try{sessionStorage.setItem(c.sessionAttribution,JSON.stringify(n));}catch{}return n}}function G(n){if(w()){try{let e=localStorage.getItem(c.firstTouchAttribution);if(e){let t=JSON.parse(e);if(t&&typeof t=="object")return t}}catch{}if(re(n)){try{localStorage.setItem(c.firstTouchAttribution,JSON.stringify(n));}catch{}return n}}}function R(){if(w())try{sessionStorage.removeItem(c.sessionAttribution);}catch{}}var S=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=D(),this.firstTouch=G(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:a$1,...this.sessionAttribution?{attribution:this.sessionAttribution}:{},...this.firstTouch?{first_touch:this.firstTouch}:{}}}getSessionAttribution(){return this.sessionAttribution}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(c.anonymousId,this.anonymousId),sessionStorage.setItem(c.sessionId,this.sessionId),localStorage.removeItem(c.identity);}catch{}R(),this.sessionAttribution=D();}touchSession(){try{sessionStorage.setItem(c.sessionLastSeen,Date.now().toString());}catch{}}loadOrCreateAnonymousId(){try{let e=localStorage.getItem(c.anonymousId);if(e)return e;let t=d();return localStorage.setItem(c.anonymousId,t),t}catch{return d()}}loadOrCreateSession(){try{let e=sessionStorage.getItem(c.sessionLastSeen),t=sessionStorage.getItem(c.sessionId),r=Date.now();if(t&&e&&r-parseInt(e,10)<d$1)return {sessionId:t,isNew:!1};let i=d();return sessionStorage.setItem(c.sessionId,i),sessionStorage.setItem(c.sessionLastSeen,r.toString()),R(),{sessionId:i,isNew:!0}}catch{return {sessionId:d(),isNew:true}}}loadIdentity(){try{let e=localStorage.getItem(c.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.userTraits=t.traits??{};}catch{}}};var E=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 b=class{constructor(e){this.log=e;this.userId=null;this.traits={};this.loadFromStorage();}identify(e,t,r){let i=r.getCurrentUserId();if(i===e){t&&(this.traits={...this.traits,...t}),r.updateTraits(this.traits),this.persist(e,this.traits);return}let s=i;r.flush().catch(()=>{}),r.resetSession(),r.clearExperimentAssignments(),this.userId=e,this.traits=t??{},r.setUserId(e),r.updateTraits(this.traits),this.persist(e,this.traits),r.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(c.identity);}catch{}this.log.debug("Reset identity.");}getUserId(){return this.userId}loadFromStorage(){try{let e=localStorage.getItem(c.identity);if(!e)return;let t=JSON.parse(e);this.userId=t.userId??null,this.traits=t.traits??{};}catch{}}persist(e,t){let r={userId:e,traits:t,identifiedAt:new Date().toISOString()};try{localStorage.setItem(c.identity,JSON.stringify(r));}catch{}}};var x=class{constructor(e,t,r,i,s,o){this.apiUrl=e;this.apiKey=t;this.environment=r;this.refreshInterval=i;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(r=>{this.log.warn("Config fetch failed",r);}),this.timer=setInterval(()=>{this.fetchConfig(e()).catch(r=>{this.log.warn("Config refresh failed",r);});},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 r=await fetch(`${this.apiUrl}/v1/config`,{headers:t});if(r.status===304){this.log.debug("Config unchanged (304).");return}if(!r.ok)throw new Error(`Config fetch returned ${r.status}`);let i=r.headers.get("ETag");i&&(this.etag=i);let s=await r.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$1=localStorage.getItem(c.sdkConfig);if(!e$1)return null;let t=JSON.parse(e$1);return Date.now()-t.cachedAt>e?(this.log.debug("Cached config is stale (>24h), ignoring."),null):t}catch{return null}}saveToStorage(e){try{localStorage.setItem(c.sdkConfig,JSON.stringify({config:e,cachedAt:Date.now()}));}catch{}}};var C=class{constructor(e,t,r,i,s,o,c,h,U=null){this.apiUrl=e;this.apiKey=t;this.environment=r;this.retryAttempts=i;this.queue=s;this.offlineQueue=o;this.connectivity=c;this.log=h;this.appVersion=U;this.lastFlushAt=null;this.retryBackoff=b$1.retryBackoff;}getLastFlushAt(){return this.lastFlushAt}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],r={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}}:{}}:{},sent_at:new Date().toISOString()},i=JSON.stringify(r),s=`${this.apiUrl}/v1/ingest?api_key=${encodeURIComponent(this.apiKey)}&env=${encodeURIComponent(this.environment)}`;navigator.sendBeacon(s,new Blob([i],{type:"application/json"}))||this.log.warn("sendBeacon failed \u2014 events may be lost on page unload.");}async sendWithRetry(e,t){try{let{body:r,compressed:i}=await this.buildBody(e),s={Authorization:`Bearer ${this.apiKey}`,"X-Environment":this.environment,"Content-Type":"application/json"};i&&(s["Content-Encoding"]="gzip");let o=await fetch(`${this.apiUrl}/v1/ingest`,{method:"POST",headers:s,body:r});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 h of e)this.queue.add(h);return !1}if(o.status>=500)throw new Error(`Ingest 5xx: ${o.status}`);return this.log.debug(`Flushed ${e.length} events.`),!0}catch(r){if(t<this.retryAttempts-1){let i=this.retryBackoff[t]??this.retryBackoff[this.retryBackoff.length-1]??15e3;return this.log.warn(`Flush attempt ${t+1} failed, retrying in ${i}ms`,r),await ie(i),this.sendWithRetry(e,t+1)}return this.log.error("Max retries exceeded, moving to offline queue.",r),this.offlineQueue.enqueue(e),false}}async buildBody(e){let t=e[0],r={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}}:{}}:{},sent_at:new Date().toISOString()},i=JSON.stringify(r);if(i.length<1024)return {body:i,compressed:false};try{let s=new CompressionStream("gzip"),o=s.writable.getWriter(),c=new TextEncoder;return o.write(c.encode(i)),o.close(),{body:await new Response(s.readable).blob(),compressed:!0}}catch{return {body:i,compressed:false}}}};function ie(n){return new Promise(e=>setTimeout(e,n))}var I=class{enqueue(e){let i=[...this.load(),...e].slice(-f$1);this.save(i);}drain(){let e=this.load();return this.clear(),e}size(){return this.load().length}clear(){try{localStorage.removeItem(c.offlineQueue);}catch{}}load(){try{let e=localStorage.getItem(c.offlineQueue);return e?JSON.parse(e):[]}catch{return []}}save(e){try{localStorage.setItem(c.offlineQueue,JSON.stringify(e));}catch(t){if(t instanceof DOMException&&t.name==="QuotaExceededError"){let r=e.slice(Math.floor(e.length/2));try{localStorage.setItem(c.offlineQueue,JSON.stringify(r));}catch{}}}}};var _=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 k=class{constructor(e,t,r,i){this.queue=e;this.transport=t;this.log=r;this.emitEvent=i;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 i=this.queue.drain();i.length>0&&this.transport.flushWithBeacon(i);},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);},r=()=>{this.scrollThrottleTimer===null&&(this.scrollThrottleTimer=setTimeout(()=>{this.scrollThrottleTimer=null;let i=ne();i>this.maxScrollPct&&(this.maxScrollPct=i);},250));};window.addEventListener("pagehide",e),window.addEventListener("beforeunload",e),document.addEventListener("visibilitychange",t),window.addEventListener("scroll",r,{passive:true}),this.handlers.push(()=>window.removeEventListener("pagehide",e),()=>window.removeEventListener("beforeunload",e),()=>document.removeEventListener("visibilitychange",t),()=>window.removeEventListener("scroll",r),()=>{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:Q(p()-this.entryTime),max_scroll_pct:this.maxScrollPct,tab_hidden_count:this.tabHiddenCount,cumulative_hidden_ms:Q(t),exit_kind:e});}};function p(){return Date.now()}function Q(n){return Math.max(0,Math.round(n/100)*100)}function ne(){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 se={errors:true,rejections:true,authEvents:true,stackLimit:4096,dedupeWindowMs:1e3},m=class{constructor(e,t,r){this.handlers=[];this.lastSignature=null;this.lastSignatureAt=0;this.track=e,this.log=t,this.cfg={...se,...r??{}};}install(){if(typeof window>"u")return;let e=typeof navigator<"u"?navigator.userAgent:null,t=oe(e);if(this.cfg.errors){let r=i=>{let s=i.error&&i.error.stack?String(i.error.stack).slice(0,this.cfg.stackLimit):null,o=`err:${i.message}:${i.filename}:${i.lineno}`;this.suppress(o)||this.safeTrack("$error",{message:i.message,source:i.filename??null,line:i.lineno??null,col:i.colno??null,stack:s,type:"uncaught_error",browser:t,user_agent:e});};window.addEventListener("error",r),this.handlers.push(()=>window.removeEventListener("error",r));}if(this.cfg.rejections){let r=i=>{let s=i.reason,o=s instanceof Error?s.message:typeof s=="string"?s:ae(s),c=s instanceof Error&&s.stack?String(s.stack).slice(0,this.cfg.stackLimit):null,h=`rej:${o}`;this.suppress(h)||this.safeTrack("$error",{message:o,stack:c,type:"unhandled_rejection",browser:t,user_agent:e});};window.addEventListener("unhandledrejection",r),this.handlers.push(()=>window.removeEventListener("unhandledrejection",r));}if(this.cfg.authEvents){let r=i=>{let s=i.detail;s?.name&&this.safeTrack(s.name,{...s.properties??{},browser:t,user_agent:e});};window.addEventListener("goatech:auth-event",r),this.handlers.push(()=>window.removeEventListener("goatech:auth-event",r));}}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(r){this.log.warn("error capture track() threw",r);}}};function oe(n){if(!n)return "unknown";let e=/Chrome\/\d/.test(n)&&!/Edg\//.test(n),t=/Firefox\/\d/.test(n),r=/Safari\//.test(n)&&!e&&!/CriOS|FxiOS|OPR\//.test(n);return e?"chrome":t?"firefox":r?"safari":"other"}function ae(n){try{return JSON.stringify(n)??String(n)}catch{return String(n)}}var ce=["x-request-id","vary","content-type","access-control-allow-origin"],v=class{constructor(e,t,r){this.originalFetch=null;this.installed=false;this.lastSig=null;this.lastSigAt=0;this.track=e,this.log=t,this.cfg={enabled:r?.enabled??true,shouldCapture:r?.shouldCapture??(i=>i>=400),excludeUrlPatterns:r?.excludeUrlPatterns??[/\/v1\/ingest\b/,/\/v1\/config\b/],captureResponseHeaders:r?.captureResponseHeaders??ce,dedupeWindowMs:r?.dedupeWindowMs??1e3,onCapture:r?.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 r=Date.now(),i=le(e),s=(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase();try{let o=await this.originalFetch.call(window,e,t);return this.shouldSkip(i)||!this.cfg.shouldCapture(o.status)||this.emit({kind:"http_error",url:i,method:s,status:o.status,latency_ms:Date.now()-r,request_id:o.headers.get("x-request-id"),response_headers:this.pluckHeaders(o.headers),cookie_names:this.readCookieNames()}),o}catch(o){if(!this.shouldSkip(i)){let c=o instanceof Error&&o.name==="AbortError",h=o instanceof Error?o.name:"UnknownError",U=o instanceof Error?o.message:String(o);this.emit({kind:"network_failure",url:i,method:s,status:0,latency_ms:Date.now()-r,request_id:null,response_headers:{},cookie_names:this.readCookieNames(),error_name:h,error_message:U,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}`,r=Date.now();if(!(this.lastSig===t&&r-this.lastSigAt<this.cfg.dedupeWindowMs)){this.lastSig=t,this.lastSigAt=r;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(i){this.log.warn("http-error-capture track() threw",i);}if(this.cfg.onCapture)try{this.cfg.onCapture(e);}catch(i){this.log.warn("http-error-capture onCapture() threw",i);}}}pluckHeaders(e){let t={};for(let r of this.cfg.captureResponseHeaders){let i=e.get(r);i!==null&&(t[r]=i);}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 le(n){return typeof n=="string"?n:n instanceof URL?n.toString():n instanceof Request?n.url:String(n)}var ue={rage:true,dead:true,rageThreshold:3,rageWindowMs:1e3,rageRadiusPx:50,maxEmitsPerSec:5},de=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA","LABEL","SUMMARY","OPTION","DETAILS"]),T=class{constructor(e,t,r){this.handlers=[];this.recent=[];this.rageCooldownUntil=0;this.emitsThisSecond=0;this.emitsSecondStartedAt=0;this.track=e,this.log=t,this.cfg={...ue,...r??{}};}install(){if(typeof window>"u")return;let e=t=>{let r=t.target;if(!(r instanceof Element))return;let i=Date.now();this.recent.push({t:i,x:t.clientX,y:t.clientY});let s=i-this.cfg.rageWindowMs;this.recent=this.recent.filter(o=>o.t>=s),this.cfg.rage&&this.maybeEmitRage(r,i),this.cfg.dead&&this.maybeEmitDead(t,r,i);};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 r=this.recent[this.recent.length-1],i=0;for(let s of this.recent){let o=s.x-r.x,c=s.y-r.y;o*o+c*c<=this.cfg.rageRadiusPx*this.cfg.rageRadiusPx&&(i+=1);}i<this.cfg.rageThreshold||this.tryEmit(t)&&(this.rageCooldownUntil=t+this.cfg.rageWindowMs,this.safeTrack("$rage_click",{target:V(e),cluster_size:i,x:r.x,y:r.y,path:typeof location<"u"?location.pathname:null}));}maybeEmitDead(e,t,r){e.defaultPrevented||he(t)||this.tryEmit(r)&&this.safeTrack("$dead_click",{target:V(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(r){this.log.warn("click-frustration track() threw",r);}}};function he(n){let e=n,t=0;for(;e&&t<8;){if(de.has(e.tagName))return true;let r=e.getAttribute("role");if(r&&/^(button|link|tab|switch|checkbox|radio|menuitem|option)$/.test(r)||e.hasAttribute("tabindex")||e.hasAttribute("contenteditable")||e.hasAttribute("data-clickable"))return true;e=e.parentElement,t+=1;}return false}function V(n){let e=n.tagName.toLowerCase(),t=n.id?`#${n.id}`:"",r=n.classList.length>0?`.${Array.from(n.classList).slice(0,3).join(".")}`:"";return `${e}${t}${r}`.slice(0,120)}var W="gt_storage_migration_v1",J="done",ge=[{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 O(n,e){try{return n.getItem(e)}catch{return null}}function X(n,e,t){try{n.setItem(e,t);}catch{}}function fe(n,e){try{n.removeItem(e);}catch{}}function Y(){if(typeof window>"u")return;let n=window.localStorage,e=window.sessionStorage;if(!(!n||!e)&&O(n,W)!==J){for(let t of ge){let r=t.storage==="local"?n:e;if(O(r,t.current)!==null)continue;let s=O(r,t.legacy);s!==null&&(X(r,t.current,s),fe(r,t.legacy));}X(n,W,J);}}var l=class l{constructor(e,t,r){this.flushTimer=null;this.destroyed=false;if(this.cfg=e,this.log=t,this.bus=r,this.context=new S,this.queue=new E(e.maxQueueSize),this.flagManager=new a,this.flagManager.setDebugMode(this.cfg.debug),this.experimentManager=new h,this.identityManager=new b(t),this.offlineQueue=new I,this.connectivity=new _,this.transport=new C(e.apiUrl,e.apiKey,e.environment,e.retryAttempts,this.queue,this.offlineQueue,this.connectivity,t,e.appVersion),this.lifecycle=new k(this.queue,this.transport,t,(i,s)=>this.track(i,s)),typeof window<"u"&&this.cfg.autoCaptureErrors!==false){let i=typeof this.cfg.autoCaptureErrors=="object"?this.cfg.autoCaptureErrors:void 0;this.errorCapture=new m((s,o)=>this.track(s,o),t,i);}else this.errorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureHttpErrors!==false){let i=typeof this.cfg.autoCaptureHttpErrors=="object"?this.cfg.autoCaptureHttpErrors:void 0;this.httpErrorCapture=new v((s,o)=>this.track(s,o),t,i);}else this.httpErrorCapture=null;if(typeof window<"u"&&this.cfg.autoCaptureClickFrustration!==false){let i=typeof this.cfg.autoCaptureClickFrustration=="object"?this.cfg.autoCaptureClickFrustration:void 0;this.clickFrustrationCapture=new T((s,o)=>this.track(s,o),t,i);}else this.clickFrustrationCapture=null;this.configSync=new x(e.apiUrl,e.apiKey,e.environment,e.configRefreshInterval,t,i=>this.applyConfig(i));}static create(e){if(Y(),!/^lp_(pub|sec)_/.test(e.apiKey))throw new Error("[GoaTech] Invalid API key format. Expected lp_pub_... or lp_sec_...");if(e.apiKey.startsWith("lp_sec_")&&typeof window<"u")throw new Error("[GoaTech] Secret keys (lp_sec_*) must not be used in the browser. Use a publishable key (lp_pub_*) for client-side code.");let t={apiKey:e.apiKey,apiUrl:e.apiUrl??b$1.apiUrl,environment:e.environment??b$1.environment,flushInterval:e.flushInterval??b$1.flushInterval,flushSize:e.flushSize??b$1.flushSize,debug:e.debug??b$1.debug,configRefreshInterval:e.configRefreshInterval??b$1.configRefreshInterval,maxQueueSize:e.maxQueueSize??b$1.maxQueueSize,retryAttempts:e.retryAttempts??b$1.retryAttempts,onEvent:e.onEvent,onDiagnostic:e.onDiagnostic,diagnosticBufferSize:e.diagnosticBufferSize??b$1.diagnosticBufferSize,autoCaptureErrors:e.autoCaptureErrors??true,autoCaptureHttpErrors:e.autoCaptureHttpErrors??false,autoCaptureClickFrustration:e.autoCaptureClickFrustration??true,appVersion:e.appVersion??null},r=new f(t.diagnosticBufferSize);t.onDiagnostic&&r.subscribe(t.onDiagnostic);let i=new y(t.debug,r),s=new l(t,i,r);return s.start(),i.diagnostic("info","lifecycle","lifecycle.init_ok","SDK initialized",{environment:t.environment,apiUrl:t.apiUrl}),i.debug("Initialized",{apiKey:e.apiKey.slice(0,10)+"...",environment:t.environment,apiUrl:t.apiUrl}),s}static init(e){if(l.instance!==null)return l.instance.log.warn("init() called after already initialized. Call destroy() first to re-initialize. Returning existing instance."),l.instance;let t=l.create(e);return l.instance=t,t}static getInstance(){if(l.instance===null)throw new Error("[GoaTech] Not initialized. Call GoaTech.init() first.");return l.instance}static isInitialized(){return l.instance!==null}track(e,t){if(this.destroyed){this.log.warn("track() called after destroy(). Ignoring.");return}let r=pe(e),i=this.context.getContext(),s={event_id:d(),event_name:r,event_properties:t,device_id:i.device_id,anonymous_id:i.anonymous_id,session_id:i.session_id,user_id:i.user_id,platform:i.platform,app_version:this.cfg.appVersion??void 0,sdk_version:i.sdk_version,locale:i.locale,timezone:i.timezone,timestamp:new Date().toISOString()};this.queue.add(s),this.context.touchSession();try{this.cfg.onEvent?.(r,t);}catch(o){this.log.warn("onEvent callback threw",o);}this.queue.size()>=this.cfg.flushSize&&this.flush().catch(()=>{}),this.log.debug(`Tracked: ${r}`);}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(),(r,i)=>{this.track("$flag_exposure",{flag_key:r,flag_value:i});})}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,r)=>{this.track("$experiment_exposure",{experiment_key:t,variant:r});})}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:r=>this.context.setUserId(r),updateTraits:r=>this.context.updateUserProperties(r),resetSession:()=>this.context.resetIdentity(),clearExperimentAssignments:()=>this.experimentManager.clearAssignments(),flush:()=>this.flush(),postIdentityResolve:(r,i)=>{this.postIdentityResolve(r,i).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:a$1}}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(),l.instance===this&&(l.instance=null),this.log.diagnostic("info","lifecycle","lifecycle.destroyed","SDK instance destroyed"),this.log.debug("Destroyed."));}start(){let e=A();if(e&&this.context.setDeviceId(e),this.configSync.start(()=>this.context.getDeviceId()),!e){let t=this.context.getAnonymousId(),r=z();$(this.cfg.apiUrl,this.cfg.apiKey,this.cfg.environment,t,null,r).then(i=>{H(i),this.context.setDeviceId(i),this.log.debug("Device registered",{deviceId:i});}).catch(i=>{this.log.warn("Device registration failed, using anonymous ID",i);});}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 r of t)this.queue.add(r);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 r=A();if(!r)return;let i=await fetch(`${this.cfg.apiUrl}/v1/devices/${encodeURIComponent(r)}/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(!i.ok)throw new Error(`Identity resolve failed: ${i.status}`)}};l.instance=null;var L=l;function pe(n){if(!n||n.trim().length===0)throw new Error("[GoaTech] Event name must not be empty.");return n.trim().slice(0,g).replace(/\s+/g,"_")}
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvZGlhZ25vc3RpYy1idXMudHMiLCIuLi9zcmMvZGV2aWNlLnRzIiwiLi4vc3JjL2F0dHJpYnV0aW9uLnRzIiwiLi4vc3JjL2NvbnRleHQudHMiLCIuLi9zcmMvcXVldWUudHMiLCIuLi9zcmMvaWRlbnRpdHkudHMiLCIuLi9zcmMvY29uZmlnLXN5bmMudHMiLCIuLi9zcmMvdHJhbnNwb3J0LnRzIiwiLi4vc3JjL29mZmxpbmUudHMiLCIuLi9zcmMvY29ubmVjdGl2aXR5LnRzIiwiLi4vc3JjL2xpZmVjeWNsZS50cyIsIi4uL3NyYy9lcnJvci1jYXB0dXJlLnRzIiwiLi4vc3JjL2h0dHAtZXJyb3ItY2FwdHVyZS50cyIsIi4uL3NyYy9jbGljay1mcnVzdHJhdGlvbi50cyIsIi4uL3NyYy9zdG9yYWdlLW1pZ3JhdGlvbi50cyIsIi4uL3NyYy9jbGllbnQudHMiXSwibmFtZXMiOlsiTG9nZ2VyIiwiZGVidWciLCJidXMiLCJtZXNzYWdlIiwiYXJncyIsInNldmVyaXR5IiwiY2F0ZWdvcnkiLCJjb2RlIiwiZGF0YSIsInJlcXVlc3RJZCIsIlNFVkVSSVRZX09SREVSIiwiRGlhZ25vc3RpY0J1cyIsImJ1ZmZlclNpemUiLCJldmVudCIsInNldmVyaXR5TnVtIiwibGlzdGVuZXIiLCJmbiIsIm9wdGlvbnMiLCJlbnRyeSIsImlkeCIsImdldERldmljZUlkIiwiU1RPUkFHRV9LRVlTIiwic2V0RGV2aWNlSWQiLCJpZCIsImdlbmVyYXRlQW5vbnltb3VzSWQiLCJjIiwiciIsImdldERldmljZUluZm8iLCJyZWdpc3RlckRldmljZSIsImFwaVVybCIsImFwaUtleSIsImVudmlyb25tZW50IiwiYW5vbnltb3VzSWQiLCJleGlzdGluZ0RldmljZUlkIiwiaW5mbyIsImJvZHkiLCJyZXMiLCJTREtfVkVSU0lPTiIsIlVUTV9LRVlTIiwiaXNCcm93c2VyIiwicGFyc2VSZWZlcnJlckhvc3QiLCJyZWZlcnJlciIsImNhcHR1cmVGcm9tV2luZG93Iiwib3V0IiwicGFyYW1zIiwia2V5IiwidmFsdWUiLCJob3N0IiwiaGFzQW55QXR0cmlidXRpb24iLCJhIiwiZ2V0T3JDcmVhdGVTZXNzaW9uQXR0cmlidXRpb24iLCJjYWNoZWQiLCJwYXJzZWQiLCJmcmVzaCIsImdldE9yU2VlZEZpcnN0VG91Y2giLCJjbGVhclNlc3Npb25BdHRyaWJ1dGlvbiIsIkNvbnRleHRNYW5hZ2VyIiwic2Vzc2lvbklkIiwiaXNOZXciLCJ1c2VySWQiLCJ0cmFpdHMiLCJzdG9yZWQiLCJsYXN0U2VlbiIsImV4aXN0aW5nIiwibm93IiwiU0VTU0lPTl9USU1FT1VUX01TIiwicmF3IiwiRXZlbnRRdWV1ZSIsIm1heFNpemUiLCJhbGwiLCJJZGVudGl0eU1hbmFnZXIiLCJsb2ciLCJjYWxsYmFja3MiLCJjdXJyZW50VXNlcklkIiwicHJldmlvdXNVc2VySWQiLCJwYXlsb2FkIiwiQ29uZmlnU3luYyIsInJlZnJlc2hJbnRlcnZhbCIsIm9uQ29uZmlnIiwiZXJyIiwiZGV2aWNlSWQiLCJoZWFkZXJzIiwibmV3RXRhZyIsImpzb24iLCJDT05GSUdfTUFYX0FHRV9NUyIsImNvbmZpZyIsIlRyYW5zcG9ydCIsInJldHJ5QXR0ZW1wdHMiLCJxdWV1ZSIsIm9mZmxpbmVRdWV1ZSIsImNvbm5lY3Rpdml0eSIsImFwcFZlcnNpb24iLCJERUZBVUxUUyIsImV2ZW50cyIsImZpcnN0IiwiZSIsInVybCIsImF0dGVtcHQiLCJjb21wcmVzc2VkIiwicmV0cnlBZnRlciIsImRlbGF5Iiwic2xlZXAiLCJzdHJlYW0iLCJ3cml0ZXIiLCJlbmNvZGVyIiwibXMiLCJyZXNvbHZlIiwiT2ZmbGluZVF1ZXVlIiwidHJpbW1lZCIsIk9GRkxJTkVfUVVFVUVfTUFYIiwiaGFsZiIsIkNvbm5lY3Rpdml0eU1vbml0b3IiLCJjYiIsIkxpZmVjeWNsZU1hbmFnZXIiLCJ0cmFuc3BvcnQiLCJlbWl0RXZlbnQiLCJwYXRoIiwibm93TXMiLCJvbkV4aXQiLCJvblZpc2liaWxpdHlDaGFuZ2UiLCJvblNjcm9sbCIsInBjdCIsImNvbXB1dGVTY3JvbGxQY3QiLCJyZW1vdmUiLCJleGl0S2luZCIsImN1bXVsYXRpdmVIaWRkZW4iLCJyb3VuZFRvMTAwIiwic2Nyb2xsVG9wIiwiZG9jSGVpZ2h0IiwiQnJvd3NlckVycm9yQ2FwdHVyZSIsInRyYWNrIiwidXNlckFnZW50IiwiYnJvd3NlciIsImRldGVjdEJyb3dzZXJUYWciLCJvbkVycm9yIiwic3RhY2siLCJzaWduYXR1cmUiLCJvblJlamVjdGlvbiIsInJlYXNvbiIsInNhZmVTdHJpbmdpZnkiLCJvbkF1dGhFdmVudCIsImRldGFpbCIsIm5hbWUiLCJwcm9wZXJ0aWVzIiwidWEiLCJpc0Nocm9tZSIsImlzRmlyZWZveCIsImlzU2FmYXJpIiwiREVGQVVMVF9IRUFERVJTIiwiSHR0cEVycm9yQ2FwdHVyZSIsInMiLCJpbnB1dCIsImluaXQiLCJzdGFydGVkIiwiZXh0cmFjdFVybCIsIm1ldGhvZCIsImFib3J0ZWQiLCJlcnJOYW1lIiwiZXJyTWVzc2FnZSIsInAiLCJ2IiwicGFpciIsIklOVEVSQUNUSVZFX1RBR1MiLCJDbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSIsIm9uQ2xpY2siLCJ0YXJnZXQiLCJjdXRvZmYiLCJhbmNob3IiLCJjbHVzdGVyIiwiZHgiLCJkeSIsInRhcmdldFNlbGVjdG9yIiwiaXNJbnRlcmFjdGl2ZSIsImVsIiwiY3VyIiwiZGVwdGgiLCJyb2xlIiwidGFnIiwiY2xhc3NlcyIsIk1JR1JBVElPTl9NQVJLRVJfS0VZIiwiTUlHUkFUSU9OX01BUktFUl9WQUxVRSIsIktFWV9NQVAiLCJzYWZlR2V0Iiwic3RvcmUiLCJzYWZlU2V0Iiwic2FmZVJlbW92ZSIsIm1pZ3JhdGVMZWdhY3lTdG9yYWdlS2V5cyIsImxvY2FsIiwic2Vzc2lvbiIsImxlZ2FjeSIsIl9Hb2FUZWNoIiwiRmxhZ01hbmFnZXIiLCJFeHBlcmltZW50TWFuYWdlciIsInByb3BzIiwiY2FwdHVyZUNmZyIsImh0dHBDZmciLCJjbGlja0NmZyIsImNmZyIsIm1lcmdlZCIsImluc3RhbmNlIiwiZXZlbnROYW1lIiwidmFsaWRhdGVFdmVudE5hbWUiLCJjdHgiLCJmbGFnS2V5IiwiZGVmYXVsdFZhbHVlIiwiZXhwZXJpbWVudEtleSIsInZhcmlhbnQiLCJ0IiwidWlkIiwicHJldklkIiwicXVldWVkIiwiYXR0ciIsIl9wcmV2aW91c1VzZXJJZCIsIkdvYVRlY2giLCJFVkVOVF9OQU1FX01BWF9MRU5HVEgiXSwibWFwcGluZ3MiOiI4S0FHTyxJQUFNQSxFQUFOLEtBQWEsQ0FLbEIsWUFBWUMsQ0FBQUEsQ0FBZ0JDLENBQUFBLENBQXFCLENBSGpELElBQUEsQ0FBaUIsTUFBQSxDQUFTLFlBSXhCLElBQUEsQ0FBSyxZQUFBLENBQWVELEVBQ3BCLElBQUEsQ0FBSyxHQUFBLENBQU1DLEdBQU8sS0FDcEIsQ0FFQSxNQUFNQyxDQUFBQSxDQUFBQSxHQUFvQkMsQ0FBQUEsQ0FBdUIsQ0FDM0MsSUFBQSxDQUFLLGNBQ1AsT0FBQSxDQUFRLEtBQUEsQ0FBTSxLQUFLLE1BQUEsQ0FBUUQsQ0FBQUEsQ0FBUyxHQUFHQyxDQUFJLENBQUEsQ0FFN0MsS0FBSyxjQUFBLENBQWUsT0FBQSxDQUFTLFlBQWFELENBQUFBLENBQVNDLENBQUksRUFDekQsQ0FFQSxJQUFBLENBQUtELEtBQW9CQyxDQUFBQSxDQUF1QixDQUM5QyxPQUFBLENBQVEsSUFBQSxDQUFLLEtBQUssTUFBQSxDQUFRRCxDQUFBQSxDQUFTLEdBQUdDLENBQUksQ0FBQSxDQUMxQyxLQUFLLGNBQUEsQ0FBZSxNQUFBLENBQVEsWUFBYUQsQ0FBQUEsQ0FBU0MsQ0FBSSxFQUN4RCxDQUVBLEtBQUEsQ0FBTUQsS0FBb0JDLENBQUFBLENBQXVCLENBQy9DLFFBQVEsS0FBQSxDQUFNLElBQUEsQ0FBSyxPQUFRRCxDQUFBQSxDQUFTLEdBQUdDLENBQUksQ0FBQSxDQUMzQyxJQUFBLENBQUssZUFBZSxPQUFBLENBQVMsV0FBQSxDQUFhRCxFQUFTQyxDQUFJLEVBQ3pELENBTUEsVUFBQSxDQUNFQyxDQUFBQSxDQUNBQyxFQUNBQyxDQUFBQSxD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LENBQUEsQ0FBR3dFLENBQXFCLEVBQzNDLE9BQUEsQ0FBUSxNQUFBLENBQVEsR0FBRyxDQUNwQyIsImZpbGUiOiJpbmRleC5tanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERpYWdub3N0aWNCdXMgfSBmcm9tIFwiLi9kaWFnbm9zdGljLWJ1cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljQ2F0ZWdvcnksIERpYWdub3N0aWNTZXZlcml0eSB9IGZyb20gXCIuL2RpYWdub3N0aWNzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXggPSBcIltHb2FUZWNoXVwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1czogRGlhZ25vc3RpY0J1cyB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGVidWc6IGJvb2xlYW4sIGJ1cz86IERpYWdub3N0aWNCdXMpIHtcbiAgICB0aGlzLmRlYnVnRW5hYmxlZCA9IGRlYnVnO1xuICAgIHRoaXMuYnVzID0gYnVzID8/IG51bGw7XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlYnVnRW5hYmxlZCkge1xuICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLnByZWZpeCwgbWVzc2FnZSwgLi4uYXJncyk7XG4gICAgfVxuICAgIHRoaXMuZW1pdERpYWdub3N0aWMoXCJkZWJ1Z1wiLCBcImxpZmVjeWNsZVwiLCBtZXNzYWdlLCBhcmdzKTtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjb25zb2xlLndhcm4odGhpcy5wcmVmaXgsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIHRoaXMuZW1pdERpYWdub3N0aWMoXCJ3YXJuXCIsIFwibGlmZWN5Y2xlXCIsIG1lc3NhZ2UsIGFyZ3MpO1xuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKHRoaXMucHJlZml4LCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB0aGlzLmVtaXREaWFnbm9zdGljKFwiZXJyb3JcIiwgXCJsaWZlY3ljbGVcIiwgbWVzc2FnZSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhIGRpYWdub3N0aWMgZXZlbnQgd2l0aCBleHBsaWNpdCBjYXRlZ29yeSBhbmQgY29kZS5cbiAgICogVXNlIHRoaXMgaW5zdGVhZCBvZiBkZWJ1Zy93YXJuL2Vycm9yIHdoZW4geW91IHdhbnQgZmluZS1ncmFpbmVkIGNvbnRyb2wuXG4gICAqL1xuICBkaWFnbm9zdGljKFxuICAgIHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHksXG4gICAgY2F0ZWdvcnk6IERpYWdub3N0aWNDYXRlZ29yeSxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVzPy5lbWl0KHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgc2V2ZXJpdHksXG4gICAgICBjYXRlZ29yeSxcbiAgICAgIGNvZGUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgZGF0YSxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdERpYWdub3N0aWMoXG4gICAgc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBjYXRlZ29yeTogRGlhZ25vc3RpY0NhdGVnb3J5LFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5idXMpIHJldHVybjtcbiAgICBjb25zdCBkYXRhID1cbiAgICAgIGFyZ3MubGVuZ3RoID4gMFxuICAgICAgICA/IGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiICYmIGFyZ3NbMF0gIT09IG51bGxcbiAgICAgICAgICA/IChhcmdzWzBdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgIDogeyBkZXRhaWxzOiBhcmdzIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5idXMuZW1pdCh7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHNldmVyaXR5LFxuICAgICAgY2F0ZWdvcnksXG4gICAgICBjb2RlOiBgJHtjYXRlZ29yeX0uJHtzZXZlcml0eX1gLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgRGlhZ25vc3RpY0V2ZW50LFxuICBEaWFnbm9zdGljQ2F0ZWdvcnksXG4gIERpYWdub3N0aWNTZXZlcml0eSxcbiAgRGlhZ25vc3RpY0xpc3RlbmVyLFxufSBmcm9tIFwiLi9kaWFnbm9zdGljcy5qc1wiO1xuXG5jb25zdCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMTAwO1xuY29uc3QgTUFYX0JVRkZFUl9TSVpFID0gMTBfMDAwO1xuY29uc3QgTUFYX1NVQlNDUklCRVJTID0gMTAwO1xuXG5jb25zdCBTRVZFUklUWV9PUkRFUjogUmVjb3JkPERpYWdub3N0aWNTZXZlcml0eSwgbnVtYmVyPiA9IHtcbiAgZGVidWc6IDAsXG4gIGluZm86IDEsXG4gIHdhcm46IDIsXG4gIGVycm9yOiAzLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmVPcHRpb25zIHtcbiAgLyoqIE9ubHkgcmVjZWl2ZSBldmVudHMgYXQgb3IgYWJvdmUgdGhpcyBzZXZlcml0eS4gRGVmYXVsdDogXCJkZWJ1Z1wiIChhbGwpLiAqL1xuICBtaW5TZXZlcml0eT86IERpYWdub3N0aWNTZXZlcml0eTtcbiAgLyoqIE9ubHkgcmVjZWl2ZSBldmVudHMgaW4gdGhlc2UgY2F0ZWdvcmllcy4gRGVmYXVsdDogYWxsLiAqL1xuICBjYXRlZ29yaWVzPzogRGlhZ25vc3RpY0NhdGVnb3J5W107XG59XG5cbmV4cG9ydCBjbGFzcyBEaWFnbm9zdGljQnVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsaXN0ZW5lcnM6IEFycmF5PHtcbiAgICBmbjogRGlhZ25vc3RpY0xpc3RlbmVyO1xuICAgIG1pblNldmVyaXR5OiBudW1iZXI7XG4gICAgY2F0ZWdvcmllczogRGlhZ25vc3RpY0NhdGVnb3J5W10gfCBudWxsO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogRGlhZ25vc3RpY0V2ZW50W107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4U2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIHdyaXRlSW5kZXggPSAwO1xuICBwcml2YXRlIGNvdW50ID0gMDtcbiAgcHJpdmF0ZSBjb3VudHM6IFJlY29yZDxEaWFnbm9zdGljU2V2ZXJpdHksIG51bWJlcj4gPSB7XG4gICAgZGVidWc6IDAsXG4gICAgaW5mbzogMCxcbiAgICB3YXJuOiAwLFxuICAgIGVycm9yOiAwLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGJ1ZmZlclNpemU6IG51bWJlciA9IERFRkFVTFRfQlVGRkVSX1NJWkUpIHtcbiAgICB0aGlzLm1heFNpemUgPSBNYXRoLm1pbihNQVhfQlVGRkVSX1NJWkUsIE1hdGgubWF4KDEsIGJ1ZmZlclNpemUpKTtcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheTxEaWFnbm9zdGljRXZlbnQ+KHRoaXMubWF4U2l6ZSk7XG4gIH1cblxuICBlbWl0KGV2ZW50OiBEaWFnbm9zdGljRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZXZlcml0eU51bSA9IFNFVkVSSVRZX09SREVSW2V2ZW50LnNldmVyaXR5XTtcbiAgICBpZiAoc2V2ZXJpdHlOdW0gPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBpZ25vcmUgaW52YWxpZCBzZXZlcml0eVxuXG4gICAgdGhpcy5idWZmZXJbdGhpcy53cml0ZUluZGV4XSA9IGV2ZW50O1xuICAgIHRoaXMud3JpdGVJbmRleCA9ICh0aGlzLndyaXRlSW5kZXggKyAxKSAlIHRoaXMubWF4U2l6ZTtcbiAgICBpZiAodGhpcy5jb3VudCA8IHRoaXMubWF4U2l6ZSkgdGhpcy5jb3VudCsrO1xuICAgIHRoaXMuY291bnRzW2V2ZW50LnNldmVyaXR5XSsrO1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgIGlmIChzZXZlcml0eU51bSA8IGxpc3RlbmVyLm1pblNldmVyaXR5KSBjb250aW51ZTtcbiAgICAgIGlmIChsaXN0ZW5lci5jYXRlZ29yaWVzICE9PSBudWxsICYmICFsaXN0ZW5lci5jYXRlZ29yaWVzLmluY2x1ZGVzKGV2ZW50LmNhdGVnb3J5KSkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ZW5lci5mbihldmVudCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbmV2ZXIgbGV0IGEgc3Vic2NyaWJlciBicmVhayB0aGUgYnVzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3Vic2NyaWJlKGZuOiBEaWFnbm9zdGljTGlzdGVuZXIsIG9wdGlvbnM/OiBTdWJzY3JpYmVPcHRpb25zKTogKCkgPT4gdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzLmxlbmd0aCA+PSBNQVhfU1VCU0NSSUJFUlMpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICB9XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBmbixcbiAgICAgIG1pblNldmVyaXR5OiBTRVZFUklUWV9PUkRFUltvcHRpb25zPy5taW5TZXZlcml0eSA/PyBcImRlYnVnXCJdLFxuICAgICAgY2F0ZWdvcmllczogb3B0aW9ucz8uY2F0ZWdvcmllcyA/PyBudWxsLFxuICAgIH07XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChlbnRyeSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMubGlzdGVuZXJzLmluZGV4T2YoZW50cnkpO1xuICAgICAgaWYgKGlkeCAhPT0gLTEpIHRoaXMubGlzdGVuZXJzLnNwbGljZShpZHgsIDEpO1xuICAgIH07XG4gIH1cblxuICBnZXRSZWNlbnREaWFnbm9zdGljcygpOiBEaWFnbm9zdGljRXZlbnRbXSB7XG4gICAgaWYgKHRoaXMuY291bnQgPT09IDApIHJldHVybiBbXTtcbiAgICBpZiAodGhpcy5jb3VudCA8IHRoaXMubWF4U2l6ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKDAsIHRoaXMuY291bnQpO1xuICAgIH1cbiAgICAvLyBSaW5nIGJ1ZmZlciBpcyBmdWxsIOKAlCByZXR1cm4gaW4gY2hyb25vbG9naWNhbCBvcmRlclxuICAgIHJldHVybiBbLi4udGhpcy5idWZmZXIuc2xpY2UodGhpcy53cml0ZUluZGV4KSwgLi4udGhpcy5idWZmZXIuc2xpY2UoMCwgdGhpcy53cml0ZUluZGV4KV07XG4gIH1cblxuICBnZXRDb3VudHMoKTogUmVjb3JkPERpYWdub3N0aWNTZXZlcml0eSwgbnVtYmVyPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5jb3VudHMgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTLCBTREtfVkVSU0lPTiB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldmljZUluZm8gfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5kZXZpY2VJZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXREZXZpY2VJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLmRldmljZUlkLCBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGxvY2FsU3RvcmFnZSB1bmF2YWlsYWJsZSAocHJpdmF0ZSBicm93c2luZyBxdW90YSwgZXRjLikg4oCUIGNvbnRpbnVlIHdpdGhvdXQgcGVyc2lzdGVuY2VcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgY3J5cHRvLnJhbmRvbVVVSURcbiAgICByZXR1cm4gXCJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHhcIi5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgICAgY29uc3QgdiA9IGMgPT09IFwieFwiID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mbygpOiBEZXZpY2VJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICBwbGF0Zm9ybTogdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IG5hdmlnYXRvci5wbGF0Zm9ybSB8fCBcIndlYlwiIDogXCJzZXJ2ZXJcIixcbiAgICB1c2VyQWdlbnQ6IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogXCJcIixcbiAgICBsYW5ndWFnZTogdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IG5hdmlnYXRvci5sYW5ndWFnZSA6IFwiZW5cIixcbiAgICBzY3JlZW5XaWR0aDogdHlwZW9mIHNjcmVlbiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNjcmVlbi53aWR0aCA6IDAsXG4gICAgc2NyZWVuSGVpZ2h0OiB0eXBlb2Ygc2NyZWVuICE9PSBcInVuZGVmaW5lZFwiID8gc2NyZWVuLmhlaWdodCA6IDAsXG4gICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyRGV2aWNlKFxuICBhcGlVcmw6IHN0cmluZyxcbiAgYXBpS2V5OiBzdHJpbmcsXG4gIGVudmlyb25tZW50OiBzdHJpbmcsXG4gIGFub255bW91c0lkOiBzdHJpbmcsXG4gIGV4aXN0aW5nRGV2aWNlSWQ6IHN0cmluZyB8IG51bGwsXG4gIGluZm86IERldmljZUluZm8sXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBib2R5ID0ge1xuICAgIGFub255bW91c19pZDogYW5vbnltb3VzSWQsXG4gICAgLi4uKGV4aXN0aW5nRGV2aWNlSWQgPyB7IGRldmljZV9pZDogZXhpc3RpbmdEZXZpY2VJZCB9IDoge30pLFxuICAgIHBsYXRmb3JtOiBcIndlYlwiIGFzIGNvbnN0LFxuICAgIGxvY2FsZTogaW5mby5sYW5ndWFnZSxcbiAgICB0aW1lem9uZTogaW5mby50aW1lem9uZSxcbiAgfTtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS92MS9kZXZpY2VzL3JlZ2lzdGVyYCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXBpS2V5fWAsXG4gICAgICBcIlgtRW52aXJvbm1lbnRcIjogZW52aXJvbm1lbnQsXG4gICAgICBcIlgtU0RLLVZlcnNpb25cIjogU0RLX1ZFUlNJT04sXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDogJHtyZXMuc3RhdHVzfWApO1xuICB9XG4gIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBkYXRhOiB7IGRldmljZV9pZDogc3RyaW5nIH0gfTtcbiAgcmV0dXJuIGpzb24uZGF0YS5kZXZpY2VfaWQ7XG59XG4iLCIvKipcbiAqIEZpcnN0LXRvdWNoIGF0dHJpYnV0aW9uIGNhcHR1cmUgZm9yIHRoZSBicm93c2VyIFNESy5cbiAqXG4gKiBQYXJzZXMgVVRNIHBhcmFtcywgYWQtY2xpY2sgSURzLCByZWZlcnJlciwgYW5kIGxhbmRpbmcgcGFnZSBmcm9tIHRoZVxuICogY3VycmVudCBicm93c2VyIGNvbnRleHQuIENhbGxlZCBvbmNlIHBlciBzZXNzaW9uIGF0IGNyZWF0aW9uIHRpbWU7IHRoZVxuICogcmVzdWx0aW5nIHNuYXBzaG90IGlzIHN0YXNoZWQgaW4gc2Vzc2lvblN0b3JhZ2UgYW5kIGF0dGFjaGVkIHRvIGV2ZXJ5XG4gKiBldmVudCdzIGNvbnRleHQgdW50aWwgdGhlIHNlc3Npb24gcm9sbHMgb3ZlciAoMzAtbWluIGluYWN0aXZpdHkpLlxuICpcbiAqIEFsc28gbWFpbnRhaW5zIGEgbG9uZ2VyLWxpdmVkIFwiZmlyc3RfdG91Y2hcIiBzbmFwc2hvdCBpbiBsb2NhbFN0b3JhZ2Ug4oCUXG4gKiB3cml0dGVuIG9uY2Ugb24gdGhlIGZpcnN0IHNlc3Npb24gdGhhdCBoYXMgQU5ZIGF0dHJpYnV0aW9uIHNpZ25hbCxcbiAqIG5ldmVyIG92ZXJ3cml0dGVuLiBQb3dlcnMgXCJob3cgZGlkIHRoaXMgdXNlciBmaXJzdCBhcnJpdmVcIiBzZWdtZW50c1xuICogZXZlbiBtb250aHMgbGF0ZXIuXG4gKlxuICogRGVmZW5zaXZlOlxuICogLSBOby1vcHMgKyByZXR1cm5zIGB1bmRlZmluZWRgIG91dHNpZGUgYnJvd3NlcnMgKHNlcnZlciBTREsgc2hhcmVzXG4gKiAgIHRoaXMgZmlsZSB2aWEgdGhlIGNvbW1vbiBDb250ZXh0TWFuYWdlcikuXG4gKiAtIFN0b3JhZ2UgYWNjZXNzIHdyYXBwZWQgaW4gdHJ5L2NhdGNoIChwcml2YXRlIG1vZGUgLyBTYWZhcmkgcXVvdGEpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXR0cmlidXRpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IFNUT1JBR0VfS0VZUyB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5cbmNvbnN0IFVUTV9LRVlTID0gW1xuICBcInV0bV9zb3VyY2VcIixcbiAgXCJ1dG1fbWVkaXVtXCIsXG4gIFwidXRtX2NhbXBhaWduXCIsXG4gIFwidXRtX2NvbnRlbnRcIixcbiAgXCJ1dG1fdGVybVwiLFxuICBcImdjbGlkXCIsXG4gIFwiZmJjbGlkXCIsXG5dIGFzIGNvbnN0O1xudHlwZSBVdG1LZXkgPSAodHlwZW9mIFVUTV9LRVlTKVtudW1iZXJdO1xuXG5mdW5jdGlvbiBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWZlcnJlckhvc3QocmVmZXJyZXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmVmZXJyZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVUkwocmVmZXJyZXIpLmhvc3RuYW1lO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBDYXB0dXJlIGZyb20gdGhlIGN1cnJlbnQgcGFnZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpbiBub24tYnJvd3NlciBlbnZzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVGcm9tV2luZG93KCk6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgb3V0OiBBdHRyaWJ1dGlvbkNvbnRleHQgPSB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIFVUTV9LRVlTKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtcy5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSkgb3V0W2tleSBhcyBVdG1LZXldID0gdmFsdWUuc2xpY2UoMCwgMjAwKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE1hbGZvcm1lZCBVUkwg4oCUIHJhcmUsIGJ1dCBuZXZlciBsZXQgaXQgdGhyb3cuXG4gIH1cblxuICBjb25zdCByZWZlcnJlciA9IGRvY3VtZW50LnJlZmVycmVyIHx8IFwiXCI7XG4gIGlmIChyZWZlcnJlcikge1xuICAgIG91dC5yZWZlcnJlciA9IHJlZmVycmVyLnNsaWNlKDAsIDUwMCk7XG4gICAgY29uc3QgaG9zdCA9IHBhcnNlUmVmZXJyZXJIb3N0KHJlZmVycmVyKTtcbiAgICBpZiAoaG9zdCkgb3V0LnJlZmVycmVyX2hvc3QgPSBob3N0O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBvdXQubGFuZGluZ19wYWdlID0gKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLnNsaWNlKDAsIDUwMCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucmVhY2hhYmxlIGluIG5vcm1hbCBicm93c2Vycy5cbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUcnVlIGlmIHRoZSBzbmFwc2hvdCBoYXMgYXQgbGVhc3Qgb25lIG1lYW5pbmdmdWwgc2lnbmFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0FueUF0dHJpYnV0aW9uKGE6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIWEpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgVVRNX0tFWVMpIHtcbiAgICBpZiAoYVtrZXkgYXMgVXRtS2V5XSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGEucmVmZXJyZXJfaG9zdCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBMb2FkIHRoZSBzZXNzaW9uLXNjb3BlZCBzbmFwc2hvdCBmcm9tIHNlc3Npb25TdG9yYWdlIGlmIGl0IGV4aXN0cyxcbiAqIG90aGVyd2lzZSBjYXB0dXJlIGEgZnJlc2ggb25lIGZyb20gYHdpbmRvd2AgYW5kIHBlcnNpc3QgaXQuIFNhbWUgY2FsbFxuICogdHdpY2UgaW4gdGhlIHNhbWUgc2Vzc2lvbiByZXR1cm5zIHRoZSBzYW1lIG9iamVjdCDigJQgZmlyc3QtdG91Y2ggb2ZcbiAqIFRISVMgc2Vzc2lvbiBuZXZlciBzaGlmdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkF0dHJpYnV0aW9uKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZCkgYXMgQXR0cmlidXRpb25Db250ZXh0O1xuICAgICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiKSByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQ29ycnVwdCBzdG9yYWdlIOKAlCByZS1jYXB0dXJlIGJlbG93LlxuICB9XG5cbiAgY29uc3QgZnJlc2ggPSBjYXB0dXJlRnJvbVdpbmRvdygpO1xuICBpZiAoIWZyZXNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25BdHRyaWJ1dGlvbiwgSlNPTi5zdHJpbmdpZnkoZnJlc2gpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gUXVvdGEgLyBkaXNhYmxlZCDigJQgc3RpbGwgcmV0dXJuIHRoZSBpbi1tZW1vcnkgdmFsdWUuXG4gIH1cbiAgcmV0dXJuIGZyZXNoO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGRldmljZSdzIGZpcnN0LXRvdWNoIHNuYXBzaG90IChsb2NhbFN0b3JhZ2UpLiBXcml0ZXMgYGZyZXNoYFxuICogb25seSBpZiBubyBmaXJzdC10b3VjaCBoYXMgYmVlbiByZWNvcmRlZCBBTkQgYGZyZXNoYCBoYXMgYXQgbGVhc3Qgb25lXG4gKiBtZWFuaW5nZnVsIHNpZ25hbCDigJQgd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgYSByZWFsIGZpcnN0LXRvdWNoXG4gKiBtb250aHMgbGF0ZXIsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGJ1cm4gYSBmaXJzdC10b3VjaCBzbG90IG9uIGFuIGVtcHR5XG4gKiBkaXJlY3QtdHJhZmZpYyBzZXNzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JTZWVkRmlyc3RUb3VjaChcbiAgZnJlc2g6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCxcbik6IEF0dHJpYnV0aW9uQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuZmlyc3RUb3VjaEF0dHJpYnV0aW9uKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNhY2hlZCkgYXMgQXR0cmlidXRpb25Db250ZXh0O1xuICAgICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSBcIm9iamVjdFwiKSByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gQ29ycnVwdCBzdG9yYWdlIOKAlCBmYWxsIHRocm91Z2ggdG8gc2VlZC5cbiAgfVxuXG4gIGlmICghaGFzQW55QXR0cmlidXRpb24oZnJlc2gpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5maXJzdFRvdWNoQXR0cmlidXRpb24sIEpTT04uc3RyaW5naWZ5KGZyZXNoKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFF1b3RhIC8gZGlzYWJsZWQuXG4gIH1cbiAgcmV0dXJuIGZyZXNoO1xufVxuXG4vKiogQ2xlYXIgdGhlIHNlc3Npb24gc25hcHNob3QuIENhbGxlZCB3aGVuIGEgbmV3IHNlc3Npb24gcm9sbHMgb3ZlciBzb1xuICogIHRoZSBuZXh0IHBhZ2V2aWV3IHJlY2FwdHVyZXMgZnJlc2ggVVRNICsgcmVmZXJyZXIuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJTZXNzaW9uQXR0cmlidXRpb24oKTogdm9pZCB7XG4gIGlmICghaXNCcm93c2VyKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZUy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUuXG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUywgU0VTU0lPTl9USU1FT1VUX01TLCBTREtfVkVSU0lPTiB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFub255bW91c0lkIH0gZnJvbSBcIi4vZGV2aWNlLmpzXCI7XG5pbXBvcnQge1xuICBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbixcbiAgZ2V0T3JDcmVhdGVTZXNzaW9uQXR0cmlidXRpb24sXG4gIGdldE9yU2VlZEZpcnN0VG91Y2gsXG59IGZyb20gXCIuL2F0dHJpYnV0aW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0aW9uQ29udGV4dCwgRXZlbnRDb250ZXh0IH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSB1c2VySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXJUcmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIHByaXZhdGUgZGV2aWNlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFub255bW91c0lkOiBzdHJpbmc7XG4gIHByaXZhdGUgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBGaXJzdC10b3VjaCBhdHRyaWJ1dGlvbiBmb3IgdGhlIENVUlJFTlQgc2Vzc2lvbi4gQ2FwdHVyZWQgb24gc2Vzc2lvblxuICAgKiAgY3JlYXRlLCByb2xsZWQgb3ZlciB3aGVuIHRoZSAzMC1taW4gd2luZG93IGV4cGlyZXMuICovXG4gIHByaXZhdGUgc2Vzc2lvbkF0dHJpYnV0aW9uOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQ7XG4gIC8qKiBFdmVyLWZpcnN0LXRvdWNoIGF0dHJpYnV0aW9uIGFjcm9zcyB0aGUgZGV2aWNlLiBQZXJzaXN0cyBpblxuICAgKiAgbG9jYWxTdG9yYWdlOyB3cml0dGVuIG9uY2UuICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaDogQXR0cmlidXRpb25Db250ZXh0IHwgdW5kZWZpbmVkO1xuICAvKiogVHJ1ZSB3aGVuIGBsb2FkT3JDcmVhdGVTZXNzaW9uYCBtaW50ZWQgYSBicmFuZC1uZXcgc2Vzc2lvbiBpZCBvblxuICAgKiAgdGhpcyBpbnN0YW5jZSAodnMuIHJlc3VtaW5nIGFuIGV4aXN0aW5nIG9uZSkuIENvbnN1bWVycyB1c2UgdGhpcyB0b1xuICAgKiAgZGVjaWRlIHdoZXRoZXIgdG8gZmlyZSBhIGAkc2Vzc2lvbl9zdGFydGAgZXZlbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBpc05ld1Nlc3Npb246IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hbm9ueW1vdXNJZCA9IHRoaXMubG9hZE9yQ3JlYXRlQW5vbnltb3VzSWQoKTtcbiAgICBjb25zdCB7IHNlc3Npb25JZCwgaXNOZXcgfSA9IHRoaXMubG9hZE9yQ3JlYXRlU2Vzc2lvbigpO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkO1xuICAgIHRoaXMuaXNOZXdTZXNzaW9uID0gaXNOZXc7XG4gICAgdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gPSBnZXRPckNyZWF0ZVNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgIHRoaXMuZmlyc3RUb3VjaCA9IGdldE9yU2VlZEZpcnN0VG91Y2godGhpcy5zZXNzaW9uQXR0cmlidXRpb24pO1xuICAgIHRoaXMubG9hZElkZW50aXR5KCk7XG4gIH1cblxuICBnZXRDb250ZXh0KCk6IEV2ZW50Q29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZV9pZDogdGhpcy5kZXZpY2VJZCA/PyB0aGlzLmFub255bW91c0lkLFxuICAgICAgYW5vbnltb3VzX2lkOiB0aGlzLmFub255bW91c0lkLFxuICAgICAgc2Vzc2lvbl9pZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcbiAgICAgIHBsYXRmb3JtOiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gXCJ3ZWJcIiA6IFwic2VydmVyXCIsXG4gICAgICBsb2NhbGU6IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IubGFuZ3VhZ2UgOiBcImVuXCIsXG4gICAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgICAgc2RrX3ZlcnNpb246IFNES19WRVJTSU9OLFxuICAgICAgLi4uKHRoaXMuc2Vzc2lvbkF0dHJpYnV0aW9uID8geyBhdHRyaWJ1dGlvbjogdGhpcy5zZXNzaW9uQXR0cmlidXRpb24gfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLmZpcnN0VG91Y2ggPyB7IGZpcnN0X3RvdWNoOiB0aGlzLmZpcnN0VG91Y2ggfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHNlc3Npb24ncyBhdHRyaWJ1dGlvbi4gRW1pdCBhcyBwcm9wcyBvbiB0aGVcbiAgICogIGAkc2Vzc2lvbl9zdGFydGAgZXZlbnQg4oCUIHRoZXNlIGZpZWxkcyBBUkUgYWxyZWFkeSBvbiBjb250ZXh0IG9mXG4gICAqICBldmVyeSBldmVudCwgYnV0IGhhdmluZyB0aGVtIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIHN0YXJ0IGV2ZW50XG4gICAqICBtYWtlcyBmdW5uZWxzICsgZGFzaGJvYXJkcyBlYXNpZXIgdG8gYnVpbGQuICovXG4gIGdldFNlc3Npb25BdHRyaWJ1dGlvbigpOiBBdHRyaWJ1dGlvbkNvbnRleHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25BdHRyaWJ1dGlvbjtcbiAgfVxuXG4gIHNldERldmljZUlkKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldmljZUlkID0gaWQ7XG4gIH1cblxuICBnZXREZXZpY2VJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VJZDtcbiAgfVxuXG4gIHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICB9XG5cbiAgZ2V0VXNlcklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnVzZXJJZDtcbiAgfVxuXG4gIGdldEFub255bW91c0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYW5vbnltb3VzSWQ7XG4gIH1cblxuICB1cGRhdGVVc2VyUHJvcGVydGllcyh0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy51c2VyVHJhaXRzID0geyAuLi50aGlzLnVzZXJUcmFpdHMsIC4uLnRyYWl0cyB9O1xuICB9XG5cbiAgZ2V0VXNlclRyYWl0cygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy51c2VyVHJhaXRzIH07XG4gIH1cblxuICByZXNldElkZW50aXR5KCk6IHZvaWQge1xuICAgIHRoaXMudXNlcklkID0gbnVsbDtcbiAgICB0aGlzLnVzZXJUcmFpdHMgPSB7fTtcbiAgICB0aGlzLmFub255bW91c0lkID0gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuYW5vbnltb3VzSWQsIHRoaXMuYW5vbnltb3VzSWQpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbklkLCB0aGlzLnNlc3Npb25JZCk7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29udGludWVcbiAgICB9XG4gICAgLy8gVHJlYXQgaWRlbnRpdHkgcmVzZXQgbGlrZSBhIG5ldyBzZXNzaW9uIGZvciBhdHRyaWJ1dGlvbiBwdXJwb3NlcyDigJRcbiAgICAvLyB0aGUgbmV4dCBwYWdldmlldyByZS1jYXB0dXJlcyBVVE0gKyByZWZlcnJlci4gRmlyc3QtdG91Y2ggaXMgbGVmdFxuICAgIC8vIGFsb25lOyB0aGF0IGJlbG9uZ3MgdG8gdGhlIGRldmljZSwgbm90IHRoZSBsb2dnZWQtaW4gdXNlci5cbiAgICBjbGVhclNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgIHRoaXMuc2Vzc2lvbkF0dHJpYnV0aW9uID0gZ2V0T3JDcmVhdGVTZXNzaW9uQXR0cmlidXRpb24oKTtcbiAgfVxuXG4gIHRvdWNoU2Vzc2lvbigpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkxhc3RTZWVuLCBEYXRlLm5vdygpLnRvU3RyaW5nKCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29udGludWVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvYWRPckNyZWF0ZUFub255bW91c0lkKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5hbm9ueW1vdXNJZCk7XG4gICAgICBpZiAoc3RvcmVkKSByZXR1cm4gc3RvcmVkO1xuICAgICAgY29uc3QgaWQgPSBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuYW5vbnltb3VzSWQsIGlkKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkT3JDcmVhdGVTZXNzaW9uKCk6IHsgc2Vzc2lvbklkOiBzdHJpbmc7IGlzTmV3OiBib29sZWFuIH0ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsYXN0U2VlbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25MYXN0U2Vlbik7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25JZCk7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKGV4aXN0aW5nICYmIGxhc3RTZWVuICYmIG5vdyAtIHBhcnNlSW50KGxhc3RTZWVuLCAxMCkgPCBTRVNTSU9OX1RJTUVPVVRfTVMpIHtcbiAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkOiBleGlzdGluZywgaXNOZXc6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBjb25zdCBpZCA9IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLnNlc3Npb25JZCwgaWQpO1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuc2Vzc2lvbkxhc3RTZWVuLCBub3cudG9TdHJpbmcoKSk7XG4gICAgICAvLyBTZXNzaW9uIHJvbGxlZCBvdmVyIChvciBmaXJzdCB2aXNpdCkuIENsZWFyIGFueSBzdGFsZSBzZXNzaW9uLVxuICAgICAgLy8gYXR0cmlidXRpb24gc25hcHNob3Qgc28gdGhlIG5leHQgY2FwdHVyZSByZWFkcyBmcmVzaCBVVE0rcmVmZXJyZXJcbiAgICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgIGNsZWFyU2Vzc2lvbkF0dHJpYnV0aW9uKCk7XG4gICAgICByZXR1cm4geyBzZXNzaW9uSWQ6IGlkLCBpc05ldzogdHJ1ZSB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgc2Vzc2lvbklkOiBnZW5lcmF0ZUFub255bW91c0lkKCksIGlzTmV3OiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSWRlbnRpdHkoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZUy5pZGVudGl0eSk7XG4gICAgICBpZiAoIXJhdykgcmV0dXJuO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIHtcbiAgICAgICAgdXNlcklkOiBzdHJpbmc7XG4gICAgICAgIHRyYWl0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9O1xuICAgICAgdGhpcy51c2VySWQgPSBwYXJzZWQudXNlcklkID8/IG51bGw7XG4gICAgICB0aGlzLnVzZXJUcmFpdHMgPSBwYXJzZWQudHJhaXRzID8/IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29ycnVwdCBzdG9yYWdlIOKAlCBpZ25vcmVcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRW5yaWNoZWRFdmVudCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFdmVudFF1ZXVlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgaXRlbXM6IEVucmljaGVkRXZlbnRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG1heFNpemU6IG51bWJlcikge1xuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7XG4gIH1cblxuICBhZGQoZXZlbnQ6IEVucmljaGVkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPj0gdGhpcy5tYXhTaXplKSB7XG4gICAgICAvLyBEcm9wIHRoZSBvbGRlc3QgZXZlbnQgKEZJRk8gb3ZlcmZsb3cpXG4gICAgICB0aGlzLml0ZW1zLnNoaWZ0KCk7XG4gICAgfVxuICAgIHRoaXMuaXRlbXMucHVzaChldmVudCk7XG4gIH1cblxuICBkcmFpbigpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMuaXRlbXMuc2xpY2UoKTtcbiAgICB0aGlzLml0ZW1zID0gW107XG4gICAgcmV0dXJuIGFsbDtcbiAgfVxuXG4gIHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNUT1JBR0VfS0VZUyB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG5pbnRlcmZhY2UgU3RvcmVkSWRlbnRpdHkge1xuICB1c2VySWQ6IHN0cmluZztcbiAgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWRlbnRpZmllZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBJZGVudGl0eU1hbmFnZXIge1xuICBwcml2YXRlIHVzZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXIpIHtcbiAgICB0aGlzLmxvYWRGcm9tU3RvcmFnZSgpO1xuICB9XG5cbiAgaWRlbnRpZnkoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdHJhaXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICBjYWxsYmFja3M6IHtcbiAgICAgIGdldEN1cnJlbnRVc2VySWQ6ICgpID0+IHN0cmluZyB8IG51bGw7XG4gICAgICBzZXRVc2VySWQ6IChpZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgdXBkYXRlVHJhaXRzOiAodDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG4gICAgICByZXNldFNlc3Npb246ICgpID0+IHZvaWQ7XG4gICAgICBjbGVhckV4cGVyaW1lbnRBc3NpZ25tZW50czogKCkgPT4gdm9pZDtcbiAgICAgIGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgICAgcG9zdElkZW50aXR5UmVzb2x2ZTogKHVzZXJJZDogc3RyaW5nLCBwcmV2aW91c0lkOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VySWQgPSBjYWxsYmFja3MuZ2V0Q3VycmVudFVzZXJJZCgpO1xuXG4gICAgaWYgKGN1cnJlbnRVc2VySWQgPT09IHVzZXJJZCkge1xuICAgICAgLy8gU2FtZSB1c2VyIOKAlCBtZXJnZSB0cmFpdHMgb25seSBpZiBwcm92aWRlZFxuICAgICAgaWYgKHRyYWl0cykge1xuICAgICAgICB0aGlzLnRyYWl0cyA9IHsgLi4udGhpcy50cmFpdHMsIC4uLnRyYWl0cyB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2tzLnVwZGF0ZVRyYWl0cyh0aGlzLnRyYWl0cyk7XG4gICAgICB0aGlzLnBlcnNpc3QodXNlcklkLCB0aGlzLnRyYWl0cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNVc2VySWQgPSBjdXJyZW50VXNlcklkO1xuXG4gICAgLy8gTmV3IHVzZXIgb3IgcmUtaWRlbnRpZmljYXRpb24gd2l0aCBkaWZmZXJlbnQgdXNlcklkOlxuICAgIC8vIGZsdXNoIHF1ZXVlZCBldmVudHMgYXR0cmlidXRlZCB0byB0aGUgb2xkIGlkZW50aXR5IGJlZm9yZSBzd2l0Y2hpbmdcbiAgICBjYWxsYmFja3MuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAvLyBSZXNldCBzZXNzaW9uIHN0YXRlIHNvIG5ldyBzZXNzaW9uIHN0YXJ0cyBjbGVhblxuICAgIGNhbGxiYWNrcy5yZXNldFNlc3Npb24oKTtcbiAgICBjYWxsYmFja3MuY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHMoKTtcblxuICAgIHRoaXMudXNlcklkID0gdXNlcklkO1xuICAgIHRoaXMudHJhaXRzID0gdHJhaXRzID8/IHt9O1xuICAgIGNhbGxiYWNrcy5zZXRVc2VySWQodXNlcklkKTtcbiAgICBjYWxsYmFja3MudXBkYXRlVHJhaXRzKHRoaXMudHJhaXRzKTtcbiAgICB0aGlzLnBlcnNpc3QodXNlcklkLCB0aGlzLnRyYWl0cyk7XG5cbiAgICAvLyBOb3RpZnkgc2VydmVyIChmaXJlLWFuZC1mb3JnZXQpXG4gICAgY2FsbGJhY2tzLnBvc3RJZGVudGl0eVJlc29sdmUodXNlcklkLCBwcmV2aW91c1VzZXJJZCk7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIklkZW50aWZpZWRcIiwgeyB1c2VySWQsIHByZXZpb3VzVXNlcklkIH0pO1xuICB9XG5cbiAgcmVzZXQoY2FsbGJhY2tzOiB7XG4gICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB2b2lkO1xuICAgIGNsZWFyRXhwZXJpbWVudEFzc2lnbm1lbnRzOiAoKSA9PiB2b2lkO1xuICAgIGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9KTogdm9pZCB7XG4gICAgY2FsbGJhY2tzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGNhbGxiYWNrcy5yZXNldFNlc3Npb24oKTtcbiAgICBjYWxsYmFja3MuY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHMoKTtcbiAgICB0aGlzLnVzZXJJZCA9IG51bGw7XG4gICAgdGhpcy50cmFpdHMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLmlkZW50aXR5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKFwiUmVzZXQgaWRlbnRpdHkuXCIpO1xuICB9XG5cbiAgZ2V0VXNlcklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnVzZXJJZDtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEZyb21TdG9yYWdlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybjtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBTdG9yZWRJZGVudGl0eTtcbiAgICAgIHRoaXMudXNlcklkID0gcGFyc2VkLnVzZXJJZCA/PyBudWxsO1xuICAgICAgdGhpcy50cmFpdHMgPSBwYXJzZWQudHJhaXRzID8/IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gY29ycnVwdCDigJQgaWdub3JlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJzaXN0KHVzZXJJZDogc3RyaW5nLCB0cmFpdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZDogU3RvcmVkSWRlbnRpdHkgPSB7XG4gICAgICB1c2VySWQsXG4gICAgICB0cmFpdHMsXG4gICAgICBpZGVudGlmaWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWVMuaWRlbnRpdHksIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTVE9SQUdFX0tFWVMsIENPTkZJR19NQVhfQUdFX01TIH0gZnJvbSBcIi4vZGVmYXVsdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgU0RLQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdTeW5jIHtcbiAgcHJpdmF0ZSB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZXRhZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcGlVcmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaUtleTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hJbnRlcnZhbDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkNvbmZpZzogKGNvbmZpZzogU0RLQ29uZmlnKSA9PiB2b2lkLFxuICApIHt9XG5cbiAgc3RhcnQoZ2V0RGV2aWNlSWQ6ICgpID0+IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyAxLiBMb2FkIGZyb20gbG9jYWxTdG9yYWdlIHN5bmNocm9ub3VzbHkg4oCUIHplcm8tbGF0ZW5jeSBmaXJzdCBwYWludFxuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMubG9hZEZyb21TdG9yYWdlKCk7XG4gICAgaWYgKHN0b3JlZCkge1xuICAgICAgdGhpcy5vbkNvbmZpZyhzdG9yZWQuY29uZmlnKTtcbiAgICB9XG4gICAgLy8gMi4gRmV0Y2ggZnJvbSBBUEkgYXN5bmNocm9ub3VzbHlcbiAgICB0aGlzLmZldGNoQ29uZmlnKGdldERldmljZUlkKCkpLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJDb25maWcgZmV0Y2ggZmFpbGVkXCIsIGVycik7XG4gICAgfSk7XG4gICAgLy8gMy4gU3RhcnQgcmVmcmVzaCB0aW1lciDigJQgYWx3YXlzIHJlYWRzIHRoZSBsYXRlc3QgZGV2aWNlSWRcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5mZXRjaENvbmZpZyhnZXREZXZpY2VJZCgpKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXCJDb25maWcgcmVmcmVzaCBmYWlsZWRcIiwgZXJyKTtcbiAgICAgIH0pO1xuICAgIH0sIHRoaXMucmVmcmVzaEludGVydmFsKTtcbiAgfVxuXG4gIHN0b3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZXIgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmZXRjaENvbmZpZyhkZXZpY2VJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFQSSByZXF1aXJlcyBYLURldmljZS1JRCDigJQgc2tpcCBmZXRjaCB1bnRpbCBkZXZpY2UgcmVnaXN0cmF0aW9uIGNvbXBsZXRlcy5cbiAgICAvLyBUaGUgcmVmcmVzaCB0aW1lciB3aWxsIHBpY2sgaXQgdXAgb24gdGhlIG5leHQgY3ljbGUuXG4gICAgaWYgKCFkZXZpY2VJZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJDb25maWcgZmV0Y2ggc2tpcHBlZCDigJQgbm8gZGV2aWNlIElEIHlldC5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmFwaUtleX1gLFxuICAgICAgXCJYLUVudmlyb25tZW50XCI6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICBcIlgtRGV2aWNlLUlkXCI6IGRldmljZUlkLFxuICAgIH07XG4gICAgaWYgKHRoaXMuZXRhZykgaGVhZGVyc1tcIklmLU5vbmUtTWF0Y2hcIl0gPSB0aGlzLmV0YWc7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmFwaVVybH0vdjEvY29uZmlnYCwgeyBoZWFkZXJzIH0pO1xuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IDMwNCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXCJDb25maWcgdW5jaGFuZ2VkICgzMDQpLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb25maWcgZmV0Y2ggcmV0dXJuZWQgJHtyZXMuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0V0YWcgPSByZXMuaGVhZGVycy5nZXQoXCJFVGFnXCIpO1xuICAgIGlmIChuZXdFdGFnKSB0aGlzLmV0YWcgPSBuZXdFdGFnO1xuXG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IGRhdGE6IFNES0NvbmZpZyB9O1xuICAgIHRoaXMub25Db25maWcoanNvbi5kYXRhKTtcbiAgICB0aGlzLnNhdmVUb1N0b3JhZ2UoanNvbi5kYXRhKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhcIkNvbmZpZyB1cGRhdGVkXCIsIHtcbiAgICAgIGZsYWdzOiBPYmplY3Qua2V5cyhqc29uLmRhdGEuZmxhZ3MpLmxlbmd0aCxcbiAgICAgIGV4cGVyaW1lbnRzOiBPYmplY3Qua2V5cyhqc29uLmRhdGEuZXhwZXJpbWVudHMpLmxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRGcm9tU3RvcmFnZSgpOiB7IGNvbmZpZzogU0RLQ29uZmlnOyBjYWNoZWRBdDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVlTLnNka0NvbmZpZyk7XG4gICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMge1xuICAgICAgICBjb25maWc6IFNES0NvbmZpZztcbiAgICAgICAgY2FjaGVkQXQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gcGFyc2VkLmNhY2hlZEF0O1xuICAgICAgaWYgKGFnZSA+IENPTkZJR19NQVhfQUdFX01TKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFwiQ2FjaGVkIGNvbmZpZyBpcyBzdGFsZSAoPjI0aCksIGlnbm9yaW5nLlwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2F2ZVRvU3RvcmFnZShjb25maWc6IFNES0NvbmZpZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgU1RPUkFHRV9LRVlTLnNka0NvbmZpZyxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBjb25maWcsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH0pLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFF1b3RhRXhjZWVkZWRFcnJvciBvciB1bmF2YWlsYWJsZSDigJQgY29udGludWUgd2l0aG91dCBjYWNoaW5nXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBERUZBVUxUUyB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFdmVudFF1ZXVlIH0gZnJvbSBcIi4vcXVldWUuanNcIjtcbmltcG9ydCB0eXBlIHsgT2ZmbGluZVF1ZXVlIH0gZnJvbSBcIi4vb2ZmbGluZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25uZWN0aXZpdHlNb25pdG9yIH0gZnJvbSBcIi4vY29ubmVjdGl2aXR5LmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBsYXN0Rmx1c2hBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJldHJ5QmFja29mZiA9IERFRkFVTFRTLnJldHJ5QmFja29mZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwaVVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBpS2V5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmV0cnlBdHRlbXB0czogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IEV2ZW50UXVldWUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvZmZsaW5lUXVldWU6IE9mZmxpbmVRdWV1ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpdml0eTogQ29ubmVjdGl2aXR5TW9uaXRvcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZzogTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwVmVyc2lvbjogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICkge31cblxuICBnZXRMYXN0Rmx1c2hBdCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdEZsdXNoQXQ7XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudHMgPSB0aGlzLnF1ZXVlLmRyYWluKCk7XG4gICAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIElmIG9mZmxpbmUsIG1vdmUgZXZlbnRzIGRpcmVjdGx5IHRvIG9mZmxpbmUgcXVldWVcbiAgICBpZiAoIXRoaXMuY29ubmVjdGl2aXR5LmlzT25saW5lKCkpIHtcbiAgICAgIHRoaXMub2ZmbGluZVF1ZXVlLmVucXVldWUoZXZlbnRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZW50ID0gYXdhaXQgdGhpcy5zZW5kV2l0aFJldHJ5KGV2ZW50cywgMCk7XG4gICAgaWYgKHNlbnQpIHtcbiAgICAgIHRoaXMubGFzdEZsdXNoQXQgPSBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZsdXNoV2l0aEJlYWNvbihldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIGlmIChldmVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgfHwgIW5hdmlnYXRvci5zZW5kQmVhY29uKSByZXR1cm47XG4gICAgY29uc3QgZmlyc3QgPSBldmVudHNbMF07XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJhdGNoOiBldmVudHMubWFwKChlKSA9PiAoe1xuICAgICAgICB0eXBlOiBcInRyYWNrXCIgYXMgY29uc3QsXG4gICAgICAgIGV2ZW50OiBlLmV2ZW50X25hbWUsXG4gICAgICAgIHByb3BlcnRpZXM6IGUuZXZlbnRfcHJvcGVydGllcyA/PyB7fSxcbiAgICAgICAgdGltZXN0YW1wOiBlLnRpbWVzdGFtcCxcbiAgICAgIH0pKSxcbiAgICAgIGNvbnRleHQ6IGZpcnN0XG4gICAgICAgID8ge1xuICAgICAgICAgICAgdXNlcjogeyBpZDogZmlyc3QudXNlcl9pZCA/PyB1bmRlZmluZWQsIGFub255bW91c19pZDogZmlyc3QuYW5vbnltb3VzX2lkIH0sXG4gICAgICAgICAgICBkZXZpY2U6IHtcbiAgICAgICAgICAgICAgaWQ6IGZpcnN0LmRldmljZV9pZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm06IGZpcnN0LnBsYXRmb3JtIGFzIFwid2ViXCIgfCBcImlvc1wiIHwgXCJhbmRyb2lkXCIsXG4gICAgICAgICAgICAgIGxvY2FsZTogZmlyc3QubG9jYWxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlc3Npb246IHsgaWQ6IGZpcnN0LnNlc3Npb25faWQgfSxcbiAgICAgICAgICAgIC4uLih0aGlzLmFwcFZlcnNpb24gPyB7IGFwcDogeyB2ZXJzaW9uOiB0aGlzLmFwcFZlcnNpb24gfSB9IDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSxcbiAgICAgIHNlbnRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICAvLyBzZW5kQmVhY29uIGRvZXMgbm90IHN1cHBvcnQgY3VzdG9tIGhlYWRlcnMg4oCUIHBhc3MgYXV0aCB2aWEgcXVlcnkgcGFyYW1zXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L3YxL2luZ2VzdD9hcGlfa2V5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYXBpS2V5KX0mZW52PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZW52aXJvbm1lbnQpfWA7XG4gICAgY29uc3Qgc2VudCA9IG5hdmlnYXRvci5zZW5kQmVhY29uKHVybCwgbmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pKTtcbiAgICBpZiAoIXNlbnQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJzZW5kQmVhY29uIGZhaWxlZCDigJQgZXZlbnRzIG1heSBiZSBsb3N0IG9uIHBhZ2UgdW5sb2FkLlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRXaXRoUmV0cnkoZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10sIGF0dGVtcHQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGJvZHksIGNvbXByZXNzZWQgfSA9IGF3YWl0IHRoaXMuYnVpbGRCb2R5KGV2ZW50cyk7XG4gICAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hcGlLZXl9YCxcbiAgICAgICAgXCJYLUVudmlyb25tZW50XCI6IHRoaXMuZW52aXJvbm1lbnQsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfTtcbiAgICAgIGlmIChjb21wcmVzc2VkKSB7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LUVuY29kaW5nXCJdID0gXCJnemlwXCI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuYXBpVXJsfS92MS9pbmdlc3RgLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMCkge1xuICAgICAgICAvLyBNYWxmb3JtZWQgYmF0Y2gg4oCUIGRyb3AsIGRvIG5vdCByZXRyeVxuICAgICAgICB0aGlzLmxvZy5lcnJvcihcIkluZ2VzdCA0MDA6IGRyb3BwaW5nIGJhdGNoLlwiLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBwYXJzZUludChyZXMuaGVhZGVycy5nZXQoXCJSZXRyeS1BZnRlclwiKSA/PyBcIjVcIiwgMTApO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBSYXRlIGxpbWl0ZWQsIHJldHJ5aW5nIGFmdGVyICR7cmV0cnlBZnRlcn1zYCk7XG4gICAgICAgIC8vIFJlLXF1ZXVlIGV2ZW50cyBmb3IgbmV4dCBmbHVzaCBjeWNsZVxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB0aGlzLnF1ZXVlLmFkZChlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmdlc3QgNXh4OiAke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBGbHVzaGVkICR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzLmApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoYXR0ZW1wdCA8IHRoaXMucmV0cnlBdHRlbXB0cyAtIDEpIHtcbiAgICAgICAgY29uc3QgZGVsYXkgPVxuICAgICAgICAgIHRoaXMucmV0cnlCYWNrb2ZmW2F0dGVtcHRdID8/IHRoaXMucmV0cnlCYWNrb2ZmW3RoaXMucmV0cnlCYWNrb2ZmLmxlbmd0aCAtIDFdID8/IDE1MDAwO1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBGbHVzaCBhdHRlbXB0ICR7YXR0ZW1wdCArIDF9IGZhaWxlZCwgcmV0cnlpbmcgaW4gJHtkZWxheX1tc2AsIGVycik7XG4gICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFdpdGhSZXRyeShldmVudHMsIGF0dGVtcHQgKyAxKTtcbiAgICAgIH1cbiAgICAgIC8vIE1heCByZXRyaWVzIGV4Y2VlZGVkIOKAlCBtb3ZlIHRvIG9mZmxpbmUgcXVldWVcbiAgICAgIHRoaXMubG9nLmVycm9yKFwiTWF4IHJldHJpZXMgZXhjZWVkZWQsIG1vdmluZyB0byBvZmZsaW5lIHF1ZXVlLlwiLCBlcnIpO1xuICAgICAgdGhpcy5vZmZsaW5lUXVldWUuZW5xdWV1ZShldmVudHMpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRCb2R5KFxuICAgIGV2ZW50czogRW5yaWNoZWRFdmVudFtdLFxuICApOiBQcm9taXNlPHsgYm9keTogc3RyaW5nIHwgQmxvYjsgY29tcHJlc3NlZDogYm9vbGVhbiB9PiB7XG4gICAgLy8gVHJhbnNmb3JtIGVucmljaGVkIGV2ZW50cyBpbnRvIHRoZSBBUEkncyBpbmdlc3RCYXRjaFNjaGVtYSBmb3JtYXQuXG4gICAgLy8gVGhlIEFQSSBleHBlY3RzIHsgYmF0Y2g6IFt7dHlwZSxldmVudCxwcm9wZXJ0aWVzLHRpbWVzdGFtcH1dLCBjb250ZXh0OiB7Li4ufSwgc2VudF9hdCB9XG4gICAgLy8gd2hpbGUgaW50ZXJuYWxseSB3ZSBzdG9yZSBmbGF0IGVucmljaGVkIGV2ZW50cy5cbiAgICBjb25zdCBmaXJzdCA9IGV2ZW50c1swXTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgYmF0Y2g6IGV2ZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidHJhY2tcIiBhcyBjb25zdCxcbiAgICAgICAgZXZlbnQ6IGUuZXZlbnRfbmFtZSxcbiAgICAgICAgcHJvcGVydGllczogZS5ldmVudF9wcm9wZXJ0aWVzID8/IHt9LFxuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgfSkpLFxuICAgICAgY29udGV4dDogZmlyc3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB1c2VyOiB7IGlkOiBmaXJzdC51c2VyX2lkID8/IHVuZGVmaW5lZCwgYW5vbnltb3VzX2lkOiBmaXJzdC5hbm9ueW1vdXNfaWQgfSxcbiAgICAgICAgICAgIGRldmljZToge1xuICAgICAgICAgICAgICBpZDogZmlyc3QuZGV2aWNlX2lkLFxuICAgICAgICAgICAgICBwbGF0Zm9ybTogZmlyc3QucGxhdGZvcm0gYXMgXCJ3ZWJcIiB8IFwiaW9zXCIgfCBcImFuZHJvaWRcIixcbiAgICAgICAgICAgICAgbG9jYWxlOiBmaXJzdC5sb2NhbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2Vzc2lvbjogeyBpZDogZmlyc3Quc2Vzc2lvbl9pZCB9LFxuICAgICAgICAgICAgLi4uKHRoaXMuYXBwVmVyc2lvbiA/IHsgYXBwOiB7IHZlcnNpb246IHRoaXMuYXBwVmVyc2lvbiB9IH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9LFxuICAgICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIGlmIChqc29uLmxlbmd0aCA8IDEwMjQpIHJldHVybiB7IGJvZHk6IGpzb24sIGNvbXByZXNzZWQ6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBDb21wcmVzc2lvblN0cmVhbShcImd6aXBcIik7XG4gICAgICBjb25zdCB3cml0ZXIgPSBzdHJlYW0ud3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICB2b2lkIHdyaXRlci53cml0ZShlbmNvZGVyLmVuY29kZShqc29uKSk7XG4gICAgICB2b2lkIHdyaXRlci5jbG9zZSgpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBSZXNwb25zZShzdHJlYW0ucmVhZGFibGUpLmJsb2IoKTtcbiAgICAgIHJldHVybiB7IGJvZHk6IGJsb2IsIGNvbXByZXNzZWQ6IHRydWUgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENvbXByZXNzaW9uU3RyZWFtIG5vdCBzdXBwb3J0ZWQg4oCUIHNlbmQgdW5jb21wcmVzc2VkXG4gICAgICByZXR1cm4geyBib2R5OiBqc29uLCBjb21wcmVzc2VkOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuIiwiaW1wb3J0IHsgU1RPUkFHRV9LRVlTLCBPRkZMSU5FX1FVRVVFX01BWCB9IGZyb20gXCIuL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVucmljaGVkRXZlbnQgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgT2ZmbGluZVF1ZXVlIHtcbiAgZW5xdWV1ZShldmVudHM6IEVucmljaGVkRXZlbnRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3QgY29tYmluZWQgPSBbLi4uZXhpc3RpbmcsIC4uLmV2ZW50c107XG4gICAgLy8gS2VlcCBvbmx5IHRoZSBtb3N0IHJlY2VudCBPRkZMSU5FX1FVRVVFX01BWCBldmVudHNcbiAgICBjb25zdCB0cmltbWVkID0gY29tYmluZWQuc2xpY2UoLU9GRkxJTkVfUVVFVUVfTUFYKTtcbiAgICB0aGlzLnNhdmUodHJpbW1lZCk7XG4gIH1cblxuICBkcmFpbigpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMubG9hZCgpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICByZXR1cm4gZXZlbnRzO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKS5sZW5ndGg7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZCgpOiBFbnJpY2hlZEV2ZW50W10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWVMub2ZmbGluZVF1ZXVlKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gW107XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIEVucmljaGVkRXZlbnRbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmUoZXZlbnRzOiBFbnJpY2hlZEV2ZW50W10pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVlTLm9mZmxpbmVRdWV1ZSwgSlNPTi5zdHJpbmdpZnkoZXZlbnRzKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBRdW90YUV4Y2VlZGVkRXJyb3Ig4oCUIHJlbW92ZSBoYWxmIHRoZSBvbGRlc3QgZXZlbnRzIGFuZCByZXRyeSBvbmNlXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIGVyci5uYW1lID09PSBcIlF1b3RhRXhjZWVkZWRFcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IGhhbGYgPSBldmVudHMuc2xpY2UoTWF0aC5mbG9vcihldmVudHMubGVuZ3RoIC8gMikpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZUy5vZmZsaW5lUXVldWUsIEpTT04uc3RyaW5naWZ5KGhhbGYpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZ2l2ZSB1cFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgQ29ubmVjdGl2aXR5TW9uaXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25saW5lQ2FsbGJhY2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVDYWxsYmFja3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgb25PbmxpbmVIYW5kbGVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uT2ZmbGluZUhhbmRsZXI6ICgpID0+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+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IFJlc29sdmVkQ29uZmlnLCBsb2c6IExvZ2dlciwgYnVzOiBEaWFnbm9zdGljQnVzKSB7XG4gICAgdGhpcy5jZmcgPSBjb25maWc7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5idXMgPSBidXM7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHRNYW5hZ2VyKCk7XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBFdmVudFF1ZXVlKGNvbmZpZy5tYXhRdWV1ZVNpemUpO1xuICAgIHRoaXMuZmxhZ01hbmFnZXIgPSBuZXcgRmxhZ01hbmFnZXIoKTtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLnNldERlYnVnTW9kZSh0aGlzLmNmZy5kZWJ1Zyk7XG4gICAgdGhpcy5leHBlcmltZW50TWFuYWdlciA9IG5ldyBFeHBlcmltZW50TWFuYWdlcigpO1xuICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyID0gbmV3IElkZW50aXR5TWFuYWdlcihsb2cpO1xuICAgIHRoaXMub2ZmbGluZVF1ZXVlID0gbmV3IE9mZmxpbmVRdWV1ZSgpO1xuICAgIHRoaXMuY29ubmVjdGl2aXR5ID0gbmV3IENvbm5lY3Rpdml0eU1vbml0b3IoKTtcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBUcmFuc3BvcnQoXG4gICAgICBjb25maWcuYXBpVXJsLFxuICAgICAgY29uZmlnLmFwaUtleSxcbiAgICAgIGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIGNvbmZpZy5yZXRyeUF0dGVtcHRzLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHRoaXMub2ZmbGluZVF1ZXVlLFxuICAgICAgdGhpcy5jb25uZWN0aXZpdHksXG4gICAgICBsb2csXG4gICAgICBjb25maWcuYXBwVmVyc2lvbixcbiAgICApO1xuICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZU1hbmFnZXIodGhpcy5xdWV1ZSwgdGhpcy50cmFuc3BvcnQsIGxvZywgKG5hbWUsIHByb3BzKSA9PlxuICAgICAgdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNhcHR1cmVDZmcgPVxuICAgICAgICB0eXBlb2YgdGhpcy5jZmcuYXV0b0NhcHR1cmVFcnJvcnMgPT09IFwib2JqZWN0XCIgPyB0aGlzLmNmZy5hdXRvQ2FwdHVyZUVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZXJyb3JDYXB0dXJlID0gbmV3IEJyb3dzZXJFcnJvckNhcHR1cmUoXG4gICAgICAgIChuYW1lLCBwcm9wcykgPT4gdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgICAgIGxvZyxcbiAgICAgICAgY2FwdHVyZUNmZyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JDYXB0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5jZmcuYXV0b0NhcHR1cmVIdHRwRXJyb3JzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgaHR0cENmZyA9XG4gICAgICAgIHR5cGVvZiB0aGlzLmNmZy5hdXRvQ2FwdHVyZUh0dHBFcnJvcnMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IHRoaXMuY2ZnLmF1dG9DYXB0dXJlSHR0cEVycm9yc1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5odHRwRXJyb3JDYXB0dXJlID0gbmV3IEh0dHBFcnJvckNhcHR1cmUoXG4gICAgICAgIChuYW1lLCBwcm9wcykgPT4gdGhpcy50cmFjayhuYW1lLCBwcm9wcyksXG4gICAgICAgIGxvZyxcbiAgICAgICAgaHR0cENmZyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaHR0cEVycm9yQ2FwdHVyZSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHRoaXMuY2ZnLmF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNsaWNrQ2ZnID1cbiAgICAgICAgdHlwZW9mIHRoaXMuY2ZnLmF1dG9DYXB0dXJlQ2xpY2tGcnVzdHJhdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gdGhpcy5jZmcuYXV0b0NhcHR1cmVDbGlja0ZydXN0cmF0aW9uXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlID0gbmV3IENsaWNrRnJ1c3RyYXRpb25DYXB0dXJlKFxuICAgICAgICAobmFtZSwgcHJvcHMpID0+IHRoaXMudHJhY2sobmFtZSwgcHJvcHMpLFxuICAgICAgICBsb2csXG4gICAgICAgIGNsaWNrQ2ZnLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGlja0ZydXN0cmF0aW9uQ2FwdHVyZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnU3luYyA9IG5ldyBDb25maWdTeW5jKFxuICAgICAgY29uZmlnLmFwaVVybCxcbiAgICAgIGNvbmZpZy5hcGlLZXksXG4gICAgICBjb25maWcuZW52aXJvbm1lbnQsXG4gICAgICBjb25maWcuY29uZmlnUmVmcmVzaEludGVydmFsLFxuICAgICAgbG9nLFxuICAgICAgKGNmZzogU0RLQ29uZmlnKSA9PiB0aGlzLmFwcGx5Q29uZmlnKGNmZyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIC0tLSBTdGF0aWMgQVBJIC0tLVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcsIGluZGVwZW5kZW50IEdvYVRlY2ggaW5zdGFuY2UuXG4gICAqIFRoZSBjYWxsZXIgb3ducyB0aGUgaW5zdGFuY2UgbGlmZWN5Y2xlIOKAlCBubyBnbG9iYWwgc3RhdGUuXG4gICAqIFByZWZlcnJlZCBmb3IgUmVhY3QgYXBwcyAocGFzcyBpbnN0YW5jZSB0byBDb250ZXh0KS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoY29uZmlnOiBHb2FUZWNoQ29uZmlnKTogR29hVGVjaCB7XG4gICAgLy8gQXVkaXQgRS0wMTAg4oCUIGNvcHkgYW55IHByZS1leGlzdGluZyBgbHBfKmAgc3RvcmFnZSBlbnRyaWVzIGludG9cbiAgICAvLyB0aGUgbmV3IGBndF8qYCBzbG90cyBiZWZvcmUgYW55IG90aGVyIGluaXQgY29kZSB0b3VjaGVzIHN0b3JhZ2UuXG4gICAgLy8gSWRlbXBvdGVudCArIGJyb3dzZXItb25seTsgbm8tb3Agb24gTm9kZSAvIHNlY29uZCBjYWxsLlxuICAgIG1pZ3JhdGVMZWdhY3lTdG9yYWdlS2V5cygpO1xuXG4gICAgLy8gVmFsaWRhdGUgQVBJIGtleSBmb3JtYXRcbiAgICBpZiAoIS9ebHBfKHB1YnxzZWMpXy8udGVzdChjb25maWcuYXBpS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW0dvYVRlY2hdIEludmFsaWQgQVBJIGtleSBmb3JtYXQuIEV4cGVjdGVkIGxwX3B1Yl8uLi4gb3IgbHBfc2VjXy4uLlwiKTtcbiAgICB9XG4gICAgLy8gUmVqZWN0IHNlY3JldCBrZXlzIGluIHRoZSBicm93c2VyIOKAlCB0aGV5IGdyYW50IHdyaXRlIGFjY2VzcyB0byB0aGVcbiAgICAvLyB3aG9sZSBwcm9qZWN0IGFuZCBtdXN0IG5ldmVyIHNoaXAgaW4gY2xpZW50IGJ1bmRsZXMuIGBzZWNgIGtleXMgYXJlXG4gICAgLy8gZm9yIHNlcnZlciBTREtzIG9ubHkuIChQcmV2aW91c2x5IHRoaXMgd2FzIGp1c3QgYSBjb25zb2xlLndhcm47IGFuXG4gICAgLy8gaWdub3JlZCB3YXJuaW5nIG1lYW5zIGEgcmVhbCBzZWNyZXQga2V5IGluIGV2ZXJ5IHVzZXIncyBidW5kbGUuKVxuICAgIGlmIChjb25maWcuYXBpS2V5LnN0YXJ0c1dpdGgoXCJscF9zZWNfXCIpICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJbR29hVGVjaF0gU2VjcmV0IGtleXMgKGxwX3NlY18qKSBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBicm93c2VyLiBcIiArXG4gICAgICAgICAgXCJVc2UgYSBwdWJsaXNoYWJsZSBrZXkgKGxwX3B1Yl8qKSBmb3IgY2xpZW50LXNpZGUgY29kZS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIE1lcmdlIGRlZmF1bHRzXG4gICAgY29uc3QgbWVyZ2VkOiBSZXNvbHZlZENvbmZpZyA9IHtcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICAgIGFwaVVybDogY29uZmlnLmFwaVVybCA/PyBERUZBVUxUUy5hcGlVcmwsXG4gICAgICBlbnZpcm9ubWVudDogY29uZmlnLmVudmlyb25tZW50ID8/IERFRkFVTFRTLmVudmlyb25tZW50LFxuICAgICAgZmx1c2hJbnRlcnZhbDogY29uZmlnLmZsdXNoSW50ZXJ2YWwgPz8gREVGQVVMVFMuZmx1c2hJbnRlcnZhbCxcbiAgICAgIGZsdXNoU2l6ZTogY29uZmlnLmZsdXNoU2l6ZSA/PyBERUZBVUxUUy5mbHVzaFNpemUsXG4gICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnID8/IERFRkFVTFRTLmRlYnVnLFxuICAgICAgY29uZmlnUmVmcmVzaEludGVydmFsOiBjb25maWcuY29uZmlnUmVmcmVzaEludGVydmFsID8/IERFRkFVTFRTLmNvbmZpZ1JlZnJlc2hJbnRlcnZhbCxcbiAgICAgIG1heFF1ZXVlU2l6ZTogY29uZmlnLm1heFF1ZXVlU2l6ZSA/PyBERUZBVUxUUy5tYXhRdWV1ZVNpemUsXG4gICAgICByZXRyeUF0dGVtcHRzOiBjb25maWcucmV0cnlBdHRlbXB0cyA/PyBERUZBVUxUUy5yZXRyeUF0dGVtcHRzLFxuICAgICAgb25FdmVudDogY29uZmlnLm9uRXZlbnQsXG4gICAgICBvbkRpYWdub3N0aWM6IGNvbmZpZy5vbkRpYWdub3N0aWMsXG4gICAgICBkaWFnbm9zdGljQnVmZmVyU2l6ZTogY29uZmlnLmRpYWdub3N0aWNCdWZmZXJTaXplID8/IERFRkFVTFRTLmRpYWdub3N0aWNCdWZmZXJTaXplLFxuICAgICAgYXV0b0NhcHR1cmVFcnJvcnM6IGNvbmZpZy5hdXRvQ2FwdHVyZUVycm9ycyA/PyB0cnVlLFxuICAgICAgLy8gRGVmYXVsdCBPRkYgdW50aWwgYmF0dGxlLXRlc3RlZCBpbiB0aGUgd2lsZC4gT3B0LWluIGZvciBhcHBzIHRoYXQgd2FudCBpdC5cbiAgICAgIC8vIE1vbmtleS1wYXRjaGluZyB3aW5kb3cuZmV0Y2ggaXMgcmlza3kg4oCUIGpzZG9tIGRvZXNuJ3QgZW5mb3JjZSBuYXRpdmUnc1xuICAgICAgLy8gYHRoaXMgPT09IHdpbmRvd2AgY29udHJhY3QsIHNvIHVuaXQgdGVzdHMgY2FuIG1pc3MgcmVhbC1icm93c2VyIGJ1Z3MuXG4gICAgICBhdXRvQ2FwdHVyZUh0dHBFcnJvcnM6IGNvbmZpZy5hdXRvQ2FwdHVyZUh0dHBFcnJvcnMgPz8gZmFsc2UsXG4gICAgICBhdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb246IGNvbmZpZy5hdXRvQ2FwdHVyZUNsaWNrRnJ1c3RyYXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFwcFZlcnNpb246IGNvbmZpZy5hcHBWZXJzaW9uID8/IG51bGwsXG4gICAgfTtcbiAgICBjb25zdCBidXMgPSBuZXcgRGlhZ25vc3RpY0J1cyhtZXJnZWQuZGlhZ25vc3RpY0J1ZmZlclNpemUpO1xuICAgIGlmIChtZXJnZWQub25EaWFnbm9zdGljKSB7XG4gICAgICBidXMuc3Vic2NyaWJlKG1lcmdlZC5vbkRpYWdub3N0aWMpO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSBuZXcgTG9nZ2VyKG1lcmdlZC5kZWJ1ZywgYnVzKTtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBHb2FUZWNoKG1lcmdlZCwgbG9nLCBidXMpO1xuICAgIGluc3RhbmNlLnN0YXJ0KCk7XG4gICAgbG9nLmRpYWdub3N0aWMoXCJpbmZvXCIsIFwibGlmZWN5Y2xlXCIsIFwibGlmZWN5Y2xlLmluaXRfb2tcIiwgXCJTREsgaW5pdGlhbGl6ZWRcIiwge1xuICAgICAgZW52aXJvbm1lbnQ6IG1lcmdlZC5lbnZpcm9ubWVudCxcbiAgICAgIGFwaVVybDogbWVyZ2VkLmFwaVVybCxcbiAgICB9KTtcbiAgICBsb2cuZGVidWcoXCJJbml0aWFsaXplZFwiLCB7XG4gICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXkuc2xpY2UoMCwgMTApICsgXCIuLi5cIixcbiAgICAgIGVudmlyb25tZW50OiBtZXJnZWQuZW52aXJvbm1lbnQsXG4gICAgICBhcGlVcmw6IG1lcmdlZC5hcGlVcmwsXG4gICAgfSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNpbmdsZXRvbiBpbnN0YW5jZS4gUmV0dXJucyBleGlzdGluZyBpbnN0YW5jZSBpZiBhbHJlYWR5XG4gICAqIGluaXRpYWxpemVkIChsb2dzIGEgd2FybmluZykuIENhbGwgYGRlc3Ryb3koKWAgZmlyc3QgdG8gcmUtaW5pdGlhbGl6ZS5cbiAgICpcbiAgICogRm9yIFJlYWN0IGFwcHMsIHByZWZlciBgR29hVGVjaC5jcmVhdGUoKWAgKyBDb250ZXh0IGluc3RlYWQuXG4gICAqL1xuICBzdGF0aWMgaW5pdChjb25maWc6IEdvYVRlY2hDb25maWcpOiBHb2FUZWNoIHtcbiAgICBpZiAoR29hVGVjaC5pbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgR29hVGVjaC5pbnN0YW5jZS5sb2cud2FybihcbiAgICAgICAgXCJpbml0KCkgY2FsbGVkIGFmdGVyIGFscmVhZHkgaW5pdGlhbGl6ZWQuIENhbGwgZGVzdHJveSgpIGZpcnN0IHRvIHJlLWluaXRpYWxpemUuIFJldHVybmluZyBleGlzdGluZyBpbnN0YW5jZS5cIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gR29hVGVjaC5pbnN0YW5jZTtcbiAgICB9XG4gICAgY29uc3QgaW5zdGFuY2UgPSBHb2FUZWNoLmNyZWF0ZShjb25maWcpO1xuICAgIEdvYVRlY2guaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKiogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuIFRocm93cyBpZiBgaW5pdCgpYCB3YXMgbmV2ZXIgY2FsbGVkLiAqL1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogR29hVGVjaCB7XG4gICAgaWYgKEdvYVRlY2guaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltHb2FUZWNoXSBOb3QgaW5pdGlhbGl6ZWQuIENhbGwgR29hVGVjaC5pbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gR29hVGVjaC5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpbmdsZXRvbiBoYXMgYmVlbiBpbml0aWFsaXplZCB2aWEgYGluaXQoKWAuXG4gICAqIFVzZWZ1bCBmb3IgSE1SIGd1YXJkcyBhbmQgY29uZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24uXG4gICAqL1xuICBzdGF0aWMgaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gR29hVGVjaC5pbnN0YW5jZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8vIC0tLSBJbnN0YW5jZSBBUEkgLS0tXG5cbiAgLyoqXG4gICAqIFF1ZXVlIGFuIGFuYWx5dGljcyBldmVudC4gQXV0by1mbHVzaGVzIHdoZW4gdGhlIHF1ZXVlIHJlYWNoZXNcbiAgICogYGZsdXNoU2l6ZWAgKGRlZmF1bHQgMjApIG9yIHdoZW4gdGhlIHBlcmlvZGljIGZsdXNoIHRpbWVyIGZpcmVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBndC50cmFjayhcImNvdXJzZV92aWV3ZWRcIiwgeyBjb3Vyc2VfaWQ6IFwiY18xMjNcIiwgc291cmNlOiBcImNhdGFsb2dcIiB9KTtcbiAgICovXG4gIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJ0cmFjaygpIGNhbGxlZCBhZnRlciBkZXN0cm95KCkuIElnbm9yaW5nLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHZhbGlkYXRlRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jb250ZXh0LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIGV2ZW50X2lkOiBnZW5lcmF0ZUFub255bW91c0lkKCksXG4gICAgICBldmVudF9uYW1lOiBuYW1lLFxuICAgICAgZXZlbnRfcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgIGRldmljZV9pZDogY3R4LmRldmljZV9pZCxcbiAgICAgIGFub255bW91c19pZDogY3R4LmFub255bW91c19pZCxcbiAgICAgIHNlc3Npb25faWQ6IGN0eC5zZXNzaW9uX2lkLFxuICAgICAgdXNlcl9pZDogY3R4LnVzZXJfaWQsXG4gICAgICBwbGF0Zm9ybTogY3R4LnBsYXRmb3JtLFxuICAgICAgYXBwX3ZlcnNpb246IHRoaXMuY2ZnLmFwcFZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgc2RrX3ZlcnNpb246IGN0eC5zZGtfdmVyc2lvbixcbiAgICAgIGxvY2FsZTogY3R4LmxvY2FsZSxcbiAgICAgIHRpbWV6b25lOiBjdHgudGltZXpvbmUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIHRoaXMucXVldWUuYWRkKGV2ZW50KTtcbiAgICB0aGlzLmNvbnRleHQudG91Y2hTZXNzaW9uKCk7XG4gICAgLy8gTm90aWZ5IG9uRXZlbnQgY2FsbGJhY2sgKHdyYXBwZWQgdG8gcHJldmVudCBjYWxsZXIgZXJyb3JzIGZyb20gYnJlYWtpbmcgdHJhY2spXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2ZnLm9uRXZlbnQ/LihuYW1lLCBwcm9wZXJ0aWVzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJvbkV2ZW50IGNhbGxiYWNrIHRocmV3XCIsIGVycik7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXVlLnNpemUoKSA+PSB0aGlzLmNmZy5mbHVzaFNpemUpIHtcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBUcmFja2VkOiAke25hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGZlYXR1cmUgZmxhZyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlICsgaWRlbnRpdHkuIFJlYWRzXG4gICAqIHRoZSBjYWNoZWQgc2VydmVyLWV2YWx1YXRlZCB2YWx1ZSBmcm9tIGAvdjEvY29uZmlnYCAocmVmcmVzaGVkIG9uXG4gICAqIGBjb25maWdSZWZyZXNoSW50ZXJ2YWxgKS4gRmlyZXMgYCRmbGFnX2V4cG9zdXJlYCBvbmNlIHBlciBzZXNzaW9uXG4gICAqIHBlciBmbGFnLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpZiAoZ3QuZmxhZyhcIm5ld19jaGVja291dF9mbG93XCIsIGZhbHNlKSkge1xuICAgKiAgIHJlbmRlck5ld0NoZWNrb3V0KCk7XG4gICAqIH1cbiAgICovXG4gIGZsYWcoZmxhZ0tleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IEZsYWdWYWx1ZSA9IGZhbHNlKTogRmxhZ1ZhbHVlIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oXCJmbGFnKCkgY2FsbGVkIGFmdGVyIGRlc3Ryb3koKS4gUmV0dXJuaW5nIGRlZmF1bHQuXCIpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmxhZ01hbmFnZXIuZXZhbHVhdGUoXG4gICAgICBmbGFnS2V5LFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgdGhpcy5jb250ZXh0LmdldFVzZXJJZCgpLFxuICAgICAgdGhpcy5jb250ZXh0LmdldFVzZXJUcmFpdHMoKSxcbiAgICAgIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMudHJhY2soXCIkZmxhZ19leHBvc3VyZVwiLCB7IGZsYWdfa2V5OiBrZXksIGZsYWdfdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGVGbGFnKGtleTogc3RyaW5nLCB2YWx1ZTogRmxhZ1ZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5mbGFnTWFuYWdlci5vdmVycmlkZUZsYWcoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhck92ZXJyaWRlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLmNsZWFyT3ZlcnJpZGVzKCk7XG4gIH1cblxuICBnZXRPdmVycmlkZXMoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmZsYWdNYW5hZ2VyLmdldE92ZXJyaWRlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGJ1Y2tldGVkIHZhcmlhbnQgKyBwYXlsb2FkIGZvciBhbiBleHBlcmltZW50LiBTdGlja3lcbiAgICogcGVyIGRldmljZS4gRmlyZXMgYCRleHBlcmltZW50X2V4cG9zdXJlYCBvbmNlIHBlciBzZXNzaW9uIHBlclxuICAgKiBleHBlcmltZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCB7IHZhcmlhbnQsIHBheWxvYWQgfSA9IGd0LmV4cGVyaW1lbnQoXCJoZXJvX2gxX2NvcHlfdjFcIik7XG4gICAqIGlmICh2YXJpYW50ICE9PSBcImNvbnRyb2xcIikgc2V0SGVhZGxpbmUoKHBheWxvYWQgYXMgeyBoZWFkbGluZTogc3RyaW5nIH0pLmhlYWRsaW5lKTtcbiAgICovXG4gIGV4cGVyaW1lbnQoZXhwZXJpbWVudEtleTogc3RyaW5nKTogRXhwZXJpbWVudFJlc3VsdCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKFwiZXhwZXJpbWVudCgpIGNhbGxlZCBhZnRlciBkZXN0cm95KCkuIFJldHVybmluZyBjb250cm9sLlwiKTtcbiAgICAgIHJldHVybiB7IHZhcmlhbnQ6IFwiY29udHJvbFwiIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLnJlc29sdmUoZXhwZXJpbWVudEtleSwgKGtleSwgdmFyaWFudCkgPT4ge1xuICAgICAgdGhpcy50cmFjayhcIiRleHBlcmltZW50X2V4cG9zdXJlXCIsIHtcbiAgICAgICAgZXhwZXJpbWVudF9rZXk6IGtleSxcbiAgICAgICAgdmFyaWFudCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRpZSB0aGUgY3VycmVudCBkZXZpY2UgdG8gYSBzdGFibGUgdXNlciBpZCBhbmQgbWVyZ2UgdHJhaXRzIG9udG9cbiAgICogdGhlIEdvYVRlY2ggdXNlciByZWNvcmQuIFJlLWlkZW50aWZ5aW5nIHdpdGggYSBkaWZmZXJlbnQgdXNlcklkXG4gICAqIGNsZWFycyB0aGUgY2FjaGVkIGV4cGVyaW1lbnQgYXNzaWdubWVudHMgc28gdGhlIG5ldyBpZGVudGl0eVxuICAgKiBnZXRzIGZyZXNoIGJ1Y2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF3YWl0IGFwaS5sb2dpbihmb3JtKTtcbiAgICogZ3QuaWRlbnRpZnkoXCJ1c2VyX2FiYzEyM1wiLCB7IGVtYWlsOiBcImphbmVAZXhhbXBsZS5jb21cIiwgcGxhbjogXCJwcm9cIiB9KTtcbiAgICovXG4gIGlkZW50aWZ5KHVzZXJJZDogc3RyaW5nLCB0cmFpdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgdGhpcy5sb2cud2FybihcImlkZW50aWZ5KCkgY2FsbGVkIGFmdGVyIGRlc3Ryb3koKS4gSWdub3JpbmcuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlkZW50aXR5TWFuYWdlci5pZGVudGlmeSh1c2VySWQsIHRyYWl0cywge1xuICAgICAgZ2V0Q3VycmVudFVzZXJJZDogKCkgPT4gdGhpcy5jb250ZXh0LmdldFVzZXJJZCgpLFxuICAgICAgc2V0VXNlcklkOiAoaWQpID0+IHRoaXMuY29udGV4dC5zZXRVc2VySWQoaWQpLFxuICAgICAgdXBkYXRlVHJhaXRzOiAodCkgPT4gdGhpcy5jb250ZXh0LnVwZGF0ZVVzZXJQcm9wZXJ0aWVzKHQpLFxuICAgICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB0aGlzLmNvbnRleHQucmVzZXRJZGVudGl0eSgpLFxuICAgICAgY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHM6ICgpID0+IHRoaXMuZXhwZXJpbWVudE1hbmFnZXIuY2xlYXJBc3NpZ25tZW50cygpLFxuICAgICAgZmx1c2g6ICgpID0+IHRoaXMuZmx1c2goKSxcbiAgICAgIHBvc3RJZGVudGl0eVJlc29sdmU6ICh1aWQsIHByZXZJZCkgPT4ge1xuICAgICAgICB0aGlzLnBvc3RJZGVudGl0eVJlc29sdmUodWlkLCBwcmV2SWQpLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvcihcIklkZW50aXR5IHJlc29sdmUgZmFpbGVkXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JnZXQgdGhlIGN1cnJlbnQgaWRlbnRpdHkgKyBleHBlcmltZW50IGFzc2lnbm1lbnRzIGFuZCBzdGFydCBhXG4gICAqIGZyZXNoIGFub255bW91cyBzZXNzaW9uLiBDYWxsIG9uIGxvZ291dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgYXBpLmxvZ291dCgpO1xuICAgKiBndC5yZXNldCgpO1xuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIucmVzZXQoe1xuICAgICAgcmVzZXRTZXNzaW9uOiAoKSA9PiB0aGlzLmNvbnRleHQucmVzZXRJZGVudGl0eSgpLFxuICAgICAgY2xlYXJFeHBlcmltZW50QXNzaWdubWVudHM6ICgpID0+IHRoaXMuZXhwZXJpbWVudE1hbmFnZXIuY2xlYXJBc3NpZ25tZW50cygpLFxuICAgICAgZmx1c2g6ICgpID0+IHRoaXMuZmx1c2goKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbiBhbnkgcXVldWVkIGV2ZW50cyB0byB0aGUgR29hVGVjaCBpbmdlc3QgZW5kcG9pbnQuIFVzZWZ1bFxuICAgKiBiZWZvcmUgbmF2aWdhdGlvbiBpbiBzaW5nbGUtcGFnZSBhcHBzIGFuZCByZXF1aXJlZCBiZWZvcmVcbiAgICogVmVyY2VsL0xhbWJkYSBmdW5jdGlvbiBleGl0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcm91dGVyLmJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgKiAgIGF3YWl0IGd0LmZsdXNoKCk7XG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQuZmx1c2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgdGhlIFNESyBvZiBhIHJvdXRlIGNoYW5nZS4gVGhlIGZpcnN0IGNhbGwgc3RhcnRzIGEgcGFnZS1sZWF2ZVxuICAgKiB0aW1lcjsgc3Vic2VxdWVudCBjYWxscyBlbWl0IGEgc3ludGhldGljIGAkcGFnZV9sZWF2ZWAgZm9yIHRoZSBwcmlvclxuICAgKiByb3V0ZSAod2l0aCBgZXhpdF9raW5kOiBcInNwYV9uYXZcImApIGJlZm9yZSByZXNldHRpbmcgc3RhdGUuIFdpcmVcbiAgICogdGhpcyBpbnRvIHlvdXIgcm91dGVyIOKAlCBmb3IgTmV4dC5qcywgdXNlIGA8UGFnZVZpZXdUcmFja2VyPmAgZnJvbVxuICAgKiBgQGdvYXRlY2gvcmVhY3RgLCB3aGljaCBjYWxscyB0aGlzIGZvciB5b3UuXG4gICAqXG4gICAqIElkZW1wb3RlbnQgZm9yIHJlcGVhdCBjYWxscyB3aXRoIHRoZSBzYW1lIHBhdGguXG4gICAqL1xuICByZWNvcmRQYWdlVmlldyhwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmxpZmVjeWNsZS5yZWNvcmRQYWdlVmlldyhwYXRoKTtcbiAgfVxuXG4gIHN0YXR1cygpOiBTREtTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0aWFsaXplZDogIXRoaXMuZGVzdHJveWVkLFxuICAgICAgb25saW5lOiB0aGlzLmNvbm5lY3Rpdml0eS5pc09ubGluZSgpLFxuICAgICAgcXVldWVEZXB0aDogdGhpcy5xdWV1ZS5zaXplKCksXG4gICAgICBvZmZsaW5lUXVldWVEZXB0aDogdGhpcy5vZmZsaW5lUXVldWUuc2l6ZSgpLFxuICAgICAgbGFzdEZsdXNoQXQ6IHRoaXMudHJhbnNwb3J0LmdldExhc3RGbHVzaEF0KCksXG4gICAgICBkZXZpY2VJZDogdGhpcy5jb250ZXh0LmdldERldmljZUlkKCksXG4gICAgICB1c2VySWQ6IHRoaXMuY29udGV4dC5nZXRVc2VySWQoKSxcbiAgICAgIGZsYWdDb3VudDogdGhpcy5mbGFnTWFuYWdlci5jb3VudCgpLFxuICAgICAgZXhwZXJpbWVudENvdW50OiB0aGlzLmV4cGVyaW1lbnRNYW5hZ2VyLmNvdW50KCksXG4gICAgICBzZGtWZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICB9O1xuICB9XG5cbiAgZGlhZ25vc3RpY3MoKTogRGlhZ25vc3RpY0J1cyB7XG4gICAgcmV0dXJuIHRoaXMuYnVzO1xuICB9XG5cbiAgZ2V0UmVjZW50RGlhZ25vc3RpY3MoKTogRGlhZ25vc3RpY0V2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLmJ1cy5nZXRSZWNlbnREaWFnbm9zdGljcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYWxsIHRpbWVycywgZHJhaW4gcmVtYWluaW5nIGV2ZW50cywgYW5kIHRlYXIgZG93biBhdXRvLWVycm9yXG4gICAqICsgbGlmZWN5Y2xlIGxpc3RlbmVycy4gQWZ0ZXIgYGRlc3Ryb3koKWAgZnVydGhlciBgdHJhY2soKWAgL1xuICAgKiBgZmxhZygpYCBjYWxscyBhcmUgbm8tb3BzLiBJZGVtcG90ZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBSZXBsYWNpbmcgdGhlIFNESyBpbnN0YW5jZSAocmFyZTsgdXN1YWxseSBqdXN0IGNhbGwgb25jZSlcbiAgICogY29uc3Qgb2xkID0gR29hVGVjaC5nZXRJbnN0YW5jZSgpO1xuICAgKiBvbGQuZGVzdHJveSgpO1xuICAgKiBjb25zdCBmcmVzaCA9IEdvYVRlY2guaW5pdCh7IGFwaUtleTogbmV4dEtleSB9KTtcbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIGZpcmUtYW5kLWZvcmdldCBmbHVzaFxuICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lciAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmZsdXNoVGltZXIpO1xuICAgICAgdGhpcy5mbHVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb25maWdTeW5jLnN0b3AoKTtcbiAgICB0aGlzLmNvbm5lY3Rpdml0eS5kZXN0cm95KCk7XG4gICAgdGhpcy5saWZlY3ljbGUuZGVzdHJveSgpO1xuICAgIHRoaXMuZXJyb3JDYXB0dXJlPy51bmluc3RhbGwoKTtcbiAgICB0aGlzLmh0dHBFcnJvckNhcHR1cmU/LnVuaW5zdGFsbCgpO1xuICAgIHRoaXMuY2xpY2tGcnVzdHJhdGlvbkNhcHR1cmU/LnVuaW5zdGFsbCgpO1xuICAgIC8vIE9ubHkgY2xlYXIgc2luZ2xldG9uIHJlZiBpZiB0aGlzIElTIHRoZSBzaW5nbGV0b25cbiAgICBpZiAoR29hVGVjaC5pbnN0YW5jZSA9PT0gdGhpcykge1xuICAgICAgR29hVGVjaC5pbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRpYWdub3N0aWMoXCJpbmZvXCIsIFwibGlmZWN5Y2xlXCIsIFwibGlmZWN5Y2xlLmRlc3Ryb3llZFwiLCBcIlNESyBpbnN0YW5jZSBkZXN0cm95ZWRcIik7XG4gICAgdGhpcy5sb2cuZGVidWcoXCJEZXN0cm95ZWQuXCIpO1xuICB9XG5cbiAgLy8gLS0tIFByaXZhdGUgLS0tXG5cbiAgcHJpdmF0ZSBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBMb2FkIHN0b3JlZCBkZXZpY2UgSURcbiAgICBjb25zdCBleGlzdGluZ0RldmljZUlkID0gZ2V0RGV2aWNlSWQoKTtcbiAgICBpZiAoZXhpc3RpbmdEZXZpY2VJZCkge1xuICAgICAgdGhpcy5jb250ZXh0LnNldERldmljZUlkKGV4aXN0aW5nRGV2aWNlSWQpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGNvbmZpZyBzeW5jIChub24tYmxvY2tpbmcg4oCUIGxvYWRzIGZyb20gY2FjaGUgZmlyc3QsIHRoZW4gZmV0Y2hlcylcbiAgICAvLyBQYXNzIGEgZ2V0dGVyIHNvIHJlZnJlc2ggaW50ZXJ2YWxzIGFsd2F5cyB1c2UgdGhlIGxhdGVzdCBkZXZpY2UgSURcbiAgICB0aGlzLmNvbmZpZ1N5bmMuc3RhcnQoKCkgPT4gdGhpcy5jb250ZXh0LmdldERldmljZUlkKCkpO1xuXG4gICAgLy8gUmVnaXN0ZXIgZGV2aWNlIGlmIG5lZWRlZCAobm9uLWJsb2NraW5nKVxuICAgIGlmICghZXhpc3RpbmdEZXZpY2VJZCkge1xuICAgICAgY29uc3QgYW5vbnltb3VzSWQgPSB0aGlzLmNvbnRleHQuZ2V0QW5vbnltb3VzSWQoKTtcbiAgICAgIGNvbnN0IGluZm8gPSBnZXREZXZpY2VJbmZvKCk7XG4gICAgICByZWdpc3RlckRldmljZShcbiAgICAgICAgdGhpcy5jZmcuYXBpVXJsLFxuICAgICAgICB0aGlzLmNmZy5hcGlLZXksXG4gICAgICAgIHRoaXMuY2ZnLmVudmlyb25tZW50LFxuICAgICAgICBhbm9ueW1vdXNJZCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaW5mbyxcbiAgICAgIClcbiAgICAgICAgLnRoZW4oKGRldmljZUlkKSA9PiB7XG4gICAgICAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpO1xuICAgICAgICAgIHRoaXMuY29udGV4dC5zZXREZXZpY2VJZChkZXZpY2VJZCk7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXCJEZXZpY2UgcmVnaXN0ZXJlZFwiLCB7IGRldmljZUlkIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oXCJEZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCwgdXNpbmcgYW5vbnltb3VzIElEXCIsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IGZsdXNoIHRpbWVyXG4gICAgdGhpcy5mbHVzaFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5mbHVzaCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9LCB0aGlzLmNmZy5mbHVzaEludGVydmFsKTtcblxuICAgIC8vIFJlZ2lzdGVyIGxpZmVjeWNsZSBsaXN0ZW5lcnMgKGJlZm9yZXVubG9hZCwgcGFnZWhpZGUsIHZpc2liaWxpdHljaGFuZ2UpXG4gICAgdGhpcy5saWZlY3ljbGUucmVnaXN0ZXIoKTtcblxuICAgIC8vIEluc3RhbGwgYnJvd3NlciBlcnJvciBjYXB0dXJlICh3aW5kb3cub25lcnJvciwgdW5oYW5kbGVkcmVqZWN0aW9uLFxuICAgIC8vIGdvYXRlY2g6YXV0aC1ldmVudCkuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIgb3Igd2hlbiBkaXNhYmxlZC5cbiAgICB0aGlzLmVycm9yQ2FwdHVyZT8uaW5zdGFsbCgpO1xuXG4gICAgLy8gSW5zdGFsbCBIVFRQIGVycm9yIGNhcHR1cmUg4oCUIHdyYXBzIHdpbmRvdy5mZXRjaCwgZW1pdHMgJGh0dHBfZXJyb3Igb25cbiAgICAvLyBldmVyeSA0eHgvNXh4ICsgbmV0d29yayBmYWlsdXJlLiBOby1vcCBvdXRzaWRlIHRoZSBicm93c2VyIC8gZGlzYWJsZWQuXG4gICAgdGhpcy5odHRwRXJyb3JDYXB0dXJlPy5pbnN0YWxsKCk7XG5cbiAgICAvLyBJbnN0YWxsIGNsaWNrLWZydXN0cmF0aW9uIGNhcHR1cmUg4oCUIGVtaXRzICRyYWdlX2NsaWNrICsgJGRlYWRfY2xpY2tcbiAgICAvLyB3aGVuIHRoZSB1c2VyIGhhbW1lcnMgdGhlIHNhbWUgc3BvdCBvciBjbGlja3MgYSBub24taW50ZXJhY3RpdmVcbiAgICAvLyB0YXJnZXQuIE5vLW9wIG91dHNpZGUgdGhlIGJyb3dzZXIgLyBkaXNhYmxlZC5cbiAgICB0aGlzLmNsaWNrRnJ1c3RyYXRpb25DYXB0dXJlPy5pbnN0YWxsKCk7XG5cbiAgICAvLyBEcmFpbiBvZmZsaW5lIHF1ZXVlIHdoZW4gYmFjayBvbmxpbmVcbiAgICB0aGlzLmNvbm5lY3Rpdml0eS5vbk9ubGluZSgoKSA9PiB7XG4gICAgICBjb25zdCBxdWV1ZWQgPSB0aGlzLm9mZmxpbmVRdWV1ZS5kcmFpbigpO1xuICAgICAgaWYgKHF1ZXVlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBCYWNrIG9ubGluZSDigJQgZmx1c2hpbmcgJHtxdWV1ZWQubGVuZ3RofSBvZmZsaW5lIGV2ZW50cy5gKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIHF1ZXVlZCkgdGhpcy5xdWV1ZS5hZGQoZSk7XG4gICAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFbWl0IGAkc2Vzc2lvbl9zdGFydGAgb25jZSBwZXIgc2Vzc2lvbi4gVGhlIENvbnRleHRNYW5hZ2VyJ3NcbiAgICAvLyBgaXNOZXdTZXNzaW9uYCBmbGFnIGlzIHRydWUgb24gdGhlIGZpcnN0IFNESyBpbml0IHdpdGhpbiBhIG5ld1xuICAgIC8vIHNlc3Npb24gKGNvbGQgc3RhcnQsIG9yIGFmdGVyIHRoZSAzMC1taW4gaWRsZSB3aW5kb3cgcm9sbGVkIG92ZXIpLlxuICAgIC8vIEV2ZXJ5IHN1YnNlcXVlbnQgZXZlbnQgYWxyZWFkeSBjYXJyaWVzIGBjb250ZXh0LmF0dHJpYnV0aW9uYCwgYnV0XG4gICAgLy8gdGhlIGRlZGljYXRlZCBzdGFydCBldmVudCBtYWtlcyBpdCB0cml2aWFsIHRvIGJ1aWxkIGZ1bm5lbHMgbGlrZVxuICAgIC8vIFwic2Vzc2lvbnMgdGhhdCBjYW1lIGZyb20gdXRtX3NvdXJjZT10d2l0dGVyIGFuZCB0aGVuIHNpZ25lZCB1cFwiLlxuICAgIGlmICh0aGlzLmNvbnRleHQuaXNOZXdTZXNzaW9uKSB7XG4gICAgICBjb25zdCBhdHRyID0gdGhpcy5jb250ZXh0LmdldFNlc3Npb25BdHRyaWJ1dGlvbigpO1xuICAgICAgdGhpcy50cmFjayhcIiRzZXNzaW9uX3N0YXJ0XCIsIGF0dHIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDb25maWcoY29uZmlnOiBTREtDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdNYW5hZ2VyLnNldEV2YWx1YXRlZEZsYWdzKGNvbmZpZy5mbGFncyk7XG4gICAgdGhpcy5leHBlcmltZW50TWFuYWdlci5zZXRBc3NpZ25tZW50cyhjb25maWcuZXhwZXJpbWVudHMpO1xuICAgIHRoaXMubG9nLmRlYnVnKFwiQ29uZmlnIGFwcGxpZWRcIiwge1xuICAgICAgZmxhZ3M6IE9iamVjdC5rZXlzKGNvbmZpZy5mbGFncykubGVuZ3RoLFxuICAgICAgZXhwZXJpbWVudHM6IE9iamVjdC5rZXlzKGNvbmZpZy5leHBlcmltZW50cykubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwb3N0SWRlbnRpdHlSZXNvbHZlKHVzZXJJZDogc3RyaW5nLCBfcHJldmlvdXNVc2VySWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VJZCA9IGdldERldmljZUlkKCk7XG4gICAgaWYgKCFkZXZpY2VJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7dGhpcy5jZmcuYXBpVXJsfS92MS9kZXZpY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRldmljZUlkKX0vaWRlbnRpZnlgLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY2ZnLmFwaUtleX1gLFxuICAgICAgICAgIFwiWC1FbnZpcm9ubWVudFwiOiB0aGlzLmNmZy5lbnZpcm9ubWVudCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1c2VyX2lkOiB1c2VySWQgfSksXG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSWRlbnRpdHkgcmVzb2x2ZSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFdmVudE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltHb2FUZWNoXSBFdmVudCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5LlwiKTtcbiAgfVxuICBjb25zdCB0cmltbWVkID0gbmFtZS50cmltKCkuc2xpY2UoMCwgRVZFTlRfTkFNRV9NQVhfTEVOR1RIKTtcbiAgcmV0dXJuIHRyaW1tZWQucmVwbGFjZSgvXFxzKy9nLCBcIl9cIik7XG59XG4iXX0=
|
|
1
|
+
export * from '@sheepit-ai/sdk-js';
|
|
2
|
+
|
|
3
|
+
// src/index.ts
|
|
4
|
+
var globals = globalThis;
|
|
5
|
+
if (!globals.__goatech_sdk_js_warned__) {
|
|
6
|
+
globals.__goatech_sdk_js_warned__ = true;
|
|
7
|
+
console.warn(
|
|
8
|
+
"@goatech/sdk-js is deprecated; rename your import to @sheepit-ai/sdk-js before 2026-11-26. See https://www.goatech.ai/docs/migrate-to-sheepit"
|
|
9
|
+
);
|
|
10
|
+
}
|
package/package.json
CHANGED
|
@@ -1,28 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goatech/sdk-js",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Deprecated — use @sheepit-ai/sdk-js. This package re-exports @sheepit-ai/sdk-js for backward compatibility.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "GoaTech",
|
|
7
7
|
"homepage": "https://goatech.ai",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "git+https://github.com/goatech-ai/GoaTech.git",
|
|
11
|
-
"directory": "packages/sdk-js"
|
|
12
|
-
},
|
|
13
|
-
"bugs": {
|
|
14
|
-
"url": "https://github.com/goatech-ai/GoaTech/issues"
|
|
11
|
+
"directory": "packages/sdk-js-shim"
|
|
15
12
|
},
|
|
16
13
|
"keywords": [
|
|
17
14
|
"goatech",
|
|
18
|
-
"
|
|
15
|
+
"sheepit",
|
|
16
|
+
"sdk",
|
|
19
17
|
"feature-flags",
|
|
20
|
-
"flags",
|
|
21
|
-
"experiments",
|
|
22
|
-
"ab-testing",
|
|
23
|
-
"rollouts",
|
|
24
18
|
"events",
|
|
25
|
-
"
|
|
19
|
+
"deprecated"
|
|
26
20
|
],
|
|
27
21
|
"engines": {
|
|
28
22
|
"node": ">=18"
|
|
@@ -30,7 +24,10 @@
|
|
|
30
24
|
"publishConfig": {
|
|
31
25
|
"access": "public"
|
|
32
26
|
},
|
|
33
|
-
"sideEffects":
|
|
27
|
+
"sideEffects": [
|
|
28
|
+
"./dist/index.js",
|
|
29
|
+
"./dist/index.mjs"
|
|
30
|
+
],
|
|
34
31
|
"main": "./dist/index.js",
|
|
35
32
|
"module": "./dist/index.mjs",
|
|
36
33
|
"types": "./dist/index.d.ts",
|
|
@@ -58,21 +55,21 @@
|
|
|
58
55
|
},
|
|
59
56
|
"files": [
|
|
60
57
|
"dist",
|
|
61
|
-
"README.md"
|
|
62
|
-
"LICENSE"
|
|
58
|
+
"README.md"
|
|
63
59
|
],
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"dev": "tsup --watch",
|
|
67
|
-
"test": "vitest run",
|
|
68
|
-
"lint": "eslint src --ext .ts"
|
|
60
|
+
"dependencies": {
|
|
61
|
+
"@sheepit-ai/sdk-js": "1.0.0"
|
|
69
62
|
},
|
|
70
63
|
"devDependencies": {
|
|
71
64
|
"@types/node": "^20.0.0",
|
|
72
|
-
"@vitest/coverage-v8": "^3.0.0",
|
|
73
|
-
"jsdom": "^29.0.1",
|
|
74
65
|
"tsup": "^8.0.0",
|
|
75
66
|
"typescript": "^5.4.0",
|
|
76
|
-
"vitest": "^
|
|
67
|
+
"vitest": "^3.0.0"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"build": "tsup",
|
|
71
|
+
"dev": "tsup --watch",
|
|
72
|
+
"lint": "eslint src --ext .ts",
|
|
73
|
+
"test": "vitest run"
|
|
77
74
|
}
|
|
78
|
-
}
|
|
75
|
+
}
|