@kitten-science/kitten-scientists 2.0.0-beta.11-dev → 2.0.0-beta.11-dev.20250518

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.
@@ -0,0 +1,23 @@
1
+ (function(m){typeof define=="function"&&define.amd?define(["dojo"],m):m()})(function(){"use strict";var jo=Object.defineProperty;var $s=m=>{throw TypeError(m)};var Jo=(m,N,j)=>N in m?jo(m,N,{enumerable:!0,configurable:!0,writable:!0,value:j}):m[N]=j;var u=(m,N,j)=>Jo(m,typeof N!="symbol"?N+"":N,j),Ls=(m,N,j)=>N.has(m)||$s("Cannot "+j);var P=(m,N,j)=>(Ls(m,N,"read from private field"),j?j.call(m):N.get(m)),I=(m,N,j)=>N.has(m)?$s("Cannot add the same private member more than once"):N instanceof WeakSet?N.add(m):N.set(m,j),L=(m,N,j,p)=>(Ls(m,N,"write to private field"),p?p.call(m,j):N.set(m,j),j);var Ue,De,Ne,qe,ze,Fe,He,We,Ge,Ze,Ke,Ve,je,Je,Xe,Ye,Qe,et,tt,it,st,nt,at,rt,ot,lt,ct,ht,ut,dt;function m(c){return c==null}function N(c,s){return!m(c)&&c instanceof s}class j extends Error{constructor(s="unexpected nil value"){super(s)}}function p(c,s){if(m(c))throw new j(s);return c}function ft(c,s){const e=new Array;for(const t of c)m(t)?m(s)||e.push(s):e.push(t);return e}const se=c=>e=>{c.error(e)};class be extends Error{constructor(e,t,i){super(t);u(this,"status");u(this,"code");this.code=e,this.name="AbstractError",this.status=i,typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,be)}static isAbstractError(e,t=!0){if(e instanceof be)return!0;if(t){const i=e;if(Object(e)===e&&"code"in i&&typeof i.code=="string"&&e.code.match(/^ERR_OS_/))return!0}return!1}}class bt extends be{constructor(s,e=400){super("ERR_OS_INVALID_OPERATION",s,e),this.name="InvalidOperationError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,bt)}}var qt,Pi;function Ii(){return Pi||(Pi=1,qt=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...s)=>console.error("SEMVER",...s):()=>{}),qt}var zt,$i;function Li(){if($i)return zt;$i=1;const c="2.0.0",s=256,e=Number.MAX_SAFE_INTEGER||9007199254740991,t=16,i=s-6;return zt={MAX_LENGTH:s,MAX_SAFE_COMPONENT_LENGTH:t,MAX_SAFE_BUILD_LENGTH:i,MAX_SAFE_INTEGER:e,RELEASE_TYPES:["major","premajor","minor","preminor","patch","prepatch","prerelease"],SEMVER_SPEC_VERSION:c,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2},zt}var pt={exports:{}},Oi;function Os(){return Oi||(Oi=1,function(c,s){const{MAX_SAFE_COMPONENT_LENGTH:e,MAX_SAFE_BUILD_LENGTH:t,MAX_LENGTH:i}=Li(),n=Ii();s=c.exports={};const a=s.re=[],r=s.safeRe=[],o=s.src=[],l=s.safeSrc=[],h=s.t={};let d=0;const g="[a-zA-Z0-9-]",f=[["\\s",1],["\\d",i],[g,t]],w=k=>{for(const[y,A]of f)k=k.split(`${y}*`).join(`${y}{0,${A}}`).split(`${y}+`).join(`${y}{1,${A}}`);return k},b=(k,y,A)=>{const V=w(y),Q=d++;n(k,Q,y),h[k]=Q,o[Q]=y,l[Q]=V,a[Q]=new RegExp(y,A?"g":void 0),r[Q]=new RegExp(V,A?"g":void 0)};b("NUMERICIDENTIFIER","0|[1-9]\\d*"),b("NUMERICIDENTIFIERLOOSE","\\d+"),b("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${g}*`),b("MAINVERSION",`(${o[h.NUMERICIDENTIFIER]})\\.(${o[h.NUMERICIDENTIFIER]})\\.(${o[h.NUMERICIDENTIFIER]})`),b("MAINVERSIONLOOSE",`(${o[h.NUMERICIDENTIFIERLOOSE]})\\.(${o[h.NUMERICIDENTIFIERLOOSE]})\\.(${o[h.NUMERICIDENTIFIERLOOSE]})`),b("PRERELEASEIDENTIFIER",`(?:${o[h.NONNUMERICIDENTIFIER]}|${o[h.NUMERICIDENTIFIER]})`),b("PRERELEASEIDENTIFIERLOOSE",`(?:${o[h.NONNUMERICIDENTIFIER]}|${o[h.NUMERICIDENTIFIERLOOSE]})`),b("PRERELEASE",`(?:-(${o[h.PRERELEASEIDENTIFIER]}(?:\\.${o[h.PRERELEASEIDENTIFIER]})*))`),b("PRERELEASELOOSE",`(?:-?(${o[h.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${o[h.PRERELEASEIDENTIFIERLOOSE]})*))`),b("BUILDIDENTIFIER",`${g}+`),b("BUILD",`(?:\\+(${o[h.BUILDIDENTIFIER]}(?:\\.${o[h.BUILDIDENTIFIER]})*))`),b("FULLPLAIN",`v?${o[h.MAINVERSION]}${o[h.PRERELEASE]}?${o[h.BUILD]}?`),b("FULL",`^${o[h.FULLPLAIN]}$`),b("LOOSEPLAIN",`[v=\\s]*${o[h.MAINVERSIONLOOSE]}${o[h.PRERELEASELOOSE]}?${o[h.BUILD]}?`),b("LOOSE",`^${o[h.LOOSEPLAIN]}$`),b("GTLT","((?:<|>)?=?)"),b("XRANGEIDENTIFIERLOOSE",`${o[h.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),b("XRANGEIDENTIFIER",`${o[h.NUMERICIDENTIFIER]}|x|X|\\*`),b("XRANGEPLAIN",`[v=\\s]*(${o[h.XRANGEIDENTIFIER]})(?:\\.(${o[h.XRANGEIDENTIFIER]})(?:\\.(${o[h.XRANGEIDENTIFIER]})(?:${o[h.PRERELEASE]})?${o[h.BUILD]}?)?)?`),b("XRANGEPLAINLOOSE",`[v=\\s]*(${o[h.XRANGEIDENTIFIERLOOSE]})(?:\\.(${o[h.XRANGEIDENTIFIERLOOSE]})(?:\\.(${o[h.XRANGEIDENTIFIERLOOSE]})(?:${o[h.PRERELEASELOOSE]})?${o[h.BUILD]}?)?)?`),b("XRANGE",`^${o[h.GTLT]}\\s*${o[h.XRANGEPLAIN]}$`),b("XRANGELOOSE",`^${o[h.GTLT]}\\s*${o[h.XRANGEPLAINLOOSE]}$`),b("COERCEPLAIN",`(^|[^\\d])(\\d{1,${e}})(?:\\.(\\d{1,${e}}))?(?:\\.(\\d{1,${e}}))?`),b("COERCE",`${o[h.COERCEPLAIN]}(?:$|[^\\d])`),b("COERCEFULL",o[h.COERCEPLAIN]+`(?:${o[h.PRERELEASE]})?(?:${o[h.BUILD]})?(?:$|[^\\d])`),b("COERCERTL",o[h.COERCE],!0),b("COERCERTLFULL",o[h.COERCEFULL],!0),b("LONETILDE","(?:~>?)"),b("TILDETRIM",`(\\s*)${o[h.LONETILDE]}\\s+`,!0),s.tildeTrimReplace="$1~",b("TILDE",`^${o[h.LONETILDE]}${o[h.XRANGEPLAIN]}$`),b("TILDELOOSE",`^${o[h.LONETILDE]}${o[h.XRANGEPLAINLOOSE]}$`),b("LONECARET","(?:\\^)"),b("CARETTRIM",`(\\s*)${o[h.LONECARET]}\\s+`,!0),s.caretTrimReplace="$1^",b("CARET",`^${o[h.LONECARET]}${o[h.XRANGEPLAIN]}$`),b("CARETLOOSE",`^${o[h.LONECARET]}${o[h.XRANGEPLAINLOOSE]}$`),b("COMPARATORLOOSE",`^${o[h.GTLT]}\\s*(${o[h.LOOSEPLAIN]})$|^$`),b("COMPARATOR",`^${o[h.GTLT]}\\s*(${o[h.FULLPLAIN]})$|^$`),b("COMPARATORTRIM",`(\\s*)${o[h.GTLT]}\\s*(${o[h.LOOSEPLAIN]}|${o[h.XRANGEPLAIN]})`,!0),s.comparatorTrimReplace="$1$2$3",b("HYPHENRANGE",`^\\s*(${o[h.XRANGEPLAIN]})\\s+-\\s+(${o[h.XRANGEPLAIN]})\\s*$`),b("HYPHENRANGELOOSE",`^\\s*(${o[h.XRANGEPLAINLOOSE]})\\s+-\\s+(${o[h.XRANGEPLAINLOOSE]})\\s*$`),b("STAR","(<|>)?=?\\s*\\*"),b("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),b("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}(pt,pt.exports)),pt.exports}var Ft,Ui;function Us(){if(Ui)return Ft;Ui=1;const c=Object.freeze({loose:!0}),s=Object.freeze({});return Ft=t=>t?typeof t!="object"?c:t:s,Ft}var Ht,Di;function Ds(){if(Di)return Ht;Di=1;const c=/^[0-9]+$/,s=(t,i)=>{const n=c.test(t),a=c.test(i);return n&&a&&(t=+t,i=+i),t===i?0:n&&!a?-1:a&&!n?1:t<i?-1:1};return Ht={compareIdentifiers:s,rcompareIdentifiers:(t,i)=>s(i,t)},Ht}var Wt,Ni;function Ns(){if(Ni)return Wt;Ni=1;const c=Ii(),{MAX_LENGTH:s,MAX_SAFE_INTEGER:e}=Li(),{safeRe:t,t:i}=Os(),n=Us(),{compareIdentifiers:a}=Ds();class r{constructor(l,h){if(h=n(h),l instanceof r){if(l.loose===!!h.loose&&l.includePrerelease===!!h.includePrerelease)return l;l=l.version}else if(typeof l!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof l}".`);if(l.length>s)throw new TypeError(`version is longer than ${s} characters`);c("SemVer",l,h),this.options=h,this.loose=!!h.loose,this.includePrerelease=!!h.includePrerelease;const d=l.trim().match(h.loose?t[i.LOOSE]:t[i.FULL]);if(!d)throw new TypeError(`Invalid Version: ${l}`);if(this.raw=l,this.major=+d[1],this.minor=+d[2],this.patch=+d[3],this.major>e||this.major<0)throw new TypeError("Invalid major version");if(this.minor>e||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>e||this.patch<0)throw new TypeError("Invalid patch version");d[4]?this.prerelease=d[4].split(".").map(g=>{if(/^[0-9]+$/.test(g)){const f=+g;if(f>=0&&f<e)return f}return g}):this.prerelease=[],this.build=d[5]?d[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(l){if(c("SemVer.compare",this.version,this.options,l),!(l instanceof r)){if(typeof l=="string"&&l===this.version)return 0;l=new r(l,this.options)}return l.version===this.version?0:this.compareMain(l)||this.comparePre(l)}compareMain(l){return l instanceof r||(l=new r(l,this.options)),a(this.major,l.major)||a(this.minor,l.minor)||a(this.patch,l.patch)}comparePre(l){if(l instanceof r||(l=new r(l,this.options)),this.prerelease.length&&!l.prerelease.length)return-1;if(!this.prerelease.length&&l.prerelease.length)return 1;if(!this.prerelease.length&&!l.prerelease.length)return 0;let h=0;do{const d=this.prerelease[h],g=l.prerelease[h];if(c("prerelease compare",h,d,g),d===void 0&&g===void 0)return 0;if(g===void 0)return 1;if(d===void 0)return-1;if(d===g)continue;return a(d,g)}while(++h)}compareBuild(l){l instanceof r||(l=new r(l,this.options));let h=0;do{const d=this.build[h],g=l.build[h];if(c("build compare",h,d,g),d===void 0&&g===void 0)return 0;if(g===void 0)return 1;if(d===void 0)return-1;if(d===g)continue;return a(d,g)}while(++h)}inc(l,h,d){if(l.startsWith("pre")){if(!h&&d===!1)throw new Error("invalid increment argument: identifier is empty");if(h){const g=`-${h}`.match(this.options.loose?t[i.PRERELEASELOOSE]:t[i.PRERELEASE]);if(!g||g[1]!==h)throw new Error(`invalid identifier: ${h}`)}}switch(l){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",h,d);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",h,d);break;case"prepatch":this.prerelease.length=0,this.inc("patch",h,d),this.inc("pre",h,d);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",h,d),this.inc("pre",h,d);break;case"release":if(this.prerelease.length===0)throw new Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":{const g=Number(d)?1:0;if(this.prerelease.length===0)this.prerelease=[g];else{let f=this.prerelease.length;for(;--f>=0;)typeof this.prerelease[f]=="number"&&(this.prerelease[f]++,f=-2);if(f===-1){if(h===this.prerelease.join(".")&&d===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(g)}}if(h){let f=[h,g];d===!1&&(f=[h]),a(this.prerelease[0],h)===0?isNaN(this.prerelease[1])&&(this.prerelease=f):this.prerelease=f}break}default:throw new Error(`invalid increment argument: ${l}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}}return Wt=r,Wt}var Gt,qi;function qs(){if(qi)return Gt;qi=1;const c=Ns();return Gt=(e,t,i)=>new c(e,i).compare(new c(t,i)),Gt}var Zt,zi;function zs(){if(zi)return Zt;zi=1;const c=qs();return Zt=(e,t,i)=>c(e,t,i)>0,Zt}zs();class Be extends be{constructor(s,e=500){super("ERR_OS_INTERNAL",s,e),this.name="InternalError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,Be)}static fromError(s){const e=new Be(s.message);return Object.assign(e,s,new Be(s.message)),e.stack=s.stack,e}}class Kt extends be{constructor(s,e=500){super("ERR_OS_UNKNOWN",s,e),this.name="UnknownError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,Kt)}}const Fs=c=>c instanceof Error||Object.prototype.toString.call(c)==="[object Error]",Hs=c=>be.isAbstractError(c)?c:Fs(c)?Be.fromError(c):new Kt(String(c)),ye=c=>{const s=performance.now();return[c(),performance.now()-s]},vt=async c=>{const s=performance.now();return[await c(),performance.now()-s]},ae=(c,s)=>c.filter(e=>!s.includes(e)),v=(...c)=>["👩‍🔬",...c.filter(s=>s!=="").flatMap(s=>{if(N(s,Error)){const e=s;return[e.name,e.message,e.stack]}return s})];function q(c){return Object.entries(c)}function z(c,s,e){if(m(s))return console.warn(...v("No source data was provided.")),c;for(const[t,i]of q(c))t in s||console.info(...v(`Entry '${t}' is missing in source. Using default value.`)),e(i,s[t]);for(const[t]of q(s))t in c||console.warn(...v(`Entry '${t}' was found in source, but it is not expected by the subject schema. This entry will be ignored.`));return c}class yt{constructor(s){u(this,"_elem");this._elem=structuredClone(s)}unwrap(){return structuredClone(this._elem)}replace(s){this._elem=structuredClone(s)}toJSON(){return this.unwrap()}}function X(c){return c.charAt(0).toUpperCase()+c.slice(1)}function Ws(c){return Math.round(c*100)/100}function Y(c){return c===-1?Number.POSITIVE_INFINITY:c}class wt{constructor(s,e){u(this,"_host");u(this,"_workshopManager");this._host=s,this._workshopManager=e}bulk(s,e,t,i){const n=[];let a=0;for(const[h,d]of q(s)){const g=oe.evaluateSubSectionTrigger(t,d.trigger),f=p(e[h]);if(!d.enabled||g<0||"tHidden"in f&&f.tHidden===!0||"rHidden"in f&&f.rHidden===!0||f.unlocked===!1||!m(d.max)&&-1<d.max&&d.max<=f.val||h==="cryochambers"&&(p(this._host.game.time.getVSU("usedCryochambers")).val>0||this._host.game.bld.getBuildingExt("chronosphere").meta.val<=f.val)||h==="ressourceRetrieval"&&f.val>=100)continue;const w=p(this._isStagedBuild(f)?f.stages[f.stage].prices:f.prices),b=this.getPriceRatio(f,i);if(!this.singleBuildPossible(f,w,b,i))continue;if(w.map(A=>this._workshopManager.getResource(A.name)).filter(A=>0<A.maxValue).filter(A=>A.value/A.maxValue<g).length===0){if(this._isStagedBuild(f)&&typeof d.stage<"u"&&d.stage!==f.stage)continue;const A=[],Q=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${h}CostReduction`),1);for(const ce of w){const ee=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${ce.name}CostReduction`),1);A.push({name:ce.name,val:ce.val*Q*ee})}n.push({count:0,id:h,label:d.label,limit:d.max||0,name:d.baseBuilding??d.building,priceRatio:b,prices:A,source:i,spot:a,val:f.val,variant:d.variant}),a++}}if(n.length===0)return[];const r={};for(const h of this._host.game.resPool.resources)r[h.name]=this._workshopManager.getValueAvailable(h.name);let o=0;const l=new Array;for(;o<1e5;){const h=ae(n,l);let d=0;const g=[];let f={...r};for(const w of l)f=this._precalculateBuilds({...w,limit:w.val+w.count},e,f).remainingResources;for(const w of h){const b=w.count+1,k=this._precalculateBuilds({...w,limit:Math.min(Y(w.limit),w.val+b)},e,f);if(k.count<b){g.push(w);continue}w.count=b,f=k.remainingResources,d++}if(l.push(...g),o++,d===0)break}return console.debug(...v(`Took '${o}' iterations to evaluate bulk build request.`)),l}_precalculateBuilds(s,e,t={}){let i=0;const n=Object.assign({},t),a=p(e[s.id]),r=s.prices,o=s.priceRatio,l=s.source;let h=!1;if(r.length===0)return{count:0,remainingResources:n};for(;!h;){for(let d=0;d<r.length;d++){let g=!1,f=!1,w=Number.POSITIVE_INFINITY,b=Number.POSITIVE_INFINITY;if(l==="Space"&&r[d].name==="oil"){g=!0;const k=this._host.game.getEffect("oilReductionRatio");w=r[d].val*(1-this._host.game.getLimitedDR(k,.75))}else if(s.id==="cryochambers"&&r[d].name==="karma"){f=!0;const k=this._host.game.prestige.getBurnedParagonRatio();b=r[d].val*(1-this._host.game.getLimitedDR(.01*k,1))}if(g?h=n.oil<w*1.05**(i+a.val):f?h=n.karma<b*o**(i+a.val):h=n[r[d].name]<r[d].val*o**(i+a.val),h||"noStackable"in a&&a.noStackable&&i+a.val>=1||s.id==="ressourceRetrieval"&&i+a.val>=100||s.id==="cryochambers"&&this._host.game.bld.getBuildingExt("chronosphere").meta.val<=i+a.val){for(let k=0;k<d;k++)if(l==="Space"&&r[k].name==="oil"){const y=this._host.game.getEffect("oilReductionRatio"),A=r[k].val*(1-this._host.game.getLimitedDR(y,.75));n.oil+=A*1.05**(i+a.val)}else if(s.id==="cryochambers"&&r[k].name==="karma"){const y=this._host.game.prestige.getBurnedParagonRatio(),A=r[k].val*(1-this._host.game.getLimitedDR(.01*y,1));n.karma+=A*o**(i+a.val)}else{const y=r[k].val*o**(i+a.val);n[r[k].name]+=r[k].name==="void"?Math.ceil(y):y}return s.limit&&s.limit!==-1&&(i=Math.max(0,Math.min(i,s.limit-s.val))),{count:i,remainingResources:n}}if(g)n.oil-=w*1.05**(i+a.val);else if(f)n.karma-=b*o**(i+a.val);else{const k=r[d].val*o**(i+a.val);n[r[d].name]-=r[d].name==="void"?Math.ceil(k):k}}++i}return{count:i,remainingResources:n}}construct(s,e,t){if(!("name"in s)||!("controller"in s.options)||!("getMetadata"in s.options.controller))return 0;const i=s.metadata;let n=0,a=t;const r=i;if(!m(r.limitBuild)&&r.limitBuild-r.val<a&&(a=r.limitBuild-r.val),s.enabled&&e.hasResources(s)||this._host.game.devMode){for(;e.hasResources(s)&&a>0;)s.prices=e.getPrices(s),e.payPrice(s),e.incrementValue(s),n++,a--;r.breakIronWill&&(this._host.game.ironWill=!1),m(i)||("unlocks"in i&&!m(i.unlocks)&&this._host.game.unlock(i.unlocks),"upgrades"in i&&!m(i.upgrades)&&this._host.game.upgrade(i.upgrades))}return n}_isStagedBuild(s){return"stage"in s&&"stages"in s&&!m(s.stage)&&!m(s.stages)}getPriceRatio(s,e){const t=this._isStagedBuild(s)?s.priceRatio||s.stages[s.stage].priceRatio:s.priceRatio??0;let i=0;return e&&e==="Bonfire"&&(i=this._host.game.getEffect(`${s.name}PriceRatio`)+this._host.game.getEffect("priceRatio")+this._host.game.getEffect("mapPriceReduction"),i=this._host.game.getLimitedDR(i,t-1)),t+i}singleBuildPossible(s,e,t,i){const a=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${s.name}CostReduction`),1);for(const r of e){const l=1-this._host.game.getLimitedDR(this._host.game.getEffect(`${r.name}CostReduction`),1),h=r.val*a*l;if(i&&i==="Space"&&r.name==="oil"){const d=this._host.game.getLimitedDR(this._host.game.getEffect("oilReductionRatio"),.75),g=h*(1-d);if(this._workshopManager.getValueAvailable("oil")<g*1.05**s.val)return!1}else if(s.name==="cryochambers"&&r.name==="karma"){const d=this._host.game.getLimitedDR(.01*this._host.game.prestige.getBurnedParagonRatio(),1),g=h*(1-d);if(this._workshopManager.getValueAvailable("karma")<g*t**s.val)return!1}else if(this._workshopManager.getValueAvailable(r.name)<h*t**s.val)return!1}return!0}}const Fi=["academy","accelerator","aiCore","amphitheatre","aqueduct","barn","biolab","brewery","calciner","chapel","chronosphere","factory","field","harbor","hut","library","logHouse","lumberMill","magneto","mansion","mine","mint","observatory","oilWell","pasture","quarry","reactor","smelter","steamworks","temple","tradepost","unicornPasture","warehouse","workshop","zebraForge","zebraOutpost","zebraWorkshop","ziggurat"],Vt=["broadcasttower","dataCenter","hydroplant","solarfarm","spaceport"],Gs=["autumn","spring","summer","winter"],we=["charon","umbra","yarn","helios","cath","redmoon","dune","piscine","terminus","kairo"],Hi=["alloy","beam","bloodstone","blueprint","compedium","concrate","eludium","gear","kerosene","manuscript","megalith","parchment","plate","scaffold","ship","slab","steel","tanker","tMythril","thorium","wood"],Wi=[...Hi,"alicorn","antimatter","blackcoin","burnedParagon","catnip","coal","culture","elderBox","faith","furs","gflops","gold","hashrates","iron","ivory","karma","kittens","manpower","minerals","necrocorn","oil","paragon","relic","science","sorrow","spice","starchart","tears","temporalFlux","timeCrystal","titanium","unicorns","unobtainium","uranium","void","wrappingPaper","zebras"],Gi=["any","engineer","farmer","geologist","hunter","miner","priest","scholar","woodcutter"],Zs=["chemist","engineer","manager","metallurgist","merchant","none","scientist","wise"];var H=(c=>(c.Cryptotheology="c",c.OrderOfTheSun="s",c.Ziggurat="z",c.UnicornPasture="zp",c))(H||{});const Zi=["apocripha","basilica","goldenSpire","scholasticism","solarRevolution","solarchant","stainedGlass","sunAltar","templars","transcendence"],Ki=["blackCore","blackLibrary","blackNexus","blackObelisk","blackRadiance","blazar","darkNova","holyGenocide","mausoleum","singularity"],Vi=["blackPyramid","ivoryCitadel","ivoryTower","marker","skyPalace","sunspire","unicornGraveyard","unicornNecropolis","unicornTomb","unicornUtopia"],ji=["dragons","griffins","nagas","leviathans","lizards","sharks","spiders","zebras"],Ks=["authocracy","bigStickPolicy","carnivale","cityOnAHill","clearCutting","communism","conservation","cryochamberExtraction","culturalExchange","diplomacy","dragonRelationsAstrologers","dragonRelationsDynamicists","dragonRelationsPhysicists","environmentalism","epicurianism","expansionism","extravagance","fascism","frugality","fullIndustrialization","griffinRelationsMachinists","griffinRelationsMetallurgists","griffinRelationsScouts","isolationism","knowledgeSharing","liberalism","liberty","lizardRelationsDiplomats","lizardRelationsEcologists","lizardRelationsPriests","militarizeSpace","monarchy","mysticism","nagaRelationsArchitects","nagaRelationsCultists","nagaRelationsMasons","necrocracy","openWoodlands","outerSpaceTreaty","radicalXenophobia","rationality","rationing","republic","scientificCommunism","sharkRelationsBotanists","sharkRelationsMerchants","sharkRelationsScribes","siphoning","socialism","spiderRelationsChemists","spiderRelationsGeologists","spiderRelationsPaleontologists","stoicism","stripMining","sustainability","technocracy","terraformingInsight","theocracy","tradition","transkittenism","zebraRelationsAppeasement","zebraRelationsBellicosity"],Ji=["brewery"],Vs=["acoustics","advExogeology","agriculture","ai","animal","antimatter","archeology","archery","architecture","artificialGravity","astronomy","biochemistry","biology","blackchain","calendar","chemistry","chronophysics","civil","combustion","construction","cryptotheology","currency","dimensionalPhysics","drama","ecology","electricity","electronics","engineering","exogeology","exogeophysics","genetics","hydroponics","industrialization","machinery","math","mechanization","metal","metalurgy","metaphysics","mining","nanotechnology","navigation","nuclearFission","oilProcessing","orbitalEngineering","paradoxalKnowledge","particlePhysics","philosophy","physics","quantumCryptography","robotics","rocketry","sattelites","steel","superconductors","tachyonTheory","terraformation","theology","thorium","voidSpace","writing"],js=["centaurusSystemMission","charonMission","duneMission","furthestRingMission","heliosMission","kairoMission","moonMission","orbitalLaunch","piscineMission","rorschachMission","terminusMission","umbraMission","yarnMission"],Xi=["containmentChamber","cryostation","entangler","heatsink","hrHarvester","hydrofracturer","hydroponics","moltenCore","moonBase","moonOutpost","orbitalArray","planetCracker","researchVessel","sattelite","spaceBeacon","spaceElevator","spaceStation","spiceRefinery","sunforge","sunlifter","tectonic","terraformingStation"],Yi=["blastFurnace","ressourceRetrieval","temporalAccelerator","temporalBattery","temporalImpedance","temporalPress","timeBoiler"],Qi=["cryochambers","usedCryochambers","voidHoover","voidRift","chronocontrol","voidResonator"],es=["advancedAutomation","advancedRefinement","aiBases","aiEngineers","alloyArmor","alloyAxe","alloyBarns","alloySaw","alloyWarehouses","amBases","amDrive","amFission","amReactors","amReactorsMK2","assistance","astrolabe","astrophysicists","augumentation","automatedPlants","barges","biofuel","bolas","cadSystems","caravanserai","carbonSequestration","cargoShips","celestialMechanics","chronoEngineers","chronoforge","coalFurnace","coldFusion","combustionEngine","compositeBow","concreteBarns","concreteHuts","concreteWarehouses","crossbow","cryocomputing","darkEnergy","deepMining","distorsion","electrolyticSmelting","eludiumCracker","eludiumHuts","eludiumReflectors","energyRifts","enrichedThorium","enrichedUranium","factoryAutomation","factoryLogistics","factoryOptimization","factoryProcessing","factoryRobotics","fluidizedReactors","fluxCondensator","fuelInjectors","geodesy","gmo","goldOre","hubbleTelescope","huntingArmor","hydroPlantTurbines","internet","invisibleBlackHand","ironAxes","ironHoes","ironwood","lhc","logistics","longRangeSpaceships","machineLearning","mineralAxes","mineralHoes","miningDrill","mWReactor","nanosuits","neuralNetworks","nuclearPlants","nuclearSmelters","offsetPress","oilDistillation","oilRefinery","orbitalGeodesy","oxidation","photolithography","photovoltaic","pneumaticPress","printingPress","pumpjack","pyrolysis","qdot","railgun","reactorVessel","refrigeration","register","reinforcedBarns","reinforcedSaw","reinforcedWarehouses","relicStation","rotaryKiln","satelliteRadio","satnav","seti","silos","solarSatellites","spaceEngineers","spaceManufacturing","spiceNavigation","starlink","stasisChambers","steelArmor","steelAxe","steelPlants","steelSaw","stoneBarns","storageBunkers","strenghtenBuild","tachyonAccelerators","thinFilm","thoriumEngine","thoriumReactors","titaniumAxe","titaniumBarns","titaniumMirrors","titaniumSaw","titaniumWarehouses","turnSmoothly","unicornSelection","unobtainiumAxe","unobtainiumDrill","unobtainiumHuts","unobtainiumReflectors","unobtainiumSaw","uplink","voidAspiration","voidEnergy","voidReactors"];var he=(c=>(c.Chronoforge="chrono",c.VoidSpace="void",c))(he||{});const kt=["ivoryCitadel","ivoryTower","skyPalace","sunspire","unicornPasture","unicornTomb","unicornUtopia"],Js=["sacrificeUnicorns","sacrificeAlicorns","refineTears","refineTimeCrystals","transcend","adore","autoPraise"];class _{constructor(s=!1){u(this,"enabled");this.enabled=s}load(s){m(s)||(this.enabled=s.enabled??this.enabled)}serialize(){return this}}class ts extends _{constructor(e=!1,t=!1){super(e);u(this,"limited");this.limited=t}load(e){m(e)||(super.load(e),this.limited=e.limited??this.limited)}}class K extends _{constructor(e=!1,t=-1){super(e);u(this,"trigger");this.trigger=t}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class re extends _{constructor(e=!1,t=1){super(e);u(this,"trigger");this.trigger=t}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class is extends _{constructor(e=!1,t=0){super(e);u(this,"max");this.max=t}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class Xs extends ts{constructor(e=!1,t=!1,i=0){super(e,t);u(this,"max");this.max=i}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class Ys extends Xs{constructor(e=!1,t=!1,i=0,n=-1){super(e,t,i);u(this,"trigger");this.trigger=n}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class Qs extends ts{constructor(e=!1,t=!1,i=-1){super(e,t);u(this,"trigger");this.trigger=i}load(e){m(e)||(super.load(e),this.trigger=e.trigger??this.trigger)}}class _t extends K{constructor(e=!1,t=-1,i=0){super(e,t);u(this,"max");this.max=i}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class en extends re{constructor(e=!1,t=1,i=0){super(e,t);u(this,"max");this.max=i}load(e){m(e)||(super.load(e),this.max=e.max??this.max)}}class jt{constructor(s,e=new Array){I(this,Ue);u(this,"selected");if(m(e.find(t=>t.value===s)))throw new Error("Provided selected value is not in provided options.");this.selected=s,L(this,Ue,e)}get options(){return P(this,Ue)}load(s){m(s)||(this.selected=s.selected??this.selected)}}Ue=new WeakMap;class tn extends re{constructor(e=!1,t=950,i=1e3,n=1){super(e,n);u(this,"buy");u(this,"sell");this.buy=t,this.sell=i}load(e){m(e)||(super.load(e),this.buy=e.buy??this.buy,this.sell=e.sell??this.sell)}}class sn extends _{constructor(e,t=!1){super(t);I(this,De);L(this,De,e)}get upgrade(){return P(this,De)}}De=new WeakMap;class nn extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Vt)e[t]=new sn(t);return e}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class Jt extends _t{constructor(e,t=!1,i=-1,n=0,a){super(t,i,n);I(this,Ne);I(this,qe);I(this,ze,0);L(this,qe,e),a&&(L(this,ze,1),L(this,Ne,a))}get baseBuilding(){return P(this,Ne)}get building(){return P(this,qe)}get stage(){return P(this,ze)}}Ne=new WeakMap,qe=new WeakMap,ze=new WeakMap;class Xt extends K{constructor(e=!1,t=-1,i=new _,n=new _,a=new _,r=new _,o=new nn){super(e,t);u(this,"buildings");u(this,"gatherCatnip");u(this,"turnOnMagnetos");u(this,"turnOnSteamworks");u(this,"turnOnReactors");u(this,"upgradeBuildings");this.buildings=this.initBuildings(),this.gatherCatnip=i,this.turnOnSteamworks=n,this.turnOnMagnetos=a,this.turnOnReactors=r,this.upgradeBuildings=o}initBuildings(){const e={broadcasttower:"amphitheatre",dataCenter:"library",hydroplant:"aqueduct",solarfarm:"pasture",spaceport:"warehouse"},t={};for(const i of Fi)i!=="unicornPasture"&&(t[i]=new Jt(i));for(const i of Vt)t[i]=new Jt(i,!1,-1,0,e[i]);return t}load(e){var t,i,n,a;m(e)||(super.load(e),z(this.buildings,e.buildings,(r,o)=>{r.enabled=(o==null?void 0:o.enabled)??r.enabled,r.max=(o==null?void 0:o.max)??r.max,r.trigger=(o==null?void 0:o.trigger)??r.trigger}),this.gatherCatnip.enabled=((t=e.gatherCatnip)==null?void 0:t.enabled)??this.gatherCatnip.enabled,this.turnOnSteamworks.enabled=((i=e.turnOnSteamworks)==null?void 0:i.enabled)??this.turnOnSteamworks.enabled,this.turnOnMagnetos.enabled=((n=e.turnOnMagnetos)==null?void 0:n.enabled)??this.turnOnMagnetos.enabled,this.turnOnReactors.enabled=((a=e.turnOnReactors)==null?void 0:a.enabled)??this.turnOnReactors.enabled,this.upgradeBuildings.load(e.upgradeBuildings))}}class me{constructor(s,e){u(this,"_host");u(this,"tab");this._host=s;const t=this._host.game.tabs.find(i=>i.tabId===e);if(m(t))throw new Error(`Unable to find tab ${e}`);this.tab=t,this.render()}render(){return this._host.game.ui.activeTabId!==this.tab.tabId&&this.tab.render(),this}}class an{constructor(s,e,t=new Xt){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new me(this._host,"Bonfire"),this._workshopManager=e,this._bulkManager=new wt(this._host,this._workshopManager)}tick(s){this.settings.enabled&&(this.manager.render(),this.autoBuild(s),this.autoMisc(s))}autoBuild(s,e=this.settings.buildings){const t=this._bulkManager,i={};for(const r of Object.values(e))i[r.building]=this.getBuild(r.baseBuilding??r.building).meta;const n=this.settings.trigger,a=t.bulk(e,i,n,"Bonfire");for(const r of a.filter(o=>0<o.count))this.build(r.name||r.id,r.stage,r.count),s.requestGameUiRefresh=!0}autoUpgrade(s){var l,h,d,g,f,w,b;const e=this._host.game.bld.getBuildingExt("pasture").meta.stage===0?this._host.game.bld.getBuildingExt("pasture").meta.val:0,t=this._host.game.bld.getBuildingExt("aqueduct").meta.stage===0?this._host.game.bld.getBuildingExt("aqueduct").meta.val:0,i=this._host.game.bld.getBuildingExt("pasture").meta;if(this.settings.upgradeBuildings.buildings.solarfarm.enabled&&i.unlocked&&i.stage===0&&p(i.stages)[1].stageUnlocked&&this._workshopManager.getPotentialCatnip(!0,0,t)>0){const k=p(i.stages)[1].prices;if(this._bulkManager.singleBuildPossible(i,k,1)){const y=this.getBuildButton("pasture",0);m(y==null?void 0:y.model)||(y.controller.sellInternal(y.model,0,!1),i.on=0,i.val=0,i.stage=1,this._host.engine.iactivity("upgrade.building.pasture",[],"ks-upgrade"),(l=this._host.game.ui)==null||l.render(),this.build("pasture",1,1),s.requestGameUiRefresh=!0)}}const n=this._host.game.bld.getBuildingExt("aqueduct").meta;if(this.settings.upgradeBuildings.buildings.hydroplant.enabled&&n.unlocked&&n.stage===0&&p(n.stages)[1].stageUnlocked&&this._workshopManager.getPotentialCatnip(!0,e,0)>0){const k=p(n.stages)[1].prices;if(this._bulkManager.singleBuildPossible(n,k,1)){const y=this.getBuildButton("aqueduct",0);m(y==null?void 0:y.model)||(y.controller.sellInternal(y.model,0,!1),n.on=0,n.val=0,n.stage=1,(h=n.calculateEffects)==null||h.call(n,n,this._host.game),this._host.engine.iactivity("upgrade.building.aqueduct",[],"ks-upgrade"),(d=this._host.game.ui)==null||d.render(),this.build("aqueduct",1,1),s.requestGameUiRefresh=!0)}}const a=this._host.game.bld.getBuildingExt("library").meta;if(this.settings.upgradeBuildings.buildings.dataCenter.enabled&&a.unlocked&&a.stage===0&&p(a.stages)[1].stageUnlocked){let k=this._host.game.workshop.get("cryocomputing").researched?1:2;this._host.game.challenges.currentChallenge==="energy"&&(k*=2);let y=3;if(this._host.game.workshop.get("uplink").researched&&(y*=1+this._host.game.bld.getBuildingExt("biolab").meta.val*this._host.game.getEffect("uplinkDCRatio")),this._host.game.workshop.get("machineLearning").researched&&(y*=1+this._host.game.bld.getBuildingExt("aiCore").meta.on*this._host.game.getEffect("dataCenterAIRatio")),this._host.game.resPool.energyProd>=this._host.game.resPool.energyCons+k*a.val/y){const A=p(a.stages)[1].prices;if(this._bulkManager.singleBuildPossible(a,A,1)){const V=p(this.getBuildButton("library",0));if(m(V.model))return;V.controller.sellInternal(V.model,0,!1),a.on=0,a.val=0,a.stage=1,(g=a.calculateEffects)==null||g.call(a,a,this._host.game),this._host.engine.iactivity("upgrade.building.library",[],"ks-upgrade"),(f=this._host.game.ui)==null||f.render(),this.build("library",1,1),s.requestGameUiRefresh=!0;return}}}const r=this._host.game.bld.getBuildingExt("warehouse").meta;if(this.settings.upgradeBuildings.buildings.spaceport.enabled&&r.unlocked&&r.stage===0&&p(r.stages)[1].stageUnlocked){const k=p(r.stages)[1].prices;if(this._bulkManager.singleBuildPossible(r,k,1)){const y=this.getBuildButton("warehouse",0);if(!m(y==null?void 0:y.model)){y.controller.sellInternal(y.model,0,!1),r.on=0,r.val=0,r.stage=1,this._host.engine.iactivity("upgrade.building.warehouse",[],"ks-upgrade"),(w=this._host.game.ui)==null||w.render(),this.build("warehouse",1,1),s.requestGameUiRefresh=!0;return}}}const o=this._host.game.bld.getBuildingExt("amphitheatre").meta;if(this.settings.upgradeBuildings.buildings.broadcasttower.enabled&&o.unlocked&&o.stage===0&&p(o.stages)[1].stageUnlocked){const k=p(o.stages)[1].prices;if(this._bulkManager.singleBuildPossible(o,k,1)){const y=this.getBuildButton("amphitheatre",0);m(y==null?void 0:y.model)||(y.controller.sellInternal(y.model,0,!1),o.on=0,o.val=0,o.stage=1,this._host.engine.iactivity("upgrade.building.amphitheatre",[],"ks-upgrade"),(b=this._host.game.ui)==null||b.render(),this.build("amphitheatre",1,1),s.requestGameUiRefresh=!0)}}}autoMisc(s){if(this.settings.turnOnSteamworks.enabled){const e=this._host.game.bld.getBuildingExt("steamworks");if(e.meta.val&&e.meta.on===0){const t=p(this.getBuildButton("steamworks"));if(m(t.model))return;t.controller.onAll(t.model)}}if(this.settings.turnOnMagnetos.enabled){const e=this._host.game.bld.getBuildingExt("magneto");if(e.meta.val&&e.meta.on<e.meta.val){const t=p(this.getBuildButton("magneto"));if(m(t.model))return;t.controller.onAll(t.model)}}if(this.settings.turnOnReactors.enabled){const e=this._host.game.bld.getBuildingExt("reactor");if(e.meta.val&&e.meta.on<e.meta.val){const t=p(this.getBuildButton("reactor"));if(m(t.model))return;t.controller.onAll(t.model)}}this.settings.upgradeBuildings.enabled&&this.autoUpgrade(s),this.settings.gatherCatnip.enabled&&this.autoGather()}autoGather(){const s=new classes.game.ui.GatherCatnipButtonController(this._host.game);for(let e=0;e<Math.floor(this._host.engine.settings.interval/20);++e)s.buyItem(void 0,null)}build(s,e,t){let i=t;const n=i;let a;const r=game.getUnlockByName(s,"buildings"),o=new classes.BuildingMeta(r).getMeta();if("stages"in o){const l=new classes.ui.btn.StagingBldBtnController(this._host.game),h=l.fetchModel({building:s,controller:l,description:p(o.description),name:p(o.label),twoRow:!1});i=this._bulkManager.construct(h,l,i),a=o.label??""}else{const l=new classes.ui.btn.BuildingBtnModernController(this._host.game),h=l.fetchModel({building:s,controller:l,description:p(o.description),name:p(o.label),twoRow:!1});i=this._bulkManager.construct(h,l,i),a=o.label??""}i!==n&&(console.warn(...v(`${a} Amount ordered: ${n} Amount Constructed: ${i}`)),i===0)||(this._host.engine.storeForSummary(a,i,"build"),i===1?this._host.engine.iactivity("act.build",[a],"ks-build"):this._host.engine.iactivity("act.builds",[a,this._host.renderAbsolute(i)],"ks-build"))}_getBuildLabel(s,e){return s.stages&&!m(e)?s.stages[e].label:p(s.label)}getBuild(s){return this._host.game.bld.getBuildingExt(s)}getBuildButton(s,e=0){const t=game.bld.get(s),i=new classes.BuildingMeta(t).getMeta(),n=m(i.stages)?t:i.stages[e],a="stages"in n?new classes.ui.btn.StagingBldBtnController(this._host.game):new classes.ui.btn.BuildingBtnModernController(this._host.game),r=a.fetchModel({building:s,description:n.description,key:s,name:n.label});return{controller:a,model:r}}}class rn{constructor(s){u(this,"_host");u(this,"_lastday");u(this,"_lastyear");u(this,"_sections",new Map);this._host=s,this.resetActivity()}resetActivity(){this._sections=new Map,this._lastday=this._host.game.calendar.day,this._lastyear=this._host.game.calendar.year}storeActivity(s,e=1,t="other"){this._sections.has(t)||this._sections.set(t,new Map);const i=p(this._sections.get(t));i.has(s)||i.set(s,0),i.set(s,p(i.get(s))+e)}renderSummary(){const s=new Array;if(this._sections.has("other")&&p(this._sections.get("other")).forEach((t,i)=>s.push(this._host.engine.i18n(`summary.${i}`,[this._host.game.getDisplayValueExt(t)]))),this._sections.has("research")&&p(this._sections.get("research")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.tech",[X(i)]))}),this._sections.has("upgrade")&&p(this._sections.get("upgrade")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.upgrade",[X(i)]))}),this._sections.has("build")&&p(this._sections.get("build")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.building",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("refine")&&p(this._sections.get("refine")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.refine",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("faith")&&p(this._sections.get("faith")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.sun",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("craft")&&p(this._sections.get("craft")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.craft",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._sections.has("trade")&&p(this._sections.get("trade")).forEach((t,i)=>{s.push(this._host.engine.i18n("summary.trade",[this._host.game.getDisplayValueExt(t),X(i)]))}),this._lastday&&this._lastyear){let e=this._host.game.calendar.year-this._lastyear,t=this._host.game.calendar.day-this._lastday;t<0&&(e-=1,t+=400);let i="";e>0&&(i+=`${e} `,i+=e===1?this._host.engine.i18n("summary.year"):this._host.engine.i18n("summary.years")),t>=0&&(e>0&&(i+=this._host.engine.i18n("summary.separator")),i+=`${Ws(t)} `,i+=t===1?this._host.engine.i18n("summary.day"):this._host.engine.i18n("summary.days")),s.push(this._host.engine.i18n("summary.head",[i]))}return s}}const on={"act.accelerate":"Accelerate time!","act.adore":"Adore the galaxy! Accumulated {0} worship to {1} epiphany","act.blackcoin.buy":"Kittens sold your Relics and bought {0} Blackcoins","act.blackcoin.sell":"Kittens sold your Blackcoins and bought {0} Relics","act.build":"Kittens have built a new {0}","act.builds":"Kittens have built a new {0} {1} times","act.craft":"Kittens have crafted {0} {1}","act.distribute":"Distributed a kitten to {0}","act.elect":"Kittens have elected a new leader.","act.feed":"Kittens fed the Elders. The elders are pleased","act.fix.cry":"Kittens fixed {0} Cryochambers","act.hunt":"Sent kittens on {0} hunts","act.observe":"Kitten Scientists have observed a star","act.praise":"Praised the sun! Accumulated {0} faith to {1} worship","act.promote":"Kittens' leader has been promoted to rank {0}","act.refineTCs":"Refined {0} time crystals","act.refineTears":"Refined {0} tears into BLS","act.sacrificeAlicorns":"Sacrificed {0} alicorns","act.sacrificeUnicorns":"Sacrificed {0} unicorns","act.sun.discover":"Kittens have discovered {0}","act.sun.discovers":"Kittens have discovered {0} {1} times","act.time.activeHeatTransferEnd":"End active Heat Transfer","act.time.activeHeatTransferStart":"Start active Heat Transfer","act.time.getTemporalFlux":"Burn crystals to obtain time flux to maintain time acceleration","act.time.skip":"Kittens combust a time crystal, {0} years skipped!","act.trade":"Kittens have traded {0} times with {1}","act.transcend":"Spent {0} epiphany, Transcended to T-level: {1}","blackcoin.buy":"Buy Limit: {0}","blackcoin.buy.prompt":"Enter at which price you want to stop buying blackcoins.","blackcoin.buy.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to buy until shortly before you sell.","blackcoin.buy.promptTitle":"Buy Limit for Blackcoins (Current: {0})","blackcoin.buy.title":"Buy Blackcoins until price reaches {0}","blackcoin.buy.trigger":"buying Blackcoins (in relics)","blackcoin.sell":"Sell Order: {0}","blackcoin.sell.prompt":"Enter at which price you want to sell all your blackcoins.","blackcoin.sell.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to sell close to the highest possible price.","blackcoin.sell.promptTitle":"Sell Order for Blackcoins (Current: {0})","blackcoin.sell.title":"Sell Blackcoins when price reaches {0}","build.embassies":"Built {0} embassies for {1}","build.embassy":"Built {0} embassy for {1}",copy:"Copy","craft.limited":"Crafting {0}: limited to be proportional to cost ratio","craft.unlimited":"Crafting {0}: unlimited",delete:"Delete","dispose.necrocorn":"Kittens disposed of inefficient necrocorns","festival.extend":"Kittens extend the festival","festival.hold":"Kittens begin holding a festival","filter.accelerate":"Tempus Fugit","filter.adore":"Adoring","filter.allKG":"All KG log entries.","filter.build":"Building","filter.craft":"Crafting","filter.disable":"Disabled {0} log messages","filter.distribute":"Distribute","filter.enable":"Enabled {0} log messages","filter.explainer":"Disabled items are hidden from the log.","filter.faith":"Order of the Sun","filter.festival":"Festivals","filter.hunt":"Hunting","filter.misc":"Miscellaneous","filter.praise":"Praising","filter.promote":"Promote leader","filter.research":"Researching","filter.star":"Astronomical Events","filter.timeSkip":"Time Skip","filter.trade":"Trading","filter.transcend":"Transcend","filter.upgrade":"Upgrading","option.accelerate":"Tempus Fugit","option.autofeed":"Feed Leviathans","option.catnip":"Gather Catnip","option.crypto":"Trade Blackcoin","option.elect":"Elect leader","option.elect.job":"Job","option.elect.job.any":"Any","option.elect.trait":"Trait","option.embassies":"Build Embassies","option.faith.adore":"Adore the Galaxy","option.faith.autoPraise":"Praise the Sun","option.faith.best.unicorn":"Automate Build Order","option.faith.refineTears":"Refine Tears","option.faith.refineTimeCrystals":"Refine TCs","option.faith.sacrificeAlicorns":"Sacrifice Alicorns","option.faith.sacrificeUnicorns":"Sacrifice Unicorns","option.faith.transcend":"Transcend","option.festival":"Hold festivals","option.fix.cry":"Fix Cryochamber","option.hunt":"Hunt","option.magnetos":"Turn on Magnetos","option.observe":"Observe Astro Events","option.praise":"Praise the Sun","option.promote":"Promote leader","option.promotekittens":"Promote kittens","option.reactors":"Turn on Reactors","option.shipOverride":"Force Ships to 243","option.steamworks":"Turn on Steamworks","option.time.activeHeatTransfer":"Active Heat Transfer","option.time.reset":"Reset Timeline (Danger!)","option.time.skip":"Time Skip","option.time.skip.ignoreOverheat":"Ignore overheat",reset:"Reset","reset.after":"Nice to meet you, the cute Kitten Scientists will serve you","reset.cancel.activity":"Meoston, We Have a Problem","reset.cancel.message":"Timeline Reset canceled","reset.check":"Trigger for {0}: {1}, you have {2}","reset.checked":"All conditions are met, the timeline will restart in the next few seconds!","reset.countdown.0":"0 - Temporal rifts opened!","reset.countdown.1":"1 - Time engine start","reset.countdown.2":"2 - Boosting the chronoforge","reset.countdown.3":"3 - Opening temporal rifts","reset.countdown.4":"4 - Turning off satellite","reset.countdown.5":"5 - Melting blackcoins","reset.countdown.6":"6 - Starting time engines","reset.countdown.7":"7 - Disassembling railguns","reset.countdown.8":"8 - Releasing lizards","reset.countdown.9":"9 - Sacrificing unicorns","reset.countdown.10":"10 - Harvesting catnip","reset.last.message":"See you next poincaré recurrence","reset.tip":'You can cancel this reset by disabling "Enable Kitten Scientists" at the top of the settings.',"resources.consume":"Consume: {0}","resources.consume.prompt":"Enter how much of the resource you want automations to consume as a percentage between 0.0 and 100.0.","resources.consume.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","resources.consume.promptTitle":"Consumption Share for {0} (Current: {1})","resources.consume.set":"Consume rate for {0}","resources.consume.title":"Consuming {0} of {1}","resources.consume.titleZero":"Not consuming {0}","resources.stock.prompt":"Enter how much of the resource you always want to keep in stock.","resources.stock.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","resources.stock.promptTitle":"Stock value for {0} (Current: {1})","resources.stock.title":"Keeping {0} {1} in stock","resources.stock.titleInfinite":"Keeping all {0} in stock","resources.stock.titleZero":"Not keeping any {0} in stock","state.compress":"Compress copied Kittens Game saves","state.confirmDestruction":"Are you sure?","state.copied.game":"Save '{0}' copied to clipboard.","state.copied.gameCurrent":"Current save copied to clipboard.","state.copied.state":"State '{0}' copied to clipboard.","state.copied.stateCurrent":"Current state copied to clipboard.","state.copy.game":"Copy this save to the clipboard.","state.copy.gameCurrent":"Copy the entire Kittens Game save (includes KS settings) to the clipboard.","state.copy.state":"Copy these settings to the clipboard.","state.copy.stateCurrent":"Copy the current Kitten Scientists settings to the clipboard.","state.delete.game":"Delete this save.","state.delete.state":"Delete these settings.","state.deleted.game":"Save '{0}' deleted.","state.deleted.state":"State '{0}' deleted.","state.edit.game":"Change the name of this save.","state.edit.state":"Change the name of these settings.","state.exportAll":"Backup","state.exportAllTitle":"Stores all local states in a single file and downloads it.","state.import":"Import settings/saves","state.imported.game":"Save imported.","state.imported.state":"State imported.","state.importedState":"Imported state {0}","state.importTitle":`Paste a save or settings from your clipboard.
2
+ Contents will be automatically detected and handled accordingly.`,"state.loaded.game":"Save '{0}' loaded.","state.loaded.state":"State '{0}' loaded.","state.loadPrompt":"Paste your (un/compressed) save or settings here:","state.local":"Local storage management","state.localGames":"Kittens Game Saves","state.localStates":"Kitten Scientists Settings","state.new":"New","state.noConfirm":"Don't ask for confirmation","state.store":"Store","state.stored.game":"Save stored.","state.stored.state":"State stored.","state.storeFactory":"Create a new state from factory defaults.","state.storeGame":"Create a new save from the current game.","state.storeGame.prompt":"Provide a label for this save:","state.storeState":"Create a new state from current settings.","state.storeState.prompt":"Provide a label for this state:","state.title":"State Management","state.unlabeledGame":"unlabeled save","state.unlabeledState":"unlabeled state","state.update.game":"Save the current game into this slot.","state.update.state":"Save the current settings into this slot.","state.updated.game":"Save '{0}' updated.","state.updated.state":"State '{0}' updated.","status.auto.disable":"Disabled Auto {0}","status.auto.enable":"Enabled Auto {0}","status.ks.disable":"Disabling the Kitten Scientists!","status.ks.enable":"Enabling the Kitten Scientists!","status.ks.init":"Kitten Scientists initialized.","status.ks.upgrade":"Kitten Scientists {0} (ours is {1}) is available at {2}.","status.reset.check.disable":"Disabled check {0} before Reset Timeline","status.reset.check.enable":"Enabled check {0} before Reset Timeline","status.resource.disable":"Disabled {0} resource management","status.resource.enable":"Enabled {0} resource management","status.sub.disable":"Disabled {0}","status.sub.enable":"Enabled {0}","summary.accelerate":"Accelerated time {0} times","summary.adore":"Accumulated {0} epiphany by adoring the galaxy","summary.building":"Built {0} {1}","summary.craft":"Crafted {0} {1}","summary.day":"day","summary.days":"days","summary.distribute":"Helped {0} kittens find a job","summary.embassy":"Built {0} embassies","summary.feed":"Fed the elders {0} necrocorns","summary.festival":"Held {0} festivals","summary.fix.cry":"Fixed {0} cryochambers","summary.head":"Summary of the last {0}","summary.hunt":"Sent adorable kitten hunters on {0} hunts","summary.praise":"Accumulated {0} worship by praising the sun","summary.promote":"Promoted our leader {0} times","summary.refine":"Refined {0} {1}","summary.separator":" and ","summary.show":"Show activity","summary.stars":"Observed {0} stars","summary.sun":"Discovered {0} {1}","summary.tech":"Researched {0}","summary.time.activeHeatTransferStart":"Active Heat Transfer {0} times","summary.time.getTemporalFlux":"Burn crystal to gain time flux {0} times","summary.time.reset.content":"Gained {0} Karma.<br>Gained {1} Paragon","summary.time.reset.title":"Summary of the last {0} timelines","summary.time.skip":"Skipped {0} years","summary.trade":"Traded {0} times with {1}","summary.transcend":"Transcended {0} times","summary.upgrade":"Upgraded {0}","summary.year":"year","summary.years":"years","time.heatTransfer.cycle.disable":"Disabled active heat transfer in cycle {0}","time.heatTransfer.cycle.enable":"Enabled active heat transfer in cycle {0}","time.skip.cycle.disable":"Disabled time skip in cycle {0} and disallow skip over this cycle","time.skip.cycle.enable":"Enabled time skip in cycle {0} and allow skip over this cycle","time.skip.season.disable":"Disabled time skip in the {0}","time.skip.season.enable":"Enabled time skip in the {0}","trade.limited":"Trading with {0}: limited to only occur when profitable based off relative production time","trade.season.disable":"Disabled trading with {0} in the {1}","trade.season.enable":"Enabled trading with {0} in the {1}","trade.seasons":"seasons","trade.unlimited":"Trading with {0}: unlimited","ui.additional":"Additional options","ui.build":"Bonfire","ui.close":"close","ui.craft":"Workshop","ui.craft.resources":"Resources","ui.cycles":"cycles","ui.disable.all":"Disable all options in this list.","ui.distribute":"Village","ui.enable.all":"Enable all options in this list.","ui.engine":"Enable Kitten Scientists","ui.faith":"Religion","ui.filter":"Log Filters","ui.infinity":"∞","ui.internals":"Internals","ui.internals.interval":"Interval: {0}","ui.internals.interval.prompt":"Enter the new amount of milliseconds as an absolute value between 0 and Infinity.","ui.internals.interval.promptExplainer":"All notations that the game supports are accepted. If you set the limit to 0, Kitten Scientists will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.internals.interval.promptTitle":"Kitten Scientists Execution Interval (Current: {0})","ui.itemsHide":"Collapse section","ui.itemsShow":"Expand section","ui.ksColumn":"Display KS in fourth column in UI","ui.language":"Language","ui.limit":"Limited","ui.limited.off":"Unlimited","ui.limited.on":"Eco Mode","ui.max":"Max: {0}","ui.max.build.prompt":"Limit for {0} (Current: {1})","ui.max.build.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.build.title":"Build {0} {1}","ui.max.build.titleInfinite":"Never stop building {0}","ui.max.build.titleZero":"Don't build {0}","ui.max.craft.prompt":"Enter the new limit of how many {0} to craft as an absolute value between 0 and Infinity.","ui.max.craft.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.craft.promptTitle":"Limit for Crafting {0} (Current: {1})","ui.max.craft.title":"Craft {0} {1}","ui.max.craft.titleInfinite":"Never stop crafting {0}","ui.max.craft.titleZero":"Don't craft {0}","ui.max.distribute.prompt":"Enter the new amount of kittens to assign as {0} as an absolute value between 0 and Infinity.","ui.max.distribute.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.distribute.promptTitle":"Assign Max. Kittens as {0} (Current: {1})","ui.max.distribute.title":"Assign {0} kittens as {1}","ui.max.distribute.titleInfinite":"Assign as many kittens as possible as {0}","ui.max.distribute.titleZero":"Don't assign any kittens as {0}","ui.max.embassy.title":"Build {0} embassy for {1}","ui.max.embassy.titleInfinite":"Never stop building embassies for {0}","ui.max.embassy.titleZero":"Don't build embassies for {0}","ui.max.prompt.absolute":"Enter the new limit as an absolute value between 0 and Infinity.","ui.max.prompt.float":"Enter the new limit as an absolute value between 0.0 and Infinity.","ui.max.set":"Maximum for {0}","ui.max.timeSkip.prompt":"Enter the new amount of years as an absolute value between 0 and Infinity.","ui.max.timeSkip.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.timeSkip.promptTitle":"Max. Years to skip (Current: {0})","ui.max.timeSkip.title":"Skip {0} years at once","ui.max.timeSkip.titleInfinite":"Skip as many years as possible","ui.max.timeSkip.titleZero":"Don't skip time","ui.maximum":"Maximum","ui.min":"Min: {0}","ui.options":"Options","ui.reset":"Reset list options to default configuration.","ui.resources":"Resource Control","ui.space":"Space","ui.time":"Time","ui.timeCtrl":"Time Control","ui.trade":"Trade","ui.trigger":"Trigger: {0}","ui.trigger.accelerateTime.prompt":"Enter the new temporal flux storage level at which to enable Tempus Fugit as a percentage between 0.0 and 100.0.","ui.trigger.accelerateTime.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.accelerateTime.promptTitle":"Trigger to Accelerate Time (Current: {0})","ui.trigger.activeHeatTransfer.prompt":"Enter the new temporal heat storage level at which to enable heat transfer as a percentage between 0.0 and 100.0.","ui.trigger.activeHeatTransfer.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.activeHeatTransfer.promptTitle":"Trigger for Heat Transfer (Current: {0})","ui.trigger.build.blocked":`∞
3
+ 🛈 The {0} section has no trigger set. This build will not be triggered!`,"ui.trigger.build.inherited":"inherited from section","ui.trigger.build.prompt":"Trigger for {0} (Current: {1})","ui.trigger.build.promptExplainer":"If you submit an empty value, or a negative value, the section trigger is used instead. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.prompt":"Enter the new relic storage level at which to trade blackcoin as an absolute value between 0.0 and Infinity.","ui.trigger.crypto.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.promptTitle":"Trigger to Trade Blackcoin (Current: {0})","ui.trigger.embassies.prompt":"Enter the new culture storage level at which to build embassies as a percentage between 0.0 and 100.0.","ui.trigger.embassies.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.embassies.promptTitle":"Trigger to Build Embassies (Current: {0})","ui.trigger.hunt.prompt":"Trigger for Hunting (Current: {0})","ui.trigger.hunt.promptExplainer":"If you submit a negative value, hunting will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.inactive":"inactive","ui.trigger.promoteKittens.prompt":"Enter the new gold storage level at which to promote kittens as a percentage between 0.0 and 100.0.","ui.trigger.promoteKittens.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.promoteKittens.promptTitle":"Trigger to Promote Kittens (Current: {0})","ui.trigger.prompt.absolute":"Enter the new trigger value as an absolute value between 0 and Infinity.","ui.trigger.prompt.float":"Enter the new trigger value as an absolute value between 0.0 and Infinity.","ui.trigger.prompt.percentage":"Enter the new trigger value as a percentage between 0.0 and 100.0.","ui.trigger.reset.promptExplainer":"If you submit a negative value, the item will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.section":"Section default trigger: {0}","ui.trigger.section.blocked":`∞
4
+ 🛈 The {0} section has no trigger set. This automation will not be triggered!`,"ui.trigger.section.inactive":"∞ (nothing is triggered automatically)","ui.trigger.section.inherited":"inherited from section","ui.trigger.section.prompt":"Trigger for section {0} (Current: {1})","ui.trigger.section.promptExplainer":`If you submit an empty value, or a negative value, the section trigger will be set to infinity (∞). Individual automations in this section need to have their own trigger set to be activated.
5
+ If you submit an invalid value, it will be treated as if you hit Cancel.`,"ui.trigger.setinteger":"Enter a new trigger value for {0}. Should be in the range from 0 up to any number. -1 means infinity.","ui.trigger.setinteger.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.setpercentage":"Enter a new trigger value for {0}. Should be in the range from 0 to 100.","ui.trigger.setpercentage.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.prompt":"Enter the new amount of Time Crystals at which to skip time as an absolute value between 1 and Infinity.","ui.trigger.timeSkip.promptExplainer":"If you submit a negative value, time skipping will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.promptTitle":"Trigger for Time Skip (Current: {0})","ui.upgrade":"Science","ui.upgrade.buildings":"Upgrade buildings","ui.upgrade.missions":"Start missions","ui.upgrade.policies":"Research policies","ui.upgrade.races":"Explore new races","ui.upgrade.techs":"Research technologies","ui.upgrade.upgrades":"Research upgrades","ui.upgrades":"Upgrades",update:"Update","upgrade.building.amphitheatre":"Upgraded amphitheatres to broadcast towers!","upgrade.building.aqueduct":"Upgraded aqueducts to hydro plants!","upgrade.building.library":"Upgraded libraries to data centers!","upgrade.building.pasture":"Upgraded pastures to solar farms!","upgrade.building.warehouse":"Upgraded warehouses to spaceports!","upgrade.policy":"Kittens have passed {0}","upgrade.race":"Kittens met the {0}","upgrade.space":"Kittens conducted a {0}","upgrade.space.mission":"Kittens conducted a mission to {0}","upgrade.tech":"Kittens have bought the tech {0}","upgrade.upgrade":"Kittens have bought the upgrade {0}"},ln={"act.accelerate":"Zeit beschleunigen!","act.adore":"Verehre die Galaxie! Kumulierte {0} Anbetung zu {1} Offenbarung","act.blackcoin.buy":"Kätzchen haben deine Relikte verkauft und {0} Blackcoins gekauft","act.blackcoin.sell":"Kätzchen haben deine Blackcoins verkauft und {0} Relikte gekauft","act.build":"Kätzchen haben ein neues {0} gebaut","act.builds":"Kätzchen haben ein neues {0} {1} Mal gebaut","act.craft":"Kätzchen haben {0} {1} hergestellt","act.distribute":"Ein Kätzchen an {0} verteilt","act.elect":"Kätzchen haben einen neuen Anführer gewählt.","act.feed":"Kätzchen haben die Ältesten gefüttert. Die Ältesten sind zufrieden","act.fix.cry":"Kätzchen haben {0} Kryokammern repariert","act.hunt":"Kätzchen auf {0} Jagden entsendet","act.observe":"Kitten Scientists haben einen Stern beobachtet","act.praise":"Die Sonne gelobt! {0} Glaube zu {1} Anbetung kumuliert","act.promote":"Der Anführer der Kätzchen wurde zum Rang {0} befördert","act.refineTCs":"{0} Zeit-Kristalle verfeinert","act.refineTears":"{0} Tränen zu STF verfeinert","act.sacrificeAlicorns":"{0} Alihörner geopfert","act.sacrificeUnicorns":"{0} Einhörner geopfert","act.sun.discover":"Kätzchen haben {0} entdeckt","act.sun.discovers":"Kätzchen haben {0} {1} mal entdeckt","act.time.activeHeatTransferEnd":"Aktiver Wärmetransfer beendet","act.time.activeHeatTransferStart":"Starte aktiven Wärmetransfer","act.time.getTemporalFlux":"Verbrennt Kristalle, um Flux zur Erhaltung der Zeitbeschleunigung zu bekommen","act.time.skip":"Kätzchen verbrennen einen Zeit-Kristall, {0} Jahre übersprungen!","act.trade":"Kätzchen haben {0} mal mit {1} gehandelt","act.transcend":"{0} Offenbarung ausgegeben, auf T-Level {1} aufgestiegen","blackcoin.buy":"Kauf-Limit: {0}","blackcoin.buy.prompt":"Gib den Preis ein, ab welchem du keine Blackcoins mehr kaufen möchtest.","blackcoin.buy.promptExplainer":"Der Blackcoin-Preis steigt immer von 800 auf 1100 (ungefähr), dann stürzt er ab. Du möchtest normalerweise bis kurz vor dem Verkauf einkaufen.","blackcoin.buy.promptTitle":"Kauf-Limit für Blackcoins (Aktuell: {0})","blackcoin.buy.title":"Blackcoins kaufen bis der Preis {0} erreicht","blackcoin.buy.trigger":"kaufe Blackcoins (in Relikten)","blackcoin.sell":"Verkauf-Order: {0}","blackcoin.sell.prompt":"Gib den Preis ein, zu welchem du deine Blackcoins verkaufen möchtest.","blackcoin.sell.promptExplainer":"Der Blackcoin-Preis steigt immer von 800 auf 1100 (ungefähr), dann stürzt er ab. Du möchtest normalerweise nahe dem höchstmöglichen Preis verkaufen.","blackcoin.sell.promptTitle":"Verkauf-Order für Blackcoins (Aktuell: {0})","blackcoin.sell.title":"Blackcoins verkaufen, wenn der Preis {0} erreicht","build.embassies":"{0} Botschaften für {1} gebaut","build.embassy":"{0} Botschaft für {1} gebaut",copy:"Kopieren","craft.limited":"Herstellen von {0}: im Verhältnis zum Kostenverhältnis begrenzt","craft.unlimited":"Herstellung von {0}: unbegrenzt",delete:"Löschen","dispose.necrocorn":"Kätzchen haben ineffiziente Necrocorns entsorgt","festival.extend":"Kätzchen haben das Festival verlängert","festival.hold":"Kätzchen fangen an, ein Festival abzuhalten","filter.accelerate":"Tempus Fugit","filter.adore":"Bewundern","filter.allKG":"Alle KG Protokollnachrichten.","filter.build":"Bauen","filter.craft":"Herstellen","filter.disable":"{0} Protokollnachrichten deaktiviert","filter.distribute":"Verteilen","filter.enable":"{0} Protokollnachrichten aktiviert","filter.explainer":"Deaktivierte Nachrichtentypen erscheinen nicht im Protokoll.","filter.faith":"Orden der Sonne","filter.festival":"Festivals","filter.hunt":"Jagen","filter.misc":"Diverses","filter.praise":"Bewundern","filter.promote":"Anführer befördern","filter.research":"Erforschen","filter.star":"Astronomische Ereignisse","filter.timeSkip":"Zeitsprung","filter.trade":"Handeln","filter.transcend":"Transzendenz","filter.upgrade":"Verbesserungen","option.accelerate":"Tempus Fugit","option.autofeed":"Leviathane füttern","option.catnip":"Katzenminze sammeln","option.crypto":"Blackcoin handeln","option.elect":"Anführer benennen","option.elect.job":"Beruf","option.elect.job.any":"Beliebig","option.elect.trait":"Eigenschaft","option.embassies":"Botschaften bauen","option.faith.adore":"Bewundere die Galaxie","option.faith.autoPraise":"Lobe die Sonne","option.faith.best.unicorn":"Reihenfolge automatisch optimieren","option.faith.refineTears":"Tränen verfeinern","option.faith.refineTimeCrystals":"ZKs verfeinern","option.faith.sacrificeAlicorns":"Alihörner opfern","option.faith.sacrificeUnicorns":"Einhörner opfern","option.faith.transcend":"Transzendenz","option.festival":"Festivals veranstalten","option.fix.cry":"Kryokammern reparieren","option.hunt":"Jagen","option.magnetos":"Magnetos einschalten","option.observe":"Astro-Ereignisse beobachten","option.praise":"Lobe die Sonne","option.promote":"Anführer befördern","option.promotekittens":"Kätzchen befördern","option.reactors":"Reaktoren einschalten","option.shipOverride":"Erzwinge 243 Schiffe","option.steamworks":"Dampfmaschinen einschalten","option.time.activeHeatTransfer":"Aktiver Wärmetransfer","option.time.reset":"Zeitleiste zurücksetzen (Gefahr!)","option.time.skip":"Zeitsprung","option.time.skip.ignoreOverheat":"Überhitzen ignorieren",reset:"Zurücksetzen","reset.after":"Schön, dich kennenzulernen, die niedlichen Kitten Scientists werden dir dienen","reset.cancel.activity":"Miauston, wir haben ein Problem","reset.cancel.message":"Zeitleiste zurücksetzen abgebrochen","reset.check":"Auslöser für {0}: {1}, du hast {2}","reset.checked":"Alle Bedingungen sind erfüllt, die Zeitlinie wird in den nächsten Sekunden neu gestartet!","reset.countdown.0":"0 - Temporale Risse geöffnet!","reset.countdown.1":"1 - Start der Zeitmaschine","reset.countdown.2":"2 - Chronoschmiede wird beschleunigt","reset.countdown.3":"3 - Zeit-Risse werden geöffnet","reset.countdown.4":"4 - Satellit wird ausgeschaltet","reset.countdown.5":"5 - Schmelze Blackcoins","reset.countdown.6":"6 - Zeit-Motoren werden gestartet","reset.countdown.7":"7 - Strahlenkanonen werden demontiert","reset.countdown.8":"8 - Freisetzung von Echsen","reset.countdown.9":"9 - Opfere Einhörner","reset.countdown.10":"10 - Katzenminzeernte","reset.last.message":"Wir sehen uns bei der nächsten poincaréschen Wiederkehr","reset.tip":'Du kannst diesen Neustart abbrechen, indem du "Kitten Scientists aktivieren" oben in den Einstellungen deaktivierst.',"resources.consume":"Verbrauch: {0}","resources.consume.prompt":"Gib ein wie viel von der Ressource von Automatisierungen verbraucht werden darf. Der Wert sollte zwischen 0,0 und 100,0 liegen.","resources.consume.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","resources.consume.promptTitle":"Verbrauchsanteil für {0} (Aktuell: {1})","resources.consume.set":"Verbrauchs-Rate für {0}","resources.consume.title":"Verbraucht {0} von {1}","resources.consume.titleZero":"{0} werden nicht verbraucht","resources.stock.prompt":"Gib ein wie viel von der Ressource jederzeit im Lager bleiben soll.","resources.stock.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","resources.stock.promptTitle":"Mindest-Lagerbestand von {0} (Aktuell: {1})","resources.stock.title":"{0} {1} werden auf Lager gehalten","resources.stock.titleInfinite":"Alle {0} werden auf Lager gehalten","resources.stock.titleZero":"{0} werden nicht auf Lager gehalten","state.compress":"Kopierte Kittens Game Spielstände komprimieren","state.confirmDestruction":"Bist du sicher?","state.copied.game":"Spielstand '{0}' in die Zwischenablage kopiert.","state.copied.gameCurrent":"Aktueller Spielstand in Zwischenablage kopiert.","state.copied.state":"Zustand '{0}' in Zwischenablage kopiert.","state.copied.stateCurrent":"Aktueller Zustand wurde in die Zwischenablage kopiert.","state.copy.game":"Diesen Spielstand in die Zwischenablage kopieren.","state.copy.gameCurrent":"Kopiere den gesamten Kittens Game Spielstand (inklusive KS-Einstellungen) in die Zwischenablage.","state.copy.state":"Diese Einstellungen in die Zwischenablage kopieren.","state.copy.stateCurrent":"Kopiere die aktuellen Kitten Scientists Einstellungen in die Zwischenablage.","state.delete.game":"Diesen Spielstand löschen.","state.delete.state":"Diese Einstellungen löschen.","state.deleted.game":"Spielstand '{0}' gelöscht.","state.deleted.state":"Zustand '{0}' gelöscht.","state.edit.game":"Ändere den Namen von diesem Spielstand.","state.edit.state":"Ändere den Namen von diesen Einstellungen.","state.exportAll":"Export","state.exportAllTitle":"Speichert alle lokalen Zustände in einer Datei und lädt sie herunter.","state.import":"Einstellungen/Spielstände importieren","state.imported.game":"Spielstand importiert.","state.imported.state":"Zustand importiert.","state.importedState":"Importierter Stand {0}","state.importTitle":`Füge ein Spielstand oder Einstellungen aus deiner Zwischenablage ein.
6
+ Inhalte werden automatisch erkannt und entsprechend behandelt.`,"state.loaded.game":"Spielstand '{0}' geladen.","state.loaded.state":"Zustand '{0}' geladen.","state.loadPrompt":"Füge deinen (un/komprimierten) Spielstand oder deine Einstellungen hier ein:","state.local":"Lokale Speicherverwaltung","state.localGames":"Kittens Game Spielstände","state.localStates":"Kitten Scientists Einstellungen","state.new":"Neu","state.noConfirm":"Nicht nach Bestätigung fragen","state.store":"Speichern","state.stored.game":"Spielstand gespeichert.","state.stored.state":"Zustand gespeichert.","state.storeFactory":"Neuen Zustand aus Werkseinstellungen erstellen.","state.storeGame":"Neuen Spielstand vom aktuellen Spiel erstellen.","state.storeGame.prompt":"Gib eine Beschreibung für diesen Spielstand ein:","state.storeState":"Erstelle einen neuen Zustand aus den aktuellen Einstellungen.","state.storeState.prompt":"Gib eine Beschreibung für diesen Zustand ein:","state.title":"Zustandsverwaltung","state.unlabeledGame":"unbeschriftetes Spiel","state.unlabeledState":"unbeschrifteter Zustand","state.update.game":"Speichere das aktuelle Spiel in diesem Slot.","state.update.state":"Speichere die aktuellen Einstellungen in diesem Slot.","state.updated.game":"Spielstand '{0}' aktualisiert.","state.updated.state":"Zustand '{0}' aktualisiert.","status.auto.disable":"Auto {0} deaktiviert","status.auto.enable":"Auto {0} aktiviert","status.ks.disable":"Deaktiviere die Kitten Scientists!","status.ks.enable":"Aktiviere die Kitten Scientists!","status.ks.init":"Kitten Scientists initialisiert.","status.ks.upgrade":"Kitten Scientists {0} (unsere ist {1}) ist unter {2} verfügbar.","status.reset.check.disable":"Überprüfung von {0} vor dem Zurücksetzen der Zeitlinie deaktiviert","status.reset.check.enable":"Überprüfung von {0} vor dem Zurücksetzen der Zeitlinie aktiviert","status.resource.disable":"{0} Ressourcenverwaltung deaktiviert","status.resource.enable":"{0} Ressourcenverwaltung aktiviert","status.sub.disable":"{0} deaktiviert","status.sub.enable":"{0} aktiviert","summary.accelerate":"Zeit {0} Mal beschleunigt","summary.adore":"{0} Offenbarung durch das Bewundern der Galaxie akkumuliert","summary.building":"{0} {1} gebaut","summary.craft":"{0} {1} hergestellt","summary.day":"Tag","summary.days":"Tage","summary.distribute":"{0} Kätzchen geholfen einen Beruf zu finden","summary.embassy":"{0} Botschaften gebaut","summary.feed":"{0} Necrocorns an die Ältesten verfüttert","summary.festival":"{0} Festivals veranstaltet","summary.fix.cry":"{0} Kryokammern repariert","summary.head":"Zusammenfassung der letzten {0}","summary.hunt":"Niedliche Jäger Kätzchen auf {0} Jagden versandt","summary.praise":"{0} Anbetung durch Loben der Sonne akkumuliert","summary.promote":"Unseren Anführer {0} mal befördert","summary.refine":"{0} {1} verfeinert","summary.separator":" und ","summary.show":"Aktivitäten anzeigen","summary.stars":"{0} Sterne beobachtet","summary.sun":"{0} {1} entdeckt","summary.tech":"{0} erforscht","summary.time.activeHeatTransferStart":"Aktive Wärmeübertragung {0} mal","summary.time.getTemporalFlux":"{0} Mal Kristalle verbrannt, um Zeit Flux zu generieren","summary.time.reset.content":"{0} Karma erhalten.<br>{1} Paragon erhalten","summary.time.reset.title":"Zusammenfassung der letzten {0} Zeitleisten","summary.time.skip":"{0} Jahre übersprungen","summary.trade":"{0} mal mit {1} gehandelt","summary.transcend":"{0} mal aufgestiegen","summary.upgrade":"{0} verbessert","summary.year":"Jahr","summary.years":"Jahre","time.heatTransfer.cycle.disable":"Aktiver Wärmetransfer im Zyklus {0} deaktiviert","time.heatTransfer.cycle.enable":"Aktiver Wärmetransfer im Zyklus {0} aktiviert","time.skip.cycle.disable":"Zeitsprung im Zyklus {0} und Überspringen über diesen Zyklus verboten","time.skip.cycle.enable":"Zeitsprung im Zyklus {0} und Überspringen über diesen Zyklus erlaubt","time.skip.season.disable":"Zeitsprung in {0} deaktiviert","time.skip.season.enable":"Zeitsprung in {0} aktiviert","trade.limited":"Handel mit {0}: limitiert auf nur, wenn profitabel auf Basis der relativen Produktionszeit","trade.season.disable":"Handel mit {0} in {1} deaktiviert","trade.season.enable":"Handel mit {0} in {1} aktiviert","trade.seasons":"Jahreszeiten","trade.unlimited":"Handel mit {0}: unbegrenzt","ui.additional":"Weitere Optionen","ui.build":"Lagerfeuer","ui.close":"schließen","ui.craft":"Werkstatt","ui.craft.resources":"Ressourcen","ui.cycles":"Zyklen","ui.disable.all":"Alle Optionen in dieser Liste deaktivieren.","ui.distribute":"Dorf","ui.enable.all":"Alle Optionen in dieser Liste aktivieren.","ui.engine":"Kitten Scientists aktivieren","ui.faith":"Religion","ui.filter":"Protokollfilter","ui.infinity":"∞","ui.internals":"Intern","ui.internals.interval":"Intervall: {0}","ui.internals.interval.prompt":"Gib die neue Anzahl an Millisekunden als absoluten Wert zwischen 0 und unendlich ein.","ui.internals.interval.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du die Grenze auf 0 setzt, werden die Kitten Scientists deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.internals.interval.promptTitle":"Kitten Scientists Ausführungsintervall (Aktuell: {0})","ui.itemsHide":"Abschnitt einklappen","ui.itemsShow":"Abschnitt ausklappen","ui.ksColumn":"KS in vierter Spalte im UI anzeigen","ui.language":"Sprache","ui.limit":"Begrenzt","ui.limited.off":"Unbegrenzt","ui.limited.on":"Öko-Modus","ui.max":"Max: {0}","ui.max.build.prompt":"Grenze für {0} (Aktuell: {1})","ui.max.build.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.build.title":"Baue {0} {1}","ui.max.build.titleInfinite":"Nie aufhören {0} zu bauen","ui.max.build.titleZero":"{0} nicht bauen","ui.max.craft.prompt":"Gib die neue Grenze zum Herstellen von {0} als absoluten Wert zwischen 0 und unendlich ein.","ui.max.craft.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.craft.promptTitle":"Grenze für Herstellen von {0} (Aktuell: {1})","ui.max.craft.title":"{0} {1} herstellen","ui.max.craft.titleInfinite":"Nie aufhören {0} herzustellen","ui.max.craft.titleZero":"{0} nicht herstellen","ui.max.distribute.prompt":"Gib die neue Anzahl an Kätzchen im {0} Beruf als absoluten Wert zwischen 0 und unendlich ein.","ui.max.distribute.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.distribute.promptTitle":"Max. Kätzchen als {0} zuweisen (Aktuell: {1})","ui.max.distribute.title":"{0} Kätzchen als {1} zuweisen","ui.max.distribute.titleInfinite":"So viele Kätzchen wie möglich als {0} zuweisen","ui.max.distribute.titleZero":"Keine Kätzchen als {0} zuweisen","ui.max.embassy.title":"Baue {0} Botschaften für {1}","ui.max.embassy.titleInfinite":"Nie aufhören Botschaften für {0} zu bauen","ui.max.embassy.titleZero":"Keine Botschaften für {0} bauen","ui.max.prompt.absolute":"Gib die neue Grenze als absoluten Wert zwischen 0 und unendlich ein.","ui.max.prompt.float":"Gib die neue Grenze als absoluten Wert zwischen 0,0 und unendlich ein.","ui.max.set":"Maximum für {0}","ui.max.timeSkip.prompt":"Gib die neue Anzahl an Jahren als absoluten Wert zwischen 0 und unendlich ein.","ui.max.timeSkip.promptExplainer":"Alle Notationen, die das Spiel unterstützt werden, akzeptiert. Wenn du gar nichts, oder einen negativen Wert eingibst, wird die Grenze auf unendlich gesetzt. Wenn du die Grenze auf 0 setzt, wird Zeit Überspringen deaktiviert. Wenn du einen ungültigen Wert eingibst, wird das genauso behandelt als ob du Abbrechen gedrückt hättest.","ui.max.timeSkip.promptTitle":"Max. Jahre zum Überspringen (Aktuell: {0})","ui.max.timeSkip.title":"{0} Jahre auf einmal überspringen","ui.max.timeSkip.titleInfinite":"So viele Jahre wie möglich überspringen","ui.max.timeSkip.titleZero":"Keine Zeit überspringen","ui.maximum":"Maximum","ui.min":"Min. {0}","ui.options":"Optionen","ui.reset":"Optionen in der Liste auf Standardkonfiguration zurücksetzen.","ui.resources":"Ressourcensteuerung","ui.space":"Weltraum","ui.time":"Zeit","ui.timeCtrl":"Zeitsteuerung","ui.trade":"Handel","ui.trigger":"Auslöser: {0}","ui.trigger.accelerateTime.prompt":"Gib den neuen Lagerbestand von Temporalem Flux, bei welchem Tempus Fugit aktiviert werden soll, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.accelerateTime.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.accelerateTime.promptTitle":"Auslöser zur Zeit-Beschleunigung (Aktuell: {0})","ui.trigger.activeHeatTransfer.prompt":"Gib den neuen Stand von Chronohitze, bei welchem aktiver Wärmetransfer aktiviert werden sollen, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.activeHeatTransfer.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.activeHeatTransfer.promptTitle":"Auslöser für Wärmetransfer (Aktuell: {0})","ui.trigger.build.blocked":`∞
7
+ 🛈 Der Abschnitt {0} hat keinen Auslöser gesetzt. Diese Option wird nie ausgelöst!`,"ui.trigger.build.inherited":"von Abschnitt übernommen","ui.trigger.build.prompt":"Auslöser für {0} (Aktuell: {1})","ui.trigger.build.promptExplainer":'Wenn du gar nichts, oder eine negative Zahl eingibst, wird der Auslöser des Abschnitts geerbt. Ungültige Eingaben werden so behandelt als ob du "Abbrechen" drückst.',"ui.trigger.crypto.prompt":"Gib den neuen Lagerbestand von Relikten, bei welchem Blackcoins gehandelt werden sollen, als absoluten Wert zwischen 0,0 und unendlich ein.","ui.trigger.crypto.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.crypto.promptTitle":"Auslöser um Blackcoin zu handeln (Aktuell: {0})","ui.trigger.embassies.prompt":"Gib den neuen Lagerbestand von Kultur, bei welchem Botschaften gebaut werden sollen, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.embassies.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.embassies.promptTitle":"Auslöser für den Bau von Botschaften (Aktuell: {0})","ui.trigger.hunt.prompt":"Auslöser für Jagd (Aktuell: {0})","ui.trigger.hunt.promptExplainer":"Wenn du einen negativen Wert eingibst, wird Jagen deaktiviert. Wenn du einen leeren Wert oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hast.","ui.trigger.inactive":"inaktiv","ui.trigger.promoteKittens.prompt":"Gib den neuen Lagerbestand von Gold, bei welchem Kätzchen befördert werden sollen, als Prozentzahl ein. Der Wert sollte zwischen 0,0 und 100,0 liegen.","ui.trigger.promoteKittens.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.promoteKittens.promptTitle":"Auslöser um Kätzchen zu befördern (Aktuell: {0})","ui.trigger.prompt.absolute":"Gib den neuen Auslöser als absoluten Wert zwischen 0 und unendlich ein.","ui.trigger.prompt.float":"Gib den neuen Auslöser als absoluten Wert zwischen 0,0 und unendlich ein.","ui.trigger.prompt.percentage":"Gib den neuen Auslöser als Prozentzahl zwischen 0,0 und 100,0 ein.","ui.trigger.reset.promptExplainer":"Wenn du einen negativen Wert eingibst, wird die Option deaktiviert. Wenn du einen leeren Wert oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hast.","ui.trigger.section":"Abschnitt Standard-Auslöser: {0}","ui.trigger.section.blocked":`∞
8
+ 🛈 Der Abschnitt {0} hat keinen Auslöser gesetzt. Diese Option wird nie ausgelöst!`,"ui.trigger.section.inactive":"∞ (nichts wird automatisch ausgelöst)","ui.trigger.section.inherited":"von Abschnitt übernommen","ui.trigger.section.prompt":"Auslöser für Abschnitt {0} (Aktuell: {1})","ui.trigger.section.promptExplainer":`Wenn du einen leeren Wert oder einen negativen Wert eingibst, wird der Auslöser des Abschnitts auf Unendlichkeit gesetzt (∞), was alle Optionen deaktiviert, es sei denn, sie haben einen eigenen Auslöser gesetzt.
9
+ Wenn du einen ungültigen Wert eingibst, wird er so behandelt, als ob du "Abbrechen" drückst.`,"ui.trigger.setinteger":"Gib einen neuen Auslöser für {0} ein. Sollte im Bereich von 0 bis zu einer beliebigen Zahl liegen. -1 bedeutet unendlich.","ui.trigger.setinteger.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.setpercentage":"Geben Sie einen neuen Auslöser für {0} ein. Sollte im Bereich von 0 bis 100 liegen.","ui.trigger.setpercentage.promptExplainer":"Wenn du einen leeren oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hättest.","ui.trigger.timeSkip.prompt":"Gib die neue Menge an Zeitkristallen ein, bei welcher Zeit übersprungen werden soll. Der Wert sollte zwischen 1 und unendlich liegen.","ui.trigger.timeSkip.promptExplainer":"Wenn du einen negativen Wert eingibst, werden Zeit-Sprünge deaktiviert. Wenn du einen leeren Wert oder einen ungültigen Wert eingibst, wird das so behandelt, als ob du Abbrechen gedrückt hast.","ui.trigger.timeSkip.promptTitle":"Auslöser für Zeitsprung (Aktuell: {0})","ui.upgrade":"Wissenschaft","ui.upgrade.buildings":"Gebäude verbessern","ui.upgrade.missions":"Missionen starten","ui.upgrade.policies":"Politik erforschen","ui.upgrade.races":"Neue Völker erforschen","ui.upgrade.techs":"Technologien erforschen","ui.upgrade.upgrades":"Verbesserungen erforschen","ui.upgrades":"Verbesserungen",update:"Aktualisieren","upgrade.building.amphitheatre":"Amphitheater zu Sendetürmen verbessert!","upgrade.building.aqueduct":"Aquädukte zu Wasserwerken verbessert!","upgrade.building.library":"Bibliotheken zu Rechenzentren verbessert!","upgrade.building.pasture":"Weiden zu Solarfarmen verbessert!","upgrade.building.warehouse":"Lagerhäuser zu Raumhäfen verbessert!","upgrade.policy":"Kätzchen haben {0} veranlasst","upgrade.race":"Kätzchen haben die {0} getroffen","upgrade.space":"Kätzchen haben {0} durchgeführt","upgrade.space.mission":"Kätzchen haben eine Mission zu {0} durchgeführt","upgrade.tech":"Kätzchen haben die Technologie {0} gekauft","upgrade.upgrade":"Kätzchen haben die Verbesserung {0} gekauft"},cn={"act.accelerate":"האץ את הזמן!","act.adore":"העריץ את הגלקסיה! נאסף {0} פולחן ל-{1} תגלית","act.blackcoin.buy":"Kittens sold your Relics and bought {0} Blackcoins","act.blackcoin.sell":"Kittens sold your Blackcoins and bought {0} Relics","act.build":"חתלתולים בנו {0} חדש","act.builds":"חתלתולים בנו {0} חדש {1} פעמים","act.craft":"חתלתולים יצרו {0} {1}","act.distribute":"הופץ חתלתול ל-{0}","act.elect":"חתלתולים בחרו מנהיג חדש.","act.feed":"חתלתולים האכילו את העתיקים. העתיקים מרוצים","act.fix.cry":"חתלתולים תיקנו {0} תאי קריו","act.hunt":"נשלחו חתלתולים {0} פעמים לציד","act.observe":"מדעניתלתול צפו בכוכב","act.praise":"הריעו לשמש! נצבר {0} אמונה עבור {1} פולחן","act.promote":"מנהיג החתלתולים קודם לדרגה {0}","act.refineTCs":"זוקקו {0} בדולחי זמן","act.refineTears":"Refined {0} tears into BLS","act.sacrificeAlicorns":"הוקרבו {0} מכונפי קרן","act.sacrificeUnicorns":"Sacrificed {0} unicorns","act.sun.discover":"חתותולים גילו {0}","act.sun.discovers":"חתלתולים גילו {0} {1} פעמים","act.time.activeHeatTransferEnd":"End active Heat Transfer","act.time.activeHeatTransferStart":"Start active Heat Transfer","act.time.getTemporalFlux":"Burn crystals to obtain time flux to maintain time acceleration","act.time.skip":"חתלתולים שרפו בדולח זמן, ופסחו על {0} שנים!","act.trade":"חתלתולים סחרו {0} פעמים עם {1}","act.transcend":"נוצל {0} תגלית, התעלה לרמת התעלות: {1}","blackcoin.buy":"Buy Limit: {0}","blackcoin.buy.prompt":"Enter at which price you want to stop buying blackcoins.","blackcoin.buy.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to buy until shortly before you sell.","blackcoin.buy.promptTitle":"Buy Limit for Blackcoins (Current: {0})","blackcoin.buy.title":"Buy Blackcoins until price reaches {0}","blackcoin.buy.trigger":"קונה מטבעותשחור (בשרידים)","blackcoin.sell":"Sell Order: {0}","blackcoin.sell.prompt":"Enter at which price you want to sell all your blackcoins.","blackcoin.sell.promptExplainer":"Blackcoin price always rises from 800 to 1100 (roughly), then it crashes. You usually want to sell close to the highest possible price.","blackcoin.sell.promptTitle":"Sell Order for Blackcoins (Current: {0})","blackcoin.sell.title":"Sell Blackcoins when price reaches {0}","build.embassies":"נבנו {0} שגרירויות של {1}","build.embassy":"נבנו {0} שגרירויות של {1}",copy:"Copy","craft.limited":"יוצר {0}: מוגבל לעלות היחסית","craft.unlimited":"יוצר {0}: ללא הגבלה",delete:"Delete","dispose.necrocorn":"חתלתולים נפטרו מאלמתי קרן לא יעילים","festival.extend":"חתלתולים האריכו את החגיגה","festival.hold":"חתלתולים החלו לערוך חגיגה","filter.accelerate":"הזמן עובר לו","filter.adore":"מעריץ","filter.allKG":"All KG log entries.","filter.build":"בנייה","filter.craft":"יצירה","filter.disable":"נכבו {0} רשומות","filter.distribute":"חלוקה","filter.enable":"Enabled {0} log messages","filter.explainer":"Disabled items are hidden from the log.","filter.faith":"מסדר השמש","filter.festival":"חגיגות","filter.hunt":"ציד","filter.misc":"שונות","filter.praise":"הילול","filter.promote":"העלאות דרגה","filter.research":"חקר","filter.star":"אירועים אסטרונומיים","filter.timeSkip":"קפיצת זמן","filter.trade":"סחר","filter.transcend":"עילוי","filter.upgrade":"שדרוג","option.accelerate":"הזמן עובר לו","option.autofeed":"האכל לוויתנים","option.catnip":"Gather Catnip","option.crypto":"סחור במטבעשחור","option.elect":"בחר מנהיג","option.elect.job":"Job","option.elect.job.any":"Any","option.elect.trait":"Trait","option.embassies":"בנה שגרירויות","option.faith.adore":"הערץ את הגלקסיה","option.faith.autoPraise":"הלל את השמש","option.faith.best.unicorn":"Automate Build Order","option.faith.refineTears":"זקק דמעות","option.faith.refineTimeCrystals":"זקק TCים","option.faith.sacrificeAlicorns":"הקרב מכונפי קרן","option.faith.sacrificeUnicorns":"Sacrifice Unicorns","option.faith.transcend":"עילוי","option.festival":"ארגן חגיגות","option.fix.cry":"תקן תאי קריו","option.hunt":"צוד","option.magnetos":"הפעל מגנטוים","option.observe":"צפה באירועים אסטרונומיים","option.praise":"הלל את השמש","option.promote":"העלאות דרגה","option.promotekittens":"העלה את דרגת החתלתולים","option.reactors":"Turn on Reactors","option.shipOverride":"הכרח ספינות ל-243","option.steamworks":"הפעל את מנוע הקיטור","option.time.activeHeatTransfer":"Active Heat Transfer","option.time.reset":"אתחל מחדש את ציר הזמן (סכנה!)","option.time.skip":"קפיצת זמן","option.time.skip.ignoreOverheat":"Ignore overheat",reset:"Reset","reset.after":"Nice to meet you, the cute Kitten Scientists will serve you","reset.cancel.activity":"מאוסטון, יש לנו בעיה","reset.cancel.message":"אתחול ציר הזמן בוטל","reset.check":"Trigger for {0}: {1}, you have {2}","reset.checked":"All conditions are met, the timeline will restart in the next few seconds!","reset.countdown.0":"0 - Temporal rifts opened!","reset.countdown.1":"1 - Time engine start","reset.countdown.2":"2 - Boosting the chronoforge","reset.countdown.3":"3 - Opening temporal rifts","reset.countdown.4":"4 - Turning off satellite","reset.countdown.5":"5 - Melting blackcoins","reset.countdown.6":"6 - Starting time engines","reset.countdown.7":"7 - Disassembling railguns","reset.countdown.8":"8 - Releasing lizards","reset.countdown.9":"9 - Sacrificing unicorns","reset.countdown.10":"10 - קוצר נפית חתולים","reset.last.message":"נתראה בהישנות פואנקרה הבאה","reset.tip":'You can cancel this reset by disabling "Enable Kitten Scientists" at the top of the settings.',"resources.consume":"צרוך: {0}","resources.consume.prompt":"Enter how much of the resource you want automations to consume as a percentage between 0.0 and 100.0.","resources.consume.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","resources.consume.promptTitle":"Consumption Share for {0} (Current: {1})","resources.consume.set":"קצב צריכה עבור {0}","resources.consume.title":"Consuming {0} of {1}","resources.consume.titleZero":"Not consuming {0}","resources.stock.prompt":"Enter how much of the resource you always want to keep in stock.","resources.stock.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","resources.stock.promptTitle":"Stock value for {0} (Current: {1})","resources.stock.title":"Keeping {0} {1} in stock","resources.stock.titleInfinite":"Keeping all {0} in stock","resources.stock.titleZero":"Not keeping any {0} in stock","state.compress":"Compress data","state.confirmDestruction":"האם אתה בטוח?","state.copied.game":"Save '{0}' copied to clipboard.","state.copied.gameCurrent":"Current save copied to clipboard.","state.copied.state":"State '{0}' copied to clipboard.","state.copied.stateCurrent":"Current state copied to clipboard.","state.copy.game":"Copy this save to the clipboard.","state.copy.gameCurrent":"Copy the entire Kittens Game save (includes KS settings) to the clipboard.","state.copy.state":"Copy these settings to the clipboard.","state.copy.stateCurrent":"Copy the current Kitten Scientists settings to the clipboard.","state.delete.game":"Delete this save.","state.delete.state":"Delete these settings.","state.deleted.game":"Save '{0}' deleted.","state.deleted.state":"State '{0}' deleted.","state.edit.game":"Change the name of this save.","state.edit.state":"Change the name of these settings.","state.exportAll":"Backup","state.exportAllTitle":"Stores all local states in a single file and downloads it.","state.import":"Import from clipboard","state.imported.game":"Save imported.","state.imported.state":"State imported.","state.importedState":"Imported state {0}","state.importTitle":`Paste a save or settings from your clipboard.
10
+ Contents will be automatically detected and handled accordingly.`,"state.loaded.game":"Save '{0}' loaded.","state.loaded.state":"State '{0}' loaded.","state.loadPrompt":"Paste your (un/compressed) save or settings here:","state.local":"Local states","state.localGames":"Kittens Game Saves","state.localStates":"Kitten Scientists Settings","state.new":"New","state.noConfirm":"Do NOT confirm destructive actions. (Danger!)","state.store":"Store","state.stored.game":"Save stored.","state.stored.state":"State stored.","state.storeFactory":"Create a new state from factory defaults.","state.storeGame":"Create a new save from the current game.","state.storeGame.prompt":"Provide a label for this save:","state.storeState":"Create a new state from current settings.","state.storeState.prompt":"Provide a label for this state:","state.title":"State Management","state.unlabeledGame":"unlabeled save","state.unlabeledState":"unlabeled state","state.update.game":"Save the current game into this slot.","state.update.state":"Save the current settings into this slot.","state.updated.game":"Save '{0}' updated.","state.updated.state":"State '{0}' updated.","status.auto.disable":"Disabled Auto {0}","status.auto.enable":"Enabled Auto {0}","status.ks.disable":"מבטל את המדעניתלתול!","status.ks.enable":"מאפשר את המדעניתלתול!","status.ks.init":"Kitten Scientists initialized.","status.ks.upgrade":"Kitten Scientists {0} (ours is {1}) is available at {2}.","status.reset.check.disable":"Disabled check {0} before Reset Timeline","status.reset.check.enable":"Enabled check {0} before Reset Timeline","status.resource.disable":"כבה ניהול משאבי {0}","status.resource.enable":"הפעל ניהול משאבי {0}","status.sub.disable":"{0} הושבת","status.sub.enable":"{0} אופשר","summary.accelerate":"הזמן הועץ {0} פעמים","summary.adore":"נצבר {0} תגלית על ידי הערצת הגלקסיה","summary.building":"נבנה {0} {1}","summary.craft":"נוצר {0} {1}","summary.day":"יום","summary.days":"ימים","summary.distribute":"עזרת ל-{0} חתלתולים למצוא עבודה","summary.embassy":"נבנו {0} שגרירויות","summary.feed":"האכלת את הוותיקים {0} אלמתי קרן","summary.festival":"אורגנו {0} חגיגות","summary.fix.cry":"תוקנו {0} תאי קריו","summary.head":"תקציר {0} האחרונים","summary.hunt":"צידיתלתול יצאו לצוד {0} פעמים","summary.praise":"נצבר {0} פולחן על ידי הילול השמש","summary.promote":"המנהיג קודם {0} פעמים","summary.refine":"זוקק {0} {1}","summary.separator":" ועוד ","summary.show":"הצג פעילות","summary.stars":"נצפו {0} כוכבים","summary.sun":"התגלו {0} {1}","summary.tech":"נחקרו {0}","summary.time.activeHeatTransferStart":"Active Heat Transfer {0} times","summary.time.getTemporalFlux":"Burn crystal to gain time flux {0} times","summary.time.reset.content":"נאסף {0} קרמה.<br>נאסף {1} מופת","summary.time.reset.title":"סיכום {0} צירי הזמן האחרונים","summary.time.skip":"{0} שנים נפסחו","summary.trade":"סחרת {0} פעמים עם {1}","summary.transcend":"התעלית {0} פעמים","summary.upgrade":"שודרג {0}","summary.year":"שנה","summary.years":"שנים","time.heatTransfer.cycle.disable":"Disabled active heat transfer in cycle {0}","time.heatTransfer.cycle.enable":"Enabled active heat transfer in cycle {0}","time.skip.cycle.disable":"Disabled time skip in cycle {0} and disallow skip over this cycle","time.skip.cycle.enable":"Enabled time skip in cycle {0} and allow skip over this cycle","time.skip.season.disable":"Disabled time skip in the {0}","time.skip.season.enable":"Enabled time skip in the {0}","trade.limited":"סחר עם {0}: מוגבל רק כאשר זה רווחי ביחס לזמן ייצור","trade.season.disable":"בוטל הסחר עם {0} עבור {1}","trade.season.enable":"אופשר הסחר עם {0} עבור {1}","trade.seasons":"עונות","trade.unlimited":"סחר עם {0}: ללא הגבלה","ui.additional":"Additional options","ui.build":"מדורה","ui.close":"סגור","ui.craft":"סדנא","ui.craft.resources":"משאבים","ui.cycles":"מחזורים","ui.disable.all":"Disable all options in this list.","ui.distribute":"כפר","ui.enable.all":"Enable all options in this list.","ui.engine":"Enable Kitten Scientists","ui.faith":"דת","ui.filter":"סנני רשומות","ui.infinity":"∞","ui.internals":"Internals","ui.internals.interval":"Interval: {0}","ui.internals.interval.prompt":"Enter the new amount of milliseconds as an absolute value between 0 and Infinity.","ui.internals.interval.promptExplainer":"All notations that the game supports are accepted. If you set the limit to 0, Kitten Scientists will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.internals.interval.promptTitle":"Kitten Scientists Execution Interval (Current: {0})","ui.itemsHide":"Collapse section","ui.itemsShow":"Expand section","ui.ksColumn":"Display in fourth column","ui.language":"Language","ui.limit":"מוגבל","ui.limited.off":"Unlimited","ui.limited.on":"Eco Mode","ui.max":"מירבי: {0}","ui.max.build.prompt":"Limit for {0} (Current: {1})","ui.max.build.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.build.title":"Build {0} {1}","ui.max.build.titleInfinite":"Never stop building {0}","ui.max.build.titleZero":"Don't build {0}","ui.max.craft.prompt":"Enter the new limit of how many {0} to craft as an absolute value between 0 and Infinity.","ui.max.craft.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.craft.promptTitle":"Limit for Crafting {0} (Current: {1})","ui.max.craft.title":"Craft {0} {1}","ui.max.craft.titleInfinite":"Never stop crafting {0}","ui.max.craft.titleZero":"Don't craft {0}","ui.max.distribute.prompt":"Enter the new amount of kittens to assign as {0} as an absolute value between 0 and Infinity.","ui.max.distribute.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.distribute.promptTitle":"Assign Max. Kittens as {0} (Current: {1})","ui.max.distribute.title":"Assign {0} kittens as {1}","ui.max.distribute.titleInfinite":"Assign as many kittens as possible as {0}","ui.max.distribute.titleZero":"Don't assign any kittens as {0}","ui.max.embassy.title":"Build {0} embassy for {1}","ui.max.embassy.titleInfinite":"Never stop building embassies for {0}","ui.max.embassy.titleZero":"Don't build embassies for {0}","ui.max.prompt.absolute":"Enter the new limit as an absolute value between 0 and Infinity.","ui.max.prompt.float":"Enter the new limit as an absolute value between 0.0 and Infinity.","ui.max.set":"מירבי עבור {0}","ui.max.timeSkip.prompt":"Enter the new amount of years as an absolute value between 0 and Infinity.","ui.max.timeSkip.promptExplainer":"All notations that the game supports are accepted. If you submit an empty value, or a negative value, the limit will be set to infinity. If you set the limit to 0, this option will be automatically disabled. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.max.timeSkip.promptTitle":"Max. Years to skip (Current: {0})","ui.max.timeSkip.title":"Skip {0} years at once","ui.max.timeSkip.titleInfinite":"Skip as many years as possible","ui.max.timeSkip.titleZero":"Don't skip time","ui.maximum":"מירבי","ui.min":"מינימלי: {0}","ui.options":"אפשרויות","ui.reset":"Reset list options to default configuration.","ui.resources":"בקרת משאבים","ui.space":"חלל","ui.time":"זמן","ui.timeCtrl":"שליטה בזמן","ui.trade":"סחר","ui.trigger":"מפעיל: {0}","ui.trigger.accelerateTime.prompt":"Enter the new temporal flux storage level at which to enable Tempus Fugit as a percentage between 0.0 and 100.0.","ui.trigger.accelerateTime.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.accelerateTime.promptTitle":"Trigger to Accelerate Time (Current: {0})","ui.trigger.activeHeatTransfer.prompt":"Enter the new temporal heat storage level at which to enable heat transfer as a percentage between 0.0 and 100.0.","ui.trigger.activeHeatTransfer.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.activeHeatTransfer.promptTitle":"Trigger for Heat Transfer (Current: {0})","ui.trigger.build.blocked":`∞
11
+ 🛈 The {0} section has no trigger set. This build will not be triggered!`,"ui.trigger.build.inherited":"inherited from section","ui.trigger.build.prompt":"Trigger for {0} (Current: {1})","ui.trigger.build.promptExplainer":"If you submit an empty value, or a negative value, the section trigger is used instead. If you submit an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.prompt":"Enter the new relic storage level at which to trade blackcoin as an absolute value between 0.0 and Infinity.","ui.trigger.crypto.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.crypto.promptTitle":"Trigger to Trade Blackcoin (Current: {0})","ui.trigger.embassies.prompt":"Enter the new culture storage level at which to build embassies as a percentage between 0.0 and 100.0.","ui.trigger.embassies.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.embassies.promptTitle":"Trigger to Build Embassies (Current: {0})","ui.trigger.hunt.prompt":"Trigger for Hunting (Current: {0})","ui.trigger.hunt.promptExplainer":"If you submit a negative value, hunting will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.inactive":"inactive","ui.trigger.promoteKittens.prompt":"Enter the new gold storage level at which to promote kittens as a percentage between 0.0 and 100.0.","ui.trigger.promoteKittens.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.promoteKittens.promptTitle":"Trigger to Promote Kittens (Current: {0})","ui.trigger.prompt.absolute":"Enter the new trigger value as an absolute value between 0 and Infinity.","ui.trigger.prompt.float":"Enter the new trigger value as an absolute value between 0.0 and Infinity.","ui.trigger.prompt.percentage":"Enter the new trigger value as a percentage between 0.0 and 100.0.","ui.trigger.reset.promptExplainer":"If you submit a negative value, the item will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.section":"Section default trigger: {0}","ui.trigger.section.blocked":`∞
12
+ 🛈 The {0} section has no trigger set. This automation will not be triggered!`,"ui.trigger.section.inactive":"∞ (nothing is triggered automatically)","ui.trigger.section.inherited":"inherited from section","ui.trigger.section.prompt":"Trigger for section {0} (Current: {1})","ui.trigger.section.promptExplainer":`If you submit an empty value, or a negative value, the section trigger will be set to infinity (∞). Individual automations in this section need to have their own trigger set to be activated.
13
+ If you submit an invalid value, it will be treated as if you hit Cancel.`,"ui.trigger.setinteger":"Enter a new trigger value for {0}. Should be in the range from 0 up to any number. -1 means infinity.","ui.trigger.setinteger.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.setpercentage":"Enter a new trigger value for {0}. Should be in the range from 0 to 100.","ui.trigger.setpercentage.promptExplainer":"If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.prompt":"Enter the new amount of Time Crystals at which to skip time as an absolute value between 1 and Infinity.","ui.trigger.timeSkip.promptExplainer":"If you submit a negative value, time skipping will be disabled. If you submit an empty value, or an invalid value, it will be treated as if you hit Cancel.","ui.trigger.timeSkip.promptTitle":"Trigger for Time Skip (Current: {0})","ui.upgrade":"מדע","ui.upgrade.buildings":"שדרג בניינים","ui.upgrade.missions":"התחל משימות","ui.upgrade.policies":"פוליסת מחקר","ui.upgrade.races":"גלה גזעים חדשים","ui.upgrade.techs":"חקור טכנולוגיות","ui.upgrade.upgrades":"חקור שדרוגים","ui.upgrades":"Upgrades",update:"Update","upgrade.building.amphitheatre":"אמפיטאטראות שודרגו למגדלי שידור!","upgrade.building.aqueduct":"אקוודוקטים שודרגו למפעלי מים!","upgrade.building.library":"ספריות שודרגו למרכזיות מידע!","upgrade.building.pasture":"אדמות חקלאיות שודרגו לשדות קולטני שמש!","upgrade.building.warehouse":"Upgraded warehouses to spaceports!","upgrade.policy":"חתלתולים העבירו {0}","upgrade.race":"חתלתולים פגשו את {0}","upgrade.space":"חתלתולים ביצעו {0}","upgrade.space.mission":"חתלתולים ביצעו משימה אל {0}","upgrade.tech":"חתלתולים קנו את הטכנולוגיה {0}","upgrade.upgrade":"חתלתולים קנו את השדרוג {0}"},hn={"act.accelerate":"固有时制御,二倍速!","act.adore":"赞美群星! 转化 {0} 虔诚为 {1} 顿悟","act.blackcoin.buy":"小猫出售遗物并买入 {0} 黑币","act.blackcoin.sell":"小猫出售黑币并买入了 {0} 遗物","act.build":"小猫建造了一个 {0}","act.builds":"小猫建造了 {1} 个新的 {0}","act.craft":"小猫制作了 {0} {1}","act.distribute":"分配一只猫猫成为 {0}","act.elect":"小猫选出了一位新领导人","act.feed":"小猫向上古神献上祭品。上古神很高兴","act.fix.cry":"小猫修复了 {0} 个冷冻仓","act.hunt":"派出 {0} 波小猫去打猎","act.observe":"小猫珂学家观测到一颗流星","act.praise":"赞美太阳! 转化 {0} 信仰为 {1} 虔诚","act.promote":"领袖被提拔到 {0} 级","act.refineTCs":"精炼 {0} 时间水晶","act.refineTears":"将 {0} 泪水提炼成黑色眼泪","act.sacrificeAlicorns":"献祭了 {0} 只天角兽","act.sacrificeUnicorns":"已献祭的独角兽数:{0}","act.sun.discover":"小猫在 {0} 方面获得顿悟","act.sun.discovers":"小猫在 {0} 方面获得 {1} 次顿悟","act.time.activeHeatTransferEnd":"主动散热完成","act.time.activeHeatTransferStart":"开始主动散热","act.time.getTemporalFlux":"烧水晶获取时间通量以维持时间加速","act.time.skip":"燃烧时间水晶, 跳过接下来的 {0} 年!","act.trade":"小猫与 {1} 交易 {0} 次","act.transcend":"消耗 {0} 顿悟,达到超越 {1}","blackcoin.buy":"买入单价:{0}","blackcoin.buy.prompt":"输入您想要停止购买黑币的价格。","blackcoin.buy.promptExplainer":"黑币价格总是从 800 上涨到 1100 (大致),然后暴跌。你通常应该一直买入直到卖出前不久。","blackcoin.buy.promptTitle":"黑币购买限额 (当前:{0})","blackcoin.buy.title":"购买黑币直至价格达到 {0}","blackcoin.buy.trigger":"购买黑币(遗迹)","blackcoin.sell":"卖出单价:{0}","blackcoin.sell.prompt":"输入您想要出售所有黑币的价格。","blackcoin.sell.promptExplainer":"黑币价格总是从 800 上涨到 1100 (大致),然后暴跌。你通常希望以接近最高价的价格出售。","blackcoin.sell.promptTitle":"黑币卖单 (当前:{0})","blackcoin.sell.title":"当价格达到 {0} 时出售黑币","build.embassies":"在 {1} 设立了 {0} 个大使馆","build.embassy":"在 {1} 设立了 {0} 个大使馆",copy:"复制","craft.limited":"制作 {0} 受库存消耗比率的限制","craft.unlimited":"制作 {0} 不受限制",delete:"删除","dispose.necrocorn":"小猫处理掉了影响效率的多余死灵兽","festival.extend":"小猫延长了节日","festival.hold":"小猫开始举办节日","filter.accelerate":"时间加速","filter.adore":"赞美群星","filter.allKG":"所有游戏日志","filter.build":"建筑","filter.craft":"工艺","filter.disable":"过滤 {0} 日志消息","filter.distribute":"猫口分配","filter.enable":"启用 {0} 日志消息","filter.explainer":"已禁用的项目不会显示在日志中。","filter.faith":"太阳秩序","filter.festival":"节日","filter.hunt":"狩猎","filter.misc":"杂项","filter.praise":"赞美太阳","filter.promote":"提拔领袖","filter.research":"研究","filter.star":"天文事件","filter.timeSkip":"时间跳转","filter.trade":"贸易","filter.transcend":"超越","filter.upgrade":"升级","option.accelerate":"时间加速","option.autofeed":"献祭上古神","option.catnip":"采集猫薄荷","option.crypto":"黑币交易","option.elect":"选择领导人","option.elect.job":"工作","option.elect.job.any":"任何","option.elect.trait":"特质","option.embassies":"建造大使馆","option.faith.adore":"赞美群星","option.faith.autoPraise":"赞美太阳","option.faith.best.unicorn":"优先最佳独角兽建筑","option.faith.refineTears":"提炼眼泪","option.faith.refineTimeCrystals":"精炼时间水晶","option.faith.sacrificeAlicorns":"献祭天角兽","option.faith.sacrificeUnicorns":"献祭独角兽","option.faith.transcend":"自动超越","option.festival":"举办节日","option.fix.cry":"修复冷冻仓","option.hunt":"狩猎","option.magnetos":"开启磁电机","option.observe":"观测天文事件","option.praise":"赞美太阳","option.promote":"提拔领袖","option.promotekittens":"提拔小猫","option.reactors":"开启反应堆","option.shipOverride":"强制243船","option.steamworks":"启动蒸汽工房","option.time.activeHeatTransfer":"主动散热","option.time.reset":"重启时间线 (危险!)","option.time.skip":"时间跳转","option.time.skip.ignoreOverheat":"忽略过热",reset:"重置","reset.after":"初次见面,可爱的猫猫科学家为您服务","reset.cancel.activity":"喵斯顿,我们有麻烦了","reset.cancel.message":"重启时间线计划取消","reset.check":"{0} 的触发值: {1}, 现在共有 {2}","reset.checked":"所有条件都已满足,时间线将在几秒后重启!","reset.countdown.0":"&nbsp;0 - 时空裂缝已打开!","reset.countdown.1":"&nbsp;1 - 时间引擎已启动!","reset.countdown.2":"&nbsp;2 - 正在启动时间锻造","reset.countdown.3":"&nbsp;3 - 正在打开时空裂隙","reset.countdown.4":"&nbsp;4 - 正在关闭卫星","reset.countdown.5":"&nbsp;5 - 正在融化黑币","reset.countdown.6":"&nbsp;6 - 正在启动时间引擎","reset.countdown.7":"&nbsp;7 - 正在拆解电磁炮","reset.countdown.8":"&nbsp;8 - 正在放生蜥蜴","reset.countdown.9":"&nbsp;9 - 正在献祭独角兽","reset.countdown.10":"&nbsp;10 - 正在收获猫薄荷","reset.last.message":"我们下个庞加莱回归再见","reset.tip":"您可以通过在设置顶部禁用“启用小猫珂学家”选项来取消此重置。","resources.consume":"消耗率: {0}","resources.consume.prompt":"输入您希望自动化消耗的资源量,以 0.0 到 100.0 之间的百分比表示。","resources.consume.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","resources.consume.promptTitle":"{0} 的消耗份额 (当前:{1})","resources.consume.set":"设置 {0} 的消耗率","resources.consume.title":"消耗 {0} 的 {1}","resources.consume.titleZero":"不消耗 {0}","resources.stock.prompt":"输入您希望始终保留的资源库存量。","resources.stock.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","resources.stock.promptTitle":"{0} 的库存值 (当前:{1})","resources.stock.title":"保持 {0} {1} 库存","resources.stock.titleInfinite":"保持所有 {0} 库存","resources.stock.titleZero":"不保留任何 {0} 库存","state.compress":"压缩数据","state.confirmDestruction":"你确定吗?","state.copied.game":"保存“{0}”复制到剪贴板。","state.copied.gameCurrent":"当前保存已复制到剪贴板。","state.copied.state":"状态“{0}”已复制到剪贴板。","state.copied.stateCurrent":"当前状态已复制到剪贴板。","state.copy.game":"将此保存复制到剪贴板。","state.copy.gameCurrent":"将整个小猫游戏保存 (包括 KS 设置) 复制到剪贴板。","state.copy.state":"将这些设置复制到剪贴板。","state.copy.stateCurrent":"将当前的 Kitten Scientists 设置复制到剪贴板。","state.delete.game":"删除此保存。","state.delete.state":"删除这些设置。","state.deleted.game":"保存“{0}”已删除。","state.deleted.state":"状态“{0}”已删除。","state.edit.game":"更改此保存的名称。","state.edit.state":"更改这些设置的名称。","state.exportAll":"备份","state.exportAllTitle":"将所有本地状态存储在单个文件中并下载。","state.import":"从剪贴板导入","state.imported.game":"保存导入。","state.imported.state":"状态导入。","state.importedState":"Imported state {0}","state.importTitle":`从剪贴板粘贴保存或设置。
14
+ 内容将被自动检测并进行相应处理。`,"state.loaded.game":"已加载保存“{0}”。","state.loaded.state":"已加载状态“{0}”。","state.loadPrompt":"在此处粘贴您的 (未压缩的) 保存或设置:","state.local":"本地状态","state.localGames":"小猫游戏保存","state.localStates":"小猫科学家设置","state.new":"新的","state.noConfirm":"不要求确认","state.store":"储存","state.stored.game":"保存储存。","state.stored.state":"状态储存。","state.storeFactory":"根据出厂默认设置创建新状态。","state.storeGame":"从当前游戏中创建一个新的保存。","state.storeGame.prompt":"为此次保存提供标签:","state.storeState":"根据当前设置创建一个新状态。","state.storeState.prompt":"为该状态提供标签:","state.title":"状态管理器","state.unlabeledGame":"未标记的保存","state.unlabeledState":"未标记状态","state.update.game":"将当前游戏保存到此位置。","state.update.state":"将当前设置保存到此槽中。","state.updated.game":"保存'{0}'已更新。","state.updated.state":"状态“{0}”已更新。","status.auto.disable":"禁用自动化 {0}","status.auto.enable":"启用自动化 {0}","status.ks.disable":"太敬业了,该歇了","status.ks.enable":"神说,要有猫猫珂学家!","status.ks.init":"小猫珂学家已初始化。","status.ks.upgrade":"小猫珂学家 (当前版本:{1}) {0} 可在这里获取:{2} 。","status.reset.check.disable":"在重启时间线前不检查 {0}","status.reset.check.enable":"在重启时间线前检查 {0}","status.resource.disable":"禁用 {0} 资源管理","status.resource.enable":"启用 {0} 资源管理","status.sub.disable":"禁用 {0}","status.sub.enable":"启用 {0}","summary.accelerate":"加速时间 {0} 次","summary.adore":"通过赞美群星积累了 {0} 顿悟","summary.building":"建造了 {0} 个 {1}","summary.craft":"制作了 {0} 个 {1}","summary.day":"天","summary.days":"天","summary.distribute":"帮助 {0} 只猫猫找到工作","summary.embassy":"设立了 {0} 个大使馆","summary.feed":"向上古神献祭 {0} 只死灵兽","summary.festival":"举办了 {0} 次节日","summary.fix.cry":"修复了 {0} 个冷冻仓","summary.head":"过去 {0} 的总结","summary.hunt":"派出了 {0} 批可爱的小猫猎人","summary.praise":"通过赞美太阳积累了 {0} 虔诚","summary.promote":"提拔领袖 {0} 次","summary.refine":"已精炼 {0} {1}","summary.separator":" ","summary.show":"总结","summary.stars":"观测了 {0} 颗流星","summary.sun":"在 {1} 方面顿悟 {0} 次","summary.tech":"掌握了 {0}","summary.time.activeHeatTransferStart":"主动散热 {0} 次","summary.time.getTemporalFlux":"烧水晶获取时间通量 {0} 次","summary.time.reset.content":"获得 {0} 业.<br>获得 {1} 领导力","summary.time.reset.title":"过去 {0} 个时间线的总结","summary.time.skip":"跳过 {0} 年","summary.trade":"与 {1} 贸易了 {0} 次","summary.transcend":"超越了 {0} 次","summary.upgrade":"发明了 {0}","summary.year":"年","summary.years":"年","time.heatTransfer.cycle.disable":"停止在 {0} 主动散热","time.heatTransfer.cycle.enable":"启用在 {0} 主动散热","time.skip.cycle.disable":"停止在 {0} 跳转时间并禁止跳过该周期","time.skip.cycle.enable":"启用在 {0} 跳转时间并允许跳过该周期","time.skip.season.disable":"停止在 {0} 跳转时间","time.skip.season.enable":"启用在 {0} 跳转时间","trade.limited":"与 {0} 的交易限制为比产量更优时才会触发","trade.season.disable":"停止在 {1} 与 {0} 的交易","trade.season.enable":"启用在 {1} 与 {0} 的交易","trade.seasons":"季节","trade.unlimited":"取消与 {0} 交易的限制","ui.additional":"附加选项","ui.build":"营火","ui.close":"关闭","ui.craft":"工艺","ui.craft.resources":"资源","ui.cycles":"周期","ui.disable.all":"全部禁用","ui.distribute":"猫力资源","ui.enable.all":"全部启用","ui.engine":"启用小猫珂学家","ui.faith":"宗教","ui.filter":"日志过滤","ui.infinity":"∞","ui.internals":"小喵设置","ui.internals.interval":"运行间隔(ms): {0}","ui.internals.interval.prompt":"输入新的毫秒数作为 0 到无穷大之间的绝对值。","ui.internals.interval.promptExplainer":"游戏支持的所有符号均可接受。如果您将限制设置为 0,Kitten Scientists 将自动禁用。如果您提交了无效值,则将被视为您点击了“取消”。","ui.internals.interval.promptTitle":"小猫科学家执行间隔 (当前:{0})","ui.itemsHide":"隐藏选项","ui.itemsShow":"显示选项","ui.ksColumn":"显示在第四栏","ui.language":"语言","ui.limit":"限制","ui.limited.off":"无限","ui.limited.on":"环保模式","ui.max":"最大值:{0}","ui.max.build.prompt":"{0} 的限制 (当前:{1})","ui.max.build.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.build.title":"构建 {0} {1}","ui.max.build.titleInfinite":"永不停止建设{0}","ui.max.build.titleZero":"不要构建{0}","ui.max.craft.prompt":"输入要制作的 {0} 数量的新限制,以 0 到无穷大之间的绝对值表示。","ui.max.craft.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.craft.promptTitle":"制作限制 {0} (当前:{1})","ui.max.craft.title":"制造 {0} {1}","ui.max.craft.titleInfinite":"永不停止创造{0}","ui.max.craft.titleZero":"不要制造 {0}","ui.max.distribute.prompt":"输入要分配的新小猫数量 {0},作为 0 到无穷大之间的绝对值。","ui.max.distribute.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.distribute.promptTitle":"将最大小猫数量指定为 {0} (当前:{1})","ui.max.distribute.title":"将 {0} 只小猫指定为 {1}","ui.max.distribute.titleInfinite":"分配尽可能多的小猫作为{0}","ui.max.distribute.titleZero":"不将任何小猫指定为{0}","ui.max.embassy.title":"为{1}建造{0}大使馆","ui.max.embassy.titleInfinite":"永不停止为{0}修建大使馆","ui.max.embassy.titleZero":"不要为{0}建造大使馆","ui.max.prompt.absolute":"输入新的限制作为 0 到无穷大之间的绝对值。","ui.max.prompt.float":"输入新的限制作为 0.0 和无穷大之间的绝对值。","ui.max.set":"设置 {0} 的最大值","ui.max.timeSkip.prompt":"输入新的年数作为 0 至无穷大之间的绝对值。","ui.max.timeSkip.promptExplainer":"游戏支持的所有符号均可接受。如果您提交空值或负值,限制将设置为无穷大。如果您将限制设置为 0,此选项将自动禁用。如果您提交无效值,将被视为您点击了“取消”。","ui.max.timeSkip.promptTitle":"最多跳过年份 (当前:{0})","ui.max.timeSkip.title":"一次跳过 {0} 年","ui.max.timeSkip.titleInfinite":"跳过尽可能多的年份","ui.max.timeSkip.titleZero":"不要跳过时间","ui.maximum":"上限","ui.min":"最小值 {0}","ui.options":"选项","ui.reset":"恢复至默认","ui.resources":"资源控制","ui.space":"太空","ui.time":"时间","ui.timeCtrl":"时间操纵","ui.trade":"贸易","ui.trigger":"触发值:{0}","ui.trigger.accelerateTime.prompt":"输入启用 Tempus Fugit 的新时间通量存储级别,以 0.0 至 100.0 之间的百分比表示。","ui.trigger.accelerateTime.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.accelerateTime.promptTitle":"加速时间的触发值 (当前:{0})","ui.trigger.activeHeatTransfer.prompt":"输入新的启用热传递的时间热存储量,以 0.0 到 100.0 之间的百分比表示。","ui.trigger.activeHeatTransfer.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.activeHeatTransfer.promptTitle":"热传递触发值 (当前:{0})","ui.trigger.build.blocked":`∞
15
+ 🛈 {0} 部分未设置触发值。此构建不会被触发!`,"ui.trigger.build.inherited":"继承自部分","ui.trigger.build.prompt":"{0} 的触发值 (当前:{1})","ui.trigger.build.promptExplainer":"如果您提交了空值或负值,则将使用部分触发值。如果您提交了无效值,则将被视为您点击了“取消”。","ui.trigger.crypto.prompt":"输入交易黑币的新文物存储级别,以 0.0 到 Infinity 之间的绝对值表示。","ui.trigger.crypto.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.crypto.promptTitle":"触发黑币交易 (当前:{0})","ui.trigger.embassies.prompt":"以 0.0 至 100.0 之间的百分比输入建造大使馆的新文化存储级别。","ui.trigger.embassies.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.embassies.promptTitle":"建立大使馆的触发值 (当前:{0})","ui.trigger.hunt.prompt":"狩猎触发值 (当前:{0})","ui.trigger.hunt.promptExplainer":"如果您提交了负值,则搜索将被禁用。如果您提交了空值或无效值,则将被视为您点击了“取消”。","ui.trigger.inactive":"不活跃","ui.trigger.promoteKittens.prompt":"输入新的可用于升级小猫的黄金库存量,以 0.0 到 100.0 之间的百分比表示。","ui.trigger.promoteKittens.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.promoteKittens.promptTitle":"小猫促销触发值 (当前:{0})","ui.trigger.prompt.absolute":"输入新的触发值作为 0 到无穷大之间的绝对值。","ui.trigger.prompt.float":"输入新的触发值作为 0.0 到无穷大之间的绝对值。","ui.trigger.prompt.percentage":"以 0.0 至 100.0 之间的百分比形式输入新的触发值。","ui.trigger.reset.promptExplainer":"如果您提交了负值,则该项目将被禁用。如果您提交了空值或无效值,则将被视为您点击了“取消”。","ui.trigger.section":"部分默认触发值:{0}","ui.trigger.section.blocked":`∞
16
+ 🛈 The {0} section has no trigger set. This automation will not be triggered!`,"ui.trigger.section.inactive":"∞ (nothing is triggered automatically)","ui.trigger.section.inherited":"继承自部分","ui.trigger.section.prompt":"{0} 部分的触发值 (当前:{1})","ui.trigger.section.promptExplainer":`If you submit an empty value, or a negative value, the section trigger will be set to infinity (∞). Individual automations in this section need to have their own trigger set to be activated.
17
+ If you submit an invalid value, it will be treated as if you hit Cancel.`,"ui.trigger.setinteger":"输入 {0} 的新触发值。范围应在 0 到任意数字之间。-1表示无穷大。","ui.trigger.setinteger.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.setpercentage":"输入新的 {0} 触发值,取值范围为 0 到 100 的小数。","ui.trigger.setpercentage.promptExplainer":"如果您提交一个空值或者一个无效值,则被视为您点击了取消。","ui.trigger.timeSkip.prompt":"输入跳过时间所需的时间水晶的新数量,以 1 到无穷大之间的绝对值表示。","ui.trigger.timeSkip.promptExplainer":"如果您提交了负值,时间跳过将被禁用。如果您提交了空值或无效值,它将被视为您点击了“取消”。","ui.trigger.timeSkip.promptTitle":"时间跳跃触发值 (当前:{0})","ui.upgrade":"升级","ui.upgrade.buildings":"升级建筑","ui.upgrade.missions":"探索星球","ui.upgrade.policies":"政策","ui.upgrade.races":"探险队出发!","ui.upgrade.techs":"科技","ui.upgrade.upgrades":"升级","ui.upgrades":"升级",update:"更新","upgrade.building.amphitheatre":"剧场 升级为 广播塔!","upgrade.building.aqueduct":"水渠 升级为 水电站!","upgrade.building.library":"图书馆 升级为 数据中心!","upgrade.building.pasture":"牧场 升级为 太阳能发电站!","upgrade.building.warehouse":"已将仓库升级为太空港!","upgrade.policy":"小猫通过了 {0} 法案","upgrade.race":"小猫遇到了 {0}","upgrade.space":"小猫执行了 {0}","upgrade.space.mission":"小猫执行了 {0} 的任务","upgrade.tech":"小猫掌握了 {0}","upgrade.upgrade":"小猫发明了 {0}"};class Ct extends _t{constructor(e,t,i=!1){super(i);I(this,Fe);I(this,He);L(this,Fe,e),L(this,He,t)}get building(){return P(this,Fe)}get variant(){return P(this,He)}}Fe=new WeakMap,He=new WeakMap;class Yt extends K{constructor(e=!1,t=-1,i=new _,n=new re(!1,-1),a=new re(!1,-1),r=new re(!1,-1),o=new re(!1,-1),l=new K(!1,1),h=new K(!1,1),d=new _){super(e,t);u(this,"buildings");u(this,"bestUnicornBuilding");u(this,"bestUnicornBuildingCurrent");u(this,"sacrificeAlicorns");u(this,"sacrificeUnicorns");u(this,"refineTears");u(this,"refineTimeCrystals");u(this,"autoPraise");u(this,"adore");u(this,"transcend");this.buildings=this.initBuildings(),this.bestUnicornBuilding=i,this.sacrificeAlicorns=n,this.sacrificeUnicorns=a,this.refineTears=r,this.refineTimeCrystals=o,this.autoPraise=l,this.adore=h,this.transcend=d,this.bestUnicornBuildingCurrent=null}initBuildings(){const e={};for(const t of Zi)e[t]=new Ct(t,H.OrderOfTheSun);for(const t of Ki)e[t]=new Ct(t,H.Cryptotheology);for(const t of Vi)e[t]=new Ct(t,H.Ziggurat);return e.unicornPasture=new Ct("unicornPasture",H.UnicornPasture),e}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max,t.trigger=(i==null?void 0:i.trigger)??t.trigger}),this.bestUnicornBuilding.load(e.bestUnicornBuilding),this.sacrificeAlicorns.load(e.sacrificeAlicorns),this.sacrificeUnicorns.load(e.sacrificeUnicorns),this.refineTears.load(e.refineTears),this.refineTimeCrystals.load(e.refineTimeCrystals),this.autoPraise.load(e.autoPraise),this.adore.load(e.adore),this.transcend.load(e.transcend),this.bestUnicornBuildingCurrent=e.bestUnicornBuildingCurrent??this.bestUnicornBuildingCurrent)}}class un{constructor(s,e,t,i=new Yt){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_bonfireManager");u(this,"_workshopManager");this._host=s,this.settings=i,this.manager=new me(this._host,"Religion"),this._workshopManager=t,this._bulkManager=new wt(this._host,this._workshopManager),this._bonfireManager=e}async tick(s){this.settings.enabled&&(this.manager.render(),this._autoBuild(s),this.settings.sacrificeUnicorns.enabled&&await this._autoSacrificeUnicorns(),this.settings.sacrificeAlicorns.enabled&&await this._autoSacrificeAlicorns(s),this.settings.refineTears.enabled&&this._autoTears(s),this.settings.refineTimeCrystals.enabled&&await this._autoTCs(s),this._autoTAP())}_autoBuild(s){if(this.settings.bestUnicornBuilding.enabled)this._buildBestUnicornBuilding(),this._buildNonUnicornBuildings(s);else{const e=Object.fromEntries(Object.entries(this.settings.buildings).filter(([,n])=>n.variant!==H.UnicornPasture)),t=Y(this.settings.buildings.unicornPasture.max),i=this._host.game.bld.getBuildingExt("unicornPasture").meta;this.settings.buildings.unicornPasture.enabled&&i.val<t&&this._bonfireManager.autoBuild(s,{unicornPasture:new Jt("unicornPasture",this.settings.buildings.unicornPasture.enabled,this.settings.buildings.unicornPasture.trigger,this.settings.buildings.unicornPasture.max)}),this._buildReligionBuildings(s,e)}}_buildBestUnicornBuilding(){var t,i;const s=this.getBestUnicornBuilding();if(this.settings.bestUnicornBuildingCurrent!==s&&(this.settings.bestUnicornBuildingCurrent=s,this._host.refreshEntireUserInterface()),this.settings.bestUnicornBuildingCurrent===null)return;const e=this.settings.trigger;if(this.settings.bestUnicornBuildingCurrent==="unicornPasture")this._bonfireManager.build(this.settings.bestUnicornBuildingCurrent,0,1);else{const n=this._getBuildButton(this.settings.bestUnicornBuildingCurrent,H.Ziggurat);if(m(n==null?void 0:n.model))return;let a=0;const r=p(n.model.prices).find(d=>d.name==="tears");m(r)||(a=r.val);const o=this._workshopManager.getValue("tears")-this._workshopManager.getStock("tears");if(!m(this._host.game.religionTab.sacrificeBtn)&&o<a){const d=Math.floor((this._workshopManager.getValue("unicorns")-this._workshopManager.getStock("unicorns"))/2500),g=Math.ceil((a-o)/this._host.game.bld.getBuildingExt("ziggurat").meta.on);if(g<d&&!m(this._host.game.religionTab.sacrificeBtn.model))(i=(t=this._host.game.religionTab.sacrificeBtn)==null?void 0:t.controller)==null||i._transform(this._host.game.religionTab.sacrificeBtn.model,g);else return}const l={[this.settings.bestUnicornBuildingCurrent]:this.settings.buildings[this.settings.bestUnicornBuildingCurrent]},h=this._bulkManager.bulk(l,this.getBuildMetaData(l),e,"Religion");0<h.length&&0<h[0].count&&this.build(this.settings.bestUnicornBuildingCurrent,H.Ziggurat,1)}}_buildNonUnicornBuildings(s){const e=[...kt],t=Object.fromEntries(Object.entries(this.settings.buildings).filter(([,i])=>!e.includes(i.building)));this._buildReligionBuildings(s,t)}_buildReligionBuildings(s,e){this.manager.render();const t=this.getBuildMetaData(e),i=this.settings.trigger,n=this._bulkManager.bulk(e,t,i,"Religion");for(const a of n)0<a.count&&(this.build(a.id,p(a.variant),a.count),s.requestGameUiRefresh=!0)}getBestUnicornBuilding(){var ce,pe;const s=this._bonfireManager.getBuildButton("unicornPasture");if(s===null)return null;const e=[...kt].filter(ee=>ee!=="unicornPasture"),t=this._host.game.getEffect("unicornsPerTickBase")*this._host.game.getTicksPerSecondUI(),i=this._host.game.getEffect("unicornsGlobalRatio")+1,n=this._host.game.getEffect("unicornsRatioReligion")+1,a=this._host.game.prestige.getParagonProductionRatio()+1,r=this._host.game.religion.getSolarRevolutionRatio()+1,o=this._host.game.calendar.cycle,l=this._host.game.calendar.cycles[o];let h=1;l.festivalEffects.unicorns!==void 0&&this._host.game.prestige.getPerk("numeromancy").researched&&this._host.game.calendar.festivalDays&&(h=l.festivalEffects.unicorns);const d=t*i*n*a*r*h,g=Math.max(this._host.game.bld.getBuildingExt("ziggurat").meta.on,1),f=500*(1+this._host.game.getEffect("unicornsRatioReligion")*.1);let w=1;this._host.game.prestige.getPerk("unicornmancy").researched&&(w*=1.1);const b=this._host.game.getEffect("riftChance")*w/(1e4*2)*f;let k=Number.POSITIVE_INFINITY,y=null;const V=p((ce=this._host.game.bld.getBuildingExt("unicornPasture").meta.effects)==null?void 0:ce.unicornsPerTickBase)*this._host.game.getTicksPerSecondUI()*i*n*a*r*h,Q=p((pe=s.model)==null?void 0:pe.prices)[0].val/V;Q<k&&(k=Q,y="unicornPasture");for(const ee of this.manager.tab.zgUpgradeButtons)if(e.includes(ee.id)&&ee.model.visible){let ve=0;for(const Se of p(ee.model.prices))Se.name==="unicorns"&&(ve+=Se.val),Se.name==="tears"&&(ve+=Se.val*2500/g);const mt=p(this._host.game.religion.getZU(ee.id));let Me=n,Ps=this._host.game.getEffect("riftChance");for(const Se in mt.effects)Se==="unicornsRatioReligion"&&(Me+=p(mt.effects.unicornsRatioReligion)),Se==="riftChance"&&(Ps+=p(mt.effects.riftChance));const Vo=500*((Me-1)*.1+1);let Bi=Ps*w/(1e4*2)*Vo;Bi-=b;let Ai=t*i*Me*a*r*h;Ai-=d,Ai+=Bi;const Is=ve/Ai;Is<k&&(0<Bi||n<Me&&0<ve)&&(k=Is,y=ee.id)}return y}build(s,e,t){let i=t;const n=i;let a;if(e===H.Cryptotheology){const r=game.getUnlockByName(s,"transcendenceUpgrades"),o=new classes.ui.TranscendenceBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),a=r.label}else if(e===H.OrderOfTheSun){const r=game.getUnlockByName(s,"religion"),o=new com.nuclearunicorn.game.ui.ReligionBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),a=r.label}else if(e===H.Ziggurat){const r=game.getUnlockByName(s,"zigguratUpgrades"),o=new com.nuclearunicorn.game.ui.ZigguratBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),a=r.label}else throw new bt("unsupported");i!==n&&(console.warn(...v(`${a} Amount ordered: ${n} Amount Constructed: ${i}`)),i===0)||(e===H.OrderOfTheSun?(this._host.engine.storeForSummary(a,i,"faith"),i===1?this._host.engine.iactivity("act.sun.discover",[a],"ks-faith"):this._host.engine.iactivity("act.sun.discovers",[a,this._host.renderAbsolute(i)],"ks-faith")):(this._host.engine.storeForSummary(a,i,"build"),i===1?this._host.engine.iactivity("act.build",[a],"ks-build"):this._host.engine.iactivity("act.builds",[a,this._host.renderAbsolute(i)],"ks-build")))}getBuildMetaData(s){const e={};for(const t of Object.values(s)){const i=this.getBuild(t.building,t.variant);if(i===null)continue;e[t.building]=i;const n=p(e[t.building]);if(!this._getBuildButton(t.building,t.variant))n.rHidden=!0;else{const a=p(this._getBuildButton(t.building,t.variant)).model,r=t.variant===H.Cryptotheology?this._host.game.science.get("cryptotheology").researched:!0;n.rHidden=!(a!=null&&a.visible&&a.enabled&&r)}}return e}getBuild(s,e){switch(e){case H.Ziggurat:return this._host.game.religion.getZU(s)??null;case H.OrderOfTheSun:return this._host.game.religion.getRU(s)??null;case H.Cryptotheology:return this._host.game.religion.getTU(s)??null}throw new Error(`Unknown build: ${s} (${e})`)}_getBuildButton(s,e){let t;switch(e){case H.Ziggurat:t=this.manager.tab.zgUpgradeButtons;break;case H.OrderOfTheSun:t=this.manager.tab.rUpgradeButtons;break;case H.Cryptotheology:t=this.manager.tab.children[0].children[0].children;break;default:throw new Error(`Invalid variant '${e}'`)}if(t.length===0)return null;const i=t.find(n=>n.id===s)??null;return i===null&&console.debug(...v(`Couldn't find button for ${s}! This will likely create problems.`)),i}_transformBtnSacrificeHelper(s,e,t,i){const a=1/(s/e),o=new classes.ui.religion.TransformBtnController(game,t.controllerOpts)._newLink(i,a);return new Promise(l=>{o.handler(new Event("decoy"),l)})}async _autoSacrificeUnicorns(){const s=this._workshopManager.getResource("unicorns"),e=this._workshopManager.getValueAvailable("unicorns");if(!m(this._host.game.religionTab.sacrificeBtn)&&Y(this.settings.sacrificeUnicorns.trigger)<=e&&Y(this.settings.sacrificeUnicorns.trigger)<=s.value){const t=this._host.game.religionTab.sacrificeBtn.controller,i=this._host.game.religionTab.sacrificeBtn.model;if(m(i))return;await this._transformBtnSacrificeHelper(e,s.value,t,i);const n=this._workshopManager.getValueAvailable("unicorns"),a=e-n;this._host.engine.iactivity("act.sacrificeUnicorns",[this._host.game.getDisplayValueExt(a)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.unicorns.title"),a,"refine")}}async _autoSacrificeAlicorns(s){const e=this._workshopManager.getResource("alicorn"),t=this._workshopManager.getValueAvailable("alicorn");if(!m(this._host.game.religionTab.sacrificeAlicornsBtn)&&Y(this.settings.sacrificeAlicorns.trigger)<=t&&Y(this.settings.sacrificeAlicorns.trigger)<=e.value){this._host.game.religionTab.sacrificeAlicornsBtn.render();const i=this._host.game.religionTab.sacrificeAlicornsBtn.controller,n=this._host.game.religionTab.sacrificeAlicornsBtn.model;if(m(n)){s.requestGameUiRefresh=!0;return}await this._transformBtnSacrificeHelper(t,e.value,i,n);const a=this._workshopManager.getValueAvailable("alicorn"),r=t-a;this._host.engine.iactivity("act.sacrificeAlicorns",[this._host.game.getDisplayValueExt(r)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.alicorn.title"),r,"refine")}}_autoTears(s){const e=this._workshopManager.getResource("tears"),t=this._workshopManager.getValueAvailable("tears"),i=this._workshopManager.getResource("sorrow");if(!m(this._host.game.religionTab.refineBtn)&&Y(this.settings.refineTears.trigger)<=t&&Y(this.settings.refineTears.trigger)<=e.value&&i.value<i.maxValue){const n=t-this.settings.refineTears.trigger;if(n<1e4)return;const a=this._host.game.religionTab.refineBtn.controller,r=this._host.game.religionTab.refineBtn.model;if(m(r)){s.requestGameUiRefresh=!0;return}a.buyItem(r,new Event("decoy"),n);const o=this._workshopManager.getValueAvailable("tears"),l=t-o;this._host.engine.iactivity("act.refineTears",[this._host.game.getDisplayValueExt(l)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.tears.title"),l,"refine")}}async _autoTCs(s){const e=this._workshopManager.getResource("timeCrystal"),t=this._workshopManager.getValueAvailable("timeCrystal");if(!m(this._host.game.religionTab.refineTCBtn)&&Y(this.settings.refineTimeCrystals.trigger)<=t&&Y(this.settings.refineTimeCrystals.trigger)<=e.value){const i=this._host.game.religionTab.refineTCBtn.controller,n=this._host.game.religionTab.refineTCBtn.model;if(m(n)){s.requestGameUiRefresh=!0;return}await this._transformBtnSacrificeHelper(t,e.value,i,n);const a=this._workshopManager.getValueAvailable("timeCrystal"),r=t-a;this._host.engine.iactivity("act.refineTCs",[this._host.game.getDisplayValueExt(r)],"ks-faith"),this._host.engine.storeForSummary(this._host.engine.i18n("$resources.timeCrystal.title"),r,"refine")}}_autoTAP(){const s=this._workshopManager.getResource("faith"),e=s.value/s.maxValue;this.settings.transcend.enabled&&this.settings.autoPraise.trigger-.02<=e&&this._autoTranscend(),this.settings.autoPraise.trigger<=e&&(this.settings.adore.enabled&&p(this._host.game.religion.getRU("apocripha")).on&&this._autoAdore(this.settings.adore.trigger),this.settings.autoPraise.enabled&&this._autoPraise())}_autoAdore(s){const e=this._workshopManager.getResource("faith"),t=this._host.game.religion.faith,i=this._host.game.religion.faithRatio,a=p(this._host.game.religion.getRU("transcendence")).on?this._host.game.religion.transcendenceTier:0,r=10+this._host.game.getEffect("solarRevolutionLimit"),o=r*s,l=t/1e6*a*a*1.01,h=i+l,d=.01+e.value*(1+this._host.game.getUnlimitedDR(h,.1)*.1),g=this._host.game.getLimitedDR(this._host.game.getUnlimitedDR(d,1e3)/100,r);o<=g&&(this._host.game.religion._resetFaithInternal(1.01),this._host.engine.iactivity("act.adore",[this._host.game.getDisplayValueExt(t),this._host.game.getDisplayValueExt(l)],"ks-adore"),this._host.engine.storeForSummary("adore",l))}_autoTranscend(){var i,n;let s=this._host.game.religion.faithRatio;const e=p(this._host.game.religion.getRU("transcendence")).on;let t=e?this._host.game.religion.transcendenceTier:0;if(e){const a=((t+2)/(t+1))**2,r=this._host.game.religion._getTranscendTotalPrice(t+1)-this._host.game.religion._getTranscendTotalPrice(t),o=r,l=a;if((1-l+Math.sqrt(80*(l*l-1)*o+(l-1)*(l-1)))*l/(40*(l+1)*(l+1)*(l-1))+o+o/(l*l-1)<=s){this._host.game.religion.faithRatio-=r,this._host.game.religion.tcratio+=r,this._host.game.religion.transcendenceTier+=1;const d=p(this._host.game.challenges.getChallenge("atheism"));(i=d.calculateEffects)==null||i.call(d,d,this._host.game);const g=p(this._host.game.religion.getTU("blackObelisk"));(n=g.calculateEffects)==null||n.call(g,g,this._host.game),this._host.game.msg(this._host.engine.i18n("$religion.transcend.msg.success",[this._host.game.religion.transcendenceTier])),s=this._host.game.religion.faithRatio,t=this._host.game.religion.transcendenceTier,this._host.engine.iactivity("act.transcend",[this._host.game.getDisplayValueExt(r),t],"ks-transcend"),this._host.engine.storeForSummary("transcend",1)}}}_autoPraise(){const s=this._workshopManager.getResource("faith"),e=this._host.game.religion.getApocryphaBonus(),t=s.value*(1+e);this._host.engine.storeForSummary("praise",t),this._host.engine.iactivity("act.praise",[this._host.game.getDisplayValueExt(s.value),this._host.game.getDisplayValueExt(t)],"ks-praise"),this._host.game.religion.praise()}}class dn extends _{constructor(e,t=!1){super(t);I(this,We);L(this,We,e)}get policy(){return P(this,We)}}We=new WeakMap;class ss extends _{constructor(e=!1){super(e);u(this,"policies");this.policies=this.initPolicies()}initPolicies(){const e={};for(const t of Ks)e[t]=new dn(t);return e}static validateGame(e,t){const i=Object.keys(t.policies),n=e.science.policies.map(o=>o.name),a=ae(n,i),r=ae(i,n);for(const o of a)console.warn(...v(`The policy '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The policy '${o}' is not a policy in Kittens Game!`))}load(e){m(e)||(super.load(e),z(this.policies,e.policies,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class gn extends K{constructor(e,t=!1){super(t,-1);I(this,Ge);L(this,Ge,e)}get tech(){return P(this,Ge)}}Ge=new WeakMap;class ns extends K{constructor(e=!1){super(e,-1);u(this,"techs");this.techs=this.initTechs()}initTechs(){const e={};for(const t of Vs)e[t]=new gn(t);return e}static validateGame(e,t){const i=Object.keys(t.techs),n=e.science.techs.map(o=>o.name),a=ae(n,i),r=ae(i,n);for(const o of a)Ji.includes(o)||console.warn(...v(`The technology '${o}' is not tracked in Kitten Scientists!`));for(const o of r){if(Ji.includes(o)){console.info(...v(`The technology '${o}' is a technology in Kittens Game, but it's no longer used.`));continue}console.warn(...v(`The technology '${o}' is not a technology in Kittens Game!`))}}load(e){m(e)||(super.load(e),z(this.techs,e.techs,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Qt extends _{constructor(e=!1,t=new ss,i=new ns,n=new _){super(e);u(this,"policies");u(this,"techs");u(this,"observe");this.policies=t,this.techs=i,this.observe=n}static validateGame(e,t){ss.validateGame(e,t.policies),ns.validateGame(e,t.techs)}load(e){var t;m(e)||(super.load(e),this.policies.load(e.policies),this.techs.load(e.techs),this.observe.enabled=((t=e.observe)==null?void 0:t.enabled)??this.observe.enabled)}}class xe{constructor(s){u(this,"_host");this._host=s}upgrade(s,e){let t=!1;if(e==="policy"){const n=game.getUnlockByName(s.name,"policies"),a=new classes.ui.PolicyBtnController(this._host.game),r=a.fetchModel({controller:a,id:n.name});t=xe.skipConfirm(()=>a.buyItem(r)).itemBought}else if(e==="science"){const n=game.getUnlockByName(s.name,"tech"),a=new com.nuclearunicorn.game.ui.TechButtonController(this._host.game),r=a.fetchModel({controller:a,id:n.name});t=xe.skipConfirm(()=>a.buyItem(r)).itemBought}else{const n=game.getUnlockByName(s.name,"upgrades"),a=new com.nuclearunicorn.game.ui.UpgradeButtonController(this._host.game),r=a.fetchModel({controller:a,id:n.name});t=xe.skipConfirm(()=>a.buyItem(r)).itemBought}if(!t)return!1;const i=s.label;return e==="workshop"?(this._host.engine.storeForSummary(i,1,"upgrade"),this._host.engine.iactivity("upgrade.upgrade",[i],"ks-upgrade")):e==="policy"?this._host.engine.iactivity("upgrade.policy",[i]):e==="science"&&(this._host.engine.storeForSummary(i,1,"research"),this._host.engine.iactivity("upgrade.tech",[i],"ks-research")),!0}static async skipConfirmAsync(s){const e=game.ui.confirm;try{return game.ui.confirm=()=>!0,await s()}finally{game.ui.confirm=e}}static skipConfirm(s){const e=game.ui.confirm;try{return game.ui.confirm=()=>!0,s()}finally{game.ui.confirm=e}}}const mn=c=>new Promise(s=>setTimeout(s,c)),Te="en-US",fn=2*60*1e3,bn="localStorage"in globalThis&&!m(localStorage["ks.timeout"])?Number(localStorage["ks.timeout"]):void 0;class T{constructor(){u(this,"_gameStartSignal");u(this,"_gameStartSignalResolver");u(this,"_possibleEngineState")}static tryEngineStateFromSaveData(s,e){const t=e;if(!(s in t)){console.debug(...v(`Failed: \`${s}\` not found in save data.`));return}const i=t.ks;if(!("state"in i)){console.debug(...v(`Failed: \`${s}.state\` not found in save data.`));return}const n=i.state;if(!Array.isArray(n)){console.debug(...v(`Failed: \`${s}.state\` not \`Array\`.`));return}return n[0]}async waitForGame(s,e,t=bn??fn){if(T._isGameLoaded()){const n=p(T.window.game),a=p(T.window.$I),r=localStorage["com.nuclearunicorn.kittengame.language"];return new s(n,a,r,this._possibleEngineState)}const i=[mn(2e3)];if(m(this._gameStartSignal)&&typeof T.window.dojo<"u"){this._gameStartSignal=new Promise(a=>{this._gameStartSignalResolver=a});const n=T.window.dojo.subscribe("game/start",()=>{console.debug(...v(`'game/start' signal caught. Fast-tracking script load for '${e}'...`)),p(this._gameStartSignalResolver)(!0),T.window.dojo.unsubscribe(n)});if(e!==void 0){const a=T.window.dojo.subscribe("server/load",r=>{console.info(...v(`'server/load' signal caught. Looking for script state with key '${e}' in save data...`));const o=T.tryEngineStateFromSaveData(e,r);if(!o){console.info(...v(`The Kittens Game save data did not contain a script state for '${e}'.`));return}console.info(...v(`Found key '${e}'! Provided save data will be used as seed for next script instance.`)),this._possibleEngineState=o,T.window.dojo.unsubscribe(a)})}}if(m(this._gameStartSignal)||i.push(this._gameStartSignal),t<0)throw new Error("Unable to find game. Giving up. Maybe the game is not exported at `window.game`?");return console.debug(...v(`Waiting for game... (timeout: ${Math.round(t/1e3)}s)`)),await Promise.race(i),this.waitForGame(s,e,t-2e3)}static _isGameLoaded(){var s;return!m(T.window.game)&&(((s=T.window.document.getElementById("game"))==null?void 0:s.checkVisibility())??!1)&&!m(T.window.$I)}static get window(){try{return p(unsafeWindow)}catch{return window}}}class pn extends xe{constructor(e,t,i=new Qt){super(e);u(this,"manager");u(this,"settings");u(this,"_workshopManager");this.settings=i,this.manager=new me(this._host,"Science"),this._workshopManager=t}async tick(e){this.settings.enabled&&(this.manager.render(),this.settings.techs.enabled&&this._host.game.tabs[2].visible&&await this.autoUnlock(),this.settings.policies.enabled&&this._host.game.tabs[2].visible&&await this.autoPolicy(),this.settings.observe.enabled&&this.observeStars())}async autoUnlock(){const e=this._host.game.science.techs,t=new Array;e:for(const i of Object.values(this.settings.techs.techs)){if(!i.enabled)continue;const n=e.find(r=>r.name===i.tech);if(m(n)){console.error(...v(`Tech '${i.tech}' not found in game!`));continue}if(n.researched||!n.unlocked)continue;let a=T.window.dojo.clone(n.prices);a=this._host.game.village.getEffectLeader("scientist",a);for(const r of a){const o=this._workshopManager.getValueAvailable(r.name),l=this._workshopManager.getResource(r.name),h=oe.evaluateSubSectionTrigger(this.settings.techs.trigger,i.trigger);if(h<0||o<l.maxValue*h||o<r.val)continue e}t.push(n)}for(const i of t)await this.upgrade(i,"science")}async autoPolicy(){const e=this._host.game.science.policies,t=new Array;for(const i of Object.values(this.settings.policies.policies)){if(!i.enabled)continue;const n=e.find(a=>a.name===i.policy);if(m(n)){console.error(...v(`Policy '${i.policy}' not found in game!`));continue}!n.researched&&!n.blocked&&n.unlocked&&(n.requiredLeaderJob===void 0||this._host.game.village.leader!==null&&this._host.game.village.leader.job===n.requiredLeaderJob)&&t.push(n)}for(const i of t)await this.upgrade(i,"policy")}observeStars(){this._host.game.calendar.observeBtn!==null&&(this._host.game.calendar.observeHandler(),this._host.engine.iactivity("act.observe",[],"ks-star"),this._host.engine.storeForSummary("stars",1))}}class vn extends _{constructor(e,t=!1){super(t);I(this,Ze);L(this,Ze,e)}get mission(){return P(this,Ze)}}Ze=new WeakMap;class as extends _{constructor(e=!1){super(e);u(this,"missions");this.missions=this.initMissions()}initMissions(){const e={};for(const t of js)e[t]=new vn(t);return e}static validateGame(e,t){const i=Object.keys(t.missions),n=e.space.programs.map(o=>o.name),a=ae(n,i),r=ae(i,n);for(const o of a)console.warn(...v(`The space mission '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The space mission '${o}' is not a space mission in Kittens Game!`))}load(e){m(e)||(super.load(e),z(this.missions,e.missions,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class yn extends _t{constructor(e){super(!1,-1,0);I(this,Ke);L(this,Ke,e)}get building(){return P(this,Ke)}}Ke=new WeakMap;class St extends K{constructor(e=!1,t=-1,i=new as){super(e,t);u(this,"buildings");u(this,"unlockMissions");this.buildings=this.initBuildings(),this.unlockMissions=i}initBuildings(){const e={};for(const t of Xi)e[t]=new yn(t);return e}static validateGame(e,t){as.validateGame(e,t.unlockMissions)}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max,t.trigger=(i==null?void 0:i.trigger)??t.trigger}),this.unlockMissions.load(e.unlockMissions))}}class wn{constructor(s,e,t=new St){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new me(this._host,"Space"),this._workshopManager=e,this._bulkManager=new wt(this._host,this._workshopManager)}tick(s){this.settings.enabled&&(this.manager.render(),this.autoBuild(s),this.settings.unlockMissions.enabled&&this.autoUnlock(s))}autoBuild(s,e=this.settings.buildings){const t=this._bulkManager,i=this.settings.trigger,n={};for(const r of Object.values(e))n[r.building]=this.getBuild(r.building);const a=t.bulk(e,n,i,"Space");for(const r of a)r.count<=0||this.build(r.id,r.count)!==0&&(s.requestGameUiRefresh=!0)}autoUnlock(s){var t,i;if(!this._host.game.tabs[6].visible)return;const e=this._host.game.space.meta[0].meta;e:for(let n=0;n<e.length;n++){if(0<e[n].val||!e[n].unlocked||!this.settings.unlockMissions.missions[e[n].name].enabled)continue;const a=(t=this.manager.tab.GCPanel)==null?void 0:t.children[n];if(m(a))return;const r=p((i=a.model)==null?void 0:i.prices);for(const o of r)if(this._workshopManager.getValueAvailable(o.name)<o.val)continue e;a.domNode.click(),s.requestGameUiRefresh=!0,n===7||n===12?this._host.engine.iactivity("upgrade.space.mission",[e[n].label],"ks-upgrade"):this._host.engine.iactivity("upgrade.space",[e[n].label],"ks-upgrade")}}build(s,e){let t=e;const i=t;let n;const a=game.getUnlockByName(s,"spaceBuilding"),r=new classes.ui.space.PlanetBuildingBtnController(this._host.game),o=r.fetchModel({controller:r,id:a.name});return t=this._bulkManager.construct(o,r,t),n=a.label,t!==i&&(console.warn(...v(`${n} Amount ordered: ${i} Amount Constructed: ${t}`)),t===0)?0:(this._host.engine.storeForSummary(n,t,"build"),t===1?this._host.engine.iactivity("act.build",[n],"ks-build"):this._host.engine.iactivity("act.builds",[n,this._host.renderAbsolute(t)],"ks-build"),t)}getBuild(s){return this._host.game.space.getBuilding(s)}_getBuildButton(s){const e=this.manager.tab.planetPanels;if(m(e))return null;let t=null;for(const i of e)if(t=i.children.find(n=>n.id===s)??null,!m(t))return t;if(t===null)throw new Error(`Couldn't find button for ${s}!`)}}var rs=(c=>(c.build="ks-activity type_ks-build",c.craft="ks-activity type_ks-craft",c.upgrade="ks-activity type_ks-upgrade",c.research="ks-activity type_ks-research",c.trade="ks-activity type_ks-trade",c.hunt="ks-activity type_ks-hunt",c.praise="ks-activity type_ks-praise",c.adore="ks-activity type_ks-adore",c.transcend="ks-activity type_ks-transcend",c.faith="ks-activity type_ks-faith",c.accelerate="ks-activity type_ks-accelerate",c.timeSkip="ks-activity type_ks-timeSkip",c.festival="ks-activity type_ks-festival",c.star="ks-activity type_ks-star",c.distribute="ks-activity type_ks-distribute",c.promote="ks-activity type_ks-promote",c.misc="ks-activity",c))(rs||{});const os=["accelerate","adore","build","craft","distribute","faith","festival","hunt","misc","praise","promote","research","star","timeSkip","trade","transcend","upgrade"];class kn extends _{constructor(e){super(!0);I(this,Ve);L(this,Ve,e)}get variant(){return P(this,Ve)}}Ve=new WeakMap;class _n extends _{constructor(e=!1,t=new _(!0)){super(e);u(this,"filters");u(this,"disableKGLog");this.filters=this.initFilters(),this.disableKGLog=t}initFilters(){const e={};for(const t of os)e[t]=new kn(rs[t]);return e}load(e){var t;m(e)||(super.load(e),z(this.filters,e.filters,(i,n)=>{i.enabled=(n==null?void 0:n.enabled)??i.enabled}),this.disableKGLog.enabled=((t=e.disableKGLog)==null?void 0:t.enabled)??this.disableKGLog.enabled)}}class Cn extends K{constructor(e,t=!1){super(t,-1);I(this,je);L(this,je,e)}get upgrade(){return P(this,je)}}je=new WeakMap;class ls extends K{constructor(e=!1){super(e,-1);u(this,"upgrades");this.upgrades=this.initUpgrades()}initUpgrades(){const e={};for(const t of es)e[t]=new Cn(t);return e}static validateGame(e,t){const i=Object.keys(t.upgrades),n=e.workshop.upgrades.map(o=>o.name),a=ae(n,i),r=ae(i,n);for(const o of a)console.warn(...v(`The workshop upgrade '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The workshop upgrade '${o}' is not an upgrade in Kittens Game!`))}load(e){m(e)||(super.load(e),z(this.upgrades,e.upgrades,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Sn extends Ys{constructor(e,t=!1,i=!0){super(t,i);I(this,Je);L(this,Je,e)}get resource(){return P(this,Je)}}Je=new WeakMap;class xt extends K{constructor(e=!1,t=-1,i=new ls,n=new _){super(e,t);u(this,"resources");u(this,"shipOverride");u(this,"unlockUpgrades");this.resources=this.initResources(),this.shipOverride=n,this.unlockUpgrades=i}initResources(){const e={};for(const t of Hi)e[t]=new Sn(t);return e}static validateGame(e,t){const i=Object.keys(t.resources),n=e.workshop.crafts.map(o=>o.name),a=ae(n,i),r=ae(i,n);for(const o of a)console.warn(...v(`The workshop craft '${o}' is not tracked in Kitten Scientists!`));for(const o of r)console.warn(...v(`The workshop craft '${o}' is not an upgrade in Kittens Game!`));ls.validateGame(e,t.unlockUpgrades)}load(e){var t;m(e)||(super.load(e),z(this.resources,e.resources,(i,n)=>{i.enabled=(n==null?void 0:n.enabled)??i.enabled,i.limited=(n==null?void 0:n.limited)??i.limited,i.max=(n==null?void 0:n.max)??i.max,i.trigger=(n==null?void 0:n.trigger)??i.trigger}),this.unlockUpgrades.load(e.unlockUpgrades),this.shipOverride.enabled=((t=e.shipOverride)==null?void 0:t.enabled)??this.shipOverride.enabled)}}class ei extends xe{constructor(e,t=new xt){super(e);u(this,"settings");u(this,"manager");this.settings=t,this.manager=new me(this._host,"Workshop")}tick(e){return this.settings.enabled?(this.autoCraft(),this.refreshStock(),this.settings.unlockUpgrades.enabled?(this.manager.render(),this.autoUnlock()):Promise.resolve()):Promise.resolve()}async autoUnlock(){if(!this._host.game.workshopTab.visible)return;const e=this._host.game.workshop.upgrades,t=new Array;e:for(const i of Object.values(this.settings.unlockUpgrades.upgrades)){if(!i.enabled)continue;const n=e.find(r=>r.name===i.upgrade);if(m(n)){console.error(...v(`Upgrade '${i.upgrade}' not found in game!`));continue}if(n.researched||!n.unlocked)continue;let a=T.window.dojo.clone(n.prices);a=this._host.game.village.getEffectLeader("scientist",a);for(const r of a){const o=this.getValueAvailable(r.name),l=this.getResource(r.name),h=oe.evaluateSubSectionTrigger(this.settings.unlockUpgrades.trigger,i.trigger);if(h<0||0<h&&o<l.maxValue*h||o<r.val)continue e}t.push(n)}for(const i of t)await this.upgrade(i,"workshop")}autoCraft(e=this.settings.resources){const t=new Map,i=this.settings.trigger;for(const a of Object.values(e)){const r=oe.evaluateSubSectionTrigger(i,a.trigger);if(r<0||!a.enabled)continue;const o=a.max?this.getResource(a.resource):!1,l=Y(a.max);if(o&&l<o.value||!this.singleCraftPossible(a.resource))continue;const h=Object.keys(this.getMaterials(a.resource));h.map(f=>this.getResource(f)).filter(f=>0<f.maxValue).filter(f=>f.value/f.maxValue<r).length===0&&t.set(a,{countRequested:1,materials:h.map(f=>({consume:0,resource:f}))})}if(t.size<1)return;const n=new Map;for(const[a,r]of t)for(const o of r.materials)n.has(o.resource)||n.set(o.resource,new Array),p(n.get(o.resource)).push(a.resource);for(const[,a]of t)for(const r of a.materials){const o=this.getValueAvailable(r.resource);r.consume=o/p(n.get(r.resource)).length}for(const[a,r]of t){const o=this.getMaterials(a.resource);let l=Number.MAX_VALUE;for(const f of r.materials){const w=p(o[f.resource]),b=this.getResource(f.resource);if(!a.limited||a.resource==="ship"&&this.settings.shipOverride.enabled&&this.getResource("ship").value<243){l=Math.min(l,f.consume/w);continue}const k=this._host.game.getResCraftRatio(a.resource),y=this.getValueAvailable(f.resource)/p(n.get(f.resource)).length,A=this.getValueAvailable(a.resource),V=w,Q=1+k,ce=y/V,pe=A/Q,ee=Math.max(0,Math.floor(Math.log(pe)/Math.LN10+1e-9));l=Math.min(l,Math.min(ce-(0<b.maxValue&&b.maxValue<=b.value?0:pe),10**(ee+1)),f.consume/w)}const h=this.getValueAvailable(a.resource),d=1+this._host.game.getResCraftRatio(a.resource),g=Number.MAX_VALUE/d-h/d;l=Math.min(l,g),r.countRequested=Math.max(0,a.max===-1?l:Math.min(l,(a.max-h)/d))}for(const[a,r]of t)r.countRequested<1||this.craft(a.resource,r.countRequested)}craft(e,t){let i=Math.floor(t);if(i<1||!this._canCraft(e,i))return;const n=this.getCraft(e),a=this._host.game.getResCraftRatio(n.name);this._host.game.craft(n.name,i);const r=p(this._host.game.resPool.get(e)).title;i=Number.parseFloat((i*(1+a)).toFixed(2)),this._host.engine.storeForSummary(r,i,"craft"),this._host.engine.iactivity("act.craft",[this._host.game.getDisplayValueExt(i),r],"ks-craft")}_canCraft(e,t){if(!this._host.game.workshopTab.visible&&e!=="wood")return!1;const i=this.getCraft(e),n=p(this.settings.resources[e]).enabled;let a=!1;if(i.unlocked&&n){a=!0;const r=this._host.game.workshop.getCraftPrice(i);for(const o of r)this.getValueAvailable(o.name)<o.val*t&&(a=!1)}return a}getCraft(e){const t=this._host.game.workshop.getCraft(e);if(!t)throw new Error(`Unable to find craft '${e}'`);return t}singleCraftPossible(e){if(!this._host.game.workshopTab.visible&&e!=="wood")return!1;const t=this.getMaterials(e);for(const[i,n]of q(t))if(this.getValueAvailable(i)<n)return!1;return!0}getMaterials(e){const t={},i=this.getCraft(e),n=this._host.game.workshop.getCraftPrice(i);for(const a of n)t[a.name]=a.val;return t}getTickVal(e,t,i=void 0){let n=this._host.game.getResourcePerTick(e.name,!0);if(e.craftable){let a=Number.MAX_VALUE;const r=this.getMaterials(e.name);for(const[o,l]of q(r)){const h=(1+this._host.game.getResCraftRatio(e.name))/l,d=this.getTickVal(this.getResource(o));d!=="ignore"&&(a=Math.min(d*h,a))}n+=a!==Number.MAX_VALUE?a:0}return n<=0&&(e.name==="spice"||e.name==="blueprint")?"ignore":(!i&&!m(t)&&(n+=t.getResValue(e.name)),n)}getAverageHunt(){const e={},t=this._host.game.getEffect("hunterRatio")+this._host.game.village.getEffectLeader("manager",0);return e.furs=40+32.5*t,e.ivory=50*Math.min(.225+.01*t,.5)+40*t*Math.min(.225+.01*t,.5),e.unicorns=.05,this.getValue("zebras")>=10&&(e.bloodstone=this.getValue("bloodstone")===0?.05:5e-4),this._host.game.ironWill&&this._host.game.workshop.get("goldOre").researched&&(e.gold=.625+.625*t),e}getResource(e){const t=this._host.game.resPool.get(e);if(m(t))throw new Error(`Unable to find resource ${e}`);return t}getValue(e){return this.getResource(e).value??0}getStock(e){const t=this._host.engine.settings.resources.resources[e];return t.enabled?t.stock:0}getConsume(e){const t=this._host.engine.settings.resources.resources[e];return t.enabled?t.consume:1}getValueAvailable(e){let t=this.getStock(e);if(e==="catnip"){const a=this._host.game.bld.getBuildingExt("pasture").meta,r=this._host.game.bld.getBuildingExt("aqueduct").meta,o=a.stage===0?a.val:0,l=r.stage===0?r.val:0,h=this.getPotentialCatnip(!0,o,l);h<0&&(t-=h*202*5)}let i=this.getValue(e);i=Math.max(i-t,0);const n=this.getConsume(e);return i*n}getPotentialCatnip(e,t,i){let n=this._host.game.getEffect("catnipPerTickBase");e?(n*=.1,n*=1+this._host.game.getLimitedDR(this._host.game.getEffect("coldHarshness"),1)):n*=this._host.game.calendar.getWeatherMod({name:"catnip"})+this._host.game.calendar.getCurSeason().modifiers.catnip,this._host.game.science.getPolicy("communism").researched&&(n=0);const a=this._host.game.village.getResProduction(),r=a.catnip?a.catnip*(1+this._host.game.getEffect("catnipJobRatio")):0;let o=n+r,l=this._host.game.space.getBuilding("hydroponics").val;this._host.game.prestige.meta[0].meta[21].researched&&(this._host.game.calendar.cycle===2&&(l*=2),this._host.game.calendar.cycle===7&&(l*=.5)),o*=1+.03*i+.025*l;const d=this._host.game.challenges.currentChallenge==="winterIsComing"?0:this._host.game.prestige.getParagonProductionRatio();o*=1+d,o*=1+this._host.game.religion.getSolarRevolutionRatio(),this._host.game.opts.disableCMBR||(o*=1+this._host.game.getCMBRBonus()),o=p(this._host.game.calendar.cycleEffectsFestival({catnip:o}).catnip);let g=this._host.game.village.getResConsumption().catnip;const f=this._host.game.bld.getBuildingExt("unicornPasture").meta.val;if(g*=1+this._host.game.getLimitedDR(t*-.005+f*-.0015,1),this._host.game.village.sim.kittens.length>0&&this._host.game.village.happiness>1){const w=this._host.game.village.happiness-1,b=this._host.game.getEffect("catnipDemandWorkerRatioGlobal");this._host.game.challenges.currentChallenge==="anarchy"?g*=1+w*(1+b):g*=1+w*(1+b)*(1-this._host.game.village.getFreeKittens()/this._host.game.village.sim.kittens.length)}return o+=g,o+=this._host.game.getResourcePerTickConvertion("catnip"),o}refreshStock(){for(const[e,t]of q(this._host.engine.settings.resources.resources)){const i=[...$(`#game .res-row.resource_${e} .res-cell.resAmount`),...$(`#game .res-row.resource_${e} .res-cell.resource-value`)];if(!t.enabled||t.stock===0){for(const a of i)a.classList.remove("ks-stock-above","ks-stock-below");continue}const n=this._host.game.resPool.get(e).value<t.stock;for(const a of i)a.classList.add(n?"ks-stock-below":"ks-stock-above"),a.classList.remove(n?"ks-stock-above":"ks-stock-below")}}}u(ei,"DEFAULT_CONSUME_RATE",1);class xn extends _{constructor(e,t=!1,i=ei.DEFAULT_CONSUME_RATE,n=0){super(t);I(this,Xe);u(this,"consume");u(this,"stock",0);L(this,Xe,e),this.consume=i,this.stock=n}get resource(){return P(this,Xe)}}Xe=new WeakMap;class Tn extends _{constructor(e=!1){super(e);u(this,"resources");this.resources=this.initResources()}initResources(){const e={};for(const t of Wi)e[t]=new xn(t);return e}load(e){m(e)||(super.load(e),z(this.resources,e.resources,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.consume=(i==null?void 0:i.consume)??t.consume,t.stock=(i==null?void 0:i.stock)??t.stock}))}}class En extends _{constructor(e=new _,t=new _(!0)){super(!0);u(this,"noConfirm");u(this,"compress");this.noConfirm=e,this.compress=t}load(e){m(e)||(super.load(e),this.noConfirm.load(e.noConfirm),this.compress.load(e.compress))}}class cs extends _{constructor(e=!1,t=new _n,i=new Tn,n=new En,a=Te,r=new _){super(e);u(this,"interval",2e3);u(this,"locale");u(this,"ksColumn");u(this,"filters");u(this,"resources");u(this,"states");this.filters=t,this.resources=i,this.states=n,this.locale=new jt(a,[{label:"Deutsch",value:"de-DE"},{label:"English",value:"en-US"},{label:"עִברִית",value:"he-IL"},{label:"中文",value:"zh-CN"}]),this.ksColumn=r}load(e,t=!1){m(e)||(super.load(e),t||(this.interval=e.interval??this.interval,this.states.load(e.states),this.locale.load(e.locale),this.ksColumn.load(e.ksColumn)),this.filters.load(e.filters),this.resources.load(e.resources))}}class hs extends re{constructor(e,t=!1,i=-1,n){super(t,i);I(this,Ye);I(this,Qe);I(this,et,0);L(this,Qe,e),n&&(L(this,et,1),L(this,Ye,n))}get baseBuilding(){return P(this,Ye)}get building(){return P(this,Qe)}get stage(){return P(this,et)}}Ye=new WeakMap,Qe=new WeakMap,et=new WeakMap;class Rn extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={broadcasttower:"amphitheatre",dataCenter:"library",hydroplant:"aqueduct",solarfarm:"pasture",spaceport:"warehouse"},t={};for(const i of Fi)i!=="unicornPasture"&&(t[i]=new hs(i));for(const i of Vt)t[i]=new hs(i,!1,-1,e[i]);return t}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Tt extends re{constructor(e,t,i=!1,n=-1){super(i,n);I(this,tt);I(this,it);L(this,tt,e),L(this,it,t)}get building(){return P(this,tt)}get variant(){return P(this,it)}}tt=new WeakMap,it=new WeakMap;class Mn extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Zi)e[t]=new Tt(t,H.OrderOfTheSun);for(const t of Ki)e[t]=new Tt(t,H.Cryptotheology);for(const t of Vi)e[t]=new Tt(t,H.Ziggurat);return e.unicornPasture=new Tt("unicornPasture",H.UnicornPasture),e}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Bn extends re{constructor(e,t=!1,i=-1){super(t,i);I(this,st);L(this,st,e)}get resource(){return P(this,st)}}st=new WeakMap;class An extends _{constructor(e=!1){super(e);u(this,"resources");this.resources=this.initResources()}initResources(){const e={};for(const t of Wi)e[t]=new Bn(t);return e}load(e){m(e)||(super.load(e),z(this.resources,e.resources,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Pn extends re{constructor(e,t=!1,i=-1){super(t,i);I(this,nt);L(this,nt,e)}get building(){return P(this,nt)}}nt=new WeakMap;class In extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Xi)e[t]=new Pn(t);return e}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class us extends re{constructor(e,t,i=!1,n=-1){super(i,n);I(this,at);I(this,rt);L(this,at,e),L(this,rt,t)}get building(){return P(this,at)}get variant(){return P(this,rt)}}at=new WeakMap,rt=new WeakMap;class $n extends _{constructor(e=!1){super(e);u(this,"buildings");this.buildings=this.initBuildings()}initBuildings(){const e={};for(const t of Yi)e[t]=new us(t,he.Chronoforge);for(const t of Qi)t!=="usedCryochambers"&&(e[t]=new us(t,he.VoidSpace));return e}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.trigger=(i==null?void 0:i.trigger)??t.trigger}))}}class Ln extends _{constructor(e,t=!1){super(t);I(this,ot);L(this,ot,e)}get upgrade(){return P(this,ot)}}ot=new WeakMap;class On extends _{constructor(e=!1){super(e);u(this,"upgrades");this.upgrades=this.initUpgrades()}initUpgrades(){const e={};for(const t of es)e[t]=new Ln(t);return e}load(e){m(e)||(super.load(e),z(this.upgrades,e.upgrades,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}))}}class Un extends _{constructor(e=!1,t=new Rn,i=new Mn,n=new An,a=new In,r=new $n,o=new On){super(e);u(this,"bonfire");u(this,"religion");u(this,"resources");u(this,"space");u(this,"time");u(this,"upgrades");this.bonfire=t,this.religion=i,this.resources=n,this.space=a,this.time=r,this.upgrades=o}load(e){m(e)||(super.load(e),this.bonfire.load(e.bonfire),this.religion.load(e.religion),this.resources.load(e.resources),this.space.load(e.space),this.time.load(e.time),this.upgrades.load(e.upgrades))}}class Dn extends K{constructor(e=new _){super(!1,1);u(this,"cycles");u(this,"activeHeatTransferStatus");this.cycles=this.initCycles(),this.activeHeatTransferStatus=e}initCycles(){const e={};for(const t of we)e[t]=new _;return e}load(e){m(e)||(super.load(e),z(this.cycles,e.cycles,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}),this.activeHeatTransferStatus.load(e.activeHeatTransferStatus))}}class Nn extends en{constructor(e=new _,t=new Dn){super(!1,5);u(this,"cycles");u(this,"seasons");u(this,"activeHeatTransfer");u(this,"ignoreOverheat");this.cycles=this.initCycles(),this.seasons=this.initSeason(),this.activeHeatTransfer=t,this.ignoreOverheat=e}initCycles(){const e={};for(const t of we)e[t]=new _;return e}initSeason(){const e={};for(const t of Gs)e[t]=new _;return e}load(e){m(e)||(super.load(e),z(this.cycles,e.cycles,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}),z(this.seasons,e.seasons,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled}),this.ignoreOverheat.load(e.ignoreOverheat),this.activeHeatTransfer.load(e.activeHeatTransfer))}}class ds extends _{constructor(e=!1,t=new K(!1,1),i=new Un,n=new Nn){super(e);u(this,"accelerateTime");u(this,"timeSkip");u(this,"reset");this.accelerateTime=t,this.reset=i,this.timeSkip=n}load(e){m(e)||(super.load(e),this.accelerateTime.load(e.accelerateTime),this.reset.load(e.reset),this.timeSkip.load(e.timeSkip))}}class gs extends _t{constructor(e,t,i=!1){super(i,-1,0);I(this,lt);I(this,ct);L(this,lt,e),L(this,ct,t)}get building(){return P(this,lt)}get variant(){return P(this,ct)}}lt=new WeakMap,ct=new WeakMap;class ms extends K{constructor(e=!1,t=-1,i=new _){super(e,t);u(this,"buildings");u(this,"fixCryochambers");this.buildings=this.initBuildings(),this.fixCryochambers=i}initBuildings(){const e={};for(const t of Yi)e[t]=new gs(t,he.Chronoforge);for(const t of Qi)t!=="usedCryochambers"&&(e[t]=new gs(t,he.VoidSpace));return e}load(e){m(e)||(super.load(e),z(this.buildings,e.buildings,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max,t.trigger=(i==null?void 0:i.trigger)??t.trigger}),this.fixCryochambers.load(e.fixCryochambers))}}class qn extends is{constructor(e,t=!1){super(t);I(this,ht);L(this,ht,e)}get race(){return P(this,ht)}}ht=new WeakMap;class zn extends K{constructor(e=!1){super(e);u(this,"races");this.races=this.initRaces()}initRaces(){const e={};for(const t of ji)t!=="leviathans"&&(e[t]=new qn(t));return e}load(e){m(e)||(super.load(e),z(this.races,e.races,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.max=(i==null?void 0:i.max)??t.max}))}}class Fn extends Qs{constructor(e,t,i,n,a,r,o,l=!1){super(t,i);I(this,ut);u(this,"seasons");I(this,dt);L(this,ut,e),this.seasons={autumn:new _(a),spring:new _(o),summer:new _(n),winter:new _(r)},L(this,dt,l)}get race(){return P(this,ut)}get require(){return P(this,dt)}}ut=new WeakMap,dt=new WeakMap;class fs extends K{constructor(e=!1,t=-1,i=new zn,n=new _,a=new tn(!1,1090,1095,1e4),r=new _){super(e,t);u(this,"races");u(this,"feedLeviathans");u(this,"buildEmbassies");u(this,"tradeBlackcoin");u(this,"unlockRaces");this.races=this.initRaces(),this.buildEmbassies=i,this.feedLeviathans=n,this.tradeBlackcoin=a,this.unlockRaces=r}initRaces(){const e={dragons:"titanium",griffins:"wood",leviathans:"unobtainium",lizards:"minerals",sharks:"iron"},t={};for(const i of ji){const n=e[i]??!1;t[i]=new Fn(i,!1,!1,!1,!1,!1,!1,n)}return t}load(e){m(e)||(super.load(e),z(this.races,e.races,(t,i)=>{t.enabled=(i==null?void 0:i.enabled)??t.enabled,t.limited=(i==null?void 0:i.limited)??t.limited,t.trigger=(i==null?void 0:i.trigger)??t.trigger,t.seasons.autumn.enabled=(i==null?void 0:i.seasons.autumn.enabled)??t.seasons.autumn.enabled,t.seasons.spring.enabled=(i==null?void 0:i.seasons.spring.enabled)??t.seasons.spring.enabled,t.seasons.summer.enabled=(i==null?void 0:i.seasons.summer.enabled)??t.seasons.summer.enabled,t.seasons.winter.enabled=(i==null?void 0:i.seasons.winter.enabled)??t.seasons.winter.enabled}),this.buildEmbassies.load(e.buildEmbassies),this.feedLeviathans.load(e.feedLeviathans),this.tradeBlackcoin.load(e.tradeBlackcoin),this.unlockRaces.load(e.unlockRaces))}}class Hn extends _{constructor(e=!1,t=new jt("any",Gi.map(n=>({label:"",value:n}))),i=new jt("none",Zs.map(n=>({label:"",value:n})))){super(e);u(this,"job");u(this,"trait");this.job=t,this.trait=i}load(e){m(e)||(super.load(e),this.job.load(e.job),this.trait.load(e.trait))}}class bs extends _{constructor(e=!1,t=new _,i=new K(!1,.98),n=new K(!1,1),a=new _,r=new Hn){super(e);u(this,"jobs");u(this,"holdFestivals");u(this,"hunt");u(this,"promoteKittens");u(this,"promoteLeader");u(this,"electLeader");this.jobs=this.initJobs(),this.holdFestivals=t,this.hunt=i,this.promoteKittens=n,this.promoteLeader=a,this.electLeader=r}initJobs(){const e={};for(const t of Gi)e[t]=new is(!1,0);return e}load(e){var t,i,n;m(e)||(super.load(e),z(this.jobs,e.jobs,(a,r)=>{a.enabled=(r==null?void 0:r.enabled)??a.enabled,a.max=(r==null?void 0:r.max)??a.max}),this.holdFestivals.enabled=((t=e.holdFestivals)==null?void 0:t.enabled)??this.holdFestivals.enabled,this.hunt.load(e.hunt),this.promoteKittens.enabled=((i=e.promoteKittens)==null?void 0:i.enabled)??this.promoteKittens.enabled,this.promoteLeader.enabled=((n=e.promoteLeader)==null?void 0:n.enabled)??this.promoteLeader.enabled,this.electLeader.load(e.electLeader))}}class Wn{constructor(s,e,t,i,n,a=new ds){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bonfireManager");u(this,"_religionManager");u(this,"_spaceManager");u(this,"_workshopManager");this._host=s,this.settings=a,this.manager=new me(this._host,"Time"),this._bonfireManager=e,this._religionManager=t,this._spaceManager=i,this._workshopManager=n}async tick(s){this.settings.enabled&&(this.settings.accelerateTime.enabled&&this.accelerateTime(),this.settings.timeSkip.enabled&&this.timeSkip(),this.settings.reset.enabled&&await this.autoReset(this._host.engine))}async autoReset(s){if(this._host.game.challenges.currentChallenge)return;const e=[],t=[],i=r=>{if(t.length!==0)for(const o of r){if(m(o.model))continue;const l=o.model,h=l.metadata.name,d=t.indexOf(h);if(d!==-1&&(t.splice(d,1),this._host.game.resPool.hasRes(p(l.prices))))return!0}return!1};for(const[r,o]of q(this.settings.reset.bonfire.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;let l;try{l=this._host.game.bld.getBuildingExt(r)}catch{l=null}if(!m(l))if(e.push({name:l.meta.label??p(l.meta.stages)[p(l.meta.stage)].label,trigger:o.trigger,val:l.meta.val}),0<o.trigger){if(l.meta.val<o.trigger)return}else t.push(r)}const n=this.settings.reset.religion.buildings.unicornPasture;if(n.enabled){if(n.trigger<0)return;const r=this._host.game.bld.getBuildingExt("unicornPasture");if(e.push({name:p(r.meta.label),trigger:n.trigger,val:r.meta.val}),0<n.trigger){if(r.meta.val<n.trigger)return}else t.push("unicornPasture")}if(i(this._bonfireManager.manager.tab.children)||t.length)return;for(const[r,o]of q(this.settings.reset.space.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;const l=this._host.game.space.getBuilding(r);if(e.push({name:l.label,trigger:o.trigger,val:l.val}),0<o.trigger){if(l.val<o.trigger)return}else t.push(r)}if(t.length===0){const r=p(this._spaceManager.manager.tab.planetPanels);for(const o of r)for(const l of o.children){const h=p(l.model),d=h.metadata.name,g=t.indexOf(d);if(g!==-1&&(t.splice(g,1),this._host.game.resPool.hasRes(p(h.prices))))break}}if(t.length)return;for(const[r,o]of q(this.settings.reset.religion.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;const l=p(this._religionManager.getBuild(r,o.variant));if(e.push({name:l.label,trigger:o.trigger,val:l.val}),0<o.trigger){if(l.val<o.trigger)return}else t.push(r)}if(i(this._religionManager.manager.tab.zgUpgradeButtons)||i(this._religionManager.manager.tab.rUpgradeButtons)||i(this._religionManager.manager.tab.ctPanel.children[0].children)||t.length)return;for(const[r,o]of q(this.settings.reset.time.buildings)){if(!o.enabled)continue;if(o.trigger<0)return;const l=p(this.getBuild(r,o.variant));if(e.push({name:l.label,trigger:o.trigger,val:l.val}),0<o.trigger){if(l.val<o.trigger)return}else t.push(r)}if(i(this.manager.tab.cfPanel.children[0].children)||i(this.manager.tab.vsPanel.children[0].children)||t.length)return;for(const[r,o]of q(this.settings.reset.resources.resources)){if(!o.enabled)continue;if(o.trigger<0)return;const l=p(this._host.game.resPool.get(r));if(e.push({name:this._host.engine.i18n(`$resources.${o.resource}.title`),trigger:o.trigger,val:l.value}),l.value<o.trigger)return}for(const[,r]of q(this.settings.reset.upgrades.upgrades))if(r.enabled){const o=p(this._host.game.workshop.upgrades.find(l=>l.name===r.upgrade));if(e.push({name:o.label,trigger:1,val:o.researched?1:0}),!o.researched)return}s.stop(!1);const a=async(r=1500)=>new Promise((o,l)=>{if(!this._host.engine.settings.enabled){l(new Error("canceled by player"));return}setTimeout(o,r)});try{for(const r of e)await a(500),this._host.engine.imessage("reset.check",[r.name,this._host.game.getDisplayValueExt(r.trigger),this._host.game.getDisplayValueExt(r.val)]);await a(0),this._host.engine.imessage("reset.checked"),await a(),this._host.engine.iactivity("reset.tip"),await a(),this._host.engine.imessage("reset.countdown.10"),await a(2e3),this._host.engine.imessage("reset.countdown.9"),await a(),this._host.engine.imessage("reset.countdown.8"),await a(),this._host.engine.imessage("reset.countdown.7"),await a(),this._host.engine.imessage("reset.countdown.6"),await a(),this._host.engine.imessage("reset.countdown.5"),await a(),this._host.engine.imessage("reset.countdown.4"),await a(),this._host.engine.imessage("reset.countdown.3"),await a(),this._host.engine.imessage("reset.countdown.2"),await a(),this._host.engine.imessage("reset.countdown.1"),await a(),this._host.engine.imessage("reset.countdown.0"),await a(),this._host.engine.iactivity("reset.last.message"),await a()}catch{this._host.engine.imessage("reset.cancel.message"),this._host.engine.iactivity("reset.cancel.activity");return}for(let r=0;r<this._host.game.challenges.challenges.length;r++)this._host.game.challenges.challenges[r].pending=!1;this._host.game.resetAutomatic()}accelerateTime(){if(this._workshopManager.getValueAvailable("temporalFlux")<=0){this._host.game.time.isAccelerated&&(this._host.game.time.isAccelerated=!1);return}if(this._host.game.time.isAccelerated)return;const e=this._host.game.resPool.get("temporalFlux");e.maxValue*this.settings.accelerateTime.trigger<=e.value&&(this._host.game.time.isAccelerated=!0,this._host.engine.iactivity("act.accelerate",[],"ks-accelerate"),this._host.engine.storeForSummary("accelerate",1))}timeSkip(){if(!this._host.game.workshop.get("chronoforge").researched||this._host.game.calendar.day<0)return;const s=this._host.game.getEffect("shatterCostIncreaseChallenge"),e=this._workshopManager.getValueAvailable("timeCrystal");if(e<this.settings.timeSkip.trigger||e<1+s)return;const t=this._host.game.getEffect("shatterVoidCost"),i=this._workshopManager.getValueAvailable("void");if(i<t)return;const n=this._host.game.calendar.season;if(!this.settings.timeSkip.seasons[this._host.game.calendar.seasons[n].name].enabled)return;const a=this._host.game.calendar.cycle;if(!this.settings.timeSkip.cycles[we[a]].enabled)return;const r=this._host.game.getEffect("heatMax"),o=this._host.game.time.heat;if(!this.settings.timeSkip.ignoreOverheat.enabled&&r<=o)return;const l=this._host.game.challenges.getChallenge("1000Years").researched?5:10;let h=Number.POSITIVE_INFINITY;if(!this.settings.timeSkip.ignoreOverheat.enabled&&this.settings.timeSkip.activeHeatTransfer.enabled){const y=this._host.game.getEffect("heatPerTick"),A=this._host.game.ticksPerSecond;if(this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled){o<=r*this.settings.timeSkip.activeHeatTransfer.trigger&&(this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled=!1,this._host.refreshEntireUserInterface(),this._host.engine.iactivity("act.time.activeHeatTransferEnd",[],"ks-timeSkip"));const V=this._host.game.getEffect("temporalFluxProduction"),Q=(this._host.game.calendar.daysPerSeason+10+this._host.game.getEffect("temporalParadoxDay"))*this._host.game.calendar.seasonsPerYear,ce=this._host.game.calendar.ticksPerDay,pe=(1+this._host.game.timeAccelerationRatio())/ce,ee=Q/pe,ve=this._host.game.resPool.get("temporalFlux"),mt=ve.maxValue>ee,Me=ve.value<ee;if(!n&&this._host.game.calendar.day<10&&V>l/y&&this.settings.accelerateTime.enabled&&mt&&Me)h=Math.ceil((ee+ce*10-ve.value)/V),this._host.engine.iactivity("act.time.getTemporalFlux",[],"ks-timeSkip"),this._host.engine.storeForSummary("time.getTemporalFlux",1);else{if(this.settings.timeSkip.activeHeatTransfer.cycles[we[a]].enabled)return;h=this._host.game.calendar.yearsPerCycle-this._host.game.calendar.cycleYear}}else o>=r-y*A*10&&(this.settings.timeSkip.activeHeatTransfer.activeHeatTransferStatus.enabled=!0,this._host.refreshEntireUserInterface(),this._host.engine.iactivity("act.time.activeHeatTransferStart",[],"ks-timeSkip"),this._host.engine.storeForSummary("time.activeHeatTransferStart",1))}const d=Y(this.settings.timeSkip.max);let g=Math.floor(Math.min(this.settings.timeSkip.ignoreOverheat.enabled?Number.POSITIVE_INFINITY:(r-o)/l,d,h,e/(1+s),0<t?i/t:Number.POSITIVE_INFINITY)),f=0;const w=this._host.game.calendar.yearsPerCycle,b=w-this._host.game.calendar.cycleYear,k=this._host.game.calendar.cyclesPerEra;if(g<b)f=g;else{f+=b,g-=b;let y=1;for(;w<g&&this.settings.timeSkip.cycles[we[(a+y)%k]].enabled;)f+=w,g-=w,y+=1;this.settings.timeSkip.cycles[we[(a+y)%k]].enabled&&0<g&&(f+=g)}if(0<f){const y=this._host.game.timeTab.cfPanel.children[0].children[0];if(m(y.model))return;this._host.engine.iactivity("act.time.skip",[f],"ks-timeSkip"),y.controller.doShatterAmt(y.model,f),this._host.engine.storeForSummary("time.skip",f)}}getBuild(s,e){return e===he.Chronoforge?this._host.game.time.getCFU(s):this._host.game.time.getVSU(s)}}class Gn{constructor(s,e,t=new ms){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_bulkManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new me(this._host,"Time"),this._bulkManager=new wt(this._host,e),this._workshopManager=e}tick(s){this.settings.enabled&&(this.manager.render(),this.autoBuild(s),this.settings.fixCryochambers.enabled&&this.fixCryochambers())}autoBuild(s,e=this.settings.buildings){const t=this._bulkManager,i=this.settings.trigger,n={};for(const r of Object.values(e)){const o=this.getBuild(r.building,r.variant);n[r.building]=p(o);const l=r.variant===he.Chronoforge?this._getBuildButtonCF(r.building):this._getBuildButtonVS(r.building);if(m(l))continue;const h=l.model,d=r.variant===he.Chronoforge?this.manager.tab.cfPanel:this.manager.tab.vsPanel,g=p(n[r.building]);g.tHidden=!(h!=null&&h.visible)||!h.enabled||!d.visible}const a=t.bulk(e,n,i,"Time");for(const r of a)r.count>0&&(this.build(r.id,r.variant,r.count),s.requestGameUiRefresh=!0)}build(s,e,t){let i=t,n;const a=i;if(e===he.Chronoforge){const r=game.getUnlockByName(s,"chronoforge"),o=new classes.ui.time.ChronoforgeBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),n=r.label}else{const r=game.getUnlockByName(s,"voidSpace"),o=new classes.ui.time.VoidSpaceBtnController(this._host.game),l=o.fetchModel({controller:o,id:r.name});i=this._bulkManager.construct(l,o,i),n=r.label}i!==a&&(console.warn(...v(`${n} Amount ordered: ${a} Amount Constructed: ${i}`)),i===0)||(this._host.engine.storeForSummary(n,i,"build"),i===1?this._host.engine.iactivity("act.build",[n],"ks-build"):this._host.engine.iactivity("act.builds",[n,this._host.renderAbsolute(i)],"ks-build"))}getBuild(s,e){return e===he.Chronoforge?this._host.game.time.getCFU(s):this._host.game.time.getVSU(s)}_getBuildButtonCF(s){return this.manager.tab.children[2].children[0].children.find(e=>e.id===s)??null}_getBuildButtonVS(s){return this.manager.tab.children[3].children[0].children.find(e=>e.id===s)??null}fixCryochambers(){if(this._host.game.time.getVSU("usedCryochambers").val<1)return;const s=p(this._host.game.time.getVSU("usedCryochambers").fixPrices);for(const n of s)if(this._workshopManager.getValueAvailable(n.name)<n.val)return;const e=this.manager.tab.vsPanel.children[0].children[0];let t=0,i;do i=!1,i=e.controller.buyItem(p(e.model),new MouseEvent("click")).itemBought,t+=i?1:0;while(i);0<t&&(this._host.engine.iactivity("act.fix.cry",[this._host.renderAbsolute(t)],"ks-fixCry"),this._host.engine.storeForSummary("fix.cry",t))}}class Zn{constructor(s,e,t=new fs){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new me(this._host,"Trade"),this._workshopManager=e}tick(s){this.settings.enabled&&(this.manager.render(),this.autoTrade(),this.settings.unlockRaces.enabled&&this.autoUnlock(s),this.settings.buildEmbassies.enabled&&this.autoBuildEmbassies(s),this.settings.feedLeviathans.enabled&&this.autoFeedElders(),this.settings.tradeBlackcoin.enabled&&this.autoTradeBlackcoin())}autoTrade(s){var d;const e=this._workshopManager.getResource("manpower"),t=this._workshopManager.getResource("gold"),i=this.settings.trigger,n=[],a=this._host.game.calendar.getCurSeason().name;for(const g of Object.values(this.settings.races)){const f=this.getRace(g.race),w=oe.evaluateSubSectionTrigger(i,g.trigger);if(w<0||!g.enabled||!g.seasons[a].enabled||!f.unlocked||!this.singleTradePossible(i,e,t,g))continue;const b=this.getTradeButton(f.name);if(!((d=b==null?void 0:b.model)!=null&&d.enabled))continue;const k=g.require?this._workshopManager.getResource(g.require):!1,y=this.getProfitability(g.race);(g.limited&&y||!k||w<=k.value/k.maxValue)&&n.push(g.race)}if(n.length===0)return;let r=this.getLowestTradeAmount(null,!0,!1);if(r<1)return;const o=[];for(let g=0;g<n.length;g++){const f=n[g],w=this.settings.races[f],b=w.require?this._workshopManager.getResource(w.require):!1,k=oe.evaluateSubSectionTrigger(i,w.trigger),y=(!b||k<=b.value/b.maxValue)&&k<=t.value/t.maxValue,A=this.getLowestTradeAmount(f,w.limited,y);if(A<1){n.splice(g,1),g--;continue}o.push(A)}if(n.length===0)return;const l={};for(;0<n.length&&1<=r;){if(r<n.length){const b=Math.floor(Math.random()*n.length),k=n[b];m(l[k])&&(l[k]=0),l[k]+=1,r-=1,n.splice(b,1),o.splice(b,1);continue}let g=Math.floor(r/n.length),f=0;const w=n[f];for(let b=0;b<n.length;++b)o[b]<g&&(g=o[b],f=b);m(l[w])&&(l[w]=0),l[w]+=g,r-=g,n.splice(f,1),o.splice(f,1)}if(Object.values(l).length===0)return;const h={};for(const[g,f]of q(l)){const w=this.getRace(g),b=this.getMaterials(g);for(const[y,A]of q(b))h[y]||(h[y]=0),h[y]-=A*f;const k=this.getAverageTrade(w);for(const[y,A]of q(k)){const V=this._workshopManager.getResource(y);h[y]||(h[y]=0),h[y]+=V.maxValue>0?Math.min(p(k[y])*p(l[g]),Math.max(V.maxValue-V.value,0)):A*p(l[g])}}m(s)||s.pushToCache({materials:h,timeStamp:this._host.game.timer.ticksTotal});for(const[g,f]of q(l))0<f&&this.trade(g,f)}autoBuildEmbassies(s){var o;if(!this._host.game.diplomacy.races[0].embassyPrices)return;const e=this._workshopManager.getResource("culture");let t=0;const i=this.settings.buildEmbassies.trigger;if(e.value/e.maxValue<Y(i))return;const n=this._host.game.diplomacyTab.racePanels;t=this._workshopManager.getValueAvailable("culture");const a={},r=[];for(let l=0;l<n.length;l++){if(!n[l].embassyButton)continue;const h=n[l].race.name,d=this._host.game.diplomacy.get(h),g=Y(this.settings.buildEmbassies.races[h].max);!this.settings.buildEmbassies.races[h].enabled||g<=d.embassyLevel||!d.unlocked||(a[h]={basePrice:p((o=d.embassyPrices)==null?void 0:o[0]).val,currentEm:d.embassyLevel,max:g,priceSum:0,race:d,val:0},r.push(h))}if(r.length!==0){for(;r.length>0;)for(let l=0;l<r.length;l++){const h=r[l],d=p(a[h]);if(d.max<=d.currentEm+d.val){r.splice(l,1),--l;continue}const g=d.basePrice*1.15**(d.currentEm+d.val);g<=t?(t-=g,d.priceSum+=g,d.val+=1,s.requestGameUiRefresh=!0):(r.splice(l,1),--l)}for(const[,l]of q(a))l.val!==0&&(t=this._workshopManager.getValueAvailable("culture"),t<l.priceSum&&console.warn(...v("Something has gone horribly wrong.",l.priceSum,t)),this._workshopManager.getResource("culture").value-=l.priceSum,l.race.embassyLevel+=l.val,this._host.engine.storeForSummary("embassy",l.val),l.val!==1?this._host.engine.iactivity("build.embassies",[l.val,l.race.title],"ks-build"):this._host.engine.iactivity("build.embassy",[l.val,l.race.title],"ks-build"))}}autoFeedElders(){const s=this._host.game.diplomacy.get("leviathans"),e=this._host.game.resPool.get("necrocorn");!s.unlocked||e.value===0||(1<=e.value?s.energy<this._host.game.diplomacy.getMarkerCap()&&(this._host.game.diplomacy.feedElders(),this._host.engine.iactivity("act.feed"),this._host.engine.storeForSummary("feed",1)):.25*(1+this._host.game.getEffect("corruptionBoostRatio"))<1&&(this._host.engine.storeForSummary("feed",e.value),this._host.game.diplomacy.feedElders(),this._host.engine.iactivity("dispose.necrocorn")))}autoUnlock(s){if(!this._host.game.tabs[4].visible)return;const e=this._host.game.diplomacy.get("leviathans").unlocked?8:7;if(this._host.game.diplomacyTab.racePanels.length<e){let t=this._workshopManager.getValueAvailable("manpower");if(!this._host.game.diplomacy.get("lizards").unlocked&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("sharks").unlocked&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("griffins").unlocked&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("nagas").unlocked&&this._host.game.resPool.get("culture").value>=1500&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("zebras").unlocked&&this._host.game.resPool.get("ship").value>=1&&t>=1e3){this._host.game.resPool.get("manpower").value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("spiders").unlocked&&p(this._host.game.resPool.get("ship")).value>=100&&p(this._host.game.resPool.get("science")).maxValue>125e3&&t>=1e3){p(this._host.game.resPool.get("manpower")).value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}if(!this._host.game.diplomacy.get("dragons").unlocked&&this._host.game.science.get("nuclearFission").researched&&t>=1e3){p(this._host.game.resPool.get("manpower")).value-=1e3;const i=p(this._host.game.diplomacy.unlockRandomRace());this._host.engine.iactivity("upgrade.race",[i.title],"ks-upgrade"),t-=1e3,s.requestGameUiRefresh=!0}}}autoTradeBlackcoin(){const s=this._host.game.calendar.cryptoPrice,e=this._host.game.resPool.get("relic").value,t=this._host.game.resPool.get("blackcoin").value;let i=0,n=0;if(s<this.settings.tradeBlackcoin.buy&&this.settings.tradeBlackcoin.trigger<e){this._host.game.diplomacy.buyBcoin();const a=this._host.game.resPool.get("blackcoin").value;i=Math.round(a-t),this._host.engine.iactivity("act.blackcoin.buy",[this._host.renderAbsolute(i)])}else if(s>this.settings.tradeBlackcoin.sell&&0<this._host.game.resPool.get("blackcoin").value){this._host.game.diplomacy.sellBcoin();const a=p(this._host.game.resPool.get("relic")).value;n=Math.round(a-e),this._host.engine.iactivity("act.blackcoin.sell",[this._host.renderAbsolute(n)])}}trade(s,e){var n;const t=this.getRace(s),i=this.getTradeButton(t.name);(!((n=i==null?void 0:i.model)!=null&&n.enabled)||!this.settings.races[s].enabled)&&console.warn(...v("KS trade checks are not functioning properly, please create an issue on the github page.")),this._host.game.diplomacy.tradeMultiple(t,e),this._host.engine.storeForSummary(t.title,e,"trade"),this._host.engine.iactivity("act.trade",[this._host.renderAbsolute(e),X(t.title)],"ks-trade")}getProfitability(s){const e=this.getRace(s);let t=0;const i=this.getMaterials(s);for(const[r,o]of q(i)){const l=this._workshopManager.getTickVal(this._workshopManager.getResource(r));if(l!=="ignore"){if(l<=0)return!1;t+=o/l}}let n=0;const a=this.getAverageTrade(e);for(const[r,o]of q(a)){const l=this._workshopManager.getResource(r),h=this._workshopManager.getTickVal(l);if(h!=="ignore"){if(h<=0)return!0;n+=0<l.maxValue?Math.min(o,Math.max(l.maxValue-l.value,0))/h:o/h}}return t<=n}getAverageTrade(s){const e=this._host.game.getEffect("standingRatio")+this._host.game.diplomacy.calculateStandingFromPolicies(s.name,this._host.game),t=1+s.energy*.02,i=1+this._host.game.diplomacy.getTradeRatio()+this._host.game.diplomacy.calculateTradeBonusFromPolicies(s.name,this._host.game),n=s.standing<0?s.standing+e:0,a=0<n?1+n:1,r=0<s.standing?Math.min(s.standing+e/2,1):0,o={};for(const d of s.sells){if(!this._isValidTrade(d,s)){o[d.name]=0;continue}let g=0;const f=s.embassyPrices?d.chance*(1+this._host.game.getLimitedDR(.01*s.embassyLevel,.75)):d.chance;if(s.name==="zebras"&&d.name==="titanium"){const w=this._host.game.resPool.get("ship").value,b=Math.min(.15+w*.0035,1);g=1.5*(1+w/50)*(a*b)}else{const w=d.seasons?1+d.seasons[this._host.game.calendar.getCurSeason().name]:1,b=(a-r)*Math.min(f/100,1),k=r*Math.min(f/100,1);g=(b+1.25*k)*d.value*t*w*i}o[d.name]=g}const l=s.embassyPrices?.35*(1+.01*s.embassyLevel):.35,h=a*Math.min(l,1);return o.spice=25*h+50*h*i/2,o.blueprint=.1*a,o}_isValidTrade(s,e){return!(s.minLevel&&e.embassyLevel<s.minLevel)&&(this._host.game.resPool.get(s.name).unlocked||s.name==="titanium"||s.name==="uranium"||e.name==="leviathans")}getLowestTradeAmount(s,e,t){let i;const n=this.getMaterials(s);let a;for(const[h,d]of q(n)){if(h==="manpower"){let g=d;this._host.game.challenges.isActive("postApocalypse")&&(g=d*(1+this._host.game.bld.getPollutionLevel())),a=this._workshopManager.getValueAvailable(h)/g}else if(h==="gold"){let g=d;this._host.game.challenges.isActive("postApocalypse")&&(g=d*(1+this._host.game.bld.getPollutionLevel())),a=this._workshopManager.getValueAvailable(h)/g}else a=this._workshopManager.getValueAvailable(h)/d;i=i===void 0||a<i?a:i}if(i=Math.floor(i??0),i===0)return 0;if(s===null||s==="leviathans")return i;const r=this.getRace(s);let o=0;const l=this.getAverageTrade(r);for(const h of r.sells){const d=this._workshopManager.getResource(h.name);let g=0;if(!d.maxValue)continue;g=p(l[h.name]);const f=Math.max((d.maxValue-d.value)/g,0);o=f<o?o:f}return o=Math.ceil(o),o===0?0:(i=o<i?Math.max(o-1,1):i,Math.floor(i))}getMaterials(s=null){const e={gold:15-this._host.game.getEffect("tradeGoldDiscount"),manpower:50-this._host.game.getEffect("tradeCatpowerDiscount")};if(m(s))return e;const t=this.getRace(s).buys;for(const i of t)e[i.name]=i.val;return e}getRace(s){const e=this._host.game.diplomacy.get(s);if(m(e))throw new Error(`Unable to retrieve race '${s}'`);return e}getTradeButton(s){const e=this.manager.tab.racePanels.find(t=>t.race.name===s);return(e==null?void 0:e.tradeBtn)??null}singleTradePossible(s,e,t,i){const n=i?oe.evaluateSubSectionTrigger(s,i.trigger):s;if(n<0&&i===void 0)return!0;if(n<0&&i!==void 0||e.value/e.maxValue<n||t.value/t.maxValue<n)return!1;const a=this.getMaterials(i==null?void 0:i.race);for(const[r,o]of q(a))if(this._workshopManager.getValueAvailable(r)<o)return!1;return!0}}class Kn{constructor(s){u(this,"_host");u(this,"_cache",new Array);u(this,"_cacheSum",{});this._host=s}pushToCache(s){this._cache.push(s);for(const[e,t]of q(s.materials))this._cacheSum[e]||(this._cacheSum[e]=0),this._cacheSum[e]+=t;for(let e=0;e<this._cache.length;++e){const t=this._cache[e];if(this._cache.length>1e4){const i=t.materials;for(const[n,a]of q(i))this._cacheSum[n]||(this._cacheSum[n]=0),this._cacheSum[n]-=a;this._cache.shift(),e--}else return}}getResValue(s){if(this._cache.length===0||!this._cacheSum[s])return 0;const e=this._host.game.timer.ticksTotal,t=this._cache[0].timeStamp;return this._cacheSum[s]/(e-t)}}class Vn{constructor(s,e,t=new bs){u(this,"_host");u(this,"settings");u(this,"manager");u(this,"_cacheManager");u(this,"_workshopManager");this._host=s,this.settings=t,this.manager=new me(this._host,"Village"),this._cacheManager=new Kn(this._host),this._workshopManager=e}tick(s){this.settings.enabled&&(this.autoDistributeKittens(),this.settings.hunt.enabled&&this.autoHunt(this._cacheManager),this.settings.holdFestivals.enabled&&this.autoFestival(this._cacheManager),this.settings.electLeader.enabled&&this.autoElect(),this.settings.promoteLeader.enabled&&this.autoPromoteLeader(),this.settings.promoteKittens.enabled&&this.autoPromoteKittens())}autoDistributeKittens(){const s=this._host.game.village.getFreeKittens();if(s){for(let e=0;e<s;++e){const t=new Array;for(const a of this._host.game.village.jobs){const r=this.settings.jobs[a.name].enabled,o=a.unlocked;if(!r||!o)continue;const l=this._host.game.village.getJobLimit(a.name),h=Y(this.settings.jobs[a.name].max),d=a.value;d<l&&d<h&&t.push({count:d,job:a,toCap:l-d})}if(!t.length)return;const i=!m(t.find(a=>a.job.name==="farmer"&&a.count===0));t.sort((a,r)=>a.count-r.count);const n=i?"farmer":t[0].job.name;this._host.game.village.assignJob(this._host.game.village.getJob(n),1),this.manager.render(),this._host.engine.iactivity("act.distribute",[this._host.engine.i18n(`$village.job.${n}`)],"ks-distribute")}this._host.engine.storeForSummary("distribute",s)}}autoElect(){if(this._host.game.challenges.isActive("anarchy"))return;const s=this._host.game.village.sim.kittens,e=this._host.game.village.leader,t=this.settings.electLeader.job.selected,i=this.settings.electLeader.trait.selected,n=s.filter(r=>(r.job===t||t==="any")&&r.trait.name===i);if(n.length===0)return;n.sort((r,o)=>o.rank-r.rank);const a=n[0];!m(e)&&e.trait.name===i&&(e.job===t||t==="any")&&a.rank<=e.rank||(this._host.game.village.makeLeader(a),this._host.engine.iactivity("act.elect"))}autoPromoteKittens(){const s=this._workshopManager.getResource("gold");if(!(this.settings.promoteKittens.trigger<s.value/s.maxValue))for(let e=0;e<this._host.game.village.sim.kittens.length;e++){let t=-1;const i=this._host.game.village.sim.kittens[e].engineerSpeciality;if(!m(i)&&(t=p(this._host.game.workshop.getCraft(i)).tier,!(t<=this._host.game.village.sim.kittens[e].rank))){this._host.game.village.promoteKittens();return}}}autoPromoteLeader(){var s,e;if(this._host.game.science.get("civil").researched&&this._host.game.village.leader!==null){const t=this._host.game.village.leader,i=t.rank,n=this._workshopManager.getResource("gold"),a=this._workshopManager.getStock("gold");this._host.game.village.sim.goldToPromote(i,i+1,n.value-a)[0]&&this._host.game.village.sim.promote(t,i+1)===1&&(this._host.engine.iactivity("act.promote",[i+1],"ks-promote"),(s=this._host.game.villageTab.censusPanel)==null||s.census.renderGovernment(this._host.game.villageTab.censusPanel.census.container),(e=this._host.game.villageTab.censusPanel)==null||e.census.update(),this._host.engine.storeForSummary("promote",1))}}autoHunt(s){const e=this._workshopManager.getResource("manpower"),t=this.settings.hunt.trigger;if(!(e.value<100||this._host.game.challenges.isActive("pacifism"))&&t<=e.value/e.maxValue&&100<=e.value){const i=Math.floor(e.value/100);this._host.engine.storeForSummary("hunt",i),this._host.engine.iactivity("act.hunt",[this._host.renderAbsolute(i)],"ks-hunt");const n=this._workshopManager.getAverageHunt(),a={};for(const[r,o]of q(n)){const l=this._workshopManager.getResource(r);a[r]=0<l.maxValue?Math.min(o*i,Math.max(l.maxValue-l.value,0)):o*i}m(s)||s.pushToCache({materials:a,timeStamp:this._host.game.timer.ticksTotal}),this._host.game.village.huntAll()}}autoFestival(s){if(!this._host.game.science.get("drama").researched||400<this._host.game.calendar.festivalDays||!this._host.game.prestige.getPerk("carnivals").researched&&0<this._host.game.calendar.festivalDays)return;const e=this._workshopManager;if(e.getValueAvailable("manpower")<1500||e.getValueAvailable("culture")<5e3||e.getValueAvailable("parchment")<2500)return;const t=4e3*e.getTickVal(e.getResource("manpower"),s,!0)>1500,i=4e3*e.getTickVal(e.getResource("culture"),s,!0)>5e3,n=4e3*e.getTickVal(e.getResource("parchment"),s,!0)>2500;if(!(!t&&!i&&!n)&&(this.manager.render(),this._host.game.villageTab.festivalBtn.model.enabled)){const a=this._host.game.calendar.festivalDays;this._host.game.villageTab.festivalBtn.onClick(),this._host.engine.storeForSummary("festival"),a>0?this._host.engine.iactivity("festival.extend",[],"ks-festival"):this._host.engine.iactivity("festival.hold",[],"ks-festival")}}}const ps={"de-DE":ln,"en-US":on,"he-IL":cn,"zh-CN":hn};class oe{constructor(s,e){u(this,"_i18nData");u(this,"_isLoaded",!1);u(this,"_host");u(this,"settings");u(this,"bonfireManager");u(this,"religionManager");u(this,"scienceManager");u(this,"spaceManager");u(this,"timeControlManager");u(this,"timeManager");u(this,"tradeManager");u(this,"villageManager");u(this,"workshopManager");u(this,"_activitySummary");u(this,"_timeoutMainLoop");this.settings=new cs,this._i18nData=ps,this.setLanguage(e,!1),this._host=s,this._activitySummary=new rn(this._host),this.workshopManager=new ei(this._host),this.bonfireManager=new an(this._host,this.workshopManager),this.religionManager=new un(this._host,this.bonfireManager,this.workshopManager),this.scienceManager=new pn(this._host,this.workshopManager),this.spaceManager=new wn(this._host,this.workshopManager),this.timeControlManager=new Wn(this._host,this.bonfireManager,this.religionManager,this.spaceManager,this.workshopManager),this.timeManager=new Gn(this._host,this.workshopManager),this.tradeManager=new Zn(this._host,this.workshopManager),this.villageManager=new Vn(this._host,this.workshopManager)}get isLoaded(){return this._isLoaded}isLanguageSupported(s){return Object.keys(this._i18nData).some(e=>e.startsWith(`${s}-`))}isLocaleSupported(s){return s in this._i18nData}localeSupportsFirstLetterSplits(s=this.settings.locale.selected){return s!=="zh-CN"}localeForLanguage(s){return Object.keys(this._i18nData).find(e=>e.startsWith(`${s}-`))}setLanguage(s,e=!0){const t=this.settings.locale.selected;if(!this.isLanguageSupported(s))console.warn(...v(`Requested language '${s}' is not available. Falling back to '${Te}'.`)),this.settings.locale.selected=Te;else{const i=p(this.localeForLanguage(s));console.info(...v(`Selecting language '${i}'.`)),this.settings.locale.selected=i}t!==this.settings.locale.selected&&e&&this._host.rebuildUi()}setLocale(s,e=!0){const t=this.settings.locale.selected;this.isLocaleSupported(s)?(console.info(...v(`Selecting language '${s}'.`)),this.settings.locale.selected=s):(console.warn(...v(`Requested language '${s}' is not available. Falling back to '${Te}'.`)),this.settings.locale.selected=Te),t!==this.settings.locale.selected&&e&&this._host.rebuildUi()}stateLoad(s,e=!1){this._isLoaded=!0,this.stop(!1);const t=Oe();s.v!==t&&console.warn(...v(`Attempting to load engine state with version tag '${s.v}' when engine is at version '${t}'!`));const i=(n,a)=>{try{n()}catch(r){console.error(...v(`Failed load of ${a} settings.`,r))}};i(()=>{this.settings.load(s.engine,e)},"engine"),i(()=>{this.bonfireManager.settings.load(s.bonfire)},"bonfire"),i(()=>{this.religionManager.settings.load(s.religion)},"religion"),i(()=>{this.scienceManager.settings.load(s.science)},"science"),i(()=>{this.spaceManager.settings.load(s.space)},"space"),i(()=>{this.timeControlManager.settings.load(s.timeControl)},"time control"),i(()=>{this.timeManager.settings.load(s.time)},"time"),i(()=>{this.tradeManager.settings.load(s.trade)},"trade"),i(()=>{this.villageManager.settings.load(s.village)},"village"),i(()=>{this.workshopManager.settings.load(s.workshop)},"workshop"),this.setLocale(this.settings.locale.selected),this.settings.enabled?this.start(!1):this.stop(!1)}static get DEFAULT_STATE(){return{bonfire:new Xt,engine:new cs,religion:new Yt,science:new Qt,space:new St,time:new ms,timeControl:new ds,trade:new fs,v:Oe(),village:new bs,workshop:new xt}}stateReset(){this.stateLoad(oe.DEFAULT_STATE)}stateSerialize(){return{bonfire:this.bonfireManager.settings,engine:this.settings,religion:this.religionManager.settings,science:this.scienceManager.settings,space:this.spaceManager.settings,time:this.timeManager.settings,timeControl:this.timeControlManager.settings,trade:this.tradeManager.settings,v:Oe(),village:this.villageManager.settings,workshop:this.workshopManager.settings}}start(s=!0){if(this._timeoutMainLoop)return;const e=()=>{const t={entry:Date.now(),exit:0,measurements:{},requestGameUiRefresh:!1};this._iterate(t).then(()=>{t.exit=Date.now();const i=t.exit-t.entry;document.dispatchEvent(new CustomEvent("ks.reportFrame",{detail:t})),this._timeoutMainLoop!==void 0&&(this._timeoutMainLoop=T.window.setTimeout(e,Math.max(10,this._host.engine.settings.interval-i)))}).catch(i=>{console.warn(...v(Hs(i)))})};this._timeoutMainLoop=T.window.setTimeout(e,this._host.engine.settings.interval),s&&this._host.engine.imessage("status.ks.enable")}stop(s=!0){this._timeoutMainLoop&&(clearTimeout(this._timeoutMainLoop),this._timeoutMainLoop=void 0,s&&this._host.engine.imessage("status.ks.disable"))}async _iterate(s){this.settings.filters.disableKGLog.enabled||this._maintainKGLogFilters();let[,e]=await vt(()=>this.scienceManager.tick(s));s.measurements.scienceManager=e,[,e]=ye(()=>{this.bonfireManager.tick(s)}),s.measurements.bonfireManager=e,[,e]=ye(()=>{this.spaceManager.tick(s)}),s.measurements.spaceManager=e,[,e]=await vt(()=>this.workshopManager.tick(s)),s.measurements.workshopManager=e,[,e]=ye(()=>{this.tradeManager.tick(s)}),s.measurements.tradeManager=e,[,e]=await vt(()=>this.religionManager.tick(s)),s.measurements.religionManager=e,[,e]=ye(()=>{this.timeManager.tick(s)}),s.measurements.timeManager=e,[,e]=ye(()=>{this.villageManager.tick(s)}),s.measurements.villageManager=e,[,e]=await vt(()=>this.timeControlManager.tick(s)),s.measurements.timeControlManager=e,[,e]=ye(()=>{s.requestGameUiRefresh&&this._host.game.ui.render()}),s.measurements.gameUiRefresh=e}_maintainKGLogFilters(){for(const e of Object.values(this._host.game.console.filters))e.enabled=!1;const s=T.window.document.querySelectorAll("[id^=filter-]");for(const e of s)e.checked=!1}symbolForCycle(s){var e;return((e=this._host.game.calendar.cycles.find(t=>t.name===s))==null?void 0:e.uglyph)??""}labelForCycle(s){const e=this.symbolForCycle(s),t=this._host.engine.i18n(`$space.planet.${s==="redmoon"?"moon":s}.label`);return`${e} ${t}`}labelForPlanet(s){const e=s==="moon"?"redmoon":s,t=we.includes(e)?e:void 0,i=this._host.engine.i18n(`$space.planet.${s}.label`);return t===void 0?i:`${this.symbolForCycle(t)} ${i}`}i18n(s,e=[]){let t;if(s.startsWith("$")&&(t=this._host.i18nEngine(s.slice(1))),t=t??this._i18nData[this.settings.locale.selected][s],m(t)){if(t=ps[Te][s],!t)return console.warn(...v(`i18n key '${s}' not found in default language.`)),`$${s}`;console.warn(...v(`i18n key '${s}' not found in selected language.`))}for(let n=0;n<e.length;++n)t=t.replace(`{${n}}`,`${e[n]}`);return t}iactivity(s,e=[],t){const i=this.i18n(s,e);if(t){const n=`type_${t}`;this._printOutput(`ks-activity ${n}`,"#e65C00",i)}else this._printOutput("ks-activity","#e65C00",i)}imessage(s,e=[]){this._printOutput("ks-default","#aa50fe",this.i18n(s,e))}storeForSummary(s,e=1,t="other"){this._activitySummary.storeActivity(s,e,t)}getSummary(){return this._activitySummary.renderSummary()}displayActivitySummary(){const s=this.getSummary();for(const e of s)this._printOutput("ks-summary","#009933",e);this.resetActivitySummary()}resetActivitySummary(){this._activitySummary.resetActivity()}_printOutput(s,e,t){if(this.settings.filters.enabled){for(const n of Object.values(this.settings.filters.filters))if(n.variant===s&&!n.enabled)return}const i=this._host.game.msg(t,s);$(i.span).css("color",e),console.debug(...v(t))}static evaluateSubSectionTrigger(s,e){return s<0?e:e<0?s:e}}const vs=c=>Number.isFinite(c)?c:0,jn=c=>({days:Math.trunc(c/864e5),hours:Math.trunc(c/36e5%24),minutes:Math.trunc(c/6e4%60),seconds:Math.trunc(c/1e3%60),milliseconds:Math.trunc(c%1e3),microseconds:Math.trunc(vs(c*1e3)%1e3),nanoseconds:Math.trunc(vs(c*1e6)%1e3)}),Jn=c=>({days:c/86400000n,hours:c/3600000n%24n,minutes:c/60000n%60n,seconds:c/1000n%60n,milliseconds:c%1000n,microseconds:0n,nanoseconds:0n}),Xn=c=>{switch(typeof c){case"number":{if(Number.isFinite(c))return jn(c);break}case"bigint":return Jn(c)}throw new TypeError("Expected a finite number or bigint")},Yn=c=>c===0||c===0n,Qn=(c,s)=>s===1||s===1n?c:`${c}s`,ea=1e-7,ta=24n*60n*60n*1000n,ia=(c,s={colonNotation:!1,compact:!1,formatSubMilliseconds:!1,keepDecimalsOnWholeSeconds:!1,millisecondsDecimalDigits:0,secondsDecimalDigits:1,separateMilliseconds:!1,unitCount:1/0,verbose:!1})=>{const e=typeof c=="bigint";if(!e&&!Number.isFinite(c))throw new TypeError("Expected a finite number or bigint");const t={...s};t.colonNotation&&(t.compact=!1,t.formatSubMilliseconds=!1,t.separateMilliseconds=!1,t.verbose=!1),t.compact&&(t.unitCount=1,t.secondsDecimalDigits=0,t.millisecondsDecimalDigits=0);let i=[];const n=(h,d)=>{const g=Math.floor(h*10**d+ea);return(Math.round(g)/10**d).toFixed(d)},a=(h,d,g,f)=>{if(!((i.length===0||!t.colonNotation)&&Yn(h)&&!(t.colonNotation&&g==="m"))){if(f??(f=String(h)),t.colonNotation){const w=f.includes(".")?f.split(".")[0].length:f.length,b=i.length>0?2:1;f="0".repeat(Math.max(0,b-w))+f}else f+=t.verbose?" "+Qn(d,h):g;i.push(f)}},r=Xn(c),o=BigInt(r.days);if(a(o/365n,"year","y"),a(o%365n,"day","d"),a(Number(r.hours),"hour","h"),a(Number(r.minutes),"minute","m"),t.separateMilliseconds||t.formatSubMilliseconds||!t.colonNotation&&c<1e3){const h=Number(r.seconds),d=Number(r.milliseconds),g=Number(r.microseconds),f=Number(r.nanoseconds);if(a(h,"second","s"),t.formatSubMilliseconds)a(d,"millisecond","ms"),a(g,"microsecond","µs"),a(f,"nanosecond","ns");else{const w=d+g/1e3+f/1e6,b=typeof t.millisecondsDecimalDigits=="number"?t.millisecondsDecimalDigits:0,k=w>=1?Math.round(w):Math.ceil(w),y=b?w.toFixed(b):k.toString();a(Number.parseFloat(y),"millisecond","ms",y)}}else{const h=(e?Number(c%ta):c)/1e3%60,d=typeof t.secondsDecimalDigits=="number"?t.secondsDecimalDigits:1,g=n(h,d),f=t.keepDecimalsOnWholeSeconds?g:g.replace(/\.0+$/,"");a(Number.parseFloat(f),"second","s",f)}if(i.length===0)return"0"+(t.verbose?" milliseconds":"ms");const l=t.colonNotation?":":" ";return typeof t.unitCount=="number"&&(i=i.slice(0,Math.max(t.unitCount,1))),i.join(l)},B={Bonfire:"M80-80v-183l363-491-67-90 49-35 55 75 56-75 48 35-66 90 362 491v183H80Zm400-623L140-243v103h145l195-273 195 273h145v-103L480-703ZM359-140h242L480-310 359-140Zm121-273 195 273-195-273-195 273 195-273Z",CheckboxCheck:"m419-321 289-289-43-43-246 246-119-119-43 43 162 162ZM120-120v-720h720v720H120Zm60-60h600v-600H180v600Zm0 0v-600 600Z",CheckboxUnCheck:"M120-120v-720h720v720H120Zm60-60h600v-600H180v600Z",Copy:"M240-200v-680h560v680H240Zm60-60h440v-560H300v560ZM120-80v-680h60v620h500v60H120Zm180-180v-560 560Z",Cycles:"M120-80v-740h125v-60h65v60h340v-60h65v60h125v360h-60v-110H180v430h324v60H120ZM760 0q-73 0-127.5-45.5T564-160h62q13 44 49.5 72T760-60q58 0 99-41t41-99q0-58-41-99t-99-41q-29 0-54 10.5T662-300h58v60H560v-160h60v57q27-26 63-41.5t77-15.5q83 0 141.5 58.5T960-200q0 83-58.5 141.5T760 0ZM180-630h600v-130H180v130Zm0 0v-130 130Z",DataUsage:"M480-80q-82 0-155-31.5T197.5-197q-54.5-54-86-127T80-479q0-158 106.5-272T451-877v102q-115 11-192 95.5T182-479q0 124 87 210.5T480-182q72 0 136-32.5T725-306l88 51q-58 83-145.5 129T480-80Zm362-229-88-49q12-31 18-61.5t6-60.5q0-116-76.5-201T511-776v-102q157 11 263 124.5T880-484q0 45-9.5 88.5T842-309Z",Delete:"M201-120v-630h-41v-60h188v-30h264v30h188v60h-41v630H201Zm60-60h438v-570H261v570Zm106-86h60v-399h-60v399Zm166 0h60v-399h-60v399ZM261-750v570-570Z",Draft:"M160-80v-800h421l219 219v581H160Zm391-554v-186H220v680h520v-494H551ZM220-820v186-186 680-680Z",Eco:"M213-175q-43.59-45-68.3-104Q120-338 120-400q0-73 25.5-133.5T222-645q35-35 87-59t122.5-37.5Q502-755 591-758.5t198 3.5q8 108 5.5 197.5t-16 160.75q-13.5 71.25-38 124.56Q716-218.87 680-183q-51 51-110 77T444-80q-69 0-126.5-23.5T213-175Zm103 0q25 17 58 26t69.92 9Q497-140 547-162t91-64q27-27 46-70.5t31-103Q727-459 731-534t0-165q-94-2-168.5 2.5T431-680q-57 12-98 30.5T266-604q-42 43-64 91t-22 98q0 48 20.5 100.5T251-230q53-98 127-176t157-123q-87 75-141 162.5T316-175Zm0 0Zm0 0Z",Edit:"M180-180h44l472-471-44-44-472 471v44Zm-60 60v-128l617-616 128 128-617 616H120Zm659-617-41-41 41 41Zm-105 64-22-22 44 44-22-22Z",ExpandCircleDown:"m480-351 173-173-43-42-130 130-130-130-43 42 173 173Zm0 271q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-83 31.5-156t86-127Q252-817 325-848.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 82-31.5 155T763-197.5q-54 54.5-127 86T480-80Zm0-60q142 0 241-99.5T820-480q0-142-99-241t-241-99q-141 0-240.5 99T140-480q0 141 99.5 240.5T480-140Zm0-340Z",ExpandCircleUp:"m350-394 130-130 130 130 43-42-173-173-173 173 43 42ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-155.5t85.5-127q54-54.5 127-86T480-880q83 0 155.5 31.5t127 86q54.5 54.5 86 127T880-480q0 83-31.5 156t-86 127q-54.5 54-127 85.5T480-80Zm0-60q141 0 240.5-99T820-480q0-141-99.5-240.5T480-820q-142 0-241 99.5T140-480q0 142 99 241t241 99Zm0-340Z",Import:"M450-160v-371L330-411l-43-43 193-193 193 193-43 43-120-120v371h-60ZM160-597v-203h640v203h-60v-143H220v143h-60Z",Religion:"M40-120v-560q0-45.83 32.12-77.92 32.12-32.08 78-32.08T228-757.92q32 32.09 32 77.92v31l220-191 220 191v-31q0-45.83 32.12-77.92 32.12-32.08 78-32.08T888-757.92q32 32.09 32 77.92v560H530v-250H430v250H40Zm720-510h100v-49.82q0-21.18-14.32-35.68-14.33-14.5-35.5-14.5-21.18 0-35.68 14.37Q760-701.25 760-680v50Zm-660 0h100v-49.82q0-21.18-14.32-35.68-14.33-14.5-35.5-14.5-21.18 0-35.68 14.37Q100-701.25 100-680v50Zm0 450h100v-390H100v390Zm160 0h110v-250h220v250h110v-390L480-761 260-570v390Zm500 0h100v-390H760v390ZM479.94-505Q457-505 441-521.06q-16-16.06-16-39T441.06-599q16.06-16 39-16T519-598.94q16 16.06 16 39T518.94-521q-16.06 16-39 16Z",Reset:"M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z",Resources:"M120-40v-880h60v80h600v-80h60v880h-60v-80H180v80h-60Zm60-469h110v-160h220v160h270v-271H180v271Zm0 329h270v-160h220v160h110v-269H180v269Zm170-329h100v-100H350v100Zm160 329h100v-100H510v100ZM350-509h100-100Zm160 329h100-100Z",Save:"M840-683v563H120v-720h563l157 157Zm-60 27L656-780H180v600h600v-476ZM479.76-245q43.24 0 73.74-30.26 30.5-30.27 30.5-73.5 0-43.24-30.26-73.74-30.27-30.5-73.5-30.5-43.24 0-73.74 30.26-30.5 30.27-30.5 73.5 0 43.24 30.26 73.74 30.27 30.5 73.5 30.5ZM233-584h358v-143H233v143Zm-53-72v476-600 124Z",SaveAs:"M120-120v-720h563l157 157v117l-60 60v-150L656-780H180v600h280v60H120Zm60-660v600-600ZM520-40v-123l263-262 122 122L643-40H520Zm300-263-37-37 37 37ZM580-100h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19ZM233-584h358v-143H233v143Zm247 339q14 0 27-3t24-10l39-40q7-11 10.5-24t3.5-27q0-43.33-30.26-73.67Q523.47-453 480.24-453q-43.24 0-73.74 30.26-30.5 30.27-30.5 73.5 0 43.24 30.33 73.74Q436.67-245 480-245Z",Seasons:"M306-394q-17 0-28.5-11.5T266-434q0-17 11.5-28.5T306-474q17 0 28.5 11.5T346-434q0 17-11.5 28.5T306-394Zm177 0q-17 0-28.5-11.5T443-434q0-17 11.5-28.5T483-474q17 0 28.5 11.5T523-434q0 17-11.5 28.5T483-394Zm170 0q-17 0-28.5-11.5T613-434q0-17 11.5-28.5T653-474q17 0 28.5 11.5T693-434q0 17-11.5 28.5T653-394ZM120-80v-740h125v-60h65v60h340v-60h65v60h125v740H120Zm60-60h600v-430H180v430Zm0-490h600v-130H180v130Zm0 0v-130 130Z",Settings:"m388-80-20-126q-19-7-40-19t-37-25l-118 54-93-164 108-79q-2-9-2.5-20.5T185-480q0-9 .5-20.5T188-521L80-600l93-164 118 54q16-13 37-25t40-18l20-127h184l20 126q19 7 40.5 18.5T669-710l118-54 93 164-108 77q2 10 2.5 21.5t.5 21.5q0 10-.5 21t-2.5 21l108 78-93 164-118-54q-16 13-36.5 25.5T592-206L572-80H388Zm48-60h88l14-112q33-8 62.5-25t53.5-41l106 46 40-72-94-69q4-17 6.5-33.5T715-480q0-17-2-33.5t-7-33.5l94-69-40-72-106 46q-23-26-52-43.5T538-708l-14-112h-88l-14 112q-34 7-63.5 24T306-642l-106-46-40 72 94 69q-4 17-6.5 33.5T245-480q0 17 2.5 33.5T254-413l-94 69 40 72 106-46q24 24 53.5 41t62.5 25l14 112Zm44-210q54 0 92-38t38-92q0-54-38-92t-92-38q-54 0-92 38t-38 92q0 54 38 92t92 38Zm0-130Z",Space:"m187-551 106 45q18-36 38.5-71t43.5-67l-79-16-109 109Zm154 81 133 133q57-26 107-59t81-64q81-81 119-166t41-192q-107 3-192 41T464-658q-31 31-64 81t-59 107Zm229-96q-20-20-20-49.5t20-49.5q20-20 49.5-20t49.5 20q20 20 20 49.5T669-566q-20 20-49.5 20T570-566Zm-15 383 109-109-16-79q-32 23-67 43.5T510-289l45 106Zm326-694q9 136-34 248T705-418l-2 2-2 2 22 110q3 15-1.5 29T706-250L535-78l-85-198-170-170-198-85 172-171q11-11 25-15.5t29-1.5l110 22q1-1 2-1.5t2-1.5q99-99 211-142.5T881-877ZM149-325q35-35 85.5-35.5T320-326q35 35 34.5 85.5T319-155q-26 26-80.5 43T75-80q15-109 31.5-164t42.5-81Zm42 43q-14 15-25 47t-19 82q50-8 82-19t47-25q19-17 19.5-42.5T278-284q-19-18-44.5-17.5T191-282Z",State:"M820-240v-480h60v480h-60Zm-340 1-43-42 169-169H80v-60h526L438-679l42-42 241 241-241 241Z",Summary:"M279-621h60v-60h-60v60Zm0 171h60v-60h-60v60Zm0 171h60v-60h-60v60ZM120-120v-720h522l198 198v522H120Zm60-60h600v-429H609v-171H180v600Zm0-600v171.43V-780v600-600Z",Sync:"M167-160v-60h130l-15-12q-64-51-93-111t-29-134q0-106 62.5-190.5T387-784v62q-75 29-121 96.5T220-477q0 63 23.5 109.5T307-287l30 21v-124h60v230H167Zm407-15v-63q76-29 121-96.5T740-483q0-48-23.5-97.5T655-668l-29-26v124h-60v-230h230v60H665l15 14q60 56 90 120t30 123q0 106-62 191T574-175Z",Time:"m627-287 45-45-159-160v-201h-60v225l174 181ZM480-80q-82 0-155-31.5t-127.5-86Q143-252 111.5-325T80-480q0-82 31.5-155t86-127.5Q252-817 325-848.5T480-880q82 0 155 31.5t127.5 86Q817-708 848.5-635T880-480q0 82-31.5 155t-86 127.5Q708-143 635-111.5T480-80Zm0-400Zm0 340q140 0 240-100t100-240q0-140-100-240T480-820q-140 0-240 100T140-480q0 140 100 240t240 100Z",Trigger:"m393-165 279-335H492l36-286-253 366h154l-36 255Zm-73 85 40-280H160l360-520h80l-40 320h240L400-80h-80Zm154-396Z",Workshop:"M768-120 517-371l57-57 251 251-57 57Zm-581 0-57-57 290-290-107-107-23 23-44-44v85l-24 24-122-122 24-24h86l-48-48 131-131q17-17 37-23t44-6q24 0 44 8.5t37 25.5L348-699l48 48-24 24 104 104 122-122q-8-13-12.5-30t-4.5-36q0-53 38.5-91.5T711-841q15 0 25.5 3t17.5 8l-85 85 75 75 85-85q5 8 8.5 19.5T841-709q0 53-38.5 91.5T711-579q-18 0-31-2.5t-24-7.5L187-120Z"},gt=class gt{constructor(s,e){u(this,"componentId");u(this,"host");u(this,"parent");u(this,"options");u(this,"_element");u(this,"children",new Set);u(this,"_needsRefresh");this.componentId=gt.nextComponentId++,this.host=s.host,this.options=e,this.parent=s instanceof gt?s:null,this._needsRefresh=!1}set element(s){this._element=s,this._element[0].id=`KS${Object.getPrototypeOf(this).constructor.name}#${this.componentId}`}get element(){return p(this._element)}requestRefresh(s=!1,e=0,t=!1){var i,n,a;if(t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh()")),(n=(i=this.options)==null?void 0:i.onRefreshRequest)==null||n.call(this),this.parent!==this&&!s&&((a=this.parent)==null||a.requestRefresh(!1,e-1,t)),this._needsRefresh&&t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh() <already pending>")),this._needsRefresh=!0,s){t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh()",`+ ${this.children.size} children`));for(const r of this.children)r.requestRefresh(!0,e+1,t)}else t&&console.debug(...v(e<0?"⤒".repeat(e*-1):" ".repeat(e),this.toString(),"requestRefresh()","<queued>"))}refresh(s=!1,e=0){var t,i;if(!s&&!this._needsRefresh){e===0&&console.debug(...v(this.toString(),"refresh() received and ignored."));return}(i=(t=this.options)==null?void 0:t.onRefresh)==null||i.call(this);for(const n of this.children)n.refresh(s,e+1);this._needsRefresh=!1}addChild(s){return s.parent=this,this.children.add(s),this.element.append(s.element),this}addChildren(s){for(const e of s??[])this.addChild(e);return this}removeChild(s){this.children.has(s)&&(s.element.remove(),this.children.delete(s))}removeChildren(s){for(const e of s)this.removeChild(e)}};u(gt,"nextComponentId",0);let W=gt;class R extends W{constructor(s,e){super(s,{...e}),this.element=$("<div/>");for(const t of(e==null?void 0:e.classes)??[])this.element.addClass(t)}toString(){return`[${R.name}#${this.componentId}]`}}const M={label:"_label_1nlev_1",splitter:"_splitter_1nlev_16",iconLabel:"_iconLabel_1nlev_20",fillSpace:"_fillSpace_1nlev_26"},ke={delimiter:"_delimiter_16hnh_1"};class ue extends W{constructor(s,e){super(s,{...e}),this.element=$("<li/>");for(const t of(e==null?void 0:e.classes)??[])this.element.addClass(t);(e==null?void 0:e.delimiter)===!0&&this.element.addClass(ke.delimiter)}toString(){return`[${ue.name}#${this.componentId}]`}}const Et={head:"_head_wr1pj_1"};class de extends ue{constructor(e,t,i){super(e,i);u(this,"head");u(this,"elementLabel");if(this.head=new R(e),this.head.element.addClass(Et.head),this.addChild(this.head),this.elementLabel=$("<label/>",{text:`${(i==null?void 0:i.upgradeIndicator)===!0?"⮤ ":""}${t}`}).addClass(M.label).addClass(Et.label),this.head.element.append(this.elementLabel),i!=null&&i.icon){const n=$("<div/>",{html:`<svg style="width: 15px; height: 15px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${i.icon}"/></svg>`}).addClass(M.iconLabel);this.elementLabel.prepend(n)}}toString(){return`[${de.name}#${this.componentId}]: '${this.elementLabel.text()}'`}addChildHead(e){return this.head.addChild(e),this}addChildrenHead(e){for(const t of e??[])this.head.addChild(t);return this}}const O={setting:"_setting_1ndg5_1",checkbox:"_checkbox_1ndg5_6",panelContent:"_panelContent_1ndg5_10",hidden:"_hidden_1ndg5_17",checked:"_checked_1ndg5_22",expanded:"_expanded_1ndg5_26",readonly:"_readonly_1ndg5_34"};class S extends de{constructor(e,t,i,n){super(e,i,{...n,onRefresh:()=>{var o;this.setting.enabled?this.element.addClass(O.checked):this.element.removeClass(O.checked),this.readOnly?this.element.addClass(O.readonly):this.element.removeClass(O.readonly),m(this.checkbox)||(this.checkbox.prop("checked",this.setting.enabled),this.checkbox.prop("disabled",this.readOnly)),(o=n==null?void 0:n.onRefresh)==null||o.call(n)}});u(this,"setting");u(this,"checkbox");u(this,"readOnly");this.element.addClass(O.setting);const a=`ks-setting${this.componentId}`,r=$("<input/>",{id:a,type:"checkbox"}).addClass(O.checkbox);this.readOnly=(n==null?void 0:n.readOnly)??!1,r.prop("disabled",this.readOnly),r.on("change",o=>{r.is(":checked")&&!t.enabled?this.check().catch(se(console)):!r.is(":checked")&&t.enabled&&this.uncheck().catch(se(console))}),this.elementLabel.before(r),this.elementLabel.prop("for",a),this.checkbox=r,this.setting=t}toString(){return`[${S.name}#${this.componentId}]: '${this.elementLabel.text()}'`}async check(e=!1){var t,i;this.setting.enabled=!0,await((i=(t=this.options)==null?void 0:t.onCheck)==null?void 0:i.call(e)),this.requestRefresh()}async uncheck(e=!1){var t;this.setting.enabled=!1,await((t=this.options.onUnCheck)==null?void 0:t.call(e)),this.requestRefresh()}}const C={iconButton:"_iconButton_q7zpt_17",inactive:"_inactive_q7zpt_29",ineffective:"_ineffective_q7zpt_37",button:"_button_q7zpt_43",readonly:"_readonly_q7zpt_67",buttonIcon:"_buttonIcon_q7zpt_72",alignRight:"_alignRight_q7zpt_77",large:"_large_q7zpt_81",bordered:"_bordered_q7zpt_85",headAction:"_headAction_q7zpt_97",lastHeadAction:"_lastHeadAction_q7zpt_100",consumeButton:"_consumeButton_q7zpt_104",stockButton:"_stockButton_q7zpt_107"};class ie extends W{constructor(e,t,i,n){super(e,{...n,onRefresh:()=>{var a;this.readOnly?this.element.addClass(C.readonly):this.element.removeClass(C.readonly),this.inactive?this.element.addClass(C.inactive):this.element.removeClass(C.inactive),(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"readOnly");u(this,"inactive");this.element=$("<div/>",{html:`<svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${t}"/></svg>`,title:i}).addClass(C.iconButton),this.readOnly=(n==null?void 0:n.readOnly)??!1,this.inactive=(n==null?void 0:n.inactive)??!1,this.element.on("click",()=>{this.readOnly||this.click().catch(se(console))})}toString(){return`[${ie.name}#${this.componentId}]`}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}const Rt={listContainer:"_listContainer_1kxbq_1",itemsList:"_itemsList_1kxbq_5",list:"_list_1kxbq_1",listTools:"_listTools_1kxbq_9"};class x extends W{constructor(e,t){super(e,{...t});u(this,"list");u(this,"disableAllButton");u(this,"enableAllButton");u(this,"resetButton");const i={hasDisableAll:!0,hasEnableAll:!0,...t},n=i.hasDisableAll||i.hasEnableAll||!m(i.onReset);if(this.element=$("<div/>").addClass(Rt.listContainer),this.list=$("<ul/>").addClass(Rt.list).addClass(Rt.itemsList),this.element.append(this.list),n){const a=new R(this,{classes:[Rt.listTools]});i.hasEnableAll&&(this.enableAllButton=new ie(e,B.CheckboxCheck,e.host.engine.i18n("ui.enable.all"),{onClick:async()=>{var l;const o=new Event("enableAll",{cancelable:!0});if(this.element[0].dispatchEvent(o),!o.defaultPrevented){for(const h of this.children)N(h,S)&&await h.check(!0);(l=t==null?void 0:t.onEnableAll)==null||l.call(this)}}}),a.addChild(this.enableAllButton)),i.hasDisableAll&&(this.disableAllButton=new ie(e,B.CheckboxUnCheck,e.host.engine.i18n("ui.disable.all"),{onClick:async()=>{var l;const o=new Event("disableAll",{cancelable:!0});if(this.element[0].dispatchEvent(o),!o.defaultPrevented){for(const h of this.children)N(h,S)&&await h.uncheck(!0);(l=t==null?void 0:t.onDisableAll)==null||l.call(this)}}}),a.addChild(this.disableAllButton));const r=i.onReset;m(r)||(this.resetButton=new ie(e,B.Reset,e.host.engine.i18n("ui.reset"),{onClick:()=>{r()}}),a.addChild(this.resetButton)),super.addChild(a)}}toString(){return`[${x.name}#${this.componentId}]`}addChild(e){return e.parent=this,this.children.add(e),this.list.append(e.element),this}}const Ae={expandoButton:"_expandoButton_l1ukp_1",expanded:"_expanded_l1ukp_1",up:"_up_l1ukp_1",down:"_down_l1ukp_4"};class Mt extends W{constructor(e,t){super(e,{...t,onRefresh:()=>{var i;this.ineffective?this.element.addClass(C.ineffective):this.element.removeClass(C.ineffective),(i=t==null?void 0:t.onRefresh)==null||i.call(t)}});u(this,"readOnly");u(this,"inactive");u(this,"ineffective");this.element=$("<div/>",{html:`
18
+ <svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor" class="${Ae.down}"><path d="${B.ExpandCircleDown}"/></svg>
19
+ <svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor" class="${Ae.up}"><path d="${B.ExpandCircleUp}"/></svg>
20
+ `,title:e.host.engine.i18n("ui.itemsShow")}).addClass(C.iconButton).addClass(Ae.expandoButton),this.element.on("click",()=>{this.readOnly||this.click().catch(se(console))}),this.readOnly=(t==null?void 0:t.readOnly)??!1,this.inactive=(t==null?void 0:t.inactive)??!1,this.ineffective=!1}toString(){return`[${Mt.name}#${this.componentId}]`}setCollapsed(){this.element.removeClass(Ae.expanded),this.element.prop("title",this.host.engine.i18n("ui.itemsShow"))}setExpanded(){this.element.addClass(Ae.expanded),this.element.prop("title",this.host.engine.i18n("ui.itemsHide"))}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}class _e extends W{constructor(e,t,i){super(e,i);u(this,"container");u(this,"expando");u(this,"head");u(this,"_mainChildVisible");this.head=t,this.container=new R(this),this.container.element.addClass(O.panelContent);const n=new Mt(e,{onClick:()=>this.toggle()});t.head.addChild(n),t.element.append(this.container.element),i!=null&&i.initiallyExpanded?(this.container.element.removeClass(O.hidden),n.setExpanded()):this.container.element.addClass(O.hidden),this._mainChildVisible=(i==null?void 0:i.initiallyExpanded)??!1,this.element=t.element,this.expando=n,this.addChildren([this.head,this.container])}get isExpanded(){return this._mainChildVisible}toString(){return`[${_e.name}#${this.componentId}]`}addChildHead(e){return this.head.addChild(e),this}addChildrenHead(e){for(const t of e??[])this.head.addChild(t);return this}addChildContent(e){return this.container.addChild(e),this}addChildrenContent(e){for(const t of e??[])this.container.addChild(t);return this}toggle(e=void 0,t=!1){const i=e!==void 0?e:!this._mainChildVisible;if(i!==this._mainChildVisible&&(this._mainChildVisible=i,this._mainChildVisible?(this.container.requestRefresh(!0),this.container.element.removeClass(O.hidden),this.expando.setExpanded(),this.head.element.addClass(O.expanded),this.element[0].dispatchEvent(new CustomEvent("panelShown"))):(this.container.element.addClass(O.hidden),this.expando.setCollapsed(),this.head.element.removeClass(O.expanded),this.element[0].dispatchEvent(new CustomEvent("panelHidden")))),t){const n=a=>{for(const r of a)N(r,_e)?r.toggle(e,t):n(r.children)};n(this.children)}}}class U extends _e{constructor(e,t,i,n){super(e,i,n);u(this,"setting");u(this,"settingItem");this.element=i.element,this.settingItem=i,this.setting=t}get isExpanded(){return this._mainChildVisible}get elementLabel(){return this.head.element}get readOnly(){return!0}set readOnly(e){}async check(){this.setting.enabled=!0,this.requestRefresh()}async uncheck(){this.setting.enabled=!1,this.requestRefresh()}toString(){return`[${U.name}#${this.componentId}]: '${this.settingItem.elementLabel.text()}'`}}class sa extends U{constructor(s,e,t,i){const n=s.host.engine.i18n("ui.upgrade.buildings");super(s,e,new S(s,e,n,{onCheck:o=>{s.host.engine.imessage("status.auto.enable",[n])},onUnCheck:o=>{s.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new R(s,{classes:[M.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.buildings).some(o=>o.enabled)}});const a=[];for(const o of Object.values(this.setting.buildings)){const l=this.host.engine.i18n(`$buildings.${o.upgrade}.label`),h=new S(this,o,l,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l])}});a.push({button:h,label:l})}a.sort((o,l)=>o.label.localeCompare(l.label));const r=new x(this);for(const o of a)r.addChild(o.button);this.addChildContent(r)}}class J extends W{constructor(e,t,i=null,n){super(e,{...n,onRefresh:()=>{var a;this.readOnly?this.element.addClass(C.readonly):this.element.removeClass(C.readonly),this.inactive?this.element.addClass(C.inactive):this.element.removeClass(C.inactive),this.ineffective?this.element.addClass(C.ineffective):this.element.removeClass(C.ineffective),(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"_iconElement");u(this,"readOnly");u(this,"inactive");u(this,"ineffective");this.element=$("<div/>",{title:n==null?void 0:n.title}).addClass(C.button).text(t),(n==null?void 0:n.border)!==!1&&this.element.addClass(C.bordered),(n==null?void 0:n.alignment)==="right"&&this.element.addClass(C.alignRight),i!==null&&(this._iconElement=$(`<svg class="${C.buttonIcon}" style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${i}"/></svg>`),(n==null?void 0:n.alignment)==="right"?this.element.append(this._iconElement):this.element.prepend(this._iconElement));for(const a of(n==null?void 0:n.classes)??[])this.element.addClass(a);this.element.on("click",()=>{this.readOnly||this.click().catch(se(console))}),this.readOnly=(n==null?void 0:n.readOnly)??!1,this.inactive=(n==null?void 0:n.inactive)??!1,this.ineffective=!1}toString(){return`[${J.name}#${this.componentId}]`}updateLabel(e){this.element.text(e),this._iconElement!==void 0&&(this.options.alignment==="right"?this.element.append(this._iconElement):this.element.prepend(this._iconElement))}updateTitle(e){this.element.prop("title",e)}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}class te extends W{constructor(s){super(s,{}),this.element=$("<div/>").addClass(ke.delimiter)}toString(){return`[${te.name}#${this.componentId}]`}}const ys={dialog:"_dialog_1276o_1",close:"_close_1276o_7"},ws={explainer:"_explainer_1idu3_1"},na={header:"_header_19ql8_1"};class D extends W{get elementLabel(){return this.element}constructor(s,e,t){super(s,{...t}),this.element=$("<li/>",{text:e}).addClass(na.header)}toString(){return`[${D.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class ti extends W{constructor(s,e){super(s,{...e}),this.element=$('<input type="text"/>').addClass("ks-input");for(const t of(e==null?void 0:e.classes)??[])this.element.addClass(t);e!=null&&e.onChange&&this.element.on("change",()=>{var t;return(t=e.onChange)==null?void 0:t.call(e,this.element[0].value)}),e!=null&&e.value&&(this.element[0].value=e.value),e!=null&&e.selected&&(this.element[0].selectionStart=0,this.element[0].selectionEnd=-1),this.element.on("keyup",t=>{var i,n;switch(t.key){case"Enter":(i=e==null?void 0:e.onEnter)==null||i.call(e,this.element[0].value);break;case"Escape":(n=e==null?void 0:e.onEscape)==null||n.call(e,this.element[0].value);break}})}toString(){return`[${ti.name}#${this.componentId}]`}}class Bt extends W{constructor(s,e,t){super(s,{...t}),this.element=$("<p/>").text(e);for(const i of(t==null?void 0:t.classes)??[])this.element.addClass(i)}toString(){return`[${Bt.name}#${this.componentId}]`}}const ks={toolbar:"_toolbar_1654f_1"};class E extends W{constructor(e,t){super(e,{...t});u(this,"container");u(this,"head");u(this,"returnValue");this.element=$("<dialog/>").addClass("dialog").addClass("help").addClass(ys.dialog),(t==null?void 0:t.hasClose)!==!1&&this.addChild(new J(e,"close",null,{classes:[ys.close],onClick:()=>{var i;this.close(),(i=t==null?void 0:t.onCancel)==null||i.call(t)}})),this.returnValue=(t==null?void 0:t.promptValue)??"",this.head=new R(e),this.container=new R(e),this.addChildren(ft([this.head,t!=null&&t.prompt?new ti(e,{onChange:i=>{this.returnValue=i},onEnter:i=>{var n;this.returnValue=i,this.close(),(n=t.onConfirm)==null||n.call(t,this.returnValue)},onEscape:i=>{var n;this.close(),(n=t.onCancel)==null||n.call(t)},selected:!0,value:t.promptValue}):void 0,this.container,new te(e),new R(e,{classes:[ks.toolbar]}).addChildren(ft([new J(e,"OK",null,{classes:[C.large],onClick:()=>{var i;this.close(),(i=t==null?void 0:t.onConfirm)==null||i.call(t,this.returnValue)}}),t!=null&&t.hasCancel?new J(e,"Cancel",null,{classes:[C.large],onClick:()=>{var i;this.close(),(i=t.onCancel)==null||i.call(t)}}):void 0]))]))}toString(){return`[${E.name}#${this.componentId}]`}addChildHead(e){return this.head.addChild(e),this}addChildrenHead(e){for(const t of e??[])this.head.addChild(t);return this}addChildContent(e){return this.container.addChild(e),this}addChildrenContent(e){for(const t of e??[])this.container.addChild(t);return this}show(){$("#gamePageContainer").append(this.element),this.element[0].show()}showModal(){$("#gamePageContainer").append(this.element),this.element[0].showModal()}close(){this.element[0].close(),this.element.remove()}static async prompt(e,t,i,n,a){return new Promise(r=>{new E(e,{hasCancel:!0,hasClose:!1,onCancel:()=>{r(void 0)},onConfirm:o=>{r(o)},prompt:!0,promptValue:n}).addChildrenHead(ft([i?new D(e,i):void 0,new Bt(e,t)])).addChildrenContent(a?[new R(e,{classes:[ws.explainer]}).addChildren([new Bt(e,a)])]:[]).showModal()})}}const aa={maxButton:"_maxButton_133h2_1"};class Pe extends J{constructor(e,t,i){super(e,"",null,{...i,classes:[aa.maxButton,...(i==null?void 0:i.classes)??[]]});u(this,"setting");this.setting=t}toString(){return`[${Pe.name}#${this.componentId}]`}}class Ee extends J{constructor(e,t,i,n){super(e,"",B.Trigger,{...n,onRefresh:()=>{var r,o;const a=this.behavior==="integer"?this.host.renderAbsolute(this.setting.trigger,"invariant"):this.host.renderPercentage(this.setting.trigger,"invariant",!0);this.updateTitle(this.host.engine.i18n("ui.trigger",[a])),(((r=this.options)==null?void 0:r.renderLabel)??!0)&&this.updateLabel(a),this.inactive?this.element.addClass(C.inactive):this.element.removeClass(C.inactive),(o=n==null?void 0:n.onRefresh)==null||o.call(this)}});u(this,"behavior");u(this,"setting");this.behavior=t instanceof K?"percentage":"integer",this.setting=t}toString(){return`[${Ee.name}#${this.componentId}]`}}class At extends S{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"maxButton");u(this,"triggerButton");this.maxButton=new Pe(e,t,{alignment:"right",border:!1,classes:[C.headAction],onClick:async()=>{await a.onSetMax.call(this)},onRefresh:a!=null&&a.onRefreshMax?()=>{var r;return(r=a.onRefreshMax)==null?void 0:r.call(this)}:void 0}),this.triggerButton=new Ee(e,t,i,{border:!1,classes:[C.lastHeadAction],onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildrenHead([new R(e,{classes:[M.fillSpace]}),this.maxButton,this.triggerButton])}toString(){return`[${At.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}const le={getBuildOption:(c,s,e,t,i,n,a)=>{const r=async()=>{const l=await E.prompt(c,c.host.engine.i18n("ui.max.prompt.absolute"),c.host.engine.i18n("ui.max.build.prompt",[i,c.host.renderAbsolute(s.max,e.selected)]),c.host.renderAbsolute(s.max),c.host.engine.i18n("ui.max.build.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){s.max=-1;return}l==="0"&&(s.enabled=!1),s.max=c.host.parseAbsolute(l)??s.max}},o=new At(c,s,e,i,{delimiter:a==null?void 0:a.delimiter,onCheck:async l=>{var h;c.host.engine.imessage("status.sub.enable",[i]),s.max===0&&!l&&await r(),await((h=a==null?void 0:a.onCheck)==null?void 0:h.call(a,l))},onRefreshMax:()=>{o.maxButton.updateLabel(c.host.renderAbsolute(s.max)),o.maxButton.element[0].title=s.max<0?c.host.engine.i18n("ui.max.build.titleInfinite",[i]):s.max===0?c.host.engine.i18n("ui.max.build.titleZero",[i]):c.host.engine.i18n("ui.max.build.title",[c.host.renderAbsolute(s.max),i])},onRefreshRequest:()=>{o.maxButton.inactive=!s.enabled||s.max===-1,o.maxButton.ineffective=t.enabled&&s.enabled&&s.max===0,o.triggerButton.inactive=!s.enabled||s.trigger===-1,o.triggerButton.ineffective=t.enabled&&s.enabled&&t.trigger===-1&&s.trigger===-1},onRefreshTrigger:()=>{o.triggerButton.element[0].title=c.host.engine.i18n("ui.trigger",[s.trigger<0?t.trigger<0?c.host.engine.i18n("ui.trigger.build.blocked",[n]):`${c.host.renderPercentage(t.trigger,e.selected,!0)} (${c.host.engine.i18n("ui.trigger.build.inherited")})`:c.host.renderPercentage(s.trigger,e.selected,!0)])},onSetMax:r,onSetTrigger:async()=>{var h;const l=await E.prompt(c,c.host.engine.i18n("ui.trigger.prompt.percentage"),c.host.engine.i18n("ui.trigger.build.prompt",[i,s.trigger!==-1?c.host.renderPercentage(s.trigger,e.selected,!0):c.host.engine.i18n("ui.trigger.build.inherited")]),s.trigger!==-1?c.host.renderPercentage(s.trigger):"",c.host.engine.i18n("ui.trigger.build.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){s.trigger=-1;return}s.trigger=c.host.parsePercentage(l),await((h=a==null?void 0:a.onSetTrigger)==null?void 0:h.call(void 0))}},onUnCheck:l=>{var h;c.host.engine.imessage("status.sub.disable",[i]),(h=a==null?void 0:a.onUnCheck)==null||h.call(a,l)},renderLabelTrigger:a==null?void 0:a.renderLabelTrigger,upgradeIndicator:a==null?void 0:a.upgradeIndicator});return o}};class F extends S{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"triggerButton");this.triggerButton=new Ee(e,t,i,{alignment:"right",border:!1,onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildrenHead([new R(e,{classes:[M.fillSpace]}),this.triggerButton])}toString(){return`[${F.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class ii extends U{constructor(s,e,t){console.debug(...v(`Constructing ${ii.name}`));const i=s.host.engine.i18n("ui.build");super(s,e,new F(s,e,t,i,{onCheck:n=>{s.host.engine.imessage("status.auto.enable",[i])},onRefreshTrigger:()=>{this.settingItem.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger.section",[e.trigger<0?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const n=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[i,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(n!==void 0){if(n===""||n.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(n)}},onUnCheck:n=>{s.host.engine.imessage("status.auto.disable",[i])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger<0,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger<0&&Object.values(e.buildings).some(n=>n.enabled&&0<n.max&&n.trigger<0),this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&(n.max===0||n.trigger<0&&e.trigger<0))}}),this.addChildrenContent([new x(this,{onReset:()=>{this.setting.load({buildings:new Xt().buildings})}}).addChildren(ft(this.host.game.bld.buildingGroups.flatMap(n=>[new D(this,n.title),...n.buildings.flatMap(a=>this._getBuildOptions(this,e,t,i,a)),n!==this.host.game.bld.buildingGroups[this.host.game.bld.buildingGroups.length-1]?new te(this):void 0]))),new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new D(this,this.host.engine.i18n("ui.additional")),new S(this,e.gatherCatnip,this.host.engine.i18n("option.catnip"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.catnip")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.catnip")])}}),new S(this,e.turnOnSteamworks,this.host.engine.i18n("option.steamworks"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.steamworks")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.steamworks")])}}),new S(this,e.turnOnMagnetos,this.host.engine.i18n("option.magnetos"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.magnetos")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.magnetos")])}}),new S(this,e.turnOnReactors,this.host.engine.i18n("option.reactors"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.reactors")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.reactors")])}}),new sa(this,e.upgradeBuildings,t,e)])])}_getBuildOptions(s,e,t,i,n){var r;if(n==="unicornPasture"||m(e.buildings[n]))return[];const a=s.host.game.bld.getBuildingExt(n).meta;if(!m(a.stages)){const o=(r=Object.values(e.buildings).find(l=>l.baseBuilding===n))==null?void 0:r.building;return[le.getBuildOption(s,e.buildings[n],t,e,a.stages[0].label,i,{renderLabelTrigger:!1}),le.getBuildOption(s,e.buildings[o],t,e,a.stages[1].label,i,{renderLabelTrigger:!1,upgradeIndicator:!0})]}return m(a.label)?[]:[le.getBuildOption(s,e.buildings[n],t,e,a.label,i,{renderLabelTrigger:!1})]}}class ra extends S{constructor(e,t){const i=X(e.host.engine.i18n("ui.engine"));super(e,t,i,{onCheck:()=>{e.host.engine.start(!0)},onUnCheck:()=>{e.host.engine.stop(!0)}});u(this,"expando");this.expando=new Mt(this),this.addChildrenHead([new R(e,{classes:[M.fillSpace]}),this.expando])}}class si extends ue{constructor(e,t,i){super(e,{...i});u(this,"button");this.button=t,this.element.addClass(Et.head),this.element.append(t.element)}}const oa={fieldset:"_fieldset_tfwil_1"};class ni extends W{constructor(s,e,t){super(s,{...t}),this.element=$("<fieldset/>").addClass(oa.fieldset),t!=null&&t.delimiter&&this.element.addClass(ke.delimiter);const i=$("<legend/>").text(e).addClass(M.label);this.element.append(i)}toString(){return`[${ni.name}#${this.componentId}]`}}class ai extends W{constructor(e,t,i,n,a){super(e,{...a,onRefresh:()=>{this.input.prop("disabled",this.readOnly)}});u(this,"setting");u(this,"option");u(this,"elementLabel");u(this,"input");u(this,"readOnly");this.element=$("<div/>"),this.element.addClass(O.setting),(a==null?void 0:a.delimiter)===!0&&this.element.addClass(ke.delimiter),this.elementLabel=$("<label/>",{text:`${a!=null&&a.upgradeIndicator?"⮤ ":""}${i.label}`}).addClass(M.label);const r=$("<input/>",{name:n,type:"radio"}).addClass("ks-radio");this.readOnly=(a==null?void 0:a.readOnly)??!1,r.on("change",()=>{this.setting.selected=i.value,m(a==null?void 0:a.onCheck)||a.onCheck()}),this.elementLabel.prepend(r),this.element.append(this.elementLabel),this.input=r,this.setting=t,this.option=i}toString(){return`[${ai.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Ie extends W{constructor(e,t,i,n){super(e,{...n,onRefresh:()=>{var a;for(const r of this._items)if(r.option.value===this.setting.selected){r.input.prop("checked",!0);break}(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"fieldset");u(this,"setting");u(this,"_items");this.element=$("<li/>"),this.fieldset=new ni(e,t),this.addChild(this.fieldset),this._items=new Array;for(const a of i.options)this._items.push(new ai(e,i,a,t,{onCheck:n==null?void 0:n.onCheck,readOnly:n==null?void 0:n.readOnly}));this.fieldset.addChildren(this._items),this.setting=i}toString(){return`[${Ie.name}#${this.componentId}]`}}const la={textButton:"_textButton_1mv97_1"};class Ce extends W{constructor(e,t,i){super(e,{...i,onRefresh:()=>{var a;this.readOnly?this.element.addClass(C.readonly):this.element.removeClass(C.readonly),(a=i==null?void 0:i.onRefresh)==null||a.call(this)}});u(this,"readOnly");this.element=$("<div/>").addClass(la.textButton),t!==void 0&&this.element.text(t);const n=i==null?void 0:i.title;m(n)||this.element.prop("title",n),this.readOnly=!1,this.element.on("click",()=>{this.readOnly||this.click().catch(se(console))})}toString(){return`[${Ce.name}#${this.componentId}]`}async click(){var e,t;this.readOnly||(await((t=(e=this.options)==null?void 0:e.onClick)==null?void 0:t.call(this)),this.requestRefresh())}}class ri extends U{constructor(s,e,t){console.debug(...v(`Constructing ${ri.name}`)),super(s,e,new de(s,s.host.engine.i18n("ui.internals"),{classes:[O.checked,O.setting],icon:B.Settings}).addChildrenHead([new R(s,{classes:[M.fillSpace]})])),this.addChildrenContent([new x(s,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new si(s,new Ce(s,s.host.engine.i18n("ui.internals.interval",[e.interval]),{onClick:async()=>{const i=await E.prompt(s,s.host.engine.i18n("ui.internals.interval.prompt"),s.host.engine.i18n("ui.internals.interval.promptTitle",[s.host.renderAbsolute(e.interval,t.selected)]),s.host.renderAbsolute(e.interval),s.host.engine.i18n("ui.internals.interval.promptExplainer"));i===void 0||i===""||i.startsWith("-")||(i==="0"&&(e.enabled=!1),e.interval=s.host.parseAbsolute(i)??e.interval)},onRefresh(){this.element.text(s.host.engine.i18n("ui.internals.interval",[e.interval]))}})),new te(s),new S(s,e.ksColumn,s.host.engine.i18n("ui.ksColumn"),{onCheck:()=>{s.host.rebuildUi()},onUnCheck:()=>{s.host.rebuildUi()}}),new te(s),new Ie(s,s.host.engine.i18n("ui.language"),e.locale,{onCheck:()=>{s.host.rebuildUi()}}),new te(s),new de(s,`Kitten Scientists ${Oe("v")}`)])])}}class oi extends W{constructor(s,e,t){super(s,{...t}),this.element=$("<li/>",{text:s.host.engine.i18n(e)}).addClass(ws.explainer)}toString(){return`[${oi.name}#${this.componentId}]`}}class li extends U{constructor(s,e){console.debug(...v(`Constructing ${li.name}`));const t=s.host.engine.i18n("ui.filter");super(s,e,new S(s,e,t,{onCheck:n=>{s.host.engine.imessage("status.auto.enable",[t])},onUnCheck:n=>{s.host.engine.imessage("status.auto.disable",[t])}}).addChildrenHead([new R(s,{classes:[M.fillSpace]})])),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new S(this,e.disableKGLog,this.host.engine.i18n("filter.allKG"))]));const i=new x(this).addChildren(os.map(n=>({label:this.host.engine.i18n(`filter.${n}`),name:n})).sort((n,a)=>n.label.localeCompare(a.label)).map(n=>new S(this,this.setting.filters[n.name],n.label,{onCheck:()=>{this.host.engine.imessage("filter.enable",[n.label])},onUnCheck:()=>{this.host.engine.imessage("filter.disable",[n.label])}})));this.addChildContent(i),this.addChildContent(new oi(this,"filter.explainer"))}}const Pt={active:"_active_6c09s_16"};class ci extends U{constructor(e,t,i){console.debug(...v(`Constructing ${ci.name}`));const n=e.host.engine.i18n("ui.faith");super(e,t,new F(e,t,i,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(r)}},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefresh:()=>{for(const[r,o]of this._unicornBuildings.entries())o.elementLabel.attr("data-ks-active-from","❊"),o.elementLabel.attr("data-ks-active-to","✮"),this.setting.bestUnicornBuilding.enabled&&this.setting.bestUnicornBuildingCurrent===r?o.elementLabel.addClass(Pt.active):o.elementLabel.removeClass(Pt.active)},onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.buildings).some(r=>r.enabled&&0<r.max&&r.trigger<0),this.expando.ineffective=t.enabled&&Object.values(t.buildings).some(r=>r.enabled&&(r.max===0||r.trigger<0&&t.trigger<0));for(const[r,o]of this._unicornBuildings.entries())o.readOnly=this._bestUnicornBuilding.setting.enabled,o.maxButton.readOnly=this._bestUnicornBuilding.setting.enabled,o.triggerButton.readOnly=this._bestUnicornBuilding.setting.enabled}});u(this,"_unicornBuildings");u(this,"_bestUnicornBuilding");const a=[...kt];this._unicornBuildings=new Map([["unicornPasture",le.getBuildOption(this,this.setting.buildings.unicornPasture,i,this.setting,this.host.engine.i18n("$buildings.unicornPasture.label"),n,{renderLabelTrigger:!1})],...this.host.game.religion.zigguratUpgrades.filter(r=>a.includes(r.name)&&!m(this.setting.buildings[r.name])).map(r=>[r.name,le.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{renderLabelTrigger:!1})])]),this._bestUnicornBuilding=new S(this,this.setting.bestUnicornBuilding,this.host.engine.i18n("option.faith.best.unicorn"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.faith.best.unicorn")]);for(const r of this._unicornBuildings.values())r.setting.enabled=!0,r.setting.max=-1,r.setting.trigger=-1},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.faith.best.unicorn")])},upgradeIndicator:!0}),this.addChildrenContent([new x(this,{onReset:()=>{const r=new Yt;this.setting.load({bestUnicornBuilding:r.bestUnicornBuilding,buildings:r.buildings})}}).addChildren([new D(this,this.host.engine.i18n("$religion.panel.ziggurat.label")),...this._unicornBuildings.values(),this._bestUnicornBuilding,new te(this),...this.host.game.religion.zigguratUpgrades.filter(r=>!a.includes(r.name)&&!m(this.setting.buildings[r.name])).map(r=>le.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{renderLabelTrigger:!1})),new te(this),new D(this,this.host.engine.i18n("$religion.panel.orderOfTheSun.label")),...this.host.game.religion.religionUpgrades.filter(r=>!m(this.setting.buildings[r.name])).map(r=>{var o;return le.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{delimiter:r.name===((o=this.host.game.religion.religionUpgrades.at(-1))==null?void 0:o.name),renderLabelTrigger:!1})}),new D(this,this.host.engine.i18n("$religion.panel.cryptotheology.label")),...this.host.game.religion.transcendenceUpgrades.filter(r=>!m(this.setting.buildings[r.name])).map(r=>le.getBuildOption(this,this.setting.buildings[r.name],i,this.setting,r.label,n,{renderLabelTrigger:!1}))]),new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new D(this,this.host.engine.i18n("ui.additional")),...Js.map(r=>{const o=this.host.engine.i18n(`option.faith.${r}`);if(r==="transcend")return new S(this,this.setting[r],o,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o])}});const l=new F(this,this.setting[r],i,o,{classes:[C.lastHeadAction],onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o])},onRefresh:()=>{l.triggerButton.inactive=!this.setting[r].enabled||this.setting[r].trigger===-1},onSetTrigger:async()=>{const h=await E.prompt(this,this.host.engine.i18n(l.triggerButton.behavior==="integer"?"ui.trigger.setinteger":"ui.trigger.setpercentage",[o]),this.host.engine.i18n("ui.trigger.build.prompt",[o,l.triggerButton.behavior==="integer"?this.host.renderAbsolute(this.setting[r].trigger,i.selected):this.host.renderPercentage(this.setting[r].trigger,i.selected,!0)]),l.triggerButton.behavior==="integer"?this.host.renderAbsolute(this.setting[r].trigger):this.host.renderPercentage(this.setting[r].trigger),this.host.engine.i18n(l.triggerButton.behavior==="integer"?"ui.trigger.setinteger.promptExplainer":"ui.trigger.setpercentage.promptExplainer"));h===void 0||h===""||h.startsWith("-")||(this.setting[r].trigger=(l.triggerButton.behavior==="integer"?this.host.parseAbsolute(h):this.host.parsePercentage(h))??this.setting[r].trigger)},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o])}});return l.triggerButton.element.addClass(C.lastHeadAction),l})])])}}class hi extends J{constructor(e,t,i,n,a){super(e,"",B.DataUsage,{...a,onClick:async()=>{const r=await E.prompt(e,e.host.engine.i18n("resources.consume.prompt"),e.host.engine.i18n("resources.consume.promptTitle",[n,e.host.renderPercentage(t.consume,i.selected,!0)]),e.host.renderPercentage(t.consume),e.host.engine.i18n("resources.consume.promptExplainer"));r!==void 0&&(r===""||r.startsWith("-")||(t.consume=e.host.parsePercentage(r)))},onRefresh:()=>{var l;const r=this.host.renderPercentage(this.setting.consume,this.host.engine.settings.locale.selected,!0),o=this.setting.consume===0?this.host.engine.i18n("resources.consume.titleZero",[this.resourceName]):this.host.engine.i18n("resources.consume.title",[r,this.resourceName]);this.updateTitle(o),(l=a==null?void 0:a.onRefresh)==null||l.call(a)}});u(this,"setting");u(this,"resourceName");this.element.addClass(C.consumeButton),this.resourceName=n,this.setting=t}toString(){return`[${hi.name}#${this.componentId}]`}}class ui extends J{constructor(e,t,i,n,a){super(e,"",null,{...a,onClick:async()=>{const r=await E.prompt(e,e.host.engine.i18n("resources.stock.prompt"),e.host.engine.i18n("resources.stock.promptTitle",[n,e.host.renderAbsolute(t.stock,i.selected)]),e.host.renderAbsolute(t.stock),e.host.engine.i18n("resources.stock.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.stock=-1;return}r==="0"&&(t.enabled=!1),t.stock=e.host.parseAbsolute(r)??t.stock}},onRefresh:()=>{const r=this.host.renderAbsolute(this.setting.stock),o=this.setting.stock<0?this.host.engine.i18n("resources.stock.titleInfinite",[this.resourceName]):this.setting.stock===0?this.host.engine.i18n("resources.stock.titleZero",[this.resourceName]):this.host.engine.i18n("resources.stock.title",[this.host.renderAbsolute(this.setting.stock),this.resourceName]);this.updateTitle(o),this.updateLabel(r)}});u(this,"setting");u(this,"resourceName");this.element.addClass(C.stockButton),this.resourceName=n,this.setting=t}toString(){return`[${ui.name}#${this.componentId}]`}}class di extends U{constructor(s,e,t){console.debug(...v(`Constructing ${di.name}`));const i=s.host.engine.i18n("ui.resources");super(s,e,new de(s,i,{classes:[O.checked,O.setting],icon:B.Resources}).addChildrenHead([new R(s,{classes:[M.fillSpace]})]));const n=["blackcoin","burnedParagon","elderBox","gflops","hashrates","kittens","paragon","temporalFlux","wrappingPaper","zebras"];this.addChildContent(new x(this).addChildren(this.host.game.resPool.resources.filter(a=>!n.includes(a.name)&&!m(this.setting.resources[a.name])).sort((a,r)=>a.title.localeCompare(r.title,t.selected)).map(a=>[this.setting.resources[a.name],X(a.title)]).map(([a,r])=>this._makeResourceSetting(this,a,t,r))))}_makeResourceSetting(s,e,t,i){const n=new S(s,e,i,{onCheck:()=>{s.host.engine.imessage("status.resource.enable",[i])},onUnCheck:()=>{s.host.engine.imessage("status.resource.disable",[i])}}).addChildrenHead([new R(s,{classes:[M.fillSpace]})]),a=new ui(s,e,t,i,{alignment:"right",border:!1,classes:[C.headAction],onRefreshRequest:()=>{a.inactive=!e.enabled||e.stock===0}});n.head.addChild(a);const r=new hi(s,e,t,i,{border:!1,classes:[C.lastHeadAction],onRefreshRequest:()=>{r.inactive=!e.enabled||e.consume!==100,r.ineffective=e.enabled&&e.consume===0}});return n.head.addChild(r),n}}class ca extends U{constructor(s,e,t,i){const n=s.host.engine.i18n("ui.upgrade.policies");super(s,e,new S(s,e,n,{onCheck:l=>{s.host.engine.imessage("status.auto.enable",[n])},onUnCheck:l=>{s.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new R(s,{classes:[M.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.policies).some(l=>l.enabled)}});const a=this.host.game.science.policies.filter(l=>!m(this.setting.policies[l.name])),r=[];let o=a[0].label;for(const l of a.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.policies[l.name],d=new S(this,h,l.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l.label])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l.label])}});this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&o[0]!==l.label[0]&&d.element.addClass(M.splitter),r.push(d),o=l.label}this.addChildContent(new x(this).addChildren(r))}}class ha extends U{constructor(s,e,t,i){const n=s.host.engine.i18n("ui.upgrade.techs");super(s,e,new F(s,e,t,n,{onCheck:l=>{s.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger",[e.trigger<0?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[n,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(l)}},onUnCheck:l=>{s.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger===-1,this.settingItem.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1&&!Object.values(e.techs).some(l=>l.enabled&&0<=l.trigger),this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.techs).some(l=>l.enabled)}});const a=this.host.game.science.techs.filter(l=>!m(this.setting.techs[l.name])),r=[];let o=a[0].label;for(const l of a.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.techs[l.name],d=new F(this,h,t,l.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l.label])},onRefresh:()=>{d.triggerButton.inactive=!h.enabled||h.trigger===-1,d.triggerButton.ineffective=i.enabled&&e.enabled&&h.enabled&&e.trigger===-1&&h.trigger===-1},onRefreshTrigger:()=>{d.triggerButton.element[0].title=this.host.engine.i18n("ui.trigger",[h.trigger<0?e.trigger<0?this.host.engine.i18n("ui.trigger.section.blocked",[n]):`${this.host.renderPercentage(e.trigger,t.selected,!0)} (${this.host.engine.i18n("ui.trigger.section.inherited")})`:this.host.renderPercentage(h.trigger,t.selected,!0)])},onSetTrigger:async()=>{const g=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.section.prompt",[n,h.trigger!==-1?this.host.renderPercentage(h.trigger,t.selected,!0):this.host.engine.i18n("ui.trigger.section.inherited")]),h.trigger!==-1?this.host.renderPercentage(h.trigger):"",this.host.engine.i18n("ui.trigger.section.promptExplainer"));if(g!==void 0){if(g===""||g.startsWith("-")){h.trigger=-1;return}h.trigger=this.host.parsePercentage(g)}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l.label])},renderLabelTrigger:!1});d.triggerButton.element.addClass(C.lastHeadAction),this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&o[0]!==l.label[0]&&d.element.addClass(M.splitter),r.push(d),o=l.label}this.addChildContent(new x(this).addChildren(r))}}class gi extends U{constructor(e,t,i){console.debug(...v(`Constructing ${gi.name}`));const n=e.host.engine.i18n("ui.upgrade");super(e,t,new S(e,t,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]),{onRefresh:()=>{this.setting.observe.enabled?$("#observeButton").hide():$("#observeButton").show()},onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&(this.setting.policies.enabled&&this._policiesUi.expando.ineffective||this.setting.techs.enabled&&(this._techsUi.expando.ineffective||this._techsUi.settingItem.triggerButton.ineffective))}});u(this,"_policiesUi");u(this,"_techsUi");u(this,"_observeStars");this._policiesUi=new ca(this,t.policies,i,t),this._techsUi=new ha(this,t.techs,i,t),this._observeStars=new S(this,this.setting.observe,this.host.engine.i18n("option.observe"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.observe")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.observe")])}});const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1});a.addChildren([this._techsUi,this._policiesUi,this._observeStars]),this.addChildContent(a)}}class ua extends U{constructor(e,t,i,n){const a=e.host.engine.i18n("ui.upgrade.missions");super(e,t,new S(e,t,a,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[a])},onRefresh:()=>{this.expando.ineffective=n.enabled&&t.enabled&&!Object.values(t.missions).some(o=>o.enabled)},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[a])}}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]));u(this,"_missions");this._missions=this.host.game.space.programs.filter(o=>!m(this.setting.missions[o.name])).map(o=>new S(this,this.setting.missions[o.name],o.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o.label])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o.label])}}));const r=new x(this).addChildren(this._missions);this.addChildContent(r)}}class mi extends U{constructor(e,t,i){console.debug(...v(`Constructing ${mi.name}`));const n=e.host.engine.i18n("ui.space");super(e,t,new F(e,t,i,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(r)}},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.buildings).some(r=>r.enabled&&0<r.max&&r.trigger<0),this.expando.ineffective=t.enabled&&(Object.values(t.buildings).some(r=>r.enabled&&(r.max===0||r.trigger<0&&t.trigger<0))||!Object.values(t.buildings).some(r=>r.enabled)&&!t.unlockMissions.enabled||this._missionsUi.expando.ineffective)}});u(this,"_missionsUi");this.addChildContent(new x(this,{onReset:()=>{this.setting.load({buildings:new St().buildings})}}).addChildren(this.host.game.space.planets.filter(r=>0<r.buildings.length).flatMap((r,o,l)=>[new D(this,this.host.engine.labelForPlanet(r.name)),...r.buildings.filter(h=>!m(this.setting.buildings[h.name])).map((h,d,g)=>le.getBuildOption(this,this.setting.buildings[h.name],i,this.setting,h.label,n,{delimiter:o<l.length-1&&d===g.length-1,renderLabelTrigger:!1}))])));const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1});a.addChild(new D(this,this.host.engine.i18n("ui.additional"))),this._missionsUi=new ua(this,this.setting.unlockMissions,i,this.setting),a.addChild(this._missionsUi),this.addChildContent(a)}}class fi extends be{constructor(s,e=400){super("ERR_OS_INVALID_ARGUMENT",s,e),this.name="InvalidArgumentError",typeof Error.captureStackTrace<"u"&&Error.captureStackTrace(this,fi)}}const It=43200,_s=1440,Cs=Symbol.for("constructDateFrom");function bi(c,s){return typeof c=="function"?c(s):c&&typeof c=="object"&&Cs in c?c[Cs](s):c instanceof Date?new c.constructor(s):new Date(s)}function da(c){return bi(c,Date.now())}const ga={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},ma=(c,s,e)=>{let t;const i=ga[c];return typeof i=="string"?t=i:s===1?t=i.one:t=i.other.replace("{{count}}",s.toString()),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"in "+t:t+" ago":t};function ne(c){return(s={})=>{const e=s.width?String(s.width):c.defaultWidth;return c.formats[e]||c.formats[c.defaultWidth]}}const fa={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},ba={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},pa={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},va={date:ne({formats:fa,defaultWidth:"full"}),time:ne({formats:ba,defaultWidth:"full"}),dateTime:ne({formats:pa,defaultWidth:"full"})},ya={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},wa=(c,s,e,t)=>ya[c];function G(c){return(s,e)=>{const t=e!=null&&e.context?String(e.context):"standalone";let i;if(t==="formatting"&&c.formattingValues){const a=c.defaultFormattingWidth||c.defaultWidth,r=e!=null&&e.width?String(e.width):a;i=c.formattingValues[r]||c.formattingValues[a]}else{const a=c.defaultWidth,r=e!=null&&e.width?String(e.width):c.defaultWidth;i=c.values[r]||c.values[a]}const n=c.argumentCallback?c.argumentCallback(s):s;return i[n]}}const ka={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},_a={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Ca={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Sa={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},xa={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Ta={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Ea={ordinalNumber:(c,s)=>{const e=Number(c),t=e%100;if(t>20||t<10)switch(t%10){case 1:return e+"st";case 2:return e+"nd";case 3:return e+"rd"}return e+"th"},era:G({values:ka,defaultWidth:"wide"}),quarter:G({values:_a,defaultWidth:"wide",argumentCallback:c=>c-1}),month:G({values:Ca,defaultWidth:"wide"}),day:G({values:Sa,defaultWidth:"wide"}),dayPeriod:G({values:xa,defaultWidth:"wide",formattingValues:Ta,defaultFormattingWidth:"wide"})};function Z(c){return(s,e={})=>{const t=e.width,i=t&&c.matchPatterns[t]||c.matchPatterns[c.defaultMatchWidth],n=s.match(i);if(!n)return null;const a=n[0],r=t&&c.parsePatterns[t]||c.parsePatterns[c.defaultParseWidth],o=Array.isArray(r)?Ma(r,d=>d.test(a)):Ra(r,d=>d.test(a));let l;l=c.valueCallback?c.valueCallback(o):o,l=e.valueCallback?e.valueCallback(l):l;const h=s.slice(a.length);return{value:l,rest:h}}}function Ra(c,s){for(const e in c)if(Object.prototype.hasOwnProperty.call(c,e)&&s(c[e]))return e}function Ma(c,s){for(let e=0;e<c.length;e++)if(s(c[e]))return e}function $t(c){return(s,e={})=>{const t=s.match(c.matchPattern);if(!t)return null;const i=t[0],n=s.match(c.parsePattern);if(!n)return null;let a=c.valueCallback?c.valueCallback(n[0]):n[0];a=e.valueCallback?e.valueCallback(a):a;const r=s.slice(i.length);return{value:a,rest:r}}}const Ba=/^(\d+)(th|st|nd|rd)?/i,Aa=/\d+/i,Pa={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Ia={any:[/^b/i,/^(a|c)/i]},$a={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},La={any:[/1/i,/2/i,/3/i,/4/i]},Oa={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},Ua={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},Da={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Na={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},qa={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},za={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},Fa={ordinalNumber:$t({matchPattern:Ba,parsePattern:Aa,valueCallback:c=>parseInt(c,10)}),era:Z({matchPatterns:Pa,defaultMatchWidth:"wide",parsePatterns:Ia,defaultParseWidth:"any"}),quarter:Z({matchPatterns:$a,defaultMatchWidth:"wide",parsePatterns:La,defaultParseWidth:"any",valueCallback:c=>c+1}),month:Z({matchPatterns:Oa,defaultMatchWidth:"wide",parsePatterns:Ua,defaultParseWidth:"any"}),day:Z({matchPatterns:Da,defaultMatchWidth:"wide",parsePatterns:Na,defaultParseWidth:"any"}),dayPeriod:Z({matchPatterns:qa,defaultMatchWidth:"any",parsePatterns:za,defaultParseWidth:"any"})},Ss={code:"en-US",formatDistance:ma,formatLong:va,formatRelative:wa,localize:Ea,match:Fa,options:{weekStartsOn:0,firstWeekContainsDate:1}};let Ha={};function xs(){return Ha}function fe(c,s){return bi(s||c,c)}function Ts(c){const s=fe(c),e=new Date(Date.UTC(s.getFullYear(),s.getMonth(),s.getDate(),s.getHours(),s.getMinutes(),s.getSeconds(),s.getMilliseconds()));return e.setUTCFullYear(s.getFullYear()),+c-+e}function Lt(c,...s){const e=bi.bind(null,c||s.find(t=>typeof t=="object"));return s.map(e)}function Ot(c,s){const e=+fe(c)-+fe(s);return e<0?-1:e>0?1:e}function Wa(c,s,e){const[t,i]=Lt(e==null?void 0:e.in,c,s),n=t.getFullYear()-i.getFullYear(),a=t.getMonth()-i.getMonth();return n*12+a}function Ga(c,s){const e=fe(c,s==null?void 0:s.in);return e.setHours(23,59,59,999),e}function Za(c,s){const e=fe(c,s==null?void 0:s.in),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e}function Ka(c,s){const e=fe(c,s==null?void 0:s.in);return+Ga(e,s)==+Za(e,s)}function Va(c,s,e){const[t,i,n]=Lt(e==null?void 0:e.in,c,c,s),a=Ot(i,n),r=Math.abs(Wa(i,n));if(r<1)return 0;i.getMonth()===1&&i.getDate()>27&&i.setDate(30),i.setMonth(i.getMonth()-a*r);let o=Ot(i,n)===-a;Ka(t)&&r===1&&Ot(t,n)===1&&(o=!1);const l=a*(r-+o);return l===0?0:l}function ja(c){return s=>{const t=(c?Math[c]:Math.trunc)(s);return t===0?0:t}}function Ja(c,s){return+fe(c)-+fe(s)}function Xa(c,s,e){const t=Ja(c,s)/1e3;return ja(e==null?void 0:e.roundingMethod)(t)}function Ya(c,s,e){const t=xs(),i=(e==null?void 0:e.locale)??t.locale??Ss,n=2520,a=Ot(c,s);if(isNaN(a))throw new RangeError("Invalid time value");const r=Object.assign({},e,{addSuffix:e==null?void 0:e.addSuffix,comparison:a}),[o,l]=Lt(e==null?void 0:e.in,...a>0?[s,c]:[c,s]),h=Xa(l,o),d=(Ts(l)-Ts(o))/1e3,g=Math.round((h-d)/60);let f;if(g<2)return e!=null&&e.includeSeconds?h<5?i.formatDistance("lessThanXSeconds",5,r):h<10?i.formatDistance("lessThanXSeconds",10,r):h<20?i.formatDistance("lessThanXSeconds",20,r):h<40?i.formatDistance("halfAMinute",0,r):h<60?i.formatDistance("lessThanXMinutes",1,r):i.formatDistance("xMinutes",1,r):g===0?i.formatDistance("lessThanXMinutes",1,r):i.formatDistance("xMinutes",g,r);if(g<45)return i.formatDistance("xMinutes",g,r);if(g<90)return i.formatDistance("aboutXHours",1,r);if(g<_s){const w=Math.round(g/60);return i.formatDistance("aboutXHours",w,r)}else{if(g<n)return i.formatDistance("xDays",1,r);if(g<It){const w=Math.round(g/_s);return i.formatDistance("xDays",w,r)}else if(g<It*2)return f=Math.round(g/It),i.formatDistance("aboutXMonths",f,r)}if(f=Va(l,o),f<12){const w=Math.round(g/It);return i.formatDistance("xMonths",w,r)}else{const w=f%12,b=Math.trunc(f/12);return w<3?i.formatDistance("aboutXYears",b,r):w<9?i.formatDistance("overXYears",b,r):i.formatDistance("almostXYears",b+1,r)}}function Es(c,s){return Ya(c,da(c),s)}function Rs(c,s){var r,o,l,h;const e=xs(),t=(s==null?void 0:s.weekStartsOn)??((o=(r=s==null?void 0:s.locale)==null?void 0:r.options)==null?void 0:o.weekStartsOn)??e.weekStartsOn??((h=(l=e.locale)==null?void 0:l.options)==null?void 0:h.weekStartsOn)??0,i=fe(c,s==null?void 0:s.in),n=i.getDay(),a=(n<t?7:0)+n-t;return i.setDate(i.getDate()-a),i.setHours(0,0,0,0),i}function Qa(c,s,e){const[t,i]=Lt(e==null?void 0:e.in,c,s);return+Rs(t,e)==+Rs(i,e)}const Ms={lessThanXSeconds:{standalone:{one:"weniger als 1 Sekunde",other:"weniger als {{count}} Sekunden"},withPreposition:{one:"weniger als 1 Sekunde",other:"weniger als {{count}} Sekunden"}},xSeconds:{standalone:{one:"1 Sekunde",other:"{{count}} Sekunden"},withPreposition:{one:"1 Sekunde",other:"{{count}} Sekunden"}},halfAMinute:{standalone:"eine halbe Minute",withPreposition:"einer halben Minute"},lessThanXMinutes:{standalone:{one:"weniger als 1 Minute",other:"weniger als {{count}} Minuten"},withPreposition:{one:"weniger als 1 Minute",other:"weniger als {{count}} Minuten"}},xMinutes:{standalone:{one:"1 Minute",other:"{{count}} Minuten"},withPreposition:{one:"1 Minute",other:"{{count}} Minuten"}},aboutXHours:{standalone:{one:"etwa 1 Stunde",other:"etwa {{count}} Stunden"},withPreposition:{one:"etwa 1 Stunde",other:"etwa {{count}} Stunden"}},xHours:{standalone:{one:"1 Stunde",other:"{{count}} Stunden"},withPreposition:{one:"1 Stunde",other:"{{count}} Stunden"}},xDays:{standalone:{one:"1 Tag",other:"{{count}} Tage"},withPreposition:{one:"1 Tag",other:"{{count}} Tagen"}},aboutXWeeks:{standalone:{one:"etwa 1 Woche",other:"etwa {{count}} Wochen"},withPreposition:{one:"etwa 1 Woche",other:"etwa {{count}} Wochen"}},xWeeks:{standalone:{one:"1 Woche",other:"{{count}} Wochen"},withPreposition:{one:"1 Woche",other:"{{count}} Wochen"}},aboutXMonths:{standalone:{one:"etwa 1 Monat",other:"etwa {{count}} Monate"},withPreposition:{one:"etwa 1 Monat",other:"etwa {{count}} Monaten"}},xMonths:{standalone:{one:"1 Monat",other:"{{count}} Monate"},withPreposition:{one:"1 Monat",other:"{{count}} Monaten"}},aboutXYears:{standalone:{one:"etwa 1 Jahr",other:"etwa {{count}} Jahre"},withPreposition:{one:"etwa 1 Jahr",other:"etwa {{count}} Jahren"}},xYears:{standalone:{one:"1 Jahr",other:"{{count}} Jahre"},withPreposition:{one:"1 Jahr",other:"{{count}} Jahren"}},overXYears:{standalone:{one:"mehr als 1 Jahr",other:"mehr als {{count}} Jahre"},withPreposition:{one:"mehr als 1 Jahr",other:"mehr als {{count}} Jahren"}},almostXYears:{standalone:{one:"fast 1 Jahr",other:"fast {{count}} Jahre"},withPreposition:{one:"fast 1 Jahr",other:"fast {{count}} Jahren"}}},er=(c,s,e)=>{let t;const i=e!=null&&e.addSuffix?Ms[c].withPreposition:Ms[c].standalone;return typeof i=="string"?t=i:s===1?t=i.one:t=i.other.replace("{{count}}",String(s)),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"in "+t:"vor "+t:t},tr={full:"EEEE, do MMMM y",long:"do MMMM y",medium:"do MMM y",short:"dd.MM.y"},ir={full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},sr={full:"{{date}} 'um' {{time}}",long:"{{date}} 'um' {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},nr={date:ne({formats:tr,defaultWidth:"full"}),time:ne({formats:ir,defaultWidth:"full"}),dateTime:ne({formats:sr,defaultWidth:"full"})},ar={lastWeek:"'letzten' eeee 'um' p",yesterday:"'gestern um' p",today:"'heute um' p",tomorrow:"'morgen um' p",nextWeek:"eeee 'um' p",other:"P"},rr=(c,s,e,t)=>ar[c],or={narrow:["v.Chr.","n.Chr."],abbreviated:["v.Chr.","n.Chr."],wide:["vor Christus","nach Christus"]},lr={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1. Quartal","2. Quartal","3. Quartal","4. Quartal"]},pi={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],wide:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]},cr={narrow:pi.narrow,abbreviated:["Jan.","Feb.","März","Apr.","Mai","Juni","Juli","Aug.","Sep.","Okt.","Nov.","Dez."],wide:pi.wide},hr={narrow:["S","M","D","M","D","F","S"],short:["So","Mo","Di","Mi","Do","Fr","Sa"],abbreviated:["So.","Mo.","Di.","Mi.","Do.","Fr.","Sa."],wide:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]},ur={narrow:{am:"vm.",pm:"nm.",midnight:"Mitternacht",noon:"Mittag",morning:"Morgen",afternoon:"Nachm.",evening:"Abend",night:"Nacht"},abbreviated:{am:"vorm.",pm:"nachm.",midnight:"Mitternacht",noon:"Mittag",morning:"Morgen",afternoon:"Nachmittag",evening:"Abend",night:"Nacht"},wide:{am:"vormittags",pm:"nachmittags",midnight:"Mitternacht",noon:"Mittag",morning:"Morgen",afternoon:"Nachmittag",evening:"Abend",night:"Nacht"}},dr={narrow:{am:"vm.",pm:"nm.",midnight:"Mitternacht",noon:"Mittag",morning:"morgens",afternoon:"nachm.",evening:"abends",night:"nachts"},abbreviated:{am:"vorm.",pm:"nachm.",midnight:"Mitternacht",noon:"Mittag",morning:"morgens",afternoon:"nachmittags",evening:"abends",night:"nachts"},wide:{am:"vormittags",pm:"nachmittags",midnight:"Mitternacht",noon:"Mittag",morning:"morgens",afternoon:"nachmittags",evening:"abends",night:"nachts"}},gr={ordinalNumber:c=>Number(c)+".",era:G({values:or,defaultWidth:"wide"}),quarter:G({values:lr,defaultWidth:"wide",argumentCallback:c=>c-1}),month:G({values:pi,formattingValues:cr,defaultWidth:"wide"}),day:G({values:hr,defaultWidth:"wide"}),dayPeriod:G({values:ur,defaultWidth:"wide",formattingValues:dr,defaultFormattingWidth:"wide"})},mr=/^(\d+)(\.)?/i,fr=/\d+/i,br={narrow:/^(v\.? ?Chr\.?|n\.? ?Chr\.?)/i,abbreviated:/^(v\.? ?Chr\.?|n\.? ?Chr\.?)/i,wide:/^(vor Christus|vor unserer Zeitrechnung|nach Christus|unserer Zeitrechnung)/i},pr={any:[/^v/i,/^n/i]},vr={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](\.)? Quartal/i},yr={any:[/1/i,/2/i,/3/i,/4/i]},wr={narrow:/^[jfmasond]/i,abbreviated:/^(j[aä]n|feb|mär[z]?|apr|mai|jun[i]?|jul[i]?|aug|sep|okt|nov|dez)\.?/i,wide:/^(januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)/i},kr={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^j[aä]/i,/^f/i,/^mär/i,/^ap/i,/^mai/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},_r={narrow:/^[smdmf]/i,short:/^(so|mo|di|mi|do|fr|sa)/i,abbreviated:/^(son?|mon?|die?|mit?|don?|fre?|sam?)\.?/i,wide:/^(sonntag|montag|dienstag|mittwoch|donnerstag|freitag|samstag)/i},Cr={any:[/^so/i,/^mo/i,/^di/i,/^mi/i,/^do/i,/^f/i,/^sa/i]},Sr={narrow:/^(vm\.?|nm\.?|Mitternacht|Mittag|morgens|nachm\.?|abends|nachts)/i,abbreviated:/^(vorm\.?|nachm\.?|Mitternacht|Mittag|morgens|nachm\.?|abends|nachts)/i,wide:/^(vormittags|nachmittags|Mitternacht|Mittag|morgens|nachmittags|abends|nachts)/i},xr={any:{am:/^v/i,pm:/^n/i,midnight:/^Mitte/i,noon:/^Mitta/i,morning:/morgens/i,afternoon:/nachmittags/i,evening:/abends/i,night:/nachts/i}},Tr={ordinalNumber:$t({matchPattern:mr,parsePattern:fr,valueCallback:c=>parseInt(c)}),era:Z({matchPatterns:br,defaultMatchWidth:"wide",parsePatterns:pr,defaultParseWidth:"any"}),quarter:Z({matchPatterns:vr,defaultMatchWidth:"wide",parsePatterns:yr,defaultParseWidth:"any",valueCallback:c=>c+1}),month:Z({matchPatterns:wr,defaultMatchWidth:"wide",parsePatterns:kr,defaultParseWidth:"any"}),day:Z({matchPatterns:_r,defaultMatchWidth:"wide",parsePatterns:Cr,defaultParseWidth:"any"}),dayPeriod:Z({matchPatterns:Sr,defaultMatchWidth:"wide",parsePatterns:xr,defaultParseWidth:"any"})},Er={code:"de",formatDistance:er,formatLong:nr,formatRelative:rr,localize:gr,match:Tr,options:{weekStartsOn:1,firstWeekContainsDate:4}},Rr={lessThanXSeconds:{one:"פחות משנייה",two:"פחות משתי שניות",other:"פחות מ־{{count}} שניות"},xSeconds:{one:"שנייה",two:"שתי שניות",other:"{{count}} שניות"},halfAMinute:"חצי דקה",lessThanXMinutes:{one:"פחות מדקה",two:"פחות משתי דקות",other:"פחות מ־{{count}} דקות"},xMinutes:{one:"דקה",two:"שתי דקות",other:"{{count}} דקות"},aboutXHours:{one:"כשעה",two:"כשעתיים",other:"כ־{{count}} שעות"},xHours:{one:"שעה",two:"שעתיים",other:"{{count}} שעות"},xDays:{one:"יום",two:"יומיים",other:"{{count}} ימים"},aboutXWeeks:{one:"כשבוע",two:"כשבועיים",other:"כ־{{count}} שבועות"},xWeeks:{one:"שבוע",two:"שבועיים",other:"{{count}} שבועות"},aboutXMonths:{one:"כחודש",two:"כחודשיים",other:"כ־{{count}} חודשים"},xMonths:{one:"חודש",two:"חודשיים",other:"{{count}} חודשים"},aboutXYears:{one:"כשנה",two:"כשנתיים",other:"כ־{{count}} שנים"},xYears:{one:"שנה",two:"שנתיים",other:"{{count}} שנים"},overXYears:{one:"יותר משנה",two:"יותר משנתיים",other:"יותר מ־{{count}} שנים"},almostXYears:{one:"כמעט שנה",two:"כמעט שנתיים",other:"כמעט {{count}} שנים"}},Mr=(c,s,e)=>{if(c==="xDays"&&(e!=null&&e.addSuffix)&&s<=2)return e.comparison&&e.comparison>0?s===1?"מחר":"מחרתיים":s===1?"אתמול":"שלשום";let t;const i=Rr[c];return typeof i=="string"?t=i:s===1?t=i.one:s===2?t=i.two:t=i.other.replace("{{count}}",String(s)),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?"בעוד "+t:"לפני "+t:t},Br={full:"EEEE, d בMMMM y",long:"d בMMMM y",medium:"d בMMM y",short:"d.M.y"},Ar={full:"H:mm:ss zzzz",long:"H:mm:ss z",medium:"H:mm:ss",short:"H:mm"},Pr={full:"{{date}} 'בשעה' {{time}}",long:"{{date}} 'בשעה' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Ir={date:ne({formats:Br,defaultWidth:"full"}),time:ne({formats:Ar,defaultWidth:"full"}),dateTime:ne({formats:Pr,defaultWidth:"full"})},$r={lastWeek:"eeee 'שעבר בשעה' p",yesterday:"'אתמול בשעה' p",today:"'היום בשעה' p",tomorrow:"'מחר בשעה' p",nextWeek:"eeee 'בשעה' p",other:"P"},Lr=(c,s,e,t)=>$r[c],Or={narrow:["לפנה״ס","לספירה"],abbreviated:["לפנה״ס","לספירה"],wide:["לפני הספירה","לספירה"]},Ur={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["רבעון 1","רבעון 2","רבעון 3","רבעון 4"]},Dr={narrow:["1","2","3","4","5","6","7","8","9","10","11","12"],abbreviated:["ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳"],wide:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"]},Nr={narrow:["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],short:["א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳"],abbreviated:["יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת"],wide:["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת"]},qr={narrow:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בוקר",afternoon:"אחר הצהריים",evening:"ערב",night:"לילה"},abbreviated:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בוקר",afternoon:"אחר הצהריים",evening:"ערב",night:"לילה"},wide:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בוקר",afternoon:"אחר הצהריים",evening:"ערב",night:"לילה"}},zr={narrow:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בבוקר",afternoon:"בצהריים",evening:"בערב",night:"בלילה"},abbreviated:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בבוקר",afternoon:"אחר הצהריים",evening:"בערב",night:"בלילה"},wide:{am:"לפנה״צ",pm:"אחה״צ",midnight:"חצות",noon:"צהריים",morning:"בבוקר",afternoon:"אחר הצהריים",evening:"בערב",night:"בלילה"}},Fr={ordinalNumber:(c,s)=>{const e=Number(c);if(e<=0||e>10)return String(e);const t=String(s==null?void 0:s.unit),i=["year","hour","minute","second"].indexOf(t)>=0,n=["ראשון","שני","שלישי","רביעי","חמישי","שישי","שביעי","שמיני","תשיעי","עשירי"],a=["ראשונה","שנייה","שלישית","רביעית","חמישית","שישית","שביעית","שמינית","תשיעית","עשירית"],r=e-1;return i?a[r]:n[r]},era:G({values:Or,defaultWidth:"wide"}),quarter:G({values:Ur,defaultWidth:"wide",argumentCallback:c=>c-1}),month:G({values:Dr,defaultWidth:"wide"}),day:G({values:Nr,defaultWidth:"wide"}),dayPeriod:G({values:qr,defaultWidth:"wide",formattingValues:zr,defaultFormattingWidth:"wide"})},Hr=/^(\d+|(ראשון|שני|שלישי|רביעי|חמישי|שישי|שביעי|שמיני|תשיעי|עשירי|ראשונה|שנייה|שלישית|רביעית|חמישית|שישית|שביעית|שמינית|תשיעית|עשירית))/i,Wr=/^(\d+|רא|שנ|של|רב|ח|שי|שב|שמ|ת|ע)/i,Gr={narrow:/^ל(ספירה|פנה״ס)/i,abbreviated:/^ל(ספירה|פנה״ס)/i,wide:/^ל(פני ה)?ספירה/i},Zr={any:[/^לפ/i,/^לס/i]},Kr={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^רבעון [1234]/i},Vr={any:[/1/i,/2/i,/3/i,/4/i]},jr={narrow:/^\d+/i,abbreviated:/^(ינו|פבר|מרץ|אפר|מאי|יוני|יולי|אוג|ספט|אוק|נוב|דצמ)׳?/i,wide:/^(ינואר|פברואר|מרץ|אפריל|מאי|יוני|יולי|אוגוסט|ספטמבר|אוקטובר|נובמבר|דצמבר)/i},Jr={narrow:[/^1$/i,/^2/i,/^3/i,/^4/i,/^5/i,/^6/i,/^7/i,/^8/i,/^9/i,/^10/i,/^11/i,/^12/i],any:[/^ינ/i,/^פ/i,/^מר/i,/^אפ/i,/^מא/i,/^יונ/i,/^יול/i,/^אוג/i,/^ס/i,/^אוק/i,/^נ/i,/^ד/i]},Xr={narrow:/^[אבגדהוש]׳/i,short:/^[אבגדהוש]׳/i,abbreviated:/^(שבת|יום (א|ב|ג|ד|ה|ו)׳)/i,wide:/^יום (ראשון|שני|שלישי|רביעי|חמישי|שישי|שבת)/i},Yr={abbreviated:[/א׳$/i,/ב׳$/i,/ג׳$/i,/ד׳$/i,/ה׳$/i,/ו׳$/i,/^ש/i],wide:[/ן$/i,/ני$/i,/לישי$/i,/עי$/i,/מישי$/i,/שישי$/i,/ת$/i],any:[/^א/i,/^ב/i,/^ג/i,/^ד/i,/^ה/i,/^ו/i,/^ש/i]},Qr={any:/^(אחר ה|ב)?(חצות|צהריים|בוקר|ערב|לילה|אחה״צ|לפנה״צ)/i},eo={any:{am:/^לפ/i,pm:/^אחה/i,midnight:/^ח/i,noon:/^צ/i,morning:/בוקר/i,afternoon:/בצ|אחר/i,evening:/ערב/i,night:/לילה/i}},to=["רא","שנ","של","רב","ח","שי","שב","שמ","ת","ע"],io={ordinalNumber:$t({matchPattern:Hr,parsePattern:Wr,valueCallback:c=>{const s=parseInt(c,10);return isNaN(s)?to.indexOf(c)+1:s}}),era:Z({matchPatterns:Gr,defaultMatchWidth:"wide",parsePatterns:Zr,defaultParseWidth:"any"}),quarter:Z({matchPatterns:Kr,defaultMatchWidth:"wide",parsePatterns:Vr,defaultParseWidth:"any",valueCallback:c=>c+1}),month:Z({matchPatterns:jr,defaultMatchWidth:"wide",parsePatterns:Jr,defaultParseWidth:"any"}),day:Z({matchPatterns:Xr,defaultMatchWidth:"wide",parsePatterns:Yr,defaultParseWidth:"any"}),dayPeriod:Z({matchPatterns:Qr,defaultMatchWidth:"any",parsePatterns:eo,defaultParseWidth:"any"})},so={code:"he",formatDistance:Mr,formatLong:Ir,formatRelative:Lr,localize:Fr,match:io,options:{weekStartsOn:0,firstWeekContainsDate:1}},no={lessThanXSeconds:{one:"不到 1 秒",other:"不到 {{count}} 秒"},xSeconds:{one:"1 秒",other:"{{count}} 秒"},halfAMinute:"半分钟",lessThanXMinutes:{one:"不到 1 分钟",other:"不到 {{count}} 分钟"},xMinutes:{one:"1 分钟",other:"{{count}} 分钟"},xHours:{one:"1 小时",other:"{{count}} 小时"},aboutXHours:{one:"大约 1 小时",other:"大约 {{count}} 小时"},xDays:{one:"1 天",other:"{{count}} 天"},aboutXWeeks:{one:"大约 1 个星期",other:"大约 {{count}} 个星期"},xWeeks:{one:"1 个星期",other:"{{count}} 个星期"},aboutXMonths:{one:"大约 1 个月",other:"大约 {{count}} 个月"},xMonths:{one:"1 个月",other:"{{count}} 个月"},aboutXYears:{one:"大约 1 年",other:"大约 {{count}} 年"},xYears:{one:"1 年",other:"{{count}} 年"},overXYears:{one:"超过 1 年",other:"超过 {{count}} 年"},almostXYears:{one:"将近 1 年",other:"将近 {{count}} 年"}},ao=(c,s,e)=>{let t;const i=no[c];return typeof i=="string"?t=i:s===1?t=i.one:t=i.other.replace("{{count}}",String(s)),e!=null&&e.addSuffix?e.comparison&&e.comparison>0?t+"内":t+"前":t},ro={full:"y'年'M'月'd'日' EEEE",long:"y'年'M'月'd'日'",medium:"yyyy-MM-dd",short:"yy-MM-dd"},oo={full:"zzzz a h:mm:ss",long:"z a h:mm:ss",medium:"a h:mm:ss",short:"a h:mm"},lo={full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},co={date:ne({formats:ro,defaultWidth:"full"}),time:ne({formats:oo,defaultWidth:"full"}),dateTime:ne({formats:lo,defaultWidth:"full"})};function Bs(c,s,e){const t="eeee p";return Qa(c,s,e)?t:c.getTime()>s.getTime()?"'下个'"+t:"'上个'"+t}const ho={lastWeek:Bs,yesterday:"'昨天' p",today:"'今天' p",tomorrow:"'明天' p",nextWeek:Bs,other:"PP p"},uo=(c,s,e,t)=>{const i=ho[c];return typeof i=="function"?i(s,e,t):i},go={narrow:["前","公元"],abbreviated:["前","公元"],wide:["公元前","公元"]},mo={narrow:["1","2","3","4"],abbreviated:["第一季","第二季","第三季","第四季"],wide:["第一季度","第二季度","第三季度","第四季度"]},fo={narrow:["一","二","三","四","五","六","七","八","九","十","十一","十二"],abbreviated:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],wide:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},bo={narrow:["日","一","二","三","四","五","六"],short:["日","一","二","三","四","五","六"],abbreviated:["周日","周一","周二","周三","周四","周五","周六"],wide:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]},po={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"}},vo={narrow:{am:"上",pm:"下",midnight:"凌晨",noon:"午",morning:"早",afternoon:"下午",evening:"晚",night:"夜"},abbreviated:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"},wide:{am:"上午",pm:"下午",midnight:"凌晨",noon:"中午",morning:"早晨",afternoon:"中午",evening:"晚上",night:"夜间"}},yo={ordinalNumber:(c,s)=>{const e=Number(c);switch(s==null?void 0:s.unit){case"date":return e.toString()+"日";case"hour":return e.toString()+"时";case"minute":return e.toString()+"分";case"second":return e.toString()+"秒";default:return"第 "+e.toString()}},era:G({values:go,defaultWidth:"wide"}),quarter:G({values:mo,defaultWidth:"wide",argumentCallback:c=>c-1}),month:G({values:fo,defaultWidth:"wide"}),day:G({values:bo,defaultWidth:"wide"}),dayPeriod:G({values:po,defaultWidth:"wide",formattingValues:vo,defaultFormattingWidth:"wide"})},wo=/^(第\s*)?\d+(日|时|分|秒)?/i,ko=/\d+/i,_o={narrow:/^(前)/i,abbreviated:/^(前)/i,wide:/^(公元前|公元)/i},Co={any:[/^(前)/i,/^(公元)/i]},So={narrow:/^[1234]/i,abbreviated:/^第[一二三四]刻/i,wide:/^第[一二三四]刻钟/i},xo={any:[/(1|一)/i,/(2|二)/i,/(3|三)/i,/(4|四)/i]},To={narrow:/^(一|二|三|四|五|六|七|八|九|十[二一])/i,abbreviated:/^(一|二|三|四|五|六|七|八|九|十[二一]|\d|1[12])月/i,wide:/^(一|二|三|四|五|六|七|八|九|十[二一])月/i},Eo={narrow:[/^一/i,/^二/i,/^三/i,/^四/i,/^五/i,/^六/i,/^七/i,/^八/i,/^九/i,/^十(?!(一|二))/i,/^十一/i,/^十二/i],any:[/^一|1/i,/^二|2/i,/^三|3/i,/^四|4/i,/^五|5/i,/^六|6/i,/^七|7/i,/^八|8/i,/^九|9/i,/^十(?!(一|二))|10/i,/^十一|11/i,/^十二|12/i]},Ro={narrow:/^[一二三四五六日]/i,short:/^[一二三四五六日]/i,abbreviated:/^周[一二三四五六日]/i,wide:/^星期[一二三四五六日]/i},Mo={any:[/日/i,/一/i,/二/i,/三/i,/四/i,/五/i,/六/i]},Bo={any:/^(上午?|下午?|午夜|[中正]午|早上?|下午|晚上?|凌晨|)/i},Ao={any:{am:/^上午?/i,pm:/^下午?/i,midnight:/^午夜/i,noon:/^[中正]午/i,morning:/^早上/i,afternoon:/^下午/i,evening:/^晚上?/i,night:/^凌晨/i}},Po={ordinalNumber:$t({matchPattern:wo,parsePattern:ko,valueCallback:c=>parseInt(c,10)}),era:Z({matchPatterns:_o,defaultMatchWidth:"wide",parsePatterns:Co,defaultParseWidth:"any"}),quarter:Z({matchPatterns:So,defaultMatchWidth:"wide",parsePatterns:xo,defaultParseWidth:"any",valueCallback:c=>c+1}),month:Z({matchPatterns:To,defaultMatchWidth:"wide",parsePatterns:Eo,defaultParseWidth:"any"}),day:Z({matchPatterns:Ro,defaultMatchWidth:"wide",parsePatterns:Mo,defaultParseWidth:"any"}),dayPeriod:Z({matchPatterns:Bo,defaultMatchWidth:"any",parsePatterns:Ao,defaultParseWidth:"any"})},Io={code:"zh-CN",formatDistance:ao,formatLong:co,formatRelative:uo,localize:yo,match:Po,options:{weekStartsOn:1,firstWeekContainsDate:4}};class $o{constructor(s){u(this,"_game");this._game=s}load(s){return new Promise((e,t)=>{if(s===null){e();return}this._game.saveImportDropboxText(s,i=>{if(i){t(i);return}e()})})}loadRaw(s){const e=this._game.compressLZData(JSON.stringify(s));return this.load(e)}}class $e extends ue{constructor(s,e){super(s,e),this.element.addClass(ks.toolbar)}toString(){return`[${$e.name}#${this.componentId}]`}addChild(s){return super.addChild(s)}}class vi extends U{constructor(e,t,i){console.debug(...v(`Constructing ${vi.name}`));const n=e.host.engine.i18n("state.title");super(e,t,new de(e,n,{classes:[O.checked,O.setting],icon:B.State}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]),{onRefresh:()=>{this._refreshGameList(),this._refreshStateList()}});u(this,"games",new Array);u(this,"states",new Array);u(this,"gameList");u(this,"stateList");u(this,"locale");this.gameList=new x(this,{hasDisableAll:!1,hasEnableAll:!1}),this.stateList=new x(this,{hasDisableAll:!1,hasEnableAll:!1}),this.locale=i.selected==="zh-CN"?Io:i.selected==="he-IL"?so:i.selected==="de-DE"?Er:Ss,this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new S(this,this.setting.noConfirm,this.host.engine.i18n("state.noConfirm")),new ue(this).addChild(new te(this)),new D(this,this.host.engine.i18n("state.local")),new $e(this).addChildren([new J(this,this.host.engine.i18n("state.import"),B.Import,{onClick:()=>{this.import()},title:this.host.engine.i18n("state.importTitle")})]),new ue(this).addChild(new te(this)),new D(this,this.host.engine.i18n("state.localStates")),new $e(this).addChildren([new J(this,this.host.engine.i18n("state.store"),B.SaveAs,{onClick:()=>{this.storeState()},title:this.host.engine.i18n("state.storeState")}),new J(this,this.host.engine.i18n("copy"),B.Copy,{onClick:()=>{this.copyState().catch(se(console)),this.host.engine.imessage("state.copied.stateCurrent")},title:this.host.engine.i18n("state.copy.stateCurrent")}),new J(this,this.host.engine.i18n("state.new"),B.Draft,{onClick:()=>{this.storeStateFactoryDefaults(),this.host.engine.imessage("state.stored.state")},title:this.host.engine.i18n("state.storeFactory")}),new J(this,this.host.engine.i18n("state.exportAll"),B.Sync,{onClick:()=>{this.exportStateAll()},title:this.host.engine.i18n("state.exportAllTitle")})]),new ue(this).addChild(this.stateList),new ue(this).addChild(new te(this)),new D(this,this.host.engine.i18n("state.localGames")),new $e(this).addChildren([new J(this,this.host.engine.i18n("state.store"),B.SaveAs,{onClick:()=>{this.storeGame(),this.host.engine.imessage("state.stored.game")},title:this.host.engine.i18n("state.storeGame")}),new J(this,this.host.engine.i18n("copy"),B.Copy,{onClick:()=>{this.copyGame().catch(se(console)),this.host.engine.imessage("state.copied.gameCurrent")},title:this.host.engine.i18n("state.copy.gameCurrent")})]),new ue(this).addChild(this.gameList),new S(this,this.setting.compress,this.host.engine.i18n("state.compress"))])),this._loadGames(),this._loadStates()}_loadGames(){let e=0,t=localStorage.getItem(`ks.game.${e}`);this.games.splice(0);try{for(;!m(t);){const i=JSON.parse(t);this.games.push(new yt(i)),t=localStorage.getItem(`ks.game.${++e}`)}}catch(i){console.error(...v(i))}}_storeGames(){let e=0,t=localStorage.getItem(`ks.game.${e}`);for(;!m(t);)localStorage.removeItem(`ks.game.${e}`),t=localStorage.getItem(`ks.game.${++e}`);e=0;for(const i of this.games)localStorage.setItem(`ks.game.${e++}`,JSON.stringify(i))}_loadStates(){let e=0,t=localStorage.getItem(`ks.state.${e}`);this.states.splice(0);try{for(;!m(t);){const i=JSON.parse(t);ge.unknownAsEngineStateOrThrow(i.state),this.states.push(new yt(i)),t=localStorage.getItem(`ks.state.${++e}`)}}catch(i){console.error(...v(i))}}_storeStates(){let e=0,t=localStorage.getItem(`ks.state.${e}`);for(;!m(t);)localStorage.removeItem(`ks.state.${e}`),t=localStorage.getItem(`ks.state.${++e}`);e=0;for(const i of this.states)localStorage.setItem(`ks.state.${e++}`,JSON.stringify(i))}_refreshGameList(){this.gameList.removeChildren(this.gameList.children),this.gameList.addChildren(this.games.sort((e,t)=>new Date(e.unwrap().timestamp).getTime()-new Date(t.unwrap().timestamp).getTime()).map(e=>[e.unwrap(),e]).map(([e,t])=>new si(this,new Ce(this,`${e.label} (${Es(new Date(e.timestamp),{addSuffix:!0,locale:this.locale})})`,{onClick:()=>{this.loadGame(e.game).catch(se(console)),this.host.engine.imessage("state.loaded.game",[e.label])},title:new Date(e.timestamp).toLocaleString()})).addChildren([new R(this,{classes:[M.fillSpace]}),new ie(this,B.Save,this.host.engine.i18n("state.update.game"),{onClick:()=>{this.updateGame(t,this.host.game.save()),this.host.engine.imessage("state.updated.game",[e.label])}}),new ie(this,B.Edit,this.host.engine.i18n("state.edit.game"),{onClick:()=>{this.storeGame(e.game),this.deleteGame(t,!0),this.host.engine.imessage("state.updated.game",[e.label])}}),new ie(this,B.Copy,this.host.engine.i18n("state.copy.game"),{onClick:()=>{this.copyGame(e.game).catch(se(console)),this.host.engine.imessage("state.copied.game",[e.label])}}),new ie(this,B.Delete,this.host.engine.i18n("state.delete.game"),{onClick:()=>{this.deleteGame(t),this.host.engine.imessage("state.deleted.game",[e.label])}})])))}_refreshStateList(){this.stateList.removeChildren(this.stateList.children),this.stateList.addChildren(this.states.sort((e,t)=>new Date(e.unwrap().timestamp).getTime()-new Date(t.unwrap().timestamp).getTime()).map(e=>[e.unwrap(),e]).map(([e,t])=>new si(this,new Ce(this,`${e.label} (${Es(new Date(e.timestamp),{addSuffix:!0,locale:this.locale})})`,{onClick:()=>{this.loadState(e.state),this.host.engine.imessage("state.loaded.state",[e.label])},title:new Date(e.timestamp).toLocaleString()})).addChildren([new R(this,{classes:[M.fillSpace]}),new ie(this,B.Save,this.host.engine.i18n("state.update.state"),{onClick:()=>{this.updateState(t,this.host.engine.stateSerialize()),this.host.engine.imessage("state.updated.state",[e.label])}}),new ie(this,B.Edit,this.host.engine.i18n("state.edit.state"),{onClick:()=>{this.storeState(e.state),this.deleteState(t,!0),this.host.engine.imessage("state.updated.state",[e.label])}}),new ie(this,B.Copy,this.host.engine.i18n("state.copy.state"),{onClick:()=>{this.copyState(e.state).catch(se(console)),this.host.engine.imessage("state.copied.state",[e.label])}}),new ie(this,B.Delete,this.host.engine.i18n("state.delete.state"),{onClick:()=>{this.deleteState(t),this.host.engine.imessage("state.deleted.state",[e.label])}})])))}async copyState(e){await this.host.copySettings(e,!1)}async copyGame(e){const t=e??this.host.game.save(),i=JSON.stringify(t),n=this.setting.compress.enabled?this.host.game.compressLZData(i):i;await T.window.navigator.clipboard.writeText(n)}import(){const e=T.window.prompt(this.host.engine.i18n("state.loadPrompt"));if(m(e))return;const t=new Date().toDateString();let i=1;const n=()=>this.host.engine.i18n("state.importedState",[`${t} #${i++}`]),a=r=>{try{const h=ge.decodeSettings(r);this.storeState(h,n()),this.host.engine.imessage("state.imported.state");return}catch{}try{const h=JSON.parse(r),d=ge.decodeSettings(h.state);this.storeState(d,h.label),this.host.engine.imessage("state.imported.state");return}catch{}let o;try{o=JSON.parse(r)}catch{const d=this.host.game.decompressLZData(r);try{o=JSON.parse(d)}catch{if(r.match(/\r?\n/))return r.split(/\r?\n/).map(f=>void a(f));throw new fi("The provided input can not be parsed as anything we understand.")}}let l;if(!m(o)&&"ks"in o&&!m(o.ks)){const h=o.ks.state[0];l=this.storeState(h,n())??void 0,this.host.engine.imessage("state.imported.state"),o.ks=void 0}this.storeGame(o,l),this.host.engine.imessage("state.imported.game")};a(e)}storeGame(e,t){let i=t;return m(i)&&(i=T.window.prompt(this.host.engine.i18n("state.storeGame.prompt"))??void 0),m(i)?null:(i=(i===""?void 0:i)??this.host.engine.i18n("state.unlabeledGame"),i=i.substring(0,127),this.games.push(new yt({game:e??this.host.game.save(),label:i,timestamp:new Date().toISOString()})),this._storeGames(),this.requestRefresh(),i)}storeState(e,t){let i=t;return m(i)&&(i=T.window.prompt(this.host.engine.i18n("state.storeState.prompt"))??void 0),m(i)?null:(i=(i===""?void 0:i)??this.host.engine.i18n("state.unlabeledState"),i=i.substring(0,127),this.states.push(new yt({label:i,state:e??this.host.engine.stateSerialize(),timestamp:new Date().toISOString()})),this._storeStates(),this.requestRefresh(),i)}storeStateFactoryDefaults(){this.storeState(oe.DEFAULT_STATE)}storeAutoSave(e){const t=this.states.find(i=>i.unwrap().label==="Auto-Save");if(!m(t)){console.info(...v("Updating existing Auto-Save...")),t.replace({...t.unwrap(),state:e,timestamp:new Date().toISOString()}),this._storeStates(),this.requestRefresh();return}console.info(...v("Storing new Auto-Save...")),this.storeState(e,"Auto-Save")}exportStateAll(){const e=this.states.map(a=>a.unwrap()).map(a=>JSON.stringify({label:a.label,state:ge.encodeSettings(a.state,!1),timestamp:a.timestamp})).join(`
21
+ `),t=document.createElement("a"),i=new Blob([e],{type:"application/x-ndjson"}),n=URL.createObjectURL(i);t.setAttribute("href",n),t.setAttribute("download",`ks-local-states-${Date.now()}.ndjson`),t.click()}async loadGame(e){this._destructiveActionPrevented()||await new $o(this.host.game).loadRaw(e)}loadState(e){this._destructiveActionPrevented()||(this.host.engine.stateLoad(e,!0),this.host.refreshEntireUserInterface())}loadAutoSave(){if(this.host.engine.isLoaded){console.info(...v("Not attempting to load Auto-Save, because a state is already loaded."));return}const e=this.states.find(t=>t.unwrap().label==="Auto-Save");if(m(e)){console.info(...v("No Auto-Save settings found."));return}console.info(...v("Loading Auto-Save...")),this.host.engine.stateLoad(e.unwrap().state,!1)}updateGame(e,t){if(this._destructiveActionPrevented())return;const i=e.unwrap().label;e.replace({game:t,label:i,timestamp:new Date().toISOString()}),this._storeGames(),this.requestRefresh()}updateState(e,t){if(this._destructiveActionPrevented())return;const i=e.unwrap().label;e.replace({label:i,state:t,timestamp:new Date().toISOString()}),this._storeStates(),this.requestRefresh()}deleteGame(e,t=!1){if(!t&&this._destructiveActionPrevented())return;const i=this.games.indexOf(e);i<0||(this.games.splice(i,1),this._storeGames(),this.requestRefresh())}deleteState(e,t=!1){if(!t&&this._destructiveActionPrevented())return;const i=this.states.indexOf(e);i<0||(this.states.splice(i,1),this._storeStates(),this.requestRefresh())}_destructiveActionPrevented(){return!this.setting.noConfirm.enabled&&!T.window.confirm(this.host.engine.i18n("state.confirmDestruction"))}}class Re extends _e{constructor(e,t,i,n){super(e,new de(e,t,{classes:[O.checked,O.setting],icon:n==null?void 0:n.icon}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]),n);u(this,"setting");this.setting=i}}class Lo extends Re{constructor(e,t,i){var r,o;const n=e.host.engine.i18n("ui.build");super(e,n,t,{icon:B.Bonfire,onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&Object.values(t.buildings).some(l=>l.enabled&&l.trigger<=0)}});u(this,"_buildings");this._buildings=[];for(const l of this.host.game.bld.buildingGroups){this._buildings.push(new D(this,l.title));for(const h of l.buildings){if(h==="unicornPasture"||m(this.setting.buildings[h]))continue;const d=this.host.game.bld.getBuildingExt(h).meta;if(m(d.stages))m(d.label)||this._buildings.push(this._getResetOption(this,this.setting.buildings[h],i,t,d.label));else{const g=(r=Object.values(this.setting.buildings).find(f=>f.baseBuilding===h))==null?void 0:r.building;this._buildings.push(this._getResetOption(this,this.setting.buildings[h],i,t,d.stages[0].label),this._getResetOption(this,this.setting.buildings[g],i,t,d.stages[1].label,!1,!0))}}l!==this.host.game.bld.buildingGroups[this.host.game.bld.buildingGroups.length-1]&&((o=this._buildings.at(-1))==null||o.element.addClass(ke.delimiter))}const a=new x(this);a.addChildren(this._buildings),this.addChildContent(a)}_getResetOption(e,t,i,n,a,r=!1,o=!1){const l=new F(e,t,i,a,{delimiter:r,onCheck:()=>{e.host.engine.imessage("status.reset.check.enable",[a])},onRefreshRequest:()=>{l.triggerButton.inactive=!t.enabled||t.trigger===-1,l.triggerButton.ineffective=n.enabled&&t.enabled&&t.trigger===-1},onSetTrigger:async()=>{const h=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.absolute"),e.host.engine.i18n("ui.trigger.build.prompt",[a,t.trigger!==-1?e.host.renderAbsolute(t.trigger,i.selected):e.host.engine.i18n("ui.trigger.inactive")]),t.trigger!==-1?e.host.renderAbsolute(t.trigger):"",e.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(h!==void 0){if(h===""||h.startsWith("-")){t.trigger=-1,t.enabled=!1;return}t.trigger=Number(h)}},onUnCheck:()=>{e.host.engine.imessage("status.reset.check.disable",[a])},upgradeIndicator:o});return l.triggerButton.element.addClass(C.lastHeadAction),l}}class Oo extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.faith");super(s,i,e,{icon:B.Religion,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(a=>a.enabled&&a.trigger<=0)}}),this.addChildrenHead([new R(s,{classes:[M.fillSpace]})]);const n=[...kt];this.addChildContent(new x(this).addChildren([new D(this,this.host.engine.i18n("$religion.panel.ziggurat.label")),this._getResetOption(this,this.setting.buildings.unicornPasture,t,e,this.host.engine.i18n("$buildings.unicornPasture.label")),...this.host.game.religion.zigguratUpgrades.filter(a=>n.includes(a.name)&&!m(this.setting.buildings[a.name])).map(a=>this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label)),new te(this),...this.host.game.religion.zigguratUpgrades.filter(a=>!n.includes(a.name)&&!m(this.setting.buildings[a.name])).map(a=>this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label)),new te(this),new D(this,this.host.engine.i18n("$religion.panel.orderOfTheSun.label")),...this.host.game.religion.religionUpgrades.filter(a=>!m(this.setting.buildings[a.name])).map(a=>{var r;return this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label,a.name===((r=this.host.game.religion.religionUpgrades.at(-1))==null?void 0:r.name))}),new D(this,this.host.engine.i18n("$religion.panel.cryptotheology.label")),...this.host.game.religion.transcendenceUpgrades.filter(a=>!m(this.setting.buildings[a.name])).map(a=>this._getResetOption(this,this.setting.buildings[a.name],t,e,a.label))]))}_getResetOption(s,e,t,i,n,a=!1,r=!1){const o=new F(s,e,t,n,{delimiter:a,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[n])},onRefreshRequest:()=>{o.triggerButton.inactive=!e.enabled||e.trigger===-1,o.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.absolute"),s.host.engine.i18n("ui.trigger.build.prompt",[n,e.trigger!==-1?s.host.renderAbsolute(e.trigger,t.selected):s.host.engine.i18n("ui.trigger.inactive")]),e.trigger!==-1?s.host.renderAbsolute(e.trigger):"",s.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1,e.enabled=!1;return}e.trigger=Number(l)}},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[n])},upgradeIndicator:r});return o.triggerButton.element.addClass(C.lastHeadAction),o}}class Uo extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.resources");super(s,i,e,{icon:B.Resources,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.resources).some(o=>o.enabled&&o.trigger<0)}}),this.addChildrenHead([new R(s,{classes:[M.fillSpace]})]);const n=this.host.game.resPool.resources,a=[];let r=n[0].title;for(const o of[...n].sort((l,h)=>l.title.localeCompare(h.title,t.selected))){const l=this.setting.resources[o.name],h=new F(this,l,t,X(o.title),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[o.title])},onRefreshRequest:()=>{h.triggerButton.inactive=!l.enabled||l.trigger===-1,h.triggerButton.ineffective=e.enabled&&l.enabled&&l.trigger===-1},onSetTrigger:async()=>{const d=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.float"),this.host.engine.i18n("ui.trigger.build.prompt",[o.title,l.trigger!==-1?this.host.renderAbsolute(l.trigger,t.selected):this.host.engine.i18n("ui.trigger.inactive")]),l.trigger!==-1?this.host.renderAbsolute(l.trigger):"",this.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(d!==void 0){if(d===""||d.startsWith("-")){l.trigger=-1,l.enabled=!1;return}l.trigger=s.host.parseAbsolute(d)??l.trigger}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[o.title])}});h.triggerButton.element.addClass(C.lastHeadAction),this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&r[0]!==o.title[0]&&h.element.addClass(M.splitter),a.push(h),r=o.title}this.addChildContent(new x(this).addChildren(a))}}class Do extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.space");super(s,i,e,{icon:B.Space,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&n.trigger<=0)}}),this.addChildrenHead([new R(s,{classes:[M.fillSpace]})]),this.addChildContent(new x(this).addChildren(this.host.game.space.planets.filter(n=>0<n.buildings.length).flatMap((n,a,r)=>[new D(this,this.host.engine.labelForPlanet(n.name)),...n.buildings.filter(o=>!m(this.setting.buildings[o.name])).map((o,l,h)=>this._getResetOption(this,this.setting.buildings[o.name],t,e,o.label,a<r.length-1&&l===h.length-1))])))}_getResetOption(s,e,t,i,n,a=!1,r=!1){const o=new F(s,e,t,n,{delimiter:a,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[n])},onRefreshRequest:()=>{o.triggerButton.inactive=!e.enabled||e.trigger===-1,o.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.absolute"),s.host.engine.i18n("ui.trigger.build.prompt",[n,e.trigger!==-1?s.host.renderAbsolute(e.trigger,t.selected):s.host.engine.i18n("ui.trigger.inactive")]),e.trigger!==-1?s.host.renderAbsolute(e.trigger):"",s.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1,e.enabled=!1;return}e.trigger=Number(l)}},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[n])},upgradeIndicator:r});return o.triggerButton.element.addClass(C.lastHeadAction),o}}class No extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.time");super(s,i,e,{icon:B.Time,onRefreshRequest:()=>{this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&n.trigger<=0)}}),this.addChildrenHead([new R(s,{classes:[M.fillSpace]})]),this.addChildContent(new x(this).addChildren([new D(this,this.host.engine.i18n("$workshop.chronoforge.label")),...this.host.game.time.chronoforgeUpgrades.filter(n=>!m(this.setting.buildings[n.name])).map(n=>{var a;return this._getResetOption(this,this.setting.buildings[n.name],t,e,n.label,n.name===((a=this.host.game.time.chronoforgeUpgrades.at(-1))==null?void 0:a.name))}),new D(this,this.host.engine.i18n("$science.voidSpace.label")),...this.host.game.time.voidspaceUpgrades.filter(n=>n.name in this.setting.buildings).map(n=>this._getResetOption(this,this.setting.buildings[n.name],t,e,n.label))]))}_getResetOption(s,e,t,i,n,a=!1,r=!1){const o=new F(s,e,t,n,{delimiter:a,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[n])},onRefreshRequest:()=>{o.triggerButton.inactive=!e.enabled||e.trigger===-1,o.triggerButton.ineffective=i.enabled&&e.enabled&&e.trigger===-1},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.absolute"),s.host.engine.i18n("ui.trigger.build.prompt",[n,e.trigger!==-1?s.host.renderAbsolute(e.trigger,t.selected):s.host.engine.i18n("ui.trigger.inactive")]),e.trigger!==-1?s.host.renderAbsolute(e.trigger):"",s.host.engine.i18n("ui.trigger.reset.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1,e.enabled=!1;return}e.trigger=Number(l)}},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[n])},upgradeIndicator:r});return o.triggerButton.element.addClass(C.lastHeadAction),o}}class qo extends Re{constructor(s,e,t){const i=s.host.engine.i18n("ui.upgrades");super(s,i,e,{icon:B.Workshop}),this.addChildrenHead([new R(s,{classes:[M.fillSpace]})]);const n=this.host.game.workshop.upgrades.filter(l=>!m(this.setting.upgrades[l.name])),a=[];let r=n[0].label,o;for(const l of n.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.upgrades[l.name],d=this._getResetOption(this,h,l.label);this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&r[0]!==l.label[0]&&(m(o)||o.element.addClass(ke.delimiter),d.element.addClass(M.splitter)),o=d,a.push(d),r=l.label}this.addChildContent(new x(this).addChildren(a))}_getResetOption(s,e,t,i=!1,n=!1){return new S(s,e,t,{delimiter:i,onCheck:()=>{s.host.engine.imessage("status.reset.check.enable",[t])},onUnCheck:()=>{s.host.engine.imessage("status.reset.check.disable",[t])},upgradeIndicator:n})}}class zo extends U{constructor(e,t,i){const n=e.host.engine.i18n("option.time.reset");super(e,t,new S(e,t,n,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&[this._bonfireUi,this._religionUi,this._resourcesUi,this._spaceUi,this._timeUi,this._upgradesUi].some(r=>r.expando.ineffective)}});u(this,"_bonfireUi");u(this,"_religionUi");u(this,"_resourcesUi");u(this,"_spaceUi");u(this,"_timeUi");u(this,"_upgradesUi");const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1});this._bonfireUi=new Lo(this,this.setting.bonfire,i),this._religionUi=new Oo(this,this.setting.religion,i),this._resourcesUi=new Uo(this,this.setting.resources,i),this._spaceUi=new Do(this,this.setting.space,i),this._timeUi=new No(this,this.setting.time,i),this._upgradesUi=new qo(this,this.setting.upgrades,i),a.addChildren([this._bonfireUi,this._religionUi,this._resourcesUi,this._spaceUi,this._timeUi,this._upgradesUi]),this.addChildContent(a)}}class As extends x{constructor(e,t,i){super(e,i);u(this,"setting");this.setting=t;const n=(r,o)=>{const l=e.host.engine.labelForCycle(r);return new S(e,o,l,{onCheck:h=>{var d;(d=i==null?void 0:i.onCheckCycle)==null||d.call(i,l,o,h)},onUnCheck:h=>{var d;(d=i==null?void 0:i.onUnCheckCycle)==null||d.call(i,l,o,h)}})},a=[n("charon",this.setting.charon),n("umbra",this.setting.umbra),n("yarn",this.setting.yarn),n("helios",this.setting.helios),n("cath",this.setting.cath),n("redmoon",this.setting.redmoon),n("dune",this.setting.dune),n("piscine",this.setting.piscine),n("terminus",this.setting.terminus),n("kairo",this.setting.kairo)];this.addChildren(a),this.element[0].addEventListener("enableAll",()=>{for(const r of a)r.check(!0)}),this.element[0].addEventListener("disableAll",()=>{for(const r of a)r.uncheck(!0)})}}class Ut extends x{constructor(e,t,i){super(e,i);u(this,"setting");u(this,"spring");u(this,"summer");u(this,"autumn");u(this,"winter");this.setting=t;const n=(a,r)=>new S(this,r,a,{onCheck:o=>{var l;(l=i==null?void 0:i.onCheckSeason)==null||l.call(i,a,r,o)},onUnCheck:o=>{var l;(l=i==null?void 0:i.onUnCheckSeason)==null||l.call(i,a,r,o)}});this.spring=n(this.host.engine.i18n("$calendar.season.spring"),this.setting.spring),this.summer=n(this.host.engine.i18n("$calendar.season.summer"),this.setting.summer),this.autumn=n(this.host.engine.i18n("$calendar.season.autumn"),this.setting.autumn),this.winter=n(this.host.engine.i18n("$calendar.season.winter"),this.setting.winter),this.addChildren([this.spring,this.summer,this.autumn,this.winter])}toString(){return`[${Ut.name}#${this.componentId}]`}}class Fo extends U{constructor(s,e,t,i,n){const a=s.host.engine.i18n("option.time.activeHeatTransfer");super(s,e,new F(s,e,t,a,{onCheck:r=>{s.host.engine.imessage("status.auto.enable",[a])},onSetTrigger:async()=>{const r=await E.prompt(s,s.host.engine.i18n("ui.trigger.activeHeatTransfer.prompt"),s.host.engine.i18n("ui.trigger.activeHeatTransfer.promptTitle",[s.host.renderPercentage(e.trigger,t.selected,!0)]),s.host.renderPercentage(e.trigger),s.host.engine.i18n("ui.trigger.activeHeatTransfer.promptExplainer"));r===void 0||r===""||r.startsWith("-")||(e.trigger=s.host.parsePercentage(r))},onUnCheck:r=>{s.host.engine.imessage("status.auto.disable",[a]),e.activeHeatTransferStatus.enabled=!1}}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled,this.settingItem.triggerButton.ineffective=n.enabled&&i.enabled&&e.enabled&&e.trigger===-1,this.expando.ineffective=n.enabled&&i.enabled&&e.enabled&&!Object.values(e.cycles).some(r=>r.enabled),e.activeHeatTransferStatus.enabled?(this.head.elementLabel.attr("data-ks-active-from","◎"),this.head.elementLabel.attr("data-ks-active-to","◎"),this.head.elementLabel.addClass(Pt.active)):this.head.elementLabel.removeClass(Pt.active)}}),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new As(this,this.setting.cycles,{onCheckCycle:r=>{this.host.engine.imessage("time.heatTransfer.cycle.enable",[r])},onUnCheckCycle:r=>{this.host.engine.imessage("time.heatTransfer.cycle.disable",[r])}})]))}}class Ho extends U{constructor(e,t,i,n){const a=e.host.engine.i18n("option.time.skip");super(e,t,new At(e,t,i,a,{onCheck:r=>{e.host.engine.imessage("status.auto.enable",[a])},onRefreshMax(){this.maxButton.updateLabel(e.host.renderAbsolute(t.max)),this.maxButton.element[0].title=t.max<0?e.host.engine.i18n("ui.max.timeSkip.titleInfinite",[a]):t.max===0?e.host.engine.i18n("ui.max.timeSkip.titleZero",[a]):e.host.engine.i18n("ui.max.timeSkip.title",[e.host.renderAbsolute(t.max),a])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):`${e.host.renderFloat(t.trigger,i.selected)} TC`])},onSetMax:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.max.timeSkip.prompt"),e.host.engine.i18n("ui.max.timeSkip.promptTitle",[e.host.renderAbsolute(t.max,i.selected)]),e.host.renderAbsolute(t.max),e.host.engine.i18n("ui.max.timeSkip.promptExplainer"));if(r!==void 0){if(r===""||r.startsWith("-")){t.max=-1;return}r==="0"&&(t.enabled=!1),t.max=e.host.parseAbsolute(r)??t.max}},onSetTrigger:async()=>{const r=await E.prompt(e,e.host.engine.i18n("ui.trigger.timeSkip.prompt"),e.host.engine.i18n("ui.trigger.timeSkip.promptTitle",[e.host.renderAbsolute(t.trigger,i.selected)]),e.host.renderAbsolute(t.trigger),e.host.engine.i18n("ui.trigger.timeSkip.promptExplainer"));r===void 0||r===""||r.startsWith("-")||(t.trigger=e.host.parseAbsolute(r)??t.trigger)},onUnCheck:r=>{e.host.engine.imessage("status.auto.disable",[a])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.maxButton.inactive=!t.enabled||t.max===-1,this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.maxButton.ineffective=n.enabled&&t.enabled&&t.max===0,this._cycles.expando.ineffective=n.enabled&&t.enabled&&!Object.values(t.cycles).some(r=>r.enabled),this._seasons.expando.ineffective=n.enabled&&t.enabled&&!Object.values(t.seasons).some(r=>r.enabled)}});u(this,"_cycles");u(this,"_seasons");u(this,"_activeHeatTransferUI");this.settingItem.triggerButton.element.removeClass(C.lastHeadAction),this._cycles=new _e(this,new de(this,X(this.host.engine.i18n("ui.cycles")),{classes:[O.checked,O.setting],icon:B.Cycles}).addChildrenHead([new R(this,{classes:[M.fillSpace]})])).addChildrenContent([new As(this,this.setting.cycles,{onCheckCycle:r=>{this.host.engine.imessage("time.skip.cycle.enable",[r])},onUnCheckCycle:r=>{this.host.engine.imessage("time.skip.cycle.disable",[r])}})]),this._seasons=new _e(this,new de(this,X(this.host.engine.i18n("trade.seasons")),{classes:[O.checked,O.setting],icon:B.Seasons}).addChildrenHead([new R(this,{classes:[M.fillSpace]})])).addChildrenContent([new Ut(this,this.setting.seasons,{onCheckSeason:r=>{this.host.engine.imessage("time.skip.season.enable",[r])},onUnCheckSeason:r=>{this.host.engine.imessage("time.skip.season.disable",[r])}})]),this._activeHeatTransferUI=new Fo(this,this.setting.activeHeatTransfer,i,t,n),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([this._cycles,this._seasons,new S(this,this.setting.ignoreOverheat,this.host.engine.i18n("option.time.skip.ignoreOverheat")),this._activeHeatTransferUI]))}}class yi extends U{constructor(e,t,i){console.debug(...v(`Constructing ${yi.name}`));const n=e.host.engine.i18n("ui.timeCtrl");super(e,t,new S(e,t,n,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&[this._timeSkipUi,this._resetUi].some(o=>o.expando.ineffective)}});u(this,"_items");u(this,"_accelerateTime");u(this,"_timeSkipUi");u(this,"_resetUi");const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1}),r=this.host.engine.i18n("option.accelerate");this._accelerateTime=new F(this,this.setting.accelerateTime,i,r,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[r])},onRefresh:()=>{this._accelerateTime.triggerButton.inactive=!this.setting.accelerateTime.enabled,this._accelerateTime.triggerButton.ineffective=this.setting.enabled&&this.setting.accelerateTime.enabled&&this.setting.accelerateTime.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.accelerateTime.prompt"),this.host.engine.i18n("ui.trigger.accelerateTime.promptTitle",[this.host.renderPercentage(this.setting.accelerateTime.trigger,i.selected,!0)]),this.host.renderPercentage(this.setting.accelerateTime.trigger),this.host.engine.i18n("ui.trigger.accelerateTime.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.accelerateTime.trigger=this.host.parsePercentage(o))},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[r])}}),this._accelerateTime.triggerButton.element.addClass(C.lastHeadAction),this._timeSkipUi=new Ho(this,this.setting.timeSkip,i,t),this._resetUi=new zo(this,this.setting.reset,i),this._items=[this._accelerateTime,this._timeSkipUi,this._resetUi],a.addChildren(this._items),this.addChildContent(a)}}class wi extends U{constructor(s,e,t){console.debug(...v(`Constructing ${wi.name}`));const i=s.host.engine.i18n("ui.time");super(s,e,new F(s,e,t,i,{onCheck:n=>{s.host.engine.imessage("status.auto.enable",[i])},onRefresh:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger===-1},onRefreshTrigger(){this.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger.section",[e.trigger<0?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const n=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[i,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(n!==void 0){if(n===""||n.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(n)}},onUnCheck:n=>{s.host.engine.imessage("status.auto.disable",[i])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger<0,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger<0&&Object.values(e.buildings).some(n=>n.enabled&&0<n.max&&n.trigger<0),this.expando.ineffective=e.enabled&&Object.values(e.buildings).some(n=>n.enabled&&(n.max===0||n.trigger<0&&e.trigger<0))}}),this.addChildrenContent([new x(this).addChildren([new D(this,this.host.engine.i18n("$workshop.chronoforge.label")),...this.host.game.time.chronoforgeUpgrades.filter(n=>!m(this.setting.buildings[n.name])).map(n=>{var a;return le.getBuildOption(this,this.setting.buildings[n.name],t,this.setting,n.label,i,{delimiter:n.name===((a=this.host.game.time.chronoforgeUpgrades.at(-1))==null?void 0:a.name),renderLabelTrigger:!1})}),new D(this,this.host.engine.i18n("$science.voidSpace.label")),...this.host.game.time.voidspaceUpgrades.filter(n=>n.name in this.setting.buildings).map(n=>le.getBuildOption(this,this.setting.buildings[n.name],t,this.setting,n.label,i,{renderLabelTrigger:!1}))]),new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new D(this,this.host.engine.i18n("ui.additional")),new S(this,this.setting.fixCryochambers,this.host.engine.i18n("option.fix.cry"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.fix.cry")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.fix.cry")])}})])])}}const Wo={buyButton:"_buyButton_10eul_1"};class ki extends Ce{constructor(e,t,i,n){super(e,void 0,{onClick:async()=>{const a=await E.prompt(e,e.host.engine.i18n("blackcoin.buy.prompt"),e.host.engine.i18n("blackcoin.buy.promptTitle",[e.host.renderAbsolute(t.buy,i.selected)]),e.host.renderAbsolute(t.buy),e.host.engine.i18n("blackcoin.buy.promptExplainer"));if(a!==void 0){if(a===""||a.startsWith("-")){t.buy=-1;return}t.buy=e.host.parseAbsolute(a)??t.buy}},onRefresh:()=>{var a;this.element.prop("title",this.host.engine.i18n("blackcoin.buy.title",[this.host.renderAbsolute(this.setting.buy)])),this.element.text(this.host.engine.i18n("blackcoin.buy",[this.host.renderAbsolute(this.setting.buy)])),(a=n==null?void 0:n.onRefresh)==null||a.call(this)}});u(this,"setting");this.element.addClass(Wo.buyButton),this.setting=t}toString(){return`[${ki.name}#${this.componentId}]`}}const Go={sellButton:"_sellButton_1tmvd_1"};class _i extends Ce{constructor(e,t,i,n){super(e,void 0,{onClick:async()=>{const a=await E.prompt(e,e.host.engine.i18n("blackcoin.sell.prompt"),e.host.engine.i18n("blackcoin.sell.promptTitle",[e.host.renderAbsolute(t.sell,i.selected)]),e.host.renderAbsolute(t.sell),e.host.engine.i18n("blackcoin.sell.promptExplainer"));if(a!==void 0){if(a===""||a.startsWith("-")){t.sell=-1;return}t.sell=e.host.parseAbsolute(a)??t.sell}},onRefresh:()=>{var a;this.element.prop("title",this.host.engine.i18n("blackcoin.sell.title",[this.host.renderAbsolute(this.setting.sell)])),this.element.text(this.host.engine.i18n("blackcoin.sell",[this.host.renderAbsolute(this.setting.sell)])),(a=n==null?void 0:n.onRefresh)==null||a.call(n)}});u(this,"setting");this.element.addClass(Go.sellButton),this.setting=t}toString(){return`[${_i.name}#${this.componentId}]`}}class Dt extends J{constructor(e,t,i){super(e,"",B.Eco,{border:!1,classes:[],onClick:()=>{var n,a;this.setting.limited=!this.setting.limited,this.setting.limited?(n=i==null?void 0:i.onLimitedCheck)==null||n.call(this):(a=i==null?void 0:i.onLimitedUnCheck)==null||a.call(this)},onRefresh:()=>{var n;this.updateTitle(this.host.engine.i18n(this.setting.limited?"ui.limited.on":"ui.limited.off")),this.setting.limited&&!this.inactive?this.element.removeClass(C.inactive):this.element.addClass(C.inactive),(n=i==null?void 0:i.onRefresh)==null||n.call(this)}});u(this,"setting");this.setting=t;for(const n of(i==null?void 0:i.classes)??[])this.element.addClass(n)}toString(){return`[${Dt.name}#${this.componentId}]`}}class Ci extends S{constructor(e,t,i,n){super(e,t,i,n);u(this,"limitedButton");this.limitedButton=new Dt(e,t,{border:!1,onLimitedCheck:n!=null&&n.onLimitedCheck?()=>{var a;return(a=n.onLimitedCheck)==null?void 0:a.call(this)}:void 0,onLimitedUnCheck:n!=null&&n.onLimitedUnCheck?()=>{var a;return(a=n.onLimitedUnCheck)==null?void 0:a.call(this)}:void 0}),this.addChildrenHead([new R(e,{classes:[M.fillSpace]}),this.limitedButton])}toString(){return`[${Ci.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Si extends Ci{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"triggerButton");this.triggerButton=new Ee(e,t,i,{border:!1,onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildHead(this.triggerButton)}toString(){return`[${Si.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Nt extends S{constructor(e,t,i,n){super(e,t,i,n);u(this,"maxButton");this.maxButton=new Pe(e,t,{border:!1,onClick:async()=>{await n.onSetMax.call(this)},onRefresh:n!=null&&n.onRefreshMax?()=>{var a;return(a=n.onRefreshMax)==null?void 0:a.call(this)}:void 0}),this.addChildrenHead([new R(e,{classes:[M.fillSpace]}),this.maxButton])}toString(){return`[${Nt.name}#${this.componentId}]: '${this.elementLabel.text()}'`}}class Zo extends U{constructor(s,e,t,i){const n=s.host.engine.i18n("option.embassies");super(s,e,new F(s,e,t,n,{onCheck:r=>{s.host.engine.imessage("status.auto.enable",[n])},onSetTrigger:async()=>{const r=await E.prompt(s,s.host.engine.i18n("ui.trigger.embassies.prompt"),s.host.engine.i18n("ui.trigger.embassies.promptTitle",[s.host.renderPercentage(e.trigger,t.selected,!0)]),s.host.renderPercentage(e.trigger),s.host.engine.i18n("ui.trigger.embassies.promptExplainer"));r===void 0||r===""||r.startsWith("-")||(e.trigger=s.host.parsePercentage(r))},onUnCheck:r=>{s.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger===-1,this.expando.ineffective=i.enabled&&e.enabled&&!Object.values(e.races).some(r=>r.enabled)}});const a=new x(this).addChildren(this.host.game.diplomacy.races.filter(r=>r.name!=="leviathans"&&!m(this.setting.races[r.name])).map(r=>this._makeEmbassySetting(this,this.setting.races[r.name],t.selected,e,r.title)));this.addChildContent(a)}_makeEmbassySetting(s,e,t,i,n){const a=async()=>{const o=await E.prompt(s,s.host.engine.i18n("ui.max.prompt.absolute"),s.host.engine.i18n("ui.max.build.prompt",[n,s.host.renderAbsolute(e.max,t)]),s.host.renderAbsolute(e.max),s.host.engine.i18n("ui.max.build.promptExplainer"));if(o!==void 0){if(o===""||o.startsWith("-")){e.max=-1;return}o==="0"&&(e.enabled=!1),e.max=s.host.parseAbsolute(o)??e.max}},r=new Nt(s,e,n,{onCheck:o=>{if(s.host.engine.imessage("status.sub.enable",[n]),e.max===0&&!o)return a()},onRefresh:()=>{r.maxButton.inactive=!e.enabled||e.max===-1,r.maxButton.ineffective=i.enabled&&e.enabled&&e.max===0},onRefreshMax:()=>{r.maxButton.updateLabel(s.host.renderAbsolute(e.max)),r.maxButton.element[0].title=e.max<0?s.host.engine.i18n("ui.max.embassy.titleInfinite",[n]):e.max===0?s.host.engine.i18n("ui.max.embassy.titleZero",[n]):s.host.engine.i18n("ui.max.embassy.title",[s.host.renderAbsolute(e.max),n])},onSetMax:a,onUnCheck:()=>{s.host.engine.imessage("status.sub.disable",[n])}});return r.maxButton.element.addClass(C.lastHeadAction),r}}class xi extends U{constructor(e,t,i){console.debug(...v(`Constructing ${xi.name}`));const n=e.host.engine.i18n("ui.trade");super(e,t,new F(e,t,i,n,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const o=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(o!==void 0){if(o===""||o.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(o)}},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.races).some(o=>o.enabled&&o.trigger<0),this.expando.ineffective=t.enabled&&Object.values(this._racePanels).some(o=>o.expando.ineffective||o.settingItem.triggerButton.ineffective)}});u(this,"_racePanels");this._racePanels=this.host.game.diplomacy.races.filter(o=>!m(this.setting.races[o.name])).map(o=>{var l;return this._getTradeOption(this,this.setting.races[o.name],i,t,o.title,n,o.name===((l=this.host.game.diplomacy.races.at(-2))==null?void 0:l.name))});const a=new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren(this._racePanels);a.addChild(new S(this,this.setting.feedLeviathans,this.host.engine.i18n("option.autofeed"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.autofeed")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.autofeed")])}})),a.addChild(new U(this,this.setting.tradeBlackcoin,new F(this,this.setting.tradeBlackcoin,i,this.host.engine.i18n("option.crypto"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.crypto")])},onRefreshRequest(){this.triggerButton.inactive=!this.setting.enabled||this.setting.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.crypto.promptTitle"),this.host.engine.i18n("ui.trigger.crypto.prompt",[this.host.renderAbsolute(this.setting.tradeBlackcoin.trigger,i.selected)]),this.host.renderAbsolute(this.setting.tradeBlackcoin.trigger),this.host.engine.i18n("ui.trigger.crypto.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.tradeBlackcoin.trigger=this.host.parseAbsolute(o)??this.setting.tradeBlackcoin.trigger)},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.crypto")])}})).addChildrenContent([new ki(this,this.setting.tradeBlackcoin,i),new _i(this,this.setting.tradeBlackcoin,i)])),this.addChildContent(a);const r=new x(this,{hasDisableAll:!1,hasEnableAll:!1});r.addChild(new D(this,this.host.engine.i18n("ui.additional"))),r.addChild(new Zo(this,this.setting.buildEmbassies,i,t)),r.addChild(new S(this,this.setting.unlockRaces,this.host.engine.i18n("ui.upgrade.races"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("ui.upgrade.races")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("ui.upgrade.races")])}})),this.addChildContent(r)}_getTradeOption(e,t,i,n,a,r,o=!1,l=!1){const h=new Si(e,t,i,a,{delimiter:o,onCheck:()=>{e.host.engine.imessage("status.sub.enable",[a])},onLimitedCheck:()=>{e.host.engine.imessage("trade.limited",[a])},onLimitedUnCheck:()=>{e.host.engine.imessage("trade.unlimited",[a])},onRefreshTrigger:()=>{h.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger",[t.trigger<0?n.trigger<0?e.host.engine.i18n("ui.trigger.section.blocked",[r]):`${e.host.renderPercentage(n.trigger,i.selected,!0)} (${e.host.engine.i18n("ui.trigger.section.inherited")})`:e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const g=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[a,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.trigger.section.inherited")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(g!==void 0){if(g===""||g.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(g)}},onUnCheck:()=>{e.host.engine.imessage("status.sub.disable",[a])},renderLabelTrigger:!1,upgradeIndicator:l}),d=new U(e,t,h,{onRefreshRequest:()=>{h.limitedButton.inactive=!t.enabled||!t.limited,h.triggerButton.inactive=!t.enabled||t.trigger===-1,h.triggerButton.ineffective=n.enabled&&t.enabled&&n.trigger===-1&&t.trigger===-1,d.expando.ineffective=n.enabled&&t.enabled&&!t.seasons.autumn.enabled&&!t.seasons.spring.enabled&&!t.seasons.summer.enabled&&!t.seasons.winter.enabled}}).addChildContent(new Ut(e,t.seasons,{onCheckSeason:g=>{e.host.engine.imessage("trade.season.enable",[X(a),g])},onUnCheckSeason:g=>{e.host.engine.imessage("trade.season.disable",[X(a),g])}}));return d}}const Ti={spacer:"_spacer_auis8_44",ui:"_ui_auis8_49",showActivity:"_showActivity_auis8_66"};class Ei extends U{constructor(e,t,i){console.debug(...v(`Constructing ${Ei.name}`));const n=e.host.engine.i18n("ui.distribute");super(e,t,new S(e,t,n,{onCheck:o=>{e.host.engine.imessage("status.auto.enable",[n])},onUnCheck:o=>{e.host.engine.imessage("status.auto.disable",[n])}}).addChildrenHead([new R(e,{classes:[M.fillSpace]})]),{onRefreshRequest:()=>{this.expando.ineffective=t.enabled&&Object.values(t.jobs).some(o=>o.enabled&&o.max===0)}});u(this,"_hunt");u(this,"_festivals");u(this,"_promoteKittens");u(this,"_promoteLeader");u(this,"_electLeader");const a=new x(this).addChildren(this.host.game.village.jobs.filter(o=>!m(this.setting.jobs[o.name])).map(o=>this._getDistributeOption(this.setting.jobs[o.name],i.selected,t,o.title)));this.addChildContent(a);const r=new x(this,{hasDisableAll:!1,hasEnableAll:!1});r.addChild(new D(this,this.host.engine.i18n("ui.additional"))),this._hunt=new F(this,this.setting.hunt,i,this.host.engine.i18n("option.hunt"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.hunt")])},onRefreshRequest:()=>{this._hunt.triggerButton.inactive=!this.setting.hunt.enabled,this._hunt.triggerButton.ineffective=this.setting.enabled&&this.setting.hunt.enabled&&this.setting.hunt.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.hunt.prompt",[this.host.renderPercentage(this.setting.hunt.trigger,i.selected,!0)]),this.host.renderPercentage(this.setting.hunt.trigger),this.host.engine.i18n("ui.trigger.hunt.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.hunt.trigger=this.host.parsePercentage(o))},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.hunt")])}}),this._hunt.triggerButton.element.addClass(C.lastHeadAction),r.addChild(this._hunt),this._festivals=new S(this,this.setting.holdFestivals,this.host.engine.i18n("option.festival"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.festival")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.festival")])}}),r.addChild(this._festivals),this._promoteKittens=new F(this,this.setting.promoteKittens,i,this.host.engine.i18n("option.promotekittens"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.promotekittens")])},onRefresh:()=>{this._promoteKittens.triggerButton.inactive=!this.setting.promoteKittens.enabled,this._promoteKittens.triggerButton.ineffective=this.setting.enabled&&this.setting.promoteKittens.enabled&&this.setting.promoteKittens.trigger===-1},onSetTrigger:async()=>{const o=await E.prompt(this,this.host.engine.i18n("ui.trigger.promoteKittens.promptTitle"),this.host.engine.i18n("ui.trigger.promoteKittens.prompt",[this.host.renderPercentage(this.setting.promoteKittens.trigger,i.selected,!0)]),this.host.renderPercentage(this.setting.promoteKittens.trigger),this.host.engine.i18n("ui.trigger.promoteKittens.promptExplainer"));o===void 0||o===""||o.startsWith("-")||(this.setting.promoteKittens.trigger=this.host.parsePercentage(o))},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.promotekittens")])}}),this._promoteKittens.triggerButton.element.addClass(C.lastHeadAction),r.addChild(this._promoteKittens),this._promoteLeader=new S(this,this.setting.promoteLeader,this.host.engine.i18n("option.promote"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.promote")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.promote")])}}),r.addChild(this._promoteLeader);for(const o of this.setting.electLeader.job.options)o.value==="any"?o.label=this.host.engine.i18n("option.elect.job.any"):o.label=this.host.engine.i18n(`$village.job.${o.value}`);for(const o of this.setting.electLeader.trait.options)o.label=this.host.engine.i18n(`$village.trait.${o.value}`);this._electLeader=new S(this,this.setting.electLeader,this.host.engine.i18n("option.elect"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.elect")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.elect")])}}).addChildren([new Ie(this,this.host.engine.i18n("option.elect.job"),this.setting.electLeader.job),new Ie(this,this.host.engine.i18n("option.elect.trait"),this.setting.electLeader.trait)]),r.addChild(this._electLeader),this.addChildContent(r)}_getDistributeOption(e,t,i,n,a=!1){const r=async()=>{const l=await E.prompt(this,this.host.engine.i18n("ui.max.distribute.prompt",[n]),this.host.engine.i18n("ui.max.distribute.promptTitle",[n,this.host.renderAbsolute(e.max,t)]),this.host.renderAbsolute(e.max),this.host.engine.i18n("ui.max.distribute.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.max=-1;return}l==="0"&&(e.enabled=!1),e.max=this.host.parseAbsolute(l)??e.max}},o=new Nt(this,e,n,{delimiter:a,onCheck:l=>{if(this.host.engine.imessage("status.sub.enable",[n]),e.max===0&&!l)return r()},onRefresh:()=>{o.maxButton.inactive=!e.enabled||e.max===-1,o.maxButton.ineffective=i.enabled&&e.enabled&&e.max===0},onRefreshMax:()=>{o.maxButton.updateLabel(this.host.renderAbsolute(e.max)),o.maxButton.element[0].title=e.max<0?this.host.engine.i18n("ui.max.distribute.titleInfinite",[n]):e.max===0?this.host.engine.i18n("ui.max.distribute.titleZero",[n]):this.host.engine.i18n("ui.max.distribute.title",[this.host.renderAbsolute(e.max),n])},onSetMax:r,onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[n])}});return o.maxButton.element.addClass(C.lastHeadAction),o}}class Ri extends S{constructor(e,t,i,n,a){super(e,t,n,a);u(this,"limitedButton");u(this,"maxButton");u(this,"triggerButton");this.limitedButton=new Dt(e,t,{...a,classes:[Et.headAction]}),this.maxButton=new Pe(e,t,{alignment:"right",border:!1,classes:[C.headAction],onClick:()=>a.onSetMax.call(this),onRefresh:a!=null&&a.onRefreshMax?()=>{var r;return(r=a.onRefreshMax)==null?void 0:r.call(this)}:void 0}),this.triggerButton=new Ee(e,t,i,{border:!1,classes:[C.lastHeadAction],onClick:async()=>{await a.onSetTrigger.call(this)},onRefresh:a!=null&&a.onRefreshTrigger?()=>{var r;return(r=a.onRefreshTrigger)==null?void 0:r.call(this)}:void 0,renderLabel:(a==null?void 0:a.renderLabelTrigger)??!0}),this.addChildrenHead([new R(e,{classes:[M.fillSpace]}),this.limitedButton,this.maxButton,this.triggerButton])}toString(){return`[${Ri.name}#${this.componentId}]`}}class Ko extends U{constructor(s,e,t){const i=s.host.engine.i18n("ui.upgrade.upgrades");super(s,e,new F(s,e,t,i,{onCheck:l=>{s.host.engine.imessage("status.auto.enable",[i])},onRefreshTrigger(){this.triggerButton.element[0].title=s.host.engine.i18n("ui.trigger",[e.trigger===-1?s.host.engine.i18n("ui.trigger.section.inactive"):s.host.renderPercentage(e.trigger,t.selected,!0)])},onSetTrigger:async()=>{const l=await E.prompt(s,s.host.engine.i18n("ui.trigger.prompt.percentage"),s.host.engine.i18n("ui.trigger.section.prompt",[i,e.trigger!==-1?s.host.renderPercentage(e.trigger,t.selected,!0):s.host.engine.i18n("ui.infinity")]),e.trigger!==-1?s.host.renderPercentage(e.trigger):"",s.host.engine.i18n("ui.trigger.section.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){e.trigger=-1;return}e.trigger=s.host.parsePercentage(l)}},onUnCheck:l=>{s.host.engine.imessage("status.auto.disable",[i])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!e.enabled||e.trigger===-1,this.settingItem.triggerButton.ineffective=e.enabled&&e.trigger<0&&Object.values(e.upgrades).some(l=>l.enabled&&l.trigger<0),this.expando.ineffective=e.enabled&&!Object.values(e.upgrades).some(l=>l.enabled)}});const n=this.host.game.workshop.upgrades.filter(l=>!m(this.setting.upgrades[l.name])),a=[];let r=n[0].label,o;for(const l of n.sort((h,d)=>h.label.localeCompare(d.label,t.selected))){const h=this.setting.upgrades[l.name],d=new F(this,h,t,l.label,{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[l.label])},onRefreshRequest:()=>{d.triggerButton.inactive=!h.enabled||h.trigger===-1,d.triggerButton.ineffective=e.enabled&&h.enabled&&e.trigger===-1&&h.trigger===-1},onRefreshTrigger:()=>{d.triggerButton.element[0].title=this.host.engine.i18n("ui.trigger",[h.trigger<0?e.trigger<0?this.host.engine.i18n("ui.trigger.build.blocked",[i]):`${this.host.renderPercentage(e.trigger,t.selected,!0)} (${this.host.engine.i18n("ui.trigger.section.inherited")})`:this.host.renderPercentage(h.trigger,t.selected,!0)])},onSetTrigger:async()=>{const g=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.section.prompt",[i,h.trigger!==-1?this.host.renderPercentage(h.trigger,t.selected,!0):this.host.engine.i18n("ui.trigger.section.inherited")]),h.trigger!==-1?this.host.renderPercentage(h.trigger):"",this.host.engine.i18n("ui.trigger.section.promptExplainer"));if(g!==void 0){if(g===""||g.startsWith("-")){h.trigger=-1;return}h.trigger=this.host.parsePercentage(g)}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[l.label])},renderLabelTrigger:!1});d.triggerButton.element.addClass(C.lastHeadAction),this.host.engine.localeSupportsFirstLetterSplits(t.selected)&&r[0]!==l.label[0]&&(m(o)||o.element.addClass(ke.delimiter),d.element.addClass(M.splitter)),o=d,a.push(d),r=l.label}this.addChildContent(new x(this).addChildren(a))}}class Mi extends U{constructor(e,t,i){console.debug(...v(`Constructing ${Mi.name}`));const n=e.host.engine.i18n("ui.craft");super(e,t,new F(e,t,i,n,{onCheck:l=>{e.host.engine.imessage("status.auto.enable",[n])},onRefreshTrigger(){this.triggerButton.element[0].title=e.host.engine.i18n("ui.trigger.section",[t.trigger<0?e.host.engine.i18n("ui.trigger.section.inactive"):e.host.renderPercentage(t.trigger,i.selected,!0)])},onSetTrigger:async()=>{const l=await E.prompt(e,e.host.engine.i18n("ui.trigger.prompt.percentage"),e.host.engine.i18n("ui.trigger.section.prompt",[n,t.trigger!==-1?e.host.renderPercentage(t.trigger,i.selected,!0):e.host.engine.i18n("ui.infinity")]),t.trigger!==-1?e.host.renderPercentage(t.trigger):"",e.host.engine.i18n("ui.trigger.section.promptExplainer"));if(l!==void 0){if(l===""||l.startsWith("-")){t.trigger=-1;return}t.trigger=e.host.parsePercentage(l)}},onUnCheck:l=>{e.host.engine.imessage("status.auto.disable",[n])},renderLabelTrigger:!1}),{onRefreshRequest:()=>{this.settingItem.triggerButton.inactive=!t.enabled||t.trigger===-1,this.settingItem.triggerButton.ineffective=t.enabled&&t.trigger<0&&Object.values(t.resources).some(l=>l.enabled&&l.max!==0&&l.trigger<0)}});u(this,"_crafts");let a=[];game.challenges.getChallenge("ironWill").active||(this.setting.resources.bloodstone.enabled=!1,this.setting.resources.tMythril.enabled=!1,a=["bloodstone","tMythril"]);const r=this.host.game.workshop.crafts.filter(l=>!a.includes(l.name)&&!m(this.setting.resources[l.name])).map(l=>[this.setting.resources[l.name],X(l.label)]);this._crafts=[];for(const[l,h]of r){const d=async()=>{const f=await E.prompt(this,this.host.engine.i18n("ui.max.craft.prompt",[h]),this.host.engine.i18n("ui.max.craft.promptTitle",[h,this.host.renderAbsolute(l.max,i.selected)]),this.host.renderAbsolute(l.max),this.host.engine.i18n("ui.max.craft.promptExplainer"));if(f!==void 0){if(f===""||f.startsWith("-")){l.max=-1;return}f==="0"&&(l.enabled=!1),l.max=this.host.parseAbsolute(f)??l.max}},g=new Ri(this,l,i,h,{delimiter:l.resource==="kerosene"||l.resource==="blueprint",onCheck:f=>{if(this.host.engine.imessage("status.sub.enable",[h]),l.max===0&&!f)return d()},onLimitedCheck:()=>{this.host.engine.imessage("craft.limited",[h])},onLimitedUnCheck:()=>{this.host.engine.imessage("craft.unlimited",[h])},onRefreshMax:()=>{g.maxButton.updateLabel(this.host.renderAbsolute(l.max)),g.maxButton.element[0].title=l.max<0?this.host.engine.i18n("ui.max.craft.titleInfinite",[h]):l.max===0?this.host.engine.i18n("ui.max.craft.titleZero",[h]):this.host.engine.i18n("ui.max.craft.title",[this.host.renderAbsolute(l.max),h])},onRefreshRequest:()=>{g.limitedButton.inactive=!l.enabled||!l.limited,g.maxButton.inactive=!l.enabled||l.max===-1,g.maxButton.ineffective=t.enabled&&l.enabled&&l.max===0,g.triggerButton.inactive=!l.enabled||l.trigger===-1,g.triggerButton.ineffective=t.enabled&&l.enabled&&t.trigger===-1&&l.trigger===-1},onRefreshTrigger:()=>{g.triggerButton.element[0].title=this.host.engine.i18n("ui.trigger",[l.trigger<0?t.trigger<0?this.host.engine.i18n("ui.trigger.build.blocked",[h]):`${this.host.renderPercentage(t.trigger,i.selected,!0)} (${this.host.engine.i18n("ui.trigger.build.inherited")})`:this.host.renderPercentage(l.trigger,i.selected,!0)])},onSetMax:d,onSetTrigger:async()=>{const f=await E.prompt(this,this.host.engine.i18n("ui.trigger.prompt.percentage"),this.host.engine.i18n("ui.trigger.section.prompt",[h,l.trigger!==-1?this.host.renderPercentage(l.trigger,i.selected,!0):this.host.engine.i18n("ui.trigger.build.inherited")]),l.trigger!==-1?this.host.renderPercentage(l.trigger):"",this.host.engine.i18n("ui.trigger.build.promptExplainer"));if(f!==void 0){if(f===""||f.startsWith("-")){l.trigger=-1;return}l.trigger=this.host.parsePercentage(f)}},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[h])},renderLabelTrigger:!1});this._crafts.push(g),l.resource==="ship"&&this._crafts.push(new S(this,this.setting.shipOverride,this.host.engine.i18n("option.shipOverride"),{onCheck:()=>{this.host.engine.imessage("status.sub.enable",[this.host.engine.i18n("option.shipOverride")])},onUnCheck:()=>{this.host.engine.imessage("status.sub.disable",[this.host.engine.i18n("option.shipOverride")])},upgradeIndicator:!0}))}const o=new x(this,{onReset:()=>{this.setting.load({resources:new xt().resources})}}).addChildren(this._crafts);this.addChildContent(o),this.addChildContent(new x(this,{hasDisableAll:!1,hasEnableAll:!1}).addChildren([new Ko(this,this.setting.unlockUpgrades,i)]))}}class Le extends W{constructor(e){console.debug(...v(`Constructing ${Le.name}`));super({host:e},{});u(this,"showActivity");u(this,"_engineUi");u(this,"_sections");u(this,"stateManagementUi");u(this,"_refreshTimeout");const t=e.engine;this._engineUi=new ra(this,t.settings),this.stateManagementUi=new vi(this,t.settings.states,t.settings.locale),this._sections=[new ii(this,t.bonfireManager.settings,t.settings.locale),new Ei(this,t.villageManager.settings,t.settings.locale),new gi(this,t.scienceManager.settings,t.settings.locale),new Mi(this,t.workshopManager.settings,t.settings.locale),new di(this,t.settings.resources,t.settings.locale),new xi(this,t.tradeManager.settings,t.settings.locale),new ci(this,t.religionManager.settings,t.settings.locale),new mi(this,t.spaceManager.settings,t.settings.locale),new wi(this,t.timeManager.settings,t.settings.locale),new yi(this,t.timeControlManager.settings,t.settings.locale),new li(this,t.settings.filters),this.stateManagementUi,new ri(this,t.settings,t.settings.locale)],this.parent=this,this.element=$("<div/>").addClass("kitten-scientists").addClass(Ti.ui);for(const h of[this._engineUi,...this._sections])this.addChild(h);const i=$("<ul/>");i.append(this._engineUi.element);for(const h of this._sections)i.append(h.element);this.element.append(i);const n=this._engineUi.expando;let a=!1;n.element.on("click",()=>{a=!a;for(const h of this._sections)h.toggle(a,!0)});let r=0;for(const h of this._sections)h.element[0].addEventListener("panelHidden",()=>{--r,r===0&&(a=!1),a||n.setCollapsed()}),h.element[0].addEventListener("panelShown",()=>{++r,a=!0,n.setExpanded()});this.showActivity=$("<span/>",{html:`<svg style="width: 18px; height: 18px;" viewBox="0 -960 960 960" fill="currentColor"><path d="${B.Summary}"/></svg>`,title:e.engine.i18n("summary.show")}).addClass(Ti.showActivity),this.showActivity.on("click",()=>{e.engine.displayActivitySummary()}),$("#clearLog").prepend(this.showActivity);const o=t.settings.ksColumn.enabled&&game.colorScheme!=="sleek";o?$("#rightColumn").after(`<div id="ksColumn" class="column"><span class="${Ti.spacer}"></span></div>`):$("#ksColumn").remove();const l=$(o?"#ksColumn":"#rightColumn");if(l.length===0){const h=$("#optionsPage .full-screen-position .page .page-content");h.length===0?console.warn(...v("Unable to find right column to inject UI into. Running headless.")):(h.append(this.element),this.element.attr("style","border-top:1px solid grey; padding:15px"))}else l.prepend(this.element);this.element=this.element,this._needsRefresh=!1}toString(){return`[${Le.name}#${this.componentId}]`}destroy(){this._refreshTimeout!==void 0&&(T.window.clearTimeout(this._refreshTimeout),this._refreshTimeout=void 0),this.showActivity.remove(),this.element.remove()}requestRefresh(e=!0,t=0,i=!1){if(this._needsRefresh){this._refreshTimeout===void 0&&console.error(...v("User interface claims to have a refresh pending, but there isn't."));return}this._refreshTimeout=T.window.setTimeout(()=>{const[n,a]=ye(()=>this.refresh());console.info(...v(`UI refresh took ${ia(a)}.`)),this._refreshTimeout=void 0},0),super.requestRefresh(!0,t,!1)}forceFullRefresh(){console.warn(...v("Forcing refresh on all user interface components...")),this.requestRefresh(),console.warn(...v("Refresh on all user interface components enforced."))}}const Oe=(c="")=>{if(m("2.0.0-beta.11-live"))throw Error("Build error: RELEASE_VERSION is not defined.");return`${c}2.0.0-beta.11-live`};class ge{constructor(s,e,t="en",i){u(this,"game");u(this,"i18nEngine");u(this,"_userInterface");u(this,"engine");u(this,"_gameBeforeSaveHandle");u(this,"_serverLoadHandle");u(this,"_saveManager",{load:s=>{console.info(...v("Looking for Kitten Scientists engine state in save data..."));const e=T.tryEngineStateFromSaveData("ks",s);if(!e){console.info(...v("The Kittens Game save data did not contain a script state."));return}console.info(...v("Found Kitten Scientists engine state in save data.")),this.engine.stateLoad(e),this.refreshEntireUserInterface()},resetState:()=>null,save:s=>{}});var n;console.info(...v(`Kitten Scientists ${Oe("v")} constructed. Checking for previous instances...`)),"kittenScientists"in T.window&&(console.warn(...v("Detected existing KS instance. Trying to unload it...")),(n=T.window.kittenScientists)==null||n.unload()),console.info(...v("You are on the 'fixed' release channel.")),this.game=s,this.i18nEngine=e;try{this.engine=new oe(this,t),this._userInterface=new Le(this)}catch(a){throw console.error(...v("Failed to construct core components.",a)),typeof GM<"u"&&console.warn(...v("Detected running in Greasemonkey.")),a}m(i)?this._userInterface.stateManagementUi.loadAutoSave():this.setSettings(i)}rebuildUi(){this._userInterface.destroy(),this._userInterface=new Le(this),this._userInterface.forceFullRefresh()}validateGame(){Qt.validateGame(this.game,this.engine.scienceManager.settings),St.validateGame(this.game,this.engine.spaceManager.settings),xt.validateGame(this.game,this.engine.workshopManager.settings)}unload(){console.warn(...v("Unloading Kitten Scientists...")),this.engine.stop(),this._userInterface.destroy(),$("#ks-styles").remove(),this._gameBeforeSaveHandle!==void 0&&(T.window.dojo.unsubscribe(this._gameBeforeSaveHandle),this._gameBeforeSaveHandle=void 0),this._serverLoadHandle!==void 0&&(T.window.dojo.unsubscribe(this._serverLoadHandle),this._gameBeforeSaveHandle=void 0);const s=this.game.managers.indexOf(this._saveManager);-1<s&&this.game.managers.splice(s,1),T.window.kittenScientists=void 0,console.warn(...v("Kitten Scientists have been unloaded!"))}run(){this.game.console.maxMessages=1e3,this.refreshEntireUserInterface(),this.engine.settings.enabled&&this.engine.start(!0),this.engine.imessage("status.ks.init"),this.runUpdateCheck().catch(se(console)),this._gameBeforeSaveHandle!==void 0&&(T.window.dojo.unsubscribe(this._gameBeforeSaveHandle),this._gameBeforeSaveHandle=void 0),this._gameBeforeSaveHandle=T.window.dojo.subscribe("game/beforesave",s=>{console.info(...v("Injecting Kitten Scientists engine state into save data..."));const e=this.getSettings();s.ks={state:[e]},this._userInterface.stateManagementUi.storeAutoSave(e),document.dispatchEvent(new CustomEvent("ks.reportSavegame",{detail:s}))}),this._serverLoadHandle!==void 0&&(T.window.dojo.unsubscribe(this._serverLoadHandle),this._gameBeforeSaveHandle=void 0),this._serverLoadHandle=T.window.dojo.subscribe("server/load",s=>{const e=T.tryEngineStateFromSaveData("ks",s);if(!e){console.info(...v("The Kittens Game save data did not contain a script state. Trying to load Auto-Save settings..."));return}console.info(...v("Found! Loading settings...")),this.engine.stateLoad(e)})}async runUpdateCheck(){{console.debug(...v("No update check on 'fixed' release channel."));return}}refreshEntireUserInterface(){console.info(...v("Requesting entire user interface to be refreshed.")),this._userInterface.forceFullRefresh()}parseFloat(s){if(s===null||s==="")return null;const e=/[KMGTP]$/i.test(s),t=s.substring(0,s.length-(e?1:0));let i=s.includes("e")||e?Number.parseFloat(t):Number.parseInt(t);if(e){const n=s.substring(s.length-1).toUpperCase();i=i*1e3**["","K","M","G","T","P"].indexOf(n)}return(i===Number.POSITIVE_INFINITY||i<0)&&(i=-1),i}parseAbsolute(s){const e=this.parseFloat(s);return e!==null?Math.round(e):null}parsePercentage(s){const e=s.trim().replace(/%$/,"");return Math.max(0,Math.min(1,Number.parseFloat(e)/100))}renderAbsolute(s,e="invariant"){return s<0||s===Number.POSITIVE_INFINITY?"∞":e!=="invariant"&&Math.floor(Math.log10(s))<9?new Intl.NumberFormat(e,{maximumFractionDigits:0,style:"decimal"}).format(s):this.game.getDisplayValueExt(s,!1,!1)}renderPercentage(s,e="invariant",t){return s<0||s===Number.POSITIVE_INFINITY?"∞":e!=="invariant"?new Intl.NumberFormat(e,{style:"percent"}).format(s):`${this.game.getDisplayValueExt(s*100,!1,!1)}${t?"%":""}`}renderFloat(s,e="invariant"){return s<0||s===Number.POSITIVE_INFINITY?"∞":e!=="invariant"?new Intl.NumberFormat(e,{style:"decimal"}).format(s):this.game.getDisplayValueExt(s,!1,!1)}static encodeSettings(s,e=!0){const t=JSON.stringify(s);return e?T.window.LZString.compressToBase64(t):t}static decodeSettings(s){try{const i=JSON.parse(s);return ge.unknownAsEngineStateOrThrow(i)}catch{}if(s.match(/\r?\n/))throw new bt("Multi-line non-JSON input can't be decoded.");const e=T.window.LZString.decompressFromBase64(s),t=JSON.parse(e);return ge.unknownAsEngineStateOrThrow(t)}getSettings(){return this.engine.stateSerialize()}getSettingsAsJson(){return JSON.stringify(this.getSettings())}setSettings(s){console.info(...v("Loading engine state..."));const e=this.engine.settings.ksColumn.enabled!==s.engine.ksColumn.enabled;this.engine.stateLoad(s),e&&this.rebuildUi(),this._userInterface.refresh(!0)}importSettingsFromString(s){const e=ge.decodeSettings(s);this.setSettings(e)}async copySettings(s=this.getSettings(),e=!0){const t=ge.encodeSettings(s,e);await T.window.navigator.clipboard.writeText(t)}static unknownAsEngineStateOrThrow(s){const e=s.v;if(!m(e)&&typeof e=="string"&&e.startsWith("2"))return s;throw new Error("Not a valid engine state.")}installSaveManager(){console.info(...v("Installing save game manager...")),this.game.managers.push(this._saveManager)}}(async()=>{const c=await new T().waitForGame(ge,"ks");T.window.kittenScientists=c,c.validateGame(),c.run()})().catch(console.error)});
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0dGVuLXNjaWVudGlzdHMubWluLmluamVjdC5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Vycm9ycy9BYnN0cmFjdEVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvSW52YWxpZE9wZXJhdGlvbkVycm9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9kZWJ1Zy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvY29uc3RhbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcGFyc2Utb3B0aW9ucy5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvaWRlbnRpZmllcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvc2VtdmVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvSW50ZXJuYWxFcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL1Vua25vd25FcnJvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2Vycm9yLXNlcmlhbGl6ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL21lYXN1cmVtZW50L3BlcmZvcm1hbmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL2FycmF5LmpzIiwiLi4vc291cmNlL3Rvb2xzL0xvZy50cyIsIi4uL3NvdXJjZS90b29scy9FbnRyaWVzLnRzIiwiLi4vc291cmNlL3Rvb2xzL0Zvcm1hdC50cyIsIi4uL3NvdXJjZS9oZWxwZXIvQnVsa1B1cmNoYXNlSGVscGVyLnRzIiwiLi4vc291cmNlL3R5cGVzL2luZGV4LnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1NldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL0J1aWxkaW5nVXBncmFkZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL0JvbmZpcmVTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9UYWJNYW5hZ2VyLnRzIiwiLi4vc291cmNlL0JvbmZpcmVNYW5hZ2VyLnRzIiwiLi4vc291cmNlL2hlbHBlci9BY3Rpdml0eVN1bW1hcnkudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVsaWdpb25TZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9SZWxpZ2lvbk1hbmFnZXIudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUG9saWN5U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVGVjaFNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1NjaWVuY2VTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9VcGdyYWRlTWFuYWdlci50cyIsIi4uL25vZGVfbW9kdWxlcy9Ab2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvYXN5bmMvYXN5bmMuanMiLCIuLi9zb3VyY2UvVXNlclNjcmlwdExvYWRlci50cyIsIi4uL3NvdXJjZS9TY2llbmNlTWFuYWdlci50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9NaXNzaW9uU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvU3BhY2VTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9TcGFjZU1hbmFnZXIudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvTG9nRmlsdGVyU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVXBncmFkZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1dvcmtzaG9wU2V0dGluZ3MudHMiLCIuLi9zb3VyY2UvV29ya3Nob3BNYW5hZ2VyLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc291cmNlc1NldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1N0YXRlU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvRW5naW5lU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVzZXRCb25maXJlU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVzZXRSZWxpZ2lvblNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvUmVzZXRTcGFjZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0VGltZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0VXBncmFkZVNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1Jlc2V0U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVGltZVNraXBIZWF0U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVGltZVNraXBTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9UaW1lQ29udHJvbFNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1RpbWVTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9FbWJhc3N5U2V0dGluZ3MudHMiLCIuLi9zb3VyY2Uvc2V0dGluZ3MvVHJhZGVTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9zZXR0aW5ncy9FbGVjdExlYWRlclNldHRpbmdzLnRzIiwiLi4vc291cmNlL3NldHRpbmdzL1ZpbGxhZ2VTZXR0aW5ncy50cyIsIi4uL3NvdXJjZS9UaW1lQ29udHJvbE1hbmFnZXIudHMiLCIuLi9zb3VyY2UvVGltZU1hbmFnZXIudHMiLCIuLi9zb3VyY2UvVHJhZGVNYW5hZ2VyLnRzIiwiLi4vc291cmNlL2hlbHBlci9NYXRlcmlhbHNDYWNoZS50cyIsIi4uL3NvdXJjZS9WaWxsYWdlTWFuYWdlci50cyIsIi4uL3NvdXJjZS9FbmdpbmUudHMiLCIuLi9ub2RlX21vZHVsZXMvQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Zvcm1hdC9taWxsaXNlY29uZHMuanMiLCIuLi9zb3VyY2UvaW1hZ2VzL0ljb25zLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvVWlDb21wb25lbnQudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9Db250YWluZXIudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9MaXN0SXRlbS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9JY29uQnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy9FeHBhbmRvQnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvQ29sbGFwc2libGVQYW5lbC50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwudHMiLCIuLi9zb3VyY2UvdWkvQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0J1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0RlbGltaXRlci50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvSW5wdXQudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9QYXJhZ3JhcGgudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9EaWFsb2cudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9idXR0b25zL01heEJ1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL2J1dHRvbnMvVHJpZ2dlckJ1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL1NldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvQnVpbGRTZWN0aW9uVG9vbHMudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL0JvbmZpcmVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL0VuZ2luZVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9CdXR0b25MaXN0SXRlbS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0ZpZWxkc2V0LnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvUmFkaW9JdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvT3B0aW9uc0xpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvVGV4dEJ1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9JbnRlcm5hbHNVaS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0V4cGxhaW5lckxpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL0xvZ0ZpbHRlclNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvUmVsaWdpb25TZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy9Db25zdW1lQnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy9TdG9ja0J1dHRvbi50cyIsIi4uL3NvdXJjZS91aS9SZXNvdXJjZXNTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1BvbGljeVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvVGVjaFNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvU2NpZW5jZVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvTWlzc2lvblNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvU3BhY2VTZXR0aW5nc1VpLnRzIiwiLi4vbm9kZV9tb2R1bGVzL0BvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvSW52YWxpZEFyZ3VtZW50RXJyb3IuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RhbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2NvbnN0cnVjdEZyb20uanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvY29uc3RydWN0Tm93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2Zvcm1hdExvbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL2xvY2FsaXplLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9fbGliL2J1aWxkTWF0Y2hGbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy9fbGliL21hdGNoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2xvY2FsZS9lbi1VUy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2RlZmF1bHRPcHRpb25zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3RvRGF0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9ub3JtYWxpemVEYXRlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9jb21wYXJlQXNjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2RpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mRGF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VuZE9mTW9udGguanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvaXNMYXN0RGF5T2ZNb250aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5Nb250aHMuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvX2xpYi9nZXRSb3VuZGluZ01ldGhvZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9kaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZGlmZmVyZW5jZUluU2Vjb25kcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9mb3JtYXREaXN0YW5jZVRvTm93LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL3N0YXJ0T2ZXZWVrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2lzU2FtZVdlZWsuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2RlL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2RlL19saWIvZm9ybWF0TG9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUvX2xpYi9sb2NhbGl6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUvX2xpYi9tYXRjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2hlL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL2hlL19saWIvZm9ybWF0TG9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUvX2xpYi9sb2NhbGl6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUvX2xpYi9tYXRjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvaGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL3poLUNOL19saWIvZm9ybWF0RGlzdGFuY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvbG9jYWxlL3poLUNOL19saWIvZm9ybWF0TG9uZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04vX2xpYi9mb3JtYXRSZWxhdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04vX2xpYi9sb2NhbGl6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04vX2xpYi9tYXRjaC5qcyIsIi4uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9sb2NhbGUvemgtQ04uanMiLCIuLi9zb3VyY2UvdG9vbHMvU2F2ZWdhbWVMb2FkZXIudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9Ub29sYmFyTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvU3RhdGVNYW5hZ2VtZW50VWkudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC50cyIsIi4uL3NvdXJjZS91aS9SZXNldEJvbmZpcmVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0UmVsaWdpb25TZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9SZXNldFNwYWNlU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9SZXNldFRpbWVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0VXBncmFkZXNTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1Jlc2V0U2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9jb21wb25lbnRzL0N5Y2xlc0xpc3QudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZWFzb25zTGlzdC50cyIsIi4uL3NvdXJjZS91aS9UaW1lU2tpcEhlYXRTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1RpbWVTa2lwU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9UaW1lQ29udHJvbFNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvVGltZVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9idXR0b25zLXRleHQvQnV5QnV0dG9uLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvYnV0dG9ucy10ZXh0L1NlbGxCdXR0b24udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9idXR0b25zL0xpbWl0ZWRCdXR0b24udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nTGltaXRlZExpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyTGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvY29tcG9uZW50cy9TZXR0aW5nTWF4TGlzdEl0ZW0udHMiLCIuLi9zb3VyY2UvdWkvRW1iYXNzeVNldHRpbmdzVWkudHMiLCIuLi9zb3VyY2UvdWkvVHJhZGVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1ZpbGxhZ2VTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL2NvbXBvbmVudHMvV29ya3Nob3BDcmFmdExpc3RJdGVtLnRzIiwiLi4vc291cmNlL3VpL1VwZ3JhZGVTZXR0aW5nc1VpLnRzIiwiLi4vc291cmNlL3VpL1dvcmtzaG9wU2V0dGluZ3NVaS50cyIsIi4uL3NvdXJjZS91aS9Vc2VySW50ZXJmYWNlLnRzIiwiLi4vc291cmNlL0tpdHRlblNjaWVudGlzdHMudHMiLCIuLi9zb3VyY2UvZW50cnlwb2ludC11c2Vyc2NyaXB0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2sgaWYgc29tZXRoaW5nIGlzIG5pbC5cbiAqIENhbiBiZSB1c2VkIGFzIGEgdHlwZWd1YXJkLlxuICogQHBhcmFtIHN1YmplY3QgLSBUaGUgc3ViamVjdCB0aGF0IGNvdWxkIGJlIG5pbC5cbiAqIEB0eXBlUGFyYW0gVFN1YmplY3QgLSBUaGUgdHlwZSBvZiB0aGUgc3ViamVjdC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3ViamVjdCBpcyBuaWwsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwoc3ViamVjdCkge1xuICAgIHJldHVybiBzdWJqZWN0ID09PSBudWxsIHx8IHN1YmplY3QgPT09IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgc29tZXRoaW5nIGlzIGEgY29uY3JldGUgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBDYW4gYmUgdXNlZCBhcyBhIHR5cGVndWFyZC5cbiAqIEBwYXJhbSBzdWJqZWN0IC0gVGhlIHN1YmplY3QgdGhhdCBjb3VsZCBiZSBuaWwuXG4gKiBAcGFyYW0gUHJvdG90eXBlIC0gVGhlIHByb3RvdHlwZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHR5cGVQYXJhbSBUU3ViamVjdCAtIFRoZSB0eXBlIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGlucHV0IGVsZW1lbnQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdHlwZSxcbiAqIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXMoc3ViamVjdCwgUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICFpc05pbChzdWJqZWN0KSAmJiBzdWJqZWN0IGluc3RhbmNlb2YgUHJvdG90eXBlO1xufVxuLyoqXG4gKiBUaHJvd24gd2hlbiBhbiB1bmV4cGVjdGVkIG5pbCB2YWx1ZSB3YXMgZW5jb3VudGVyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmV4cGVjdGVkTmlsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIFVuZXhwZWN0ZWROaWxFcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gXCJ1bmV4cGVjdGVkIG5pbCB2YWx1ZVwiKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgdGhlIHBhc3NlZCBzdWJqZWN0IGlzIG5vdCBuaWw7IHRocm93IG90aGVyd2lzZS5cbiAqIEBwYXJhbSBzdWJqZWN0IC0gQSBzdWJqZWN0IHRoYXQgaXMgcG9zc2libHkgbmlsLlxuICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UgdG8gdGhyb3cgd2hlbiB0aGUgc3ViamVjdCBpcyBuaWwuXG4gKiBAdHlwZVBhcmFtIFRTdWJqZWN0IC0gVGhlIHR5cGUgb2YgdGhlIHN1YmplY3QuXG4gKiBAcmV0dXJucyBUaGUgc3ViamVjdCwgaWYgaXQgaXNuJ3QgbmlsLlxuICogQHRocm93cyB7QGxpbmtjb2RlIFVuZXhwZWN0ZWROaWxFcnJvcn0gV2hlbiB0aGUgc3ViamVjdCBpcyBuaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdXN0RXhpc3Qoc3ViamVjdCwgZXJyb3JNZXNzYWdlKSB7XG4gICAgaWYgKGlzTmlsKHN1YmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTmlsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YmplY3Q7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGFsbCBwYXNzZWQgc3ViamVjdHMgYXJlIG5vdCBuaWw7IHRocm93IG90aGVyd2lzZS5cbiAqIEBwYXJhbSBzdWJqZWN0cyAtIFRoZSBzdWJqZWN0cyB0aGF0IGFyZSBwb3NzaWJseSBuaWwuXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZSB0byB0aHJvdyB3aGVuIGEgc3ViamVjdCBpcyBuaWwuXG4gKiBAdHlwZVBhcmFtIFRTdWJqZWN0IC0gVGhlIHR5cGUgYSB0aGUgc3ViamVjdC5cbiAqIEByZXR1cm5zIFRoZSBzdWJqZWN0cywgaWYgdGhleSBhcmVuJ3QgbmlsLlxuICogQHRocm93cyB7QGxpbmtjb2RlIFVuZXhwZWN0ZWROaWxFcnJvcn0gV2hlbiBhIHN1YmplY3QgaXMgbmlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVzdEV4aXN0QWxsKHN1YmplY3RzLCBlcnJvck1lc3NhZ2UpIHtcbiAgICBmb3IgKGNvbnN0IHN1YmplY3Qgb2Ygc3ViamVjdHMpIHtcbiAgICAgICAgaWYgKGlzTmlsKHN1YmplY3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE5pbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN1YmplY3RzO1xufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCB0aGUgcGFzc2VkIHN1YmplY3QgaXMgbm90IG5pbDsgdGhyb3cgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHN1YmplY3QgLSBBIHN1YmplY3QgdGhhdCBpcyBwb3NzaWJseSBuaWwuXG4gKiBAdHlwZVBhcmFtIFRTdWJqZWN0IC0gVGhlIHR5cGUgb2YgdGhlIHN1YmplY3QuXG4gKiBAdGhyb3dzIHtAbGlua2NvZGUgVW5leHBlY3RlZE5pbEVycm9yfSBXaGVuIHRoZSBzdWJqZWN0IGlzIG5pbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4aXN0cyhzdWJqZWN0KSB7XG4gICAgaWYgKGlzTmlsKHN1YmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTmlsRXJyb3IoKTtcbiAgICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBwYXNzZWQgc3ViamVjdHMgYXJlIG5vdCBuaWw7IHRocm93IG90aGVyd2lzZS5cbiAqIEBwYXJhbSBzdWJqZWN0cyAtIFN1YmplY3RzIHRoYXQgYXJlIHBvc3NpYmx5IG5pbC5cbiAqIEB0eXBlUGFyYW0gVFN1YmplY3QgLSBUaGUgdHlwZSBvZiBhIHN1YmplY3QuXG4gKiBAdGhyb3dzIHtAbGlua2NvZGUgVW5leHBlY3RlZE5pbEVycm9yfSBXaGVuIGEgc3ViamVjdCBpcyBuaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeGlzdHNBbGwoc3ViamVjdHMpIHtcbiAgICBmb3IgKGNvbnN0IHN1YmplY3Qgb2Ygc3ViamVjdHMpIHtcbiAgICAgICAgaWYgKGlzTmlsKHN1YmplY3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE5pbEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIENvbnZlcnQgYSBuaWxhYmxlIGludG8gYSByZWFsIHZhbHVlLCBpZiBpdCBpcyBuaWwuXG4gKiBAcGFyYW0gbmlsYWJsZSAtIFRoZSBzdWJqZWN0IHRvIGNvbnZlcnQgdG8gYW4gb3B0aW9uYWwuXG4gKiBAcGFyYW0gdG8gLSBUaGUgdmFsdWUgdG8gY29hbGVzZSB0by5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dCB2YWx1ZSwgaWYgaXQgd2Fzbid0IG5pbCwgb3IgdGhlIHZhbHVlIHRvIGNvYWxlc2NlIHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29hbGVzY2UobmlsYWJsZSwgdG8pIHtcbiAgICBpZiAoaXNOaWwobmlsYWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRvO1xuICAgIH1cbiAgICByZXR1cm4gbmlsYWJsZTtcbn1cbi8qKlxuICogRHJvcCBhbGwgbmlsIHZhbHVlcyBmcm9tIGFuIGFycmF5LCBvciByZXBsYWNlcyB0aGVtIHdpdGggYW5vdGhlciB2YWx1ZS5cbiAqIEBwYXJhbSBuaWxhYmxlcyAtIFRoZSBzdWJqZWN0IHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gdG8gLSBUaGUgdmFsdWUgdG8gY29hbGVzZSB0by5cbiAqIEByZXR1cm5zIEFuIGFycmF5IHdpdGggd2hlcmUgYWxsIHZhbHVlcyBhcmUgbm90IG5pbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvYWxlc2NlQXJyYXkobmlsYWJsZXMsIHRvKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG4gICAgZm9yIChjb25zdCBuaWxhYmxlIG9mIG5pbGFibGVzKSB7XG4gICAgICAgIGlmICghaXNOaWwobmlsYWJsZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5pbGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc05pbCh0bykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRvKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgbmlsYWJsZSBpbnRvIGFuIG9wdGlvbmFsIGFyZ3VtZW50LlxuICogVGhpcyBtZWFucyBgbnVsbGAgaXMgbm9ybWFsaXplZCB0byBgdW5kZWZpbmVkYC5cbiAqIEBwYXJhbSBuaWxhYmxlIC0gVGhlIHN1YmplY3QgdG8gY29udmVydCB0byBhbiBvcHRpb25hbC5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSwgbm9ybWFsaXplZCB0byBgdW5kZWZpbmVkYCwgaWYgaXQgd2FzIG5pbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3B0aW9uYWwobmlsYWJsZSkge1xuICAgIGlmIChpc05pbChuaWxhYmxlKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gbmlsYWJsZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5pbC5qcy5tYXAiLCIvKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZSBlcnJvcnMgKG9yIGFueXRoaW5nIGVsc2UgdGhhdCB3YXMgYHRocm93YG4pXG4gKiBhbmQgcHJpbnRzIGl0IHRvIGEge0BsaW5rY29kZSAhY29uc29sZX0uXG4gKiBAcGFyYW0gY29uc29sZSAtIFRoZSBjb25zb2xlIHRvIHByaW50IGVycm9ycyB0by5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHByaW50IGVycm9ycyB0byB0aGUgY29uc29sZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlID0gKGNvbnNvbGUpID0+IHtcbiAgICBjb25zdCBwcmludEVycm9yc1RvQ29uc29sZSA9IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9O1xuICAgIHJldHVybiBwcmludEVycm9yc1RvQ29uc29sZTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zb2xlLmpzLm1hcCIsIi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBlcnJvci5cbiAgICAgKi9cbiAgICBzdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gYXBwbGljYXRpb24tdW5pcXVlLCByZWFkYWJsZSBlcnJvciBjb2RlLlxuICAgICAqL1xuICAgIGNvZGU7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIEFic3RyYWN0RXJyb3J9LlxuICAgICAqIEBwYXJhbSBjb2RlIC0gVGhlIG1haW4gaWRlbnRpZmljYXRpb24gY29kZSBmb3IgdGhlIGVycm9yLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1haW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIHN0YXR1cykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBYnN0cmFjdEVycm9yXCI7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGEgbmV3IHN0YWNrdHJhY2UsIG90aGVyd2lzZSBpdCB3aWxsIGluY2x1ZGUgb3VyIGJhc2UtY2xhc3MgY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgY29kZVxuICAgICAgICAgICAgLy8gbG9jYXRpb24gd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpbi5cbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEFic3RyYWN0RXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rY29kZSBBYnN0cmFjdEVycm9yfSwgb3Igb25lIG9mIGl0cyBzdWJjbGFzc2VzLlxuICAgICAqIEBwYXJhbSBlcnJvciAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIGFsbG93Rm9yZWlnbk1vZHVsZSAtIE9ubHkgY2hlY2sgZm9yIHNpbWlsYXIgbG9va2luZyBlcnJvciBjb2Rlcy5cbiAgICAgKiBZb3UncmUgZ29pbmcgdG8gd2FudCB0byB1c2UgdGhpcyBpZiB5b3UncmUgZGVhbGluZyB3aXRoIGEgc2V0dXAgd2hlcmVcbiAgICAgKiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqcy11dGlscyBhcmUgbG9hZGVkLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0IGlzIGFuIHtAbGlua2NvZGUgQWJzdHJhY3RFcnJvcn0sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBpc0Fic3RyYWN0RXJyb3IoZXJyb3IsIGFsbG93Rm9yZWlnbk1vZHVsZSA9IHRydWUpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJzdHJhY3RFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqcy11dGlscyBhcmUgbG9hZGVkIGF0IHJ1bnRpbWUsIHRoZVxuICAgICAgICAvLyBwcm90b3R5cGVzIG9mIGVycm9ycyBkb24ndCBhbGlnbi4gSW4gdGhhdCBjYXNlLCB3ZSBqdXN0IGFuYWx5emUgdGhlXG4gICAgICAgIC8vIGVycm9yIGNvZGUuXG4gICAgICAgIGlmIChhbGxvd0ZvcmVpZ25Nb2R1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yUmVjb3JkID0gZXJyb3I7XG4gICAgICAgICAgICBpZiAoT2JqZWN0KGVycm9yKSA9PT0gZXJyb3IgJiZcbiAgICAgICAgICAgICAgICBcImNvZGVcIiBpbiBlcnJvclJlY29yZCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBlcnJvclJlY29yZC5jb2RlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlZEVycm9yLmNvZGUubWF0Y2goL15FUlJfT1NfLykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BYnN0cmFjdEVycm9yLmpzLm1hcCIsImltcG9ydCB7IEFic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9BYnN0cmFjdEVycm9yLmpzXCI7XG4vKipcbiAqIFVzZWQgd2hlbiBhbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCB0aGF0IGNhbiBub3QgYmUgY29tcGxldGVkIGluIHRoZSBjdXJyZW50XG4gKiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgQWJzdHJhY3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIEludmFsaWRPcGVyYXRpb25FcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWFpbiBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzID0gNDAwKSB7XG4gICAgICAgIHN1cGVyKFwiRVJSX09TX0lOVkFMSURfT1BFUkFUSU9OXCIsIG1lc3NhZ2UsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW52YWxpZE9wZXJhdGlvbkVycm9yXCI7XG4gICAgICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYSBuZXcgc3RhY2t0cmFjZSwgb3RoZXJ3aXNlIGl0IHdpbGwgaW5jbHVkZSBvdXIgYmFzZS1jbGFzc1xuICAgICAgICAgICAgLy8gY29uc3RydWN0b3IgaW5zdGVhZCBvZiB0aGUgY29kZSBsb2NhdGlvbiB3ZSdyZSBhY3R1YWxseSBpbnRlcmVzdGVkIGluLlxuICAgICAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZE9wZXJhdGlvbkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUludmFsaWRPcGVyYXRpb25FcnJvci5qcy5tYXAiLCIndXNlIHN0cmljdCdcblxuY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIE5vdGU6IHRoaXMgaXMgdGhlIHNlbXZlci5vcmcgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGF0IGl0IGltcGxlbWVudHNcbi8vIE5vdCBuZWNlc3NhcmlseSB0aGUgcGFja2FnZSB2ZXJzaW9uIG9mIHRoaXMgY29kZS5cbmNvbnN0IFNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnXG5cbmNvbnN0IE1BWF9MRU5HVEggPSAyNTZcbmNvbnN0IE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gOTAwNzE5OTI1NDc0MDk5MVxuXG4vLyBNYXggc2FmZSBzZWdtZW50IGxlbmd0aCBmb3IgY29lcmNpb24uXG5jb25zdCBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIID0gMTZcblxuLy8gTWF4IHNhZmUgbGVuZ3RoIGZvciBhIGJ1aWxkIGlkZW50aWZpZXIuIFRoZSBtYXggbGVuZ3RoIG1pbnVzIDYgY2hhcmFjdGVycyBmb3Jcbi8vIHRoZSBzaG9ydGVzdCB2ZXJzaW9uIHdpdGggYSBidWlsZCAwLjAuMCtCVUlMRC5cbmNvbnN0IE1BWF9TQUZFX0JVSUxEX0xFTkdUSCA9IE1BWF9MRU5HVEggLSA2XG5cbmNvbnN0IFJFTEVBU0VfVFlQRVMgPSBbXG4gICdtYWpvcicsXG4gICdwcmVtYWpvcicsXG4gICdtaW5vcicsXG4gICdwcmVtaW5vcicsXG4gICdwYXRjaCcsXG4gICdwcmVwYXRjaCcsXG4gICdwcmVyZWxlYXNlJyxcbl1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE1BWF9MRU5HVEgsXG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX1NBRkVfSU5URUdFUixcbiAgUkVMRUFTRV9UWVBFUyxcbiAgU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgRkxBR19JTkNMVURFX1BSRVJFTEVBU0U6IDBiMDAxLFxuICBGTEFHX0xPT1NFOiAwYjAxMCxcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7XG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX0xFTkdUSCxcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKVxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge31cblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbmNvbnN0IHJlID0gZXhwb3J0cy5yZSA9IFtdXG5jb25zdCBzYWZlUmUgPSBleHBvcnRzLnNhZmVSZSA9IFtdXG5jb25zdCBzcmMgPSBleHBvcnRzLnNyYyA9IFtdXG5jb25zdCBzYWZlU3JjID0gZXhwb3J0cy5zYWZlU3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgc2FmZVNyY1tpbmRleF0gPSBzYWZlXG4gIHJlW2luZGV4XSA9IG5ldyBSZWdFeHAodmFsdWUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxuICBzYWZlUmVbaW5kZXhdID0gbmV3IFJlZ0V4cChzYWZlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIGZvciB0b2tlbml6aW5nLFxuLy8gdmFsaWRhdGluZywgYW5kIHBhcnNpbmcgU2VtVmVyIHZlcnNpb24gc3RyaW5ncy5cblxuLy8gIyMgTnVtZXJpYyBJZGVudGlmaWVyXG4vLyBBIHNpbmdsZSBgMGAsIG9yIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGRpZ2l0cy5cblxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSJywgJzB8WzEtOV1cXFxcZConKVxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSTE9PU0UnLCAnXFxcXGQrJylcblxuLy8gIyMgTm9uLW51bWVyaWMgSWRlbnRpZmllclxuLy8gWmVybyBvciBtb3JlIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgaHlwaGVuLCBhbmQgdGhlbiB6ZXJvIG9yXG4vLyBtb3JlIGxldHRlcnMsIGRpZ2l0cywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ05PTk5VTUVSSUNJREVOVElGSUVSJywgYFxcXFxkKlthLXpBLVotXSR7TEVUVEVSREFTSE5VTUJFUn0qYClcblxuLy8gIyMgTWFpbiBWZXJzaW9uXG4vLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTicsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT05MT09TRScsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvbiBJZGVudGlmaWVyXG4vLyBBIG51bWVyaWMgaWRlbnRpZmllciwgb3IgYSBub24tbnVtZXJpYyBpZGVudGlmaWVyLlxuLy8gTm9uLW51bWJlcmljIGlkZW50aWZpZXJzIGluY2x1ZGUgbnVtYmVyaWMgaWRlbnRpZmllcnMgYnV0IGNhbiBiZSBsb25nZXIuXG4vLyBUaGVyZWZvcmUgbm9uLW51bWJlcmljIGlkZW50aWZpZXJzIG11c3QgZ28gZmlyc3QuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBwYXJzZSBvdXQganVzdCB0aGUgb3B0aW9ucyB3ZSBjYXJlIGFib3V0XG5jb25zdCBsb29zZU9wdGlvbiA9IE9iamVjdC5mcmVlemUoeyBsb29zZTogdHJ1ZSB9KVxuY29uc3QgZW1wdHlPcHRzID0gT2JqZWN0LmZyZWV6ZSh7IH0pXG5jb25zdCBwYXJzZU9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgcmV0dXJuIGVtcHR5T3B0c1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBsb29zZU9wdGlvblxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnNcbn1cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VPcHRpb25zXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHZlcnNpb24uaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgICByZXR1cm4gdmVyc2lvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24udmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHZlcnNpb24uIE11c3QgYmUgYSBzdHJpbmcuIEdvdCB0eXBlIFwiJHt0eXBlb2YgdmVyc2lvbn1cIi5gKVxuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGB2ZXJzaW9uIGlzIGxvbmdlciB0aGFuICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2BcbiAgICAgIClcbiAgICB9XG5cbiAgICBkZWJ1ZygnU2VtVmVyJywgdmVyc2lvbiwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIC8vIHRoaXMgaXNuJ3QgYWN0dWFsbHkgcmVsZXZhbnQgZm9yIHZlcnNpb25zLCBidXQga2VlcCBpdCBzbyB0aGF0IHdlXG4gICAgLy8gZG9uJ3QgcnVuIGludG8gdHJvdWJsZSBwYXNzaW5nIHRoaXMub3B0aW9ucyBhcm91bmQuXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgY29uc3QgbSA9IHZlcnNpb24udHJpbSgpLm1hdGNoKG9wdGlvbnMubG9vc2UgPyByZVt0LkxPT1NFXSA6IHJlW3QuRlVMTF0pXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgVmVyc2lvbjogJHt2ZXJzaW9ufWApXG4gICAgfVxuXG4gICAgdGhpcy5yYXcgPSB2ZXJzaW9uXG5cbiAgICAvLyB0aGVzZSBhcmUgYWN0dWFsbHkgbnVtYmVyc1xuICAgIHRoaXMubWFqb3IgPSArbVsxXVxuICAgIHRoaXMubWlub3IgPSArbVsyXVxuICAgIHRoaXMucGF0Y2ggPSArbVszXVxuXG4gICAgaWYgKHRoaXMubWFqb3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWFqb3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1ham9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbm9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1pbm9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtaW5vciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXRjaCA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5wYXRjaCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgcGF0Y2ggdmVyc2lvbicpXG4gICAgfVxuXG4gICAgLy8gbnVtYmVyaWZ5IGFueSBwcmVyZWxlYXNlIG51bWVyaWMgaWRzXG4gICAgaWYgKCFtWzRdKSB7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBtWzRdLnNwbGl0KCcuJykubWFwKChpZCkgPT4ge1xuICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KGlkKSkge1xuICAgICAgICAgIGNvbnN0IG51bSA9ICtpZFxuICAgICAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPCBNQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWxkID0gbVs1XSA/IG1bNV0uc3BsaXQoJy4nKSA6IFtdXG4gICAgdGhpcy5mb3JtYXQoKVxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICB0aGlzLnZlcnNpb24gPSBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5wYXRjaH1gXG4gICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmVyc2lvbiArPSBgLSR7dGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICBjb21wYXJlIChvdGhlcikge1xuICAgIGRlYnVnKCdTZW1WZXIuY29tcGFyZScsIHRoaXMudmVyc2lvbiwgdGhpcy5vcHRpb25zLCBvdGhlcilcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09ICdzdHJpbmcnICYmIG90aGVyID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGlmIChvdGhlci52ZXJzaW9uID09PSB0aGlzLnZlcnNpb24pIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZU1haW4ob3RoZXIpIHx8IHRoaXMuY29tcGFyZVByZShvdGhlcilcbiAgfVxuXG4gIGNvbXBhcmVNYWluIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1ham9yLCBvdGhlci5tYWpvcikgfHxcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1pbm9yLCBvdGhlci5taW5vcikgfHxcbiAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnBhdGNoLCBvdGhlci5wYXRjaClcbiAgICApXG4gIH1cblxuICBjb21wYXJlUHJlIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgLy8gTk9UIGhhdmluZyBhIHByZXJlbGVhc2UgaXMgPiBoYXZpbmcgb25lXG4gICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmIG90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLnByZXJlbGVhc2VbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5wcmVyZWxlYXNlW2ldXG4gICAgICBkZWJ1ZygncHJlcmVsZWFzZSBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICBjb21wYXJlQnVpbGQgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5idWlsZFtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLmJ1aWxkW2ldXG4gICAgICBkZWJ1ZygnYnVpbGQgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuICAvLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG4gIGluYyAocmVsZWFzZSwgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpIHtcbiAgICBpZiAocmVsZWFzZS5zdGFydHNXaXRoKCdwcmUnKSkge1xuICAgICAgaWYgKCFpZGVudGlmaWVyICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICAgIH1cbiAgICAgIC8vIEF2b2lkIGFuIGludmFsaWQgc2VtdmVyIHJlc3VsdHNcbiAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gYC0ke2lkZW50aWZpZXJ9YC5tYXRjaCh0aGlzLm9wdGlvbnMubG9vc2UgPyByZVt0LlBSRVJFTEVBU0VMT09TRV0gOiByZVt0LlBSRVJFTEVBU0VdKVxuICAgICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoWzFdICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgICBjYXNlICdwcmVtYWpvcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVtaW5vcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHByZXJlbGVhc2UsIGl0IHdpbGwgYnVtcCB0byB0aGUgbmV4dCB2ZXJzaW9uXG4gICAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBub24tcHJlcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIGFjdHMgdGhlIHNhbWUgYXNcbiAgICAgIC8vIHByZXBhdGNoLlxuICAgICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2ZXJzaW9uICR7dGhpcy5yYXd9IGlzIG5vdCBhIHByZXJlbGVhc2VgKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ21ham9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWFqb3IuXG4gICAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWlub3IgIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnBhdGNoICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbWlub3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgICAgLy8gMS4yLjAtNSBidW1wcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcHJlLXJlbGVhc2UgaXQgd2lsbCBidW1wIHVwIHRvIHRoZSBzYW1lIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wYXRjaCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIHVzZWQgcHVibGljbHkuXG4gICAgICAvLyAxLjAuMCAncHJlJyB3b3VsZCBiZWNvbWUgMS4wLjAtMCB3aGljaCBpcyB0aGUgd3JvbmcgZGlyZWN0aW9uLlxuICAgICAgY2FzZSAncHJlJzoge1xuICAgICAgICBjb25zdCBiYXNlID0gTnVtYmVyKGlkZW50aWZpZXJCYXNlKSA/IDEgOiAwXG5cbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbYmFzZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGhcbiAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rK1xuICAgICAgICAgICAgICBpID0gLTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBkaWRuJ3QgaW5jcmVtZW50IGFueXRoaW5nXG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllciA9PT0gdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKSAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaChiYXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIC8vIDEuMi4wLWJldGEuMSBidW1wcyB0byAxLjIuMC1iZXRhLjIsXG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgICBsZXQgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCBiYXNlXVxuICAgICAgICAgIGlmIChpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXJlbGVhc2UgPSBbaWRlbnRpZmllcl1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnByZXJlbGVhc2VbMF0sIGlkZW50aWZpZXIpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4odGhpcy5wcmVyZWxlYXNlWzFdKSkge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6ICR7cmVsZWFzZX1gKVxuICAgIH1cbiAgICB0aGlzLnJhdyA9IHRoaXMuZm9ybWF0KClcbiAgICBpZiAodGhpcy5idWlsZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmF3ICs9IGArJHt0aGlzLmJ1aWxkLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZW1WZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PlxuICBuZXcgU2VtVmVyKGEsIGxvb3NlKS5jb21wYXJlKG5ldyBTZW1WZXIoYiwgbG9vc2UpKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RcbiIsImltcG9ydCB7IEFic3RyYWN0RXJyb3IgfSBmcm9tIFwiLi9BYnN0cmFjdEVycm9yLmpzXCI7XG4vKipcbiAqIFVzZWQgd2hlbiBhbiB7QGxpbmtjb2RlICFFcnJvcn0tbGlrZSBvYmplY3Qgd2FzIGNhdWdodCBhbmQgY29udmVydGVkIGludG8gYW5cbiAqIGltcGxlbWVudGF0aW9uIG9mIHtAbGlua2NvZGUgQWJzdHJhY3RFcnJvcn0gZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEludGVybmFsRXJyb3IgZXh0ZW5kcyBBYnN0cmFjdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGlua2NvZGUgSW50ZXJuYWxFcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWFpbiBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKFwiRVJSX09TX0lOVEVSTkFMXCIsIG1lc3NhZ2UsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW50ZXJuYWxFcnJvclwiO1xuICAgICAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGEgbmV3IHN0YWNrdHJhY2UsIG90aGVyd2lzZSBpdCB3aWxsIGluY2x1ZGUgb3VyIGJhc2UtY2xhc3NcbiAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIGNvZGUgbG9jYXRpb24gd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpbi5cbiAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludGVybmFsRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGVycm9yIGludG8gYW4ge0BsaW5rY29kZSBJbnRlcm5hbEVycm9yfS5cbiAgICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyBBbiB7QGxpbmtjb2RlIEludGVybmFsRXJyb3J9IHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gZXJyb3IuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21FcnJvcihlcnJvcikge1xuICAgICAgICAvLyBDcmVhdGUgYSBfcmVhbF8gYEludGVybmFsRXJyb3JgIGluc3RhbmNlLCB3aGljaCB3ZSB3aWxsIHJldHVybiBsYXRlci5cbiAgICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IG5ldyBJbnRlcm5hbEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAvLyBBc3NpZ24gdGhlIGVycm9yIHRvIGl0LCB0byBpbmhlcml0IGFsbCB0aGUgZmllbGRzIGluIHRoZSBlcnJvci5cbiAgICAgICAgLy8gVGhlbiBhc3NpZ24gYW5vdGhlciBgSW50ZXJuYWxFcnJvcmAgdG8gcmVwbGFjZSBrZXkgZmllbGRzLCBsaWtlOlxuICAgICAgICAvLyBuYW1lLCBjb2RlLCBzdGF0dXMsIC4uLlxuICAgICAgICBPYmplY3QuYXNzaWduKGludGVybmFsRXJyb3IsIGVycm9yLCBuZXcgSW50ZXJuYWxFcnJvcihlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIC8vIEluaGVyaXQgdGhlIG9yaWdpbmFsIGVycm9yIHN0YWNrIGFnYWluLlxuICAgICAgICBpbnRlcm5hbEVycm9yLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgIHJldHVybiBpbnRlcm5hbEVycm9yO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUludGVybmFsRXJyb3IuanMubWFwIiwiaW1wb3J0IHsgQWJzdHJhY3RFcnJvciB9IGZyb20gXCIuL0Fic3RyYWN0RXJyb3IuanNcIjtcbi8qKlxuICogVXNlZCB3aGVuIGFuIHVua25vd24sIG5vbi17QGxpbmtjb2RlICFFcnJvcn0tbGlrZSBvYmplY3Qgd2FzIGNhdWdodCBhbmQgY29udmVydGVkIGludG8gYVxuICogcmVhbCB7QGxpbmtjb2RlICFFcnJvcn0gaW5zdGFuY2UuXG4gKiBMaWtlIHdoZW4geW91IGNhdGNoIGEgYHRocm93IFwiYm9vbVwiYCwgd2Ugd2lsbCBjb252ZXJ0IHRoZSBjYXVnaHQgYFwiYm9vbVwiYFxuICogaW50byBhbiB7QGxpbmtjb2RlIFVua25vd25FcnJvcn0uXG4gKiBUbyBlbnJpY2ggYW4ge0BsaW5rY29kZSAhRXJyb3J9LWxpa2Ugb2JqZWN0IHRoYXQgd2FzIGNhdWdodCwgdXNlIHRoZSB7QGxpbmtjb2RlIEludGVybmFsRXJyb3J9LlxuICovXG5leHBvcnQgY2xhc3MgVW5rbm93bkVycm9yIGV4dGVuZHMgQWJzdHJhY3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmtjb2RlIFVua25vd25FcnJvcn0uXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWFpbiBlcnJvciBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgSFRUUCBzdGF0dXMgY29kZSB0byByZXR1cm4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKFwiRVJSX09TX1VOS05PV05cIiwgbWVzc2FnZSwgc3RhdHVzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJVbmtub3duRXJyb3JcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIG5ldyBzdGFja3RyYWNlLCBvdGhlcndpc2UgaXQgd2lsbCBpbmNsdWRlIG91ciBiYXNlLWNsYXNzXG4gICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBjb2RlIGxvY2F0aW9uIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4uXG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBVbmtub3duRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VW5rbm93bkVycm9yLmpzLm1hcCIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIi4uL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEVycm9yIH0gZnJvbSBcIi4vQWJzdHJhY3RFcnJvci5qc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuL0ludGVybmFsRXJyb3IuanNcIjtcbmltcG9ydCB7IFVua25vd25FcnJvciB9IGZyb20gXCIuL1Vua25vd25FcnJvci5qc1wiO1xuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHVua25vd24gc3ViamVjdCBpcyBhbiB7QGxpbmtjb2RlICFFcnJvcn0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc3ViamVjdCAtIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3ViamVjdCBpcyBhbiB7QGxpbmtjb2RlICFFcnJvcn0sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNFcnJvciA9IChzdWJqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHN1YmplY3QgaW5zdGFuY2VvZiBFcnJvciB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ViamVjdCkgPT09IFwiW29iamVjdCBFcnJvcl1cIjtcbn07XG4vKipcbiAqIFJldHVybnMgYW4ge0BsaW5rY29kZSBBYnN0cmFjdEVycm9yfSB0aGF0IGJlc3QgcmVwcmVzZW50cyB0aGUgcGFzc2VkIHN1YmplY3QuXG4gKiBJZiB0aGUgcGFzc2VkIHN1YmplY3QgaXMgYWxyZWFkeSBhbiB7QGxpbmtjb2RlIEFic3RyYWN0RXJyb3J9LCBpdCBpcyByZXR1cm5lZCBhcy1pcy5cbiAqIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhbiBhcHByb3ByaWF0ZSBlcnJvciB0eXBlLlxuICogQHBhcmFtIHN1YmplY3QgLSBUaGUgc3ViamVjdCB0byBpbnNwZWN0XG4gKiBAcmV0dXJucyBBbiB7QGxpbmtjb2RlIEFic3RyYWN0RXJyb3J9IGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgdW5rbm93blRvRXJyb3IgPSAoc3ViamVjdCkgPT4ge1xuICAgIGlmIChBYnN0cmFjdEVycm9yLmlzQWJzdHJhY3RFcnJvcihzdWJqZWN0KSkge1xuICAgICAgICByZXR1cm4gc3ViamVjdDtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3Ioc3ViamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIEludGVybmFsRXJyb3IuZnJvbUVycm9yKHN1YmplY3QpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVua25vd25FcnJvcihTdHJpbmcoc3ViamVjdCkpO1xufTtcbi8qKlxuICogU2VyaWFsaXplcyBhbiBlcnJvciBpbnRvIGEgc3RyaW5nLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIHN0cmluZ2lmeS5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBlcnJvclRvU3RyaW5nID0gKGVycm9yKSA9PiB7XG4gICAgcmV0dXJuIGlzTmlsKGVycm9yLnRvU3RyaW5nKSA/IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcnJvcikgOiBlcnJvci50b1N0cmluZygpO1xufTtcbi8qKlxuICogU2VyaWFsaXplcyBhbiBlcnJvciBpbnRvIGEgSlNPTiBzdHJpbmcuXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gc3RyaW5naWZ5LlxuICogQHJldHVybnMgQSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgZXJyb3JUb0pTT04gPSAoZXJyb3IpID0+IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKSk7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBhbiBlcnJvciBpbnRvIGEgcmVndWxhciBoYXNoLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIG5ldyBvYmplY3QgdGhhdCBjb250YWlucyBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgZXJyb3JUb1JlY29yZCA9IChlcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY29yZCA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKSkge1xuICAgICAgICByZWNvcmRbcHJvcGVydHlOYW1lXSA9IGVycm9yW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG59O1xuLyoqXG4gKiBTZXJpYWxpemVzIGFuIGVycm9yIGludG8gYSBzaW1wbGVyIHNoYXBlLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIHNlcmlhbGl6ZS5cbiAqIEByZXR1cm5zIEEgc2ltcGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVycm9yVG9TaW1wbGVTZXJpYWxpemFibGUgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ge1xuICAgICAgICBjb2RlOiBlcnJvci5jb2RlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgfTtcbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvci1zZXJpYWxpemVyLmpzLm1hcCIsIi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFuZCBtZWFzdXJlcyBob3cgbG9uZyB0aGUgZXhlY3V0aW9uIHRha2VzLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgZnVuY3Rpb24gb2Ygd2hpY2ggdGhlIGV4ZWN1dGlvbiBzcGVlZCBzaG91bGQgYmUgbWVhc3VyZWQuXG4gKiBAcmV0dXJucyBBIHR1cGxlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24sIGFuZCB0aGUgZXhlY3V0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgY29uc3QgbWVhc3VyZSA9IChjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICByZXR1cm4gW2NvbnRleHQoKSwgcGVyZm9ybWFuY2Uubm93KCkgLSBlbnRyeV07XG59O1xuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gYXN5bmMgZnVuY3Rpb24gYW5kIG1lYXN1cmVzIGhvdyBsb25nIHRoZSBleGVjdXRpb24gdGFrZXMuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBhc3luYyBmdW5jdGlvbiBvZiB3aGljaCB0aGUgZXhlY3V0aW9uIHNwZWVkIHNob3VsZCBiZSBtZWFzdXJlZC5cbiAqIEByZXR1cm5zIEEgdHVwbGUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiwgYW5kIHRoZSBleGVjdXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBjb25zdCBtZWFzdXJlQXN5bmMgPSBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgcmV0dXJuIFthd2FpdCBjb250ZXh0KCksIHBlcmZvcm1hbmNlLm5vdygpIC0gZW50cnldO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcmZvcm1hbmNlLmpzLm1hcCIsImltcG9ydCB7IGlzIH0gZnJvbSBcIi4vbmlsLmpzXCI7XG4vKipcbiAqIFBsYWNlcyB0aGUgaXRlbXMgaW4gdGhlIGFycmF5IGluIHJhbmRvbSBvcmRlci5cbiAqIFRoZSBhcnJheSBpcyBzaHVmZmxlZCBpbi1wbGFjZSwgbm8gY29weSBpcyBjcmVhdGVkLiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgZXhhY3RseSB0aGUgcGFzc2VkIGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gKiBAdHlwZVBhcmFtIFRFbGVtZW50cyAtIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkuXG4gKiBAcmV0dXJucyBUaGUgcGFzc2VkIGFycmF5IGluIHJhbmRvbSBvcmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNodWZmbGVBcnJheSA9IChhcnJheSkgPT4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC50cnVuYyhNYXRoLnJhbmRvbSgpICogKGluZGV4ICsgMSkpO1xuICAgICAgICBjb25zdCB0ZW1wID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBhcnJheVtpbmRleF0gPSBhcnJheVt0YXJnZXRJbmRleF07XG4gICAgICAgIGFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn07XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCBob2xkcyBhbGwgaXRlbXMgdGhhdCBhcHBlYXIgaW4gYm90aFxuICogcGFzc2VkIGFycmF5cy5cbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IGFycmF5LlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIGFycmF5LlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHJldHVybnMgQSBuZXcgYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGl0ZW1zIHRoYXQgYXBwZWFyIGluXG4gKiBib3RoIHBhc3NlZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcnNlY3QgPSAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhLmZpbHRlcih4ID0+IGIuaW5jbHVkZXMoeCkpO1xufTtcbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSB0aGF0IGhvbGRzIGFsbCBpdGVtcyB0aGF0IG9ubHkgYXBwZWFyIGluIGBhYC5cbiAqIEBwYXJhbSBhIC0gVGhlIGZpcnN0IGFycmF5LlxuICogQHBhcmFtIGIgLSBUaGUgc2Vjb25kIGFycmF5LlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHJldHVybnMgQSBuZXcgYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGl0ZW1zIHRoYXQgb255IGFwcGVhciBpbiBgYWAuXG4gKi9cbmV4cG9ydCBjb25zdCBkaWZmZXJlbmNlID0gKGEsIGIpID0+IHtcbiAgICByZXR1cm4gYS5maWx0ZXIoeCA9PiAhYi5pbmNsdWRlcyh4KSk7XG59O1xuLyoqXG4gKiBGcm9tIGFuIGFycmF5IHdpdGggdW5rbm93biBjb250ZW50cywgcmV0cmlldmUgYWxsIHRoZSBlbGVtZW50c1xuICogdGhhdCBhcmUgb2YgYSBjZXJ0YWluIHR5cGUgYW5kIHJldHVybiB0aGVtIGFzIGEgbmV3IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIGZpbHRlci5cbiAqIEBwYXJhbSBJbnN0YW5jZVR5cGUgLSBUaGUgdHlwZSB0byBzZWFyY2ggZm9yLlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LlxuICogQHJldHVybnMgQSBuZXcgYXJyYXkgd2l0aCB0aGUgZmlsdGVyZWQgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBmaWx0ZXJUeXBlID0gKGFycmF5LCBJbnN0YW5jZVR5cGUpID0+IGFycmF5LmZpbHRlcihlbGVtZW50ID0+IGlzKGVsZW1lbnQsIEluc3RhbmNlVHlwZSkpO1xuLyoqXG4gKiBGcm9tIGFuIGl0ZXJhYmxlIHdpdGggdW5rbm93biBjb250ZW50cywgeWllbGQgYXJyYXlzIHRoYXQgY29udGFpbiBpdGVtcyBmcm9tXG4gKiB0aGUgaXRlcmFibGUgdXAgdG8gYSBnaXZlbiBsaW1pdC5cbiAqIEBwYXJhbSBpdGVyYWJsZSAtIFRoZSBpdGVyYWJsZSB0byByZXRyaWV2ZSBpdGVtcyBmcm9tLlxuICogQHBhcmFtIGxpbWl0IC0gVGhlIGFtb3VudCBvZiBpdGVtcyBpbiBlYWNoIGNodW5rLlxuICogQHR5cGVQYXJhbSBURWxlbWVudHMgLSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxuICogQHlpZWxkcyBDaHVua3MgZnJvbSB0aGUgcHJvdmlkZWQgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBjaHVua2lmeSA9IGZ1bmN0aW9uKiAoaXRlcmFibGUsIGxpbWl0KSB7XG4gICAgbGV0IGNodW5rID0gW107XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgIGNodW5rLnB1c2goZWxlbWVudCk7XG4gICAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IGxpbWl0KSB7XG4gICAgICAgICAgICB5aWVsZCBjaHVuaztcbiAgICAgICAgICAgIGNodW5rID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNodW5rLmxlbmd0aCkge1xuICAgICAgICB5aWVsZCBjaHVuaztcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJyYXkuanMubWFwIiwiaW1wb3J0IHsgaXMsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBjbCA9IDxUIGV4dGVuZHMgQXJyYXk8dW5rbm93bj4+KC4uLmFyZ3M6IFQpOiBBcnJheTxzdHJpbmcgfCBUW251bWJlcl0+ID0+IFtcbiAgXCLwn5Gp4oCN8J+UrFwiLFxuICAuLi5hcmdzXG4gICAgLmZpbHRlcihhcmcgPT4gYXJnICE9PSBcIlwiKVxuICAgIC5mbGF0TWFwKChtYXliZUVycm9yOiBNYXliZTxFcnJvcj4gfCB1bmtub3duKSA9PiB7XG4gICAgICBpZiAoaXMobWF5YmVFcnJvciwgRXJyb3IpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbWF5YmVFcnJvcjtcbiAgICAgICAgcmV0dXJuIFtlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFja107XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF5YmVFcnJvcjtcbiAgICB9KSxcbl07XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vTG9nLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBkZWVwTWVyZ2VMZWZ0ID0gKFxuICBhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHN1YmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5hIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGIpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgc3ViamVjdFtrZXldID0gZGVlcE1lcmdlTGVmdChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIGp1c3QgbmF1Z2h0eSBidXNpbmVzcy5cbiAgICAgICAga2V5IGluIGEgPyBhW2tleV0gOiB7fSxcbiAgICAgICAgYltrZXldLFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzdWJqZWN0W2tleV0gPSBiW2tleV0gPz8gYVtrZXldO1xuICB9XG4gIHJldHVybiBzdWJqZWN0O1xufTtcblxuLyoqXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgbWVhbnMgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRyaWVzXG4gKiBpbiBhIHBhcnRpYWxseSBmaWxsZWQgc3RydWN0dXJlIHdpdGggdHlwZWQga2V5cy5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCBTb21lIG9iamVjdC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGtleS12YWx1ZSB0dXBsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RFbnRyaWVzPFRLZXlzIGV4dGVuZHMgc3RyaW5nLCBUVmFsdWVzPihcbiAgc3ViamVjdDogUGFydGlhbDxSZWNvcmQ8VEtleXMsIFRWYWx1ZXM+Pixcbik6IEFycmF5PFtUS2V5cywgVFZhbHVlc10+IHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHN1YmplY3QpIGFzIEFycmF5PFtUS2V5cywgVFZhbHVlc10+O1xufVxuXG4vKipcbiAqIEdpdmVuIGEgYHN1YmplY3RgIG9iamVjdCBzY2hlbWEsIGNvbnN1bWUgYWxsIGtub3duIHZhbHVlcyBmcm9tIHRoZVxuICogYHNvdXJjZWAgaW50byB0aGUgc2NoZW1hIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gc3ViamVjdCBBbiBvYmplY3QgdGhhdCBzaG91bGQgY29uc3VtZSB2YWx1ZXMgZnJvbSB0aGUgc291cmNlLlxuICogQHBhcmFtIHNvdXJjZSBBbiBvYmplY3QgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBgc3ViamVjdGAgZnJvbSB3aGljaCB0byBjb3B5IHZhbHVlcy5cbiAqIEBwYXJhbSBjb25zdW1lciBBIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgZWFjaCBgc3ViamVjdGAgYW5kIGBzb3VyY2VgIHZhbHVlIHBhaXIuXG4gKiBAcmV0dXJucyBUaGUgYHN1YmplY3RgIGFmdGVyIHByb2Nlc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lRW50cmllczxUS2V5cyBleHRlbmRzIHN0cmluZywgVFZhbHVlcz4oXG4gIHN1YmplY3Q6IFBhcnRpYWw8UmVjb3JkPFRLZXlzLCBUVmFsdWVzPj4sXG4gIHNvdXJjZTogUGFydGlhbDxSZWNvcmQ8VEtleXMsIFRWYWx1ZXM+PiB8IHVuZGVmaW5lZCxcbiAgY29uc3VtZXI6IChzdWJqZWN0S2V5OiBUVmFsdWVzLCBzb3VyY2VLZXk6IFRWYWx1ZXMgfCB1bmRlZmluZWQpID0+IHVua25vd24sXG4pOiBQYXJ0aWFsPFJlY29yZDxUS2V5cywgVFZhbHVlcz4+IHtcbiAgaWYgKGlzTmlsKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iamVjdEVudHJpZXMoc3ViamVjdCkpIHtcbiAgICBjb25zdW1lcih2YWx1ZSwgc291cmNlW2tleV0pO1xuICB9XG4gIHJldHVybiBzdWJqZWN0O1xufVxuXG4vKipcbiAqIEdpdmVuIGEgYHN1YmplY3RgIG9iamVjdCBzY2hlbWEsIGNvbnN1bWUgYWxsIGtub3duIHZhbHVlcyBmcm9tIHRoZVxuICogYHNvdXJjZWAgaW50byB0aGUgc2NoZW1hIG9iamVjdC5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIGxvZyBhIG1lc3NhZ2Ugd2hlbiB0aGUgYHNvdXJjZWAgd2FzIG1pc3NpbmcgYSB2YWx1ZSBleHBlY3RlZFxuICogYnkgdGhlIGBzdWJqZWN0YCBzY2hlbWEgYW5kIGxvZyBhIHdhcm5pbmcgd2hlbiB0aGUgYHNvdXJjZWAgc3VwcGxpZWQgYVxuICogdmFsdWUgdGhhdCB3YXMgbm90IGV4cGVjdGVkIGJ5IHRoZSBgc3ViamVjdGAgc2NoZW1hLlxuICpcbiAqIEBwYXJhbSBzdWJqZWN0IEFuIG9iamVjdCB0aGF0IHNob3VsZCBjb25zdW1lIHZhbHVlcyBmcm9tIHRoZSBzb3VyY2UuXG4gKiBAcGFyYW0gc291cmNlIEFuIG9iamVjdCB0aGF0IGlzIHNpbWlsYXIgdG8gdGhlIGBzdWJqZWN0YCBmcm9tIHdoaWNoIHRvIGNvcHkgdmFsdWVzLlxuICogQHBhcmFtIGNvbnN1bWVyIEEgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyBlYWNoIGBzdWJqZWN0YCBhbmQgYHNvdXJjZWAgdmFsdWUgcGFpci5cbiAqIEByZXR1cm5zIFRoZSBgc3ViamVjdGAgYWZ0ZXIgcHJvY2Vzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVFbnRyaWVzUGVkYW50aWM8VEtleXMgZXh0ZW5kcyBzdHJpbmcsIFRWYWx1ZXM+KFxuICBzdWJqZWN0OiBQYXJ0aWFsPFJlY29yZDxUS2V5cywgVFZhbHVlcz4+LFxuICBzb3VyY2U6IFBhcnRpYWw8UmVjb3JkPFRLZXlzLCBUVmFsdWVzPj4gfCB1bmRlZmluZWQsXG4gIGNvbnN1bWVyOiAoc3ViamVjdEtleTogVFZhbHVlcywgc291cmNlS2V5OiBUVmFsdWVzIHwgdW5kZWZpbmVkKSA9PiB1bmtub3duLFxuKTogUGFydGlhbDxSZWNvcmQ8VEtleXMsIFRWYWx1ZXM+PiB7XG4gIGlmIChpc05pbChzb3VyY2UpKSB7XG4gICAgY29uc29sZS53YXJuKC4uLmNsKFwiTm8gc291cmNlIGRhdGEgd2FzIHByb3ZpZGVkLlwiKSk7XG4gICAgcmV0dXJuIHN1YmplY3Q7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmplY3RFbnRyaWVzKHN1YmplY3QpKSB7XG4gICAgaWYgKCEoa2V5IGluIHNvdXJjZSkpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChgRW50cnkgJyR7a2V5fScgaXMgbWlzc2luZyBpbiBzb3VyY2UuIFVzaW5nIGRlZmF1bHQgdmFsdWUuYCkpO1xuICAgIH1cbiAgICBjb25zdW1lcih2YWx1ZSwgc291cmNlW2tleV0pO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5XSBvZiBvYmplY3RFbnRyaWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoIShrZXkgaW4gc3ViamVjdCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgYEVudHJ5ICcke2tleX0nIHdhcyBmb3VuZCBpbiBzb3VyY2UsIGJ1dCBpdCBpcyBub3QgZXhwZWN0ZWQgYnkgdGhlIHN1YmplY3Qgc2NoZW1hLiBUaGlzIGVudHJ5IHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1YmplY3Q7XG59XG5cbi8qKlxuICogVW5pcXVlIHdyYXBzIGFuIG9iamVjdCB0byBwcmV2ZW50IGFjY2lkZW50YWwgc2hhcmluZyBvZiByZWZlcmVuY2VzIGJ5XG4gKiByZXR1cm5pbmcgY2xvbmVkIHZlcnNpb25zIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmlxdWU8VD4ge1xuICBwcml2YXRlIF9lbGVtOiBUO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW06IFQpIHtcbiAgICB0aGlzLl9lbGVtID0gc3RydWN0dXJlZENsb25lKGVsZW0pO1xuICB9XG5cbiAgdW53cmFwKCkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZWxlbSk7XG4gIH1cblxuICByZXBsYWNlKGVsZW06IFQpIHtcbiAgICB0aGlzLl9lbGVtID0gc3RydWN0dXJlZENsb25lKGVsZW0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnVud3JhcCgpO1xuICB9XG59XG4iLCIvKipcbiAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB3aXRoIHRoZSBmaXJzdCBsZXR0ZXIgaW4gdXBwZXIgY2FzZS5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdWNmaXJzdChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgaW5wdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogUm91bmRzIHRoZSBnaXZlbiBudW1iZXIgdG8gdHdvIGRlY2ltYWxzLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmRUb1R3byhpbnB1dDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoaW5wdXQgKiAxMDApIC8gMTAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRpdmVPbmVUb0luZmluaXR5KHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdmFsdWUgPT09IC0xID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogdmFsdWU7XG59XG4iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL2FycmF5LmpzXCI7XG5pbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZmlyZUl0ZW0gfSBmcm9tIFwiLi4vc2V0dGluZ3MvQm9uZmlyZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBvYmplY3RFbnRyaWVzIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IG5lZ2F0aXZlT25lVG9JbmZpbml0eSB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBVbnNhZmVCdWlsZGluZyxcbiAgVW5zYWZlU3RhZ2luZ0JsZEJ1dHRvbk9wdGlvbnMsXG4gIFVuc2FmZVVuc3RhZ2VkQnVpbGRpbmdCdXR0b25PcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvYnVpbGRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1aWxkaW5nU3RhY2thYmxlQnRuQ29udHJvbGxlcixcbiAgVW5zYWZlQnVpbGRpbmdCdG5Nb2Rlcm5Nb2RlbCxcbiAgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbCxcbn0gZnJvbSBcIi4uL3R5cGVzL2NvcmUuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWxsQnVpbGRpbmdzLFxuICBCdWlsZGluZyxcbiAgUHJpY2UsXG4gIFJlc291cmNlLFxuICBUYWJJZCxcbiAgVGltZUl0ZW1WYXJpYW50LFxuICBVbmljb3JuSXRlbVZhcmlhbnQsXG4gIFVubG9ja3MsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBVbnNhZmVSZWxpZ2lvbkJ0bk1vZGVsLFxuICBVbnNhZmVSZWxpZ2lvbkJ1dHRvbk9wdGlvbnMsXG4gIFVuc2FmZVJlbGlnaW9uVXBncmFkZSxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZUJ0bk1vZGVsLFxuICBVbnNhZmVUcmFuc2NlbmRlbmNlQnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZVVwZ3JhZGUsXG4gIFVuc2FmZVppZ2d1cmF0QnRuTW9kZWwsXG4gIFVuc2FmZVppZ2d1cmF0QnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlWmlnZ3VyYXRVcGdyYWRlLFxufSBmcm9tIFwiLi4vdHlwZXMvcmVsaWdpb24uanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgVW5zYWZlUGxhbmV0QnVpbGRpbmdCdXR0b25PcHRpb25zLFxuICBVbnNhZmVTcGFjZUJ1aWxkaW5nLFxuICBVbnNhZmVTcGFjZVByb2dyYW1CdXR0b25PcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvc3BhY2UuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlLFxuICBVbnNhZmVDaHJvbm9mb3JnZVVwZ3JhZGVCdXR0b25PcHRpb25zLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlQnV0dG9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3R5cGVzL3RpbWUuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4uL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBCdWxrQnVpbGRMaXN0SXRlbSA9IHtcbiAgY291bnQ6IG51bWJlcjtcbiAgaWQ6IEFsbEJ1aWxkaW5ncztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIG5hbWU/OiBBbGxCdWlsZGluZ3M7XG4gIHN0YWdlPzogbnVtYmVyO1xuICB2YXJpYW50PzogVGltZUl0ZW1WYXJpYW50IHwgVW5pY29ybkl0ZW1WYXJpYW50O1xufTtcblxudHlwZSBCdWlsZFJlcXVlc3QgPSB7XG4gIGlkOiBBbGxCdWlsZGluZ3M7XG4gIHByaWNlczogQXJyYXk8UHJpY2U+O1xuICBwcmljZVJhdGlvOiBudW1iZXI7XG4gIHNvdXJjZTogVGFiSWQ7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHZhbDogbnVtYmVyO1xufTtcblxudHlwZSBQb3RlbnRpYWxCdWlsZCA9IHtcbiAgaWQ6IEFsbEJ1aWxkaW5ncztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIG5hbWU/OiBBbGxCdWlsZGluZ3M7XG4gIHNwb3Q6IG51bWJlcjtcbiAgY291bnQ6IG51bWJlcjtcbiAgcHJpY2VzOiBBcnJheTxQcmljZT47XG4gIHByaWNlUmF0aW86IG51bWJlcjtcbiAgc291cmNlOiBUYWJJZDtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdmFsOiBudW1iZXI7XG4gIHZhcmlhbnQ/OiBUaW1lSXRlbVZhcmlhbnQgfCBVbmljb3JuSXRlbVZhcmlhbnQ7XG59O1xuXG5leHBvcnQgY2xhc3MgQnVsa1B1cmNoYXNlSGVscGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoaG9zdDogS2l0dGVuU2NpZW50aXN0cywgd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXIpIHtcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcbiAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIgPSB3b3Jrc2hvcE1hbmFnZXI7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIGhhc2ggb2YgcG90ZW50aWFsIGJ1aWxkcyBhbmQgZGV0ZXJtaW5lIGhvdyBtYW55IG9mIHRoZW0gY2FuIGJlIGJ1aWx0LlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRzIC0gQWxsIHBvdGVudGlhbCBidWlsZHMuXG4gICAqIEBwYXJhbSBtZXRhRGF0YSAtIFRoZSBtZXRhZGF0YSBmb3IgdGhlIHBvdGVudGlhbCBidWlsZHMuXG4gICAqIEBwYXJhbSBzZWN0aW9uVHJpZ2dlciAtIFRoZSBjb25maWd1cmVkIHRyaWdnZXIgdGhyZXNob2xkIGZvciB0aGUgc2VjdGlvbiBvZiB0aGVzZSBidWlsZHMuXG4gICAqIEBwYXJhbSBzb3VyY2VUYWIgLSBUaGUgdGFiIHRoZXNlIGJ1aWxkcyBvcmlnaW5hdGUgZnJvbS5cbiAgICogQHJldHVybnMgQWxsIHRoZSBwb3NzaWJsZSBidWlsZHMuXG4gICAqL1xuICBidWxrKFxuICAgIGJ1aWxkczogUGFydGlhbDxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgQWxsQnVpbGRpbmdzLFxuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAgICAgICBsYWJlbD86IHN0cmluZztcbiAgICAgICAgICBtYXg/OiBudW1iZXI7XG4gICAgICAgICAgYmFzZUJ1aWxkaW5nPzogQnVpbGRpbmc7XG4gICAgICAgICAgYnVpbGRpbmc/OiBBbGxCdWlsZGluZ3MgfCBCb25maXJlSXRlbTtcbiAgICAgICAgICBzdGFnZT86IG51bWJlcjtcbiAgICAgICAgICB0cmlnZ2VyOiBudW1iZXI7XG4gICAgICAgICAgdmFyaWFudD86IFRpbWVJdGVtVmFyaWFudCB8IFVuaWNvcm5JdGVtVmFyaWFudDtcbiAgICAgICAgfVxuICAgICAgPlxuICAgID4sXG4gICAgbWV0YURhdGE6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIEFsbEJ1aWxkaW5ncyxcbiAgICAgICAgUmVxdWlyZWQ8XG4gICAgICAgICAgfCBVbnNhZmVCdWlsZGluZ1xuICAgICAgICAgIHwgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVSZWxpZ2lvblVwZ3JhZGVcbiAgICAgICAgICB8IFVuc2FmZVNwYWNlQnVpbGRpbmdcbiAgICAgICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVaaWdndXJhdFVwZ3JhZGVcbiAgICAgICAgPlxuICAgICAgPlxuICAgID4sXG4gICAgc2VjdGlvblRyaWdnZXI6IG51bWJlcixcbiAgICBzb3VyY2VUYWI6IFRhYklkLFxuICApOiBBcnJheTxCdWxrQnVpbGRMaXN0SXRlbT4ge1xuICAgIGNvbnN0IHBvdGVudGlhbEJ1aWxkczogQXJyYXk8UG90ZW50aWFsQnVpbGQ+ID0gW107XG5cbiAgICAvLyBIb3cgbWFueSBidWlsZHMgYXJlIG9uIHRoZSBsaXN0LlxuICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIGJ1aWxkXSBvZiBvYmplY3RFbnRyaWVzKGJ1aWxkcykpIHtcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBFbmdpbmUuZXZhbHVhdGVTdWJTZWN0aW9uVHJpZ2dlcihzZWN0aW9uVHJpZ2dlciwgYnVpbGQudHJpZ2dlcik7XG4gICAgICBjb25zdCBidWlsZE1ldGFEYXRhID0gbXVzdEV4aXN0KG1ldGFEYXRhW25hbWVdKTtcblxuICAgICAgLy8gSWYgdGhlIGJ1aWxkIGlzIGRpc2FibGVkLCBza2lwIGl0LlxuICAgICAgaWYgKCFidWlsZC5lbmFibGVkIHx8IHRyaWdnZXIgPCAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyB0SGlkZGVuIGlzIGEgZmxhZyB0aGF0IGlzIG1hbnVhbGx5IHNldCB0byBleGNsdWRlIHRpbWUgYnVpbGRpbmdzIGZyb20gdGhlIHByb2Nlc3MuXG4gICAgICBpZiAoXCJ0SGlkZGVuXCIgaW4gYnVpbGRNZXRhRGF0YSAmJiBidWlsZE1ldGFEYXRhLnRIaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBySGlkZGVuIGlzIGEgZmxhZyB0aGF0IGlzIG1hbnVhbGx5IHNldCB0byBleGNsdWRlIHJlbGlnaW9uIGJ1aWxkaW5ncyBmcm9tIHRoZSBwcm9jZXNzLlxuICAgICAgaWYgKFwickhpZGRlblwiIGluIGJ1aWxkTWV0YURhdGEgJiYgYnVpbGRNZXRhRGF0YS5ySGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlIGJ1aWxkaW5nIGlzbid0IHVubG9ja2VkLCBza2lwIGl0LlxuICAgICAgaWYgKGJ1aWxkTWV0YURhdGEudW5sb2NrZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgbWF4IGFsbG93ZWQgYnVpbGRpbmdzIGhhdmUgYWxyZWFkeSBiZWVuIGJ1aWx0LCB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIHRoZW0uXG4gICAgICBpZiAoIWlzTmlsKGJ1aWxkLm1heCkgJiYgLTEgPCBidWlsZC5tYXggJiYgYnVpbGQubWF4IDw9IGJ1aWxkTWV0YURhdGEudmFsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgY3J5b2NoYW1iZXJzLCBpZiB0aGVyZSBhcmUgdXNlZCBjcnlvY2hhbWJlcnMsIGRvbid0IGJ1aWxkIG5ldyBvbmVzLlxuICAgICAgLy8gQWxzbywgZG9uJ3QgYnVpbGQgbW9yZSBjcnlvY2hhbWJlcnMgdGhhbiB5b3UgaGF2ZSBjaHJvbm9zcGhlcmVzLCBhcyB0aGV5J2xsIHN0YXkgdW51c2VkLlxuICAgICAgaWYgKFxuICAgICAgICBuYW1lID09PSBcImNyeW9jaGFtYmVyc1wiICYmXG4gICAgICAgIChtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnRpbWUuZ2V0VlNVKFwidXNlZENyeW9jaGFtYmVyc1wiKSkudmFsID4gMCB8fFxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJjaHJvbm9zcGhlcmVcIikubWV0YS52YWwgPD0gYnVpbGRNZXRhRGF0YS52YWwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGdlbmVyYWxpemVkIHRvIG1hdGNoIGFsbCBidWlsZHMgdGhhdCBoYXZlIGEgYGxpbWl0QnVpbGRgIHByb3BlcnR5LlxuICAgICAgaWYgKG5hbWUgPT09IFwicmVzc291cmNlUmV0cmlldmFsXCIgJiYgYnVpbGRNZXRhRGF0YS52YWwgPj0gMTAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHByaWNlcyBhbmQgdGhlIHByaWNlIHJhdGlvIG9mIHRoaXMgYnVpbGQuXG4gICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QoXG4gICAgICAgIHRoaXMuX2lzU3RhZ2VkQnVpbGQoYnVpbGRNZXRhRGF0YSlcbiAgICAgICAgICA/IGJ1aWxkTWV0YURhdGEuc3RhZ2VzW2J1aWxkTWV0YURhdGEuc3RhZ2VdLnByaWNlc1xuICAgICAgICAgIDogYnVpbGRNZXRhRGF0YS5wcmljZXMsXG4gICAgICApO1xuICAgICAgY29uc3QgcHJpY2VSYXRpbyA9IHRoaXMuZ2V0UHJpY2VSYXRpbyhidWlsZE1ldGFEYXRhLCBzb3VyY2VUYWIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gYnVpbGQgdGhpcyBpdGVtLlxuICAgICAgaWYgKCF0aGlzLnNpbmdsZUJ1aWxkUG9zc2libGUoYnVpbGRNZXRhRGF0YSwgcHJpY2VzLCBwcmljZVJhdGlvLCBzb3VyY2VUYWIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGJ1aWxkLlxuICAgICAgLy8gV2Ugd2FudCBhIGxpc3Qgb2YgYWxsIHJlc291cmNlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhpcyBidWlsZCwgd2hpY2ggaGF2ZSBhIGNhcGFjaXR5LlxuICAgICAgY29uc3QgcmVxdWlyZWRNYXRlcmlhbHMgPSBwcmljZXNcbiAgICAgICAgLm1hcChwcmljZSA9PiB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UocHJpY2UubmFtZSkpXG4gICAgICAgIC5maWx0ZXIobWF0ZXJpYWwgPT4gMCA8IG1hdGVyaWFsLm1heFZhbHVlKTtcbiAgICAgIGNvbnN0IGFsbE1hdGVyaWFsc0Fib3ZlVHJpZ2dlciA9XG4gICAgICAgIHJlcXVpcmVkTWF0ZXJpYWxzLmZpbHRlcihtYXRlcmlhbCA9PiBtYXRlcmlhbC52YWx1ZSAvIG1hdGVyaWFsLm1heFZhbHVlIDwgdHJpZ2dlcilcbiAgICAgICAgICAubGVuZ3RoID09PSAwO1xuXG4gICAgICBpZiAoYWxsTWF0ZXJpYWxzQWJvdmVUcmlnZ2VyKSB7XG4gICAgICAgIC8vIElmIHRoZSBidWlsZCBpcyBmb3IgYSBzdGFnZSB0aGF0IHRoZSBidWlsZGluZyBpc24ndCBjdXJyZW50bHkgYXQsIHNraXAgaXQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLl9pc1N0YWdlZEJ1aWxkKGJ1aWxkTWV0YURhdGEpICYmXG4gICAgICAgICAgdHlwZW9mIGJ1aWxkLnN0YWdlICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYnVpbGQuc3RhZ2UgIT09IGJ1aWxkTWV0YURhdGEuc3RhZ2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtUHJpY2VzID0gW107XG5cbiAgICAgICAgLy8gR2V0IGNvc3QgcmVkdWN0aW9uIG1vZGlmaWVyLlxuICAgICAgICBjb25zdCBwcmljZXNEaXNjb3VudCA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRMaW1pdGVkRFIoXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChgJHtuYW1lfUNvc3RSZWR1Y3Rpb25gIGFzIGNvbnN0KSxcbiAgICAgICAgICAxLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBwcmljZU1vZGlmaWVyID0gMSAtIHByaWNlc0Rpc2NvdW50O1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgYWN0dWFsIHByaWNlcyBmb3IgdGhpcyBidWlsZGluZy5cbiAgICAgICAgZm9yIChjb25zdCBwcmljZSBvZiBwcmljZXMpIHtcbiAgICAgICAgICBjb25zdCByZXNQcmljZURpc2NvdW50ID0gdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUihcbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoYCR7cHJpY2UubmFtZX1Db3N0UmVkdWN0aW9uYCBhcyBjb25zdCksXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcmVzUHJpY2VNb2RpZmllciA9IDEgLSByZXNQcmljZURpc2NvdW50O1xuICAgICAgICAgIGl0ZW1QcmljZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBwcmljZS5uYW1lLFxuICAgICAgICAgICAgdmFsOiBwcmljZS52YWwgKiBwcmljZU1vZGlmaWVyICogcmVzUHJpY2VNb2RpZmllcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgY2FjaGUgbGlzdCBmb3IgdGhlIGJ1bGsgcHJvY2Vzc2luZy5cbiAgICAgICAgcG90ZW50aWFsQnVpbGRzLnB1c2goe1xuICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgIGlkOiBuYW1lLFxuICAgICAgICAgIGxhYmVsOiBidWlsZC5sYWJlbCxcbiAgICAgICAgICBsaW1pdDogYnVpbGQubWF4IHx8IDAsXG4gICAgICAgICAgbmFtZTogKGJ1aWxkLmJhc2VCdWlsZGluZyA/PyBidWlsZC5idWlsZGluZykgYXMgQnVpbGRpbmcsXG4gICAgICAgICAgcHJpY2VSYXRpbzogcHJpY2VSYXRpbyxcbiAgICAgICAgICBwcmljZXM6IGl0ZW1QcmljZXMsXG4gICAgICAgICAgc291cmNlOiBzb3VyY2VUYWIsXG4gICAgICAgICAgc3BvdDogY291bnRlcixcbiAgICAgICAgICB2YWw6IGJ1aWxkTWV0YURhdGEudmFsLFxuICAgICAgICAgIHZhcmlhbnQ6IGJ1aWxkLnZhcmlhbnQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG90ZW50aWFsQnVpbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgcmVzb3VyY2VzLlxuICAgIC8vIFdlIG5lZWQgYSBjb3B5LCBiZWNhdXNlIGBfZ2V0UG9zc2libGVCdWlsZENvdW50YCBtb2RpZmllcyB0aGlzIGRhdGEuXG4gICAgY29uc3QgY3VycmVudFJlc291cmNlUG9vbDogUmVjb3JkPFJlc291cmNlLCBudW1iZXI+ID0ge30gYXMgUmVjb3JkPFJlc291cmNlLCBudW1iZXI+O1xuICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLnJlc291cmNlcykge1xuICAgICAgY3VycmVudFJlc291cmNlUG9vbFtyZXMubmFtZV0gPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocmVzLm5hbWUpO1xuICAgIH1cblxuICAgIGxldCBpdGVyYXRpb25zID0gMDtcbiAgICBjb25zdCBidWlsZHNDb21taXR0ZWQgPSBuZXcgQXJyYXk8UG90ZW50aWFsQnVpbGQ+KCk7XG4gICAgd2hpbGUgKGl0ZXJhdGlvbnMgPCAxZTUpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXNUaGlzSXRlcmF0aW9uID0gZGlmZmVyZW5jZShwb3RlbnRpYWxCdWlsZHMsIGJ1aWxkc0NvbW1pdHRlZCk7XG5cbiAgICAgIGxldCBidWlsZFRoaXNJdGVyYXRpb24gPSAwO1xuICAgICAgY29uc3QgY29tbWl0dGVkVGhpc0l0ZXJhdGlvbiA9IFtdO1xuICAgICAgbGV0IHRlbXBQb29sID0geyAuLi5jdXJyZW50UmVzb3VyY2VQb29sIH07XG4gICAgICAvLyBQYXkgYWxyZWFkeSBjb21taXR0ZWQgYnVpbGRzIGZyb20gdGhlIHRlbXAgcG9vbC5cbiAgICAgIGZvciAoY29uc3QgY29tbWl0dGVkQnVpbGQgb2YgYnVpbGRzQ29tbWl0dGVkKSB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlSW5zdGFuY2VzID0gdGhpcy5fcHJlY2FsY3VsYXRlQnVpbGRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLmNvbW1pdHRlZEJ1aWxkLFxuICAgICAgICAgICAgbGltaXQ6IGNvbW1pdHRlZEJ1aWxkLnZhbCArIGNvbW1pdHRlZEJ1aWxkLmNvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0YURhdGEsXG4gICAgICAgICAgdGVtcFBvb2wsXG4gICAgICAgICk7XG4gICAgICAgIHRlbXBQb29sID0gcG9zc2libGVJbnN0YW5jZXMucmVtYWluaW5nUmVzb3VyY2VzO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3cgc2VlIHdoYXQgd2UgY2FuIGRvIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHBvb2wuXG4gICAgICBmb3IgKGNvbnN0IHBvdGVudGlhbEJ1aWxkIG9mIGNhbmRpZGF0ZXNUaGlzSXRlcmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluc3RhbmNlQ291bnQgPSBwb3RlbnRpYWxCdWlsZC5jb3VudCArIDE7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlSW5zdGFuY2VzID0gdGhpcy5fcHJlY2FsY3VsYXRlQnVpbGRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnBvdGVudGlhbEJ1aWxkLFxuICAgICAgICAgICAgbGltaXQ6IE1hdGgubWluKFxuICAgICAgICAgICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkocG90ZW50aWFsQnVpbGQubGltaXQpLFxuICAgICAgICAgICAgICBwb3RlbnRpYWxCdWlsZC52YWwgKyB0YXJnZXRJbnN0YW5jZUNvdW50LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldGFEYXRhLFxuICAgICAgICAgIHRlbXBQb29sLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwb3NzaWJsZUluc3RhbmNlcy5jb3VudCA8IHRhcmdldEluc3RhbmNlQ291bnQpIHtcbiAgICAgICAgICBjb21taXR0ZWRUaGlzSXRlcmF0aW9uLnB1c2gocG90ZW50aWFsQnVpbGQpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcG90ZW50aWFsQnVpbGQuY291bnQgPSB0YXJnZXRJbnN0YW5jZUNvdW50O1xuICAgICAgICB0ZW1wUG9vbCA9IHBvc3NpYmxlSW5zdGFuY2VzLnJlbWFpbmluZ1Jlc291cmNlcztcblxuICAgICAgICBidWlsZFRoaXNJdGVyYXRpb24rKztcbiAgICAgIH1cblxuICAgICAgYnVpbGRzQ29tbWl0dGVkLnB1c2goLi4uY29tbWl0dGVkVGhpc0l0ZXJhdGlvbik7XG5cbiAgICAgIGl0ZXJhdGlvbnMrKztcblxuICAgICAgaWYgKGJ1aWxkVGhpc0l0ZXJhdGlvbiA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBUb29rICcke2l0ZXJhdGlvbnN9JyBpdGVyYXRpb25zIHRvIGV2YWx1YXRlIGJ1bGsgYnVpbGQgcmVxdWVzdC5gKSk7XG5cbiAgICByZXR1cm4gYnVpbGRzQ29tbWl0dGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBob3cgbWFueSBvZiBhIGdpdmVuIGJ1aWxkIGl0ZW0gYnVpbGQgYmUgYnVpbHQgd2l0aCB0aGUgZ2l2ZW4gcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRDYWNoZUl0ZW0gVGhlIGl0ZW0gdG8gYnVpbGQuXG4gICAqIEBwYXJhbSBidWlsZENhY2hlSXRlbS5pZCA/XG4gICAqIEBwYXJhbSBidWlsZENhY2hlSXRlbS5uYW1lID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLmNvdW50ID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLnNwb3QgP1xuICAgKiBAcGFyYW0gYnVpbGRDYWNoZUl0ZW0ucHJpY2VzID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLnByaWNlUmF0aW8gP1xuICAgKiBAcGFyYW0gYnVpbGRDYWNoZUl0ZW0uc291cmNlID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLmxpbWl0ID9cbiAgICogQHBhcmFtIGJ1aWxkQ2FjaGVJdGVtLnZhbCA/XG4gICAqIEBwYXJhbSBtZXRhRGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBwb3RlbnRpYWwgYnVpbGRzLlxuICAgKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHJlc291cmNlcy5cbiAgICogQHJldHVybnMgVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNvdWxkIGJlIGJ1aWx0LiBJZiB0aGlzIGlzIG5vbi16ZXJvLCB0aGUgYHJlc291cmNlc2Agd2lsbCBoYXZlIGJlZW4gYWRqdXN0ZWRcbiAgICogdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGJ1aWxkcyBtYWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJlY2FsY3VsYXRlQnVpbGRzKFxuICAgIGJ1aWxkQ2FjaGVJdGVtOiBCdWlsZFJlcXVlc3QsXG4gICAgbWV0YURhdGE6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIEFsbEJ1aWxkaW5ncyxcbiAgICAgICAgUmVxdWlyZWQ8XG4gICAgICAgICAgfCBVbnNhZmVCdWlsZGluZ1xuICAgICAgICAgIHwgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVSZWxpZ2lvblVwZ3JhZGVcbiAgICAgICAgICB8IFVuc2FmZVNwYWNlQnVpbGRpbmdcbiAgICAgICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlXG4gICAgICAgICAgfCBVbnNhZmVaaWdndXJhdFVwZ3JhZGVcbiAgICAgICAgPlxuICAgICAgPlxuICAgID4sXG4gICAgcmVzb3VyY2VzOiBSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4sXG4gICk6IHtcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIHJlbWFpbmluZ1Jlc291cmNlczogUmVjb3JkPFJlc291cmNlLCBudW1iZXI+O1xuICB9IHtcbiAgICBsZXQgYnVpbGRzUG9zc2libGUgPSAwO1xuXG4gICAgY29uc3QgdGVtcFBvb2wgPSBPYmplY3QuYXNzaWduKHt9LCByZXNvdXJjZXMpO1xuXG4gICAgLy8gVGhlIEtHIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVpbGQuXG4gICAgY29uc3QgYnVpbGRNZXRhRGF0YSA9IG11c3RFeGlzdChtZXRhRGF0YVtidWlsZENhY2hlSXRlbS5pZF0pO1xuICAgIGNvbnN0IHByaWNlcyA9IGJ1aWxkQ2FjaGVJdGVtLnByaWNlcztcbiAgICBjb25zdCBwcmljZVJhdGlvID0gYnVpbGRDYWNoZUl0ZW0ucHJpY2VSYXRpbztcbiAgICBjb25zdCBzb3VyY2UgPSBidWlsZENhY2hlSXRlbS5zb3VyY2U7XG4gICAgbGV0IG1heEl0ZW1zQnVpbHQgPSBmYWxzZTtcblxuICAgIGlmIChwcmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBjb3VudDogMCwgcmVtYWluaW5nUmVzb3VyY2VzOiB0ZW1wUG9vbCB9O1xuICAgIH1cblxuICAgIC8vIFRoZXJlIGlzIGFjdHVhbGx5IG5vIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgbWF4SXRlbXNCdWlsdGAgY2hhbmdlcyBpbiB0aGUgbG9vcHMgYmVsb3cuXG4gICAgLy8gVGhpcyBjb3VsZCBlbmQgdXAgYmVpbmcgYW4gaW5maW5pdGUgbG9vcCB1bmRlciB1bmV4cGVjdGVkIGNvbmRpdGlvbnMuXG4gICAgd2hpbGUgKCFtYXhJdGVtc0J1aWx0KSB7XG4gICAgICAvLyBHbyB0aHJvdWdoIHRoZSBwcmljZXMgZm9yIHRoaXMgYnVpbGQuXG4gICAgICBmb3IgKGxldCBwcmljZUluZGV4ID0gMDsgcHJpY2VJbmRleCA8IHByaWNlcy5sZW5ndGg7IHByaWNlSW5kZXgrKykge1xuICAgICAgICAvLyBJcyB0aGlzIGFuIG9pbCBjb3N0IGZvciBhIGJ1aWxkIG9uIHRoZSBzcGFjZSB0YWI/XG4gICAgICAgIGxldCBzcGFjZU9pbCA9IGZhbHNlO1xuICAgICAgICAvLyBJcyB0aGlzIGEga2FybWEgY29zdCBmb3IgYnVpbGRpbmcgY3J5b2NoYW1iZXJzP1xuICAgICAgICBsZXQgY3J5b0thcm1hID0gZmFsc2U7XG4gICAgICAgIC8vIFRoZSBhY3R1YWwsIGRpc2NvdW50ZWQgb2lsIHByaWNlIGZvciB0aGUgYnVpbGQuXG4gICAgICAgIGxldCBvaWxQcmljZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgLy8gVGhlIGFjdHVhbCwgZGlzY291bnRlZCBrYXJtYSBwcmljZSBmb3IgdGhlIGJ1aWxkLlxuICAgICAgICBsZXQga2FybWFQcmljZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgZmxhZ3MgYWJvdmUuXG4gICAgICAgIGlmIChzb3VyY2UgPT09IFwiU3BhY2VcIiAmJiBwcmljZXNbcHJpY2VJbmRleF0ubmFtZSA9PT0gXCJvaWxcIikge1xuICAgICAgICAgIHNwYWNlT2lsID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IG9pbFJlZHVjdGlvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcIm9pbFJlZHVjdGlvblJhdGlvXCIpO1xuICAgICAgICAgIG9pbFByaWNlID1cbiAgICAgICAgICAgIHByaWNlc1twcmljZUluZGV4XS52YWwgKiAoMSAtIHRoaXMuX2hvc3QuZ2FtZS5nZXRMaW1pdGVkRFIob2lsUmVkdWN0aW9uUmF0aW8sIDAuNzUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChidWlsZENhY2hlSXRlbS5pZCA9PT0gXCJjcnlvY2hhbWJlcnNcIiAmJiBwcmljZXNbcHJpY2VJbmRleF0ubmFtZSA9PT0gXCJrYXJtYVwiKSB7XG4gICAgICAgICAgY3J5b0thcm1hID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IGJ1cm5lZFBhcmFnb25SYXRpbyA9IHRoaXMuX2hvc3QuZ2FtZS5wcmVzdGlnZS5nZXRCdXJuZWRQYXJhZ29uUmF0aW8oKTtcbiAgICAgICAgICBrYXJtYVByaWNlID1cbiAgICAgICAgICAgIHByaWNlc1twcmljZUluZGV4XS52YWwgKlxuICAgICAgICAgICAgKDEgLSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKDAuMDEgKiBidXJuZWRQYXJhZ29uUmF0aW8sIDEuMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwYWNlT2lsKSB7XG4gICAgICAgICAgbWF4SXRlbXNCdWlsdCA9IHRlbXBQb29sLm9pbCA8IG9pbFByaWNlICogMS4wNSAqKiAoYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3J5b0thcm1hKSB7XG4gICAgICAgICAgbWF4SXRlbXNCdWlsdCA9XG4gICAgICAgICAgICB0ZW1wUG9vbC5rYXJtYSA8IGthcm1hUHJpY2UgKiBwcmljZVJhdGlvICoqIChidWlsZHNQb3NzaWJsZSArIGJ1aWxkTWV0YURhdGEudmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXhJdGVtc0J1aWx0ID1cbiAgICAgICAgICAgIHRlbXBQb29sW3ByaWNlc1twcmljZUluZGV4XS5uYW1lXSA8XG4gICAgICAgICAgICBwcmljZXNbcHJpY2VJbmRleF0udmFsICogcHJpY2VSYXRpbyAqKiAoYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBhbnkgc3BlY2lhbCBidWlsZHMgaGF2ZSByZWFjaGVkIHRoZWlyIHJlYXNvbmFibGUgbGltaXQgb2YgdW5pdHMgdG8gYnVpbGQuXG4gICAgICAgIC8vIEluIHdoaWNoIGNhc2Ugd2UgdXBkYXRlIG91ciB0ZW1wb3JhcnkgcmVzb3VyY2VzIGNhY2hlLiBOb3Qgc3VyZSB3aHkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtYXhJdGVtc0J1aWx0IHx8XG4gICAgICAgICAgLy8gSXMgdGhpcyBhIG5vbi1zdGFja2FibGUgYnVpbGQ/XG4gICAgICAgICAgLy8gU3BhY2UgbWlzc2lvbnMgYW5kIHJlbGlnaW9uIHVwZ3JhZGVzIChiZWZvcmUgdHJhbnNjZW5kZW5jZSBpcyB1bmxvY2tlZClcbiAgICAgICAgICAvLyBhcmUgZXhhbXBsZSBvZiBub24tc3RhY2thYmxlIGJ1aWxkcy5cbiAgICAgICAgICAoXCJub1N0YWNrYWJsZVwiIGluIGJ1aWxkTWV0YURhdGEgJiZcbiAgICAgICAgICAgIGJ1aWxkTWV0YURhdGEubm9TdGFja2FibGUgJiZcbiAgICAgICAgICAgIGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwgPj0gMSkgfHxcbiAgICAgICAgICAvLyBJcyB0aGlzIHRoZSByZXNvdXJjZSByZXRyaWV2YWwgYnVpbGQ/IFRoaXMgb25lIGlzIGxpbWl0ZWQgdG8gMTAwIHVuaXRzLlxuICAgICAgICAgIChidWlsZENhY2hlSXRlbS5pZCA9PT0gXCJyZXNzb3VyY2VSZXRyaWV2YWxcIiAmJlxuICAgICAgICAgICAgYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCA+PSAxMDApIHx8XG4gICAgICAgICAgKGJ1aWxkQ2FjaGVJdGVtLmlkID09PSBcImNyeW9jaGFtYmVyc1wiICYmXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiY2hyb25vc3BoZXJlXCIpLm1ldGEudmFsIDw9XG4gICAgICAgICAgICAgIGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHByaWNlcyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkLlxuICAgICAgICAgIGZvciAobGV0IHByaWNlSW5kZXgyID0gMDsgcHJpY2VJbmRleDIgPCBwcmljZUluZGV4OyBwcmljZUluZGV4MisrKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBUaGlzIHNlZW1zIHRvIGp1c3QgYmUgYHNwYWNlT2lsYC5cbiAgICAgICAgICAgIC8vIFRPRE86IEEgbG90IG9mIHRoaXMgY29kZSBzZWVtcyB0byBiZSBhIGR1cGxpY2F0aW9uIGZyb20gYSBmZXcgbGluZXMgYWJvdmUuXG4gICAgICAgICAgICBpZiAoc291cmNlID09PSBcIlNwYWNlXCIgJiYgcHJpY2VzW3ByaWNlSW5kZXgyXS5uYW1lID09PSBcIm9pbFwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9pbFJlZHVjdGlvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcIm9pbFJlZHVjdGlvblJhdGlvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBvaWxQcmljZVJlZnVuZCA9XG4gICAgICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXgyXS52YWwgKlxuICAgICAgICAgICAgICAgICgxIC0gdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUihvaWxSZWR1Y3Rpb25SYXRpbywgMC43NSkpO1xuXG4gICAgICAgICAgICAgIHRlbXBQb29sLm9pbCArPSBvaWxQcmljZVJlZnVuZCAqIDEuMDUgKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuXG4gICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8ganVzdCBiZSBgY3J5b0thcm1hYC5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGJ1aWxkQ2FjaGVJdGVtLmlkID09PSBcImNyeW9jaGFtYmVyc1wiICYmXG4gICAgICAgICAgICAgIHByaWNlc1twcmljZUluZGV4Ml0ubmFtZSA9PT0gXCJrYXJtYVwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgYnVybmVkUGFyYWdvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldEJ1cm5lZFBhcmFnb25SYXRpbygpO1xuICAgICAgICAgICAgICBjb25zdCBrYXJtYVByaWNlUmVmdW5kID1cbiAgICAgICAgICAgICAgICBwcmljZXNbcHJpY2VJbmRleDJdLnZhbCAqXG4gICAgICAgICAgICAgICAgKDEgLSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKDAuMDEgKiBidXJuZWRQYXJhZ29uUmF0aW8sIDEuMCkpO1xuXG4gICAgICAgICAgICAgIHRlbXBQb29sLmthcm1hICs9XG4gICAgICAgICAgICAgICAga2FybWFQcmljZVJlZnVuZCAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVmdW5kVmFsID1cbiAgICAgICAgICAgICAgICBwcmljZXNbcHJpY2VJbmRleDJdLnZhbCAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICAgICAgICB0ZW1wUG9vbFtwcmljZXNbcHJpY2VJbmRleDJdLm5hbWVdICs9XG4gICAgICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXgyXS5uYW1lID09PSBcInZvaWRcIiA/IE1hdGguY2VpbChyZWZ1bmRWYWwpIDogcmVmdW5kVmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElzIHRoaXMgYSBsaW1pdGVkIGJ1aWxkPyBJZiBzbywgZG9uJ3QgYnVpbGQgbW9yZSB0aGFuIHRoZSBsaW1pdC5cbiAgICAgICAgICBpZiAoYnVpbGRDYWNoZUl0ZW0ubGltaXQgJiYgYnVpbGRDYWNoZUl0ZW0ubGltaXQgIT09IC0xKSB7XG4gICAgICAgICAgICBidWlsZHNQb3NzaWJsZSA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICBNYXRoLm1pbihidWlsZHNQb3NzaWJsZSwgYnVpbGRDYWNoZUl0ZW0ubGltaXQgLSBidWlsZENhY2hlSXRlbS52YWwpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyBjb3VudDogYnVpbGRzUG9zc2libGUsIHJlbWFpbmluZ1Jlc291cmNlczogdGVtcFBvb2wgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZHVjdCB0aGUgY29zdCBvZiB0aGlzIHByaWNlIGZyb20gdGhlIHRlbXBvcmFyeSByZXNvdXJjZSBjYWNoZS5cbiAgICAgICAgaWYgKHNwYWNlT2lsKSB7XG4gICAgICAgICAgdGVtcFBvb2wub2lsIC09IG9pbFByaWNlICogMS4wNSAqKiAoYnVpbGRzUG9zc2libGUgKyBidWlsZE1ldGFEYXRhLnZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3J5b0thcm1hKSB7XG4gICAgICAgICAgdGVtcFBvb2wua2FybWEgLT0ga2FybWFQcmljZSAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5ld1ByaWNlVmFsdWUgPVxuICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXhdLnZhbCAqIHByaWNlUmF0aW8gKiogKGJ1aWxkc1Bvc3NpYmxlICsgYnVpbGRNZXRhRGF0YS52YWwpO1xuICAgICAgICAgIHRlbXBQb29sW3ByaWNlc1twcmljZUluZGV4XS5uYW1lXSAtPVxuICAgICAgICAgICAgcHJpY2VzW3ByaWNlSW5kZXhdLm5hbWUgPT09IFwidm9pZFwiID8gTWF0aC5jZWlsKG5ld1ByaWNlVmFsdWUpIDogbmV3UHJpY2VWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBuZXh0IHByaWNlLi4uXG4gICAgICB9XG5cbiAgICAgICsrYnVpbGRzUG9zc2libGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY291bnQ6IGJ1aWxkc1Bvc3NpYmxlLCByZW1haW5pbmdSZXNvdXJjZXM6IHRlbXBQb29sIH07XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgdGhlIGJ1aWxkIGZvciBhIGdpdmVuIGJ1dHRvbi5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1dHRvbi5cbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnVpbGQgYnV0dG9uLlxuICAgKiBAcGFyYW0gYW1vdW50IEhvdyBtYW55IGl0ZW1zIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBIb3cgbWFueSBpdGVtcyB3ZXJlIGJ1aWx0LlxuICAgKi9cbiAgY29uc3RydWN0PFxuICAgIFRNb2RlbCBleHRlbmRzXG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWw8VW5zYWZlU3RhZ2luZ0JsZEJ1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWw8VW5zYWZlVW5zdGFnZWRCdWlsZGluZ0J1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nU3RhY2thYmxlQnRuTW9kZWw8VW5zYWZlQ2hyb25vZm9yZ2VVcGdyYWRlQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbDxVbnNhZmVQbGFuZXRCdWlsZGluZ0J1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZUJ1aWxkaW5nU3RhY2thYmxlQnRuTW9kZWw8VW5zYWZlU3BhY2VQcm9ncmFtQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbDxVbnNhZmVWb2lkU3BhY2VVcGdyYWRlQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlUmVsaWdpb25CdG5Nb2RlbDxVbnNhZmVSZWxpZ2lvbkJ1dHRvbk9wdGlvbnM+XG4gICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VCdG5Nb2RlbDxVbnNhZmVUcmFuc2NlbmRlbmNlQnV0dG9uT3B0aW9ucz5cbiAgICAgIHwgVW5zYWZlWmlnZ3VyYXRCdG5Nb2RlbDxVbnNhZmVaaWdndXJhdEJ1dHRvbk9wdGlvbnM+LFxuICAgIFRDb250cm9sbGVyIGV4dGVuZHMgQnVpbGRpbmdTdGFja2FibGVCdG5Db250cm9sbGVyPFRNb2RlbD4sXG4gID4obW9kZWw6IFRNb2RlbCwgY29udHJvbGxlcjogVENvbnRyb2xsZXIsIGFtb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoXCJuYW1lXCIgaW4gbW9kZWwgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKFwiY29udHJvbGxlclwiIGluIG1vZGVsLm9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKFwiZ2V0TWV0YWRhdGFcIiBpbiBtb2RlbC5vcHRpb25zLmNvbnRyb2xsZXIgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gbW9kZWwubWV0YWRhdGE7XG4gICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgIGxldCBhbW91bnRDYWxjdWxhdGVkID0gYW1vdW50O1xuXG4gICAgLy8gRm9yIGxpbWl0ZWQgYnVpbGRzLCBvbmx5IGNvbnN0cnVjdCB1cCB0byB0aGUgbWF4LlxuICAgIGNvbnN0IHZzTWV0YSA9IG1ldGEgYXMgUmVxdWlyZWQ8VW5zYWZlVm9pZFNwYWNlVXBncmFkZT47XG4gICAgaWYgKCFpc05pbCh2c01ldGEubGltaXRCdWlsZCkgJiYgdnNNZXRhLmxpbWl0QnVpbGQgLSB2c01ldGEudmFsIDwgYW1vdW50Q2FsY3VsYXRlZCkge1xuICAgICAgYW1vdW50Q2FsY3VsYXRlZCA9IHZzTWV0YS5saW1pdEJ1aWxkIC0gdnNNZXRhLnZhbDtcbiAgICB9XG5cbiAgICBpZiAoKG1vZGVsLmVuYWJsZWQgJiYgY29udHJvbGxlci5oYXNSZXNvdXJjZXMobW9kZWwpKSB8fCB0aGlzLl9ob3N0LmdhbWUuZGV2TW9kZSkge1xuICAgICAgd2hpbGUgKGNvbnRyb2xsZXIuaGFzUmVzb3VyY2VzKG1vZGVsKSAmJiBhbW91bnRDYWxjdWxhdGVkID4gMCkge1xuICAgICAgICBtb2RlbC5wcmljZXMgPSBjb250cm9sbGVyLmdldFByaWNlcyhtb2RlbCk7XG4gICAgICAgIGNvbnRyb2xsZXIucGF5UHJpY2UobW9kZWwpO1xuICAgICAgICBjb250cm9sbGVyLmluY3JlbWVudFZhbHVlKG1vZGVsKTtcbiAgICAgICAgY291bnRlcisrO1xuICAgICAgICBhbW91bnRDYWxjdWxhdGVkLS07XG4gICAgICB9XG4gICAgICBpZiAodnNNZXRhLmJyZWFrSXJvbldpbGwpIHtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmlyb25XaWxsID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWlzTmlsKG1ldGEpKSB7XG4gICAgICAgIGlmIChcInVubG9ja3NcIiBpbiBtZXRhICYmICFpc05pbChtZXRhLnVubG9ja3MpKSB7XG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnVubG9jayhtZXRhLnVubG9ja3MgYXMgUGFydGlhbDxVbmxvY2tzPik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidXBncmFkZXNcIiBpbiBtZXRhICYmICFpc05pbChtZXRhLnVwZ3JhZGVzKSkge1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51cGdyYWRlKG1ldGEudXBncmFkZXMgYXMgUGFydGlhbDxVbmxvY2tzPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cblxuICBwcml2YXRlIF9pc1N0YWdlZEJ1aWxkKFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogVGhpcyBpcyBjdXJyZW50bHkgdG9vIGhhcmQgdG8gd29yayBhcm91bmQuXG4gICAgZGF0YTogYW55LFxuICApOiBkYXRhIGlzIHtcbiAgICBzdGFnZTogbnVtYmVyO1xuICAgIHN0YWdlczogQXJyYXk8e1xuICAgICAgcHJpY2VSYXRpbzogbnVtYmVyO1xuICAgICAgcHJpY2VzPzogQXJyYXk8UHJpY2U+O1xuICAgIH0+O1xuICB9IHtcbiAgICByZXR1cm4gXCJzdGFnZVwiIGluIGRhdGEgJiYgXCJzdGFnZXNcIiBpbiBkYXRhICYmICFpc05pbChkYXRhLnN0YWdlKSAmJiAhaXNOaWwoZGF0YS5zdGFnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgcHJpY2UgbW9kaWZpZXIgZm9yIHRoZSBnaXZlbiBidWlsZGluZy5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgVGhlIGJ1aWxkaW5nIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0gc291cmNlIFRoZSB0YWIgdGhlIGJ1aWxkaW5nIGJlbG9uZ3MgdG8uXG4gICAqIEByZXR1cm5zIFRoZSBwcmljZSBtb2RpZmllciBmb3IgdGhpcyBidWlsZGluZy5cbiAgICogQHNlZSBgZ2V0UHJpY2VSYXRpb1dpdGhBY2Nlc3NvcmBAYGJ1aWxkaW5ncy5qc2BcbiAgICovXG4gIGdldFByaWNlUmF0aW8oXG4gICAgZGF0YTpcbiAgICAgIHwgVW5zYWZlQnVpbGRpbmdcbiAgICAgIHwgVW5zYWZlQ2hyb25vRm9yZ2VVcGdyYWRlXG4gICAgICB8IFVuc2FmZVJlbGlnaW9uVXBncmFkZVxuICAgICAgfCBVbnNhZmVTcGFjZUJ1aWxkaW5nXG4gICAgICB8IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlXG4gICAgICB8IFVuc2FmZVZvaWRTcGFjZVVwZ3JhZGVcbiAgICAgIHwgVW5zYWZlWmlnZ3VyYXRVcGdyYWRlLFxuICAgIHNvdXJjZT86IFRhYklkLFxuICApOiBudW1iZXIge1xuICAgIC8vIElmIHRoZSBidWlsZGluZyBoYXMgc3RhZ2VzLCB1c2UgdGhlIHJhdGlvIGZvciB0aGUgY3VycmVudCBzdGFnZS5cbiAgICBjb25zdCByYXRpbyA9XG4gICAgICAvLyBUT0RPOiBUaGlzIHNlZW1zIHdlaXJkLiBXaHkgbm90IHRha2UgdGhlIHByaWNlIHJhdGlvIG9mIHRoZSBzdGFnZSBhcyB0aGUgZGVmYXVsdD9cbiAgICAgIHRoaXMuX2lzU3RhZ2VkQnVpbGQoZGF0YSlcbiAgICAgICAgPyBkYXRhLnByaWNlUmF0aW8gfHwgZGF0YS5zdGFnZXNbZGF0YS5zdGFnZV0ucHJpY2VSYXRpb1xuICAgICAgICA6IChkYXRhLnByaWNlUmF0aW8gPz8gMCk7XG5cbiAgICBsZXQgcmF0aW9EaWZmID0gMDtcbiAgICBpZiAoc291cmNlICYmIHNvdXJjZSA9PT0gXCJCb25maXJlXCIpIHtcbiAgICAgIHJhdGlvRGlmZiA9XG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoYCR7ZGF0YS5uYW1lfVByaWNlUmF0aW9gIGFzIGNvbnN0KSArXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJwcmljZVJhdGlvXCIpICtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcIm1hcFByaWNlUmVkdWN0aW9uXCIpO1xuXG4gICAgICByYXRpb0RpZmYgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKHJhdGlvRGlmZiwgcmF0aW8gLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmF0aW8gKyByYXRpb0RpZmY7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBnaXZlbiBidWlsZCBjb3VsZCBiZSBwZXJmb3JtZWQuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZCBUaGUgYnVpbGQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC5cbiAgICogQHBhcmFtIGJ1aWxkLm5hbWUgVGhlIG5hbWUgb2YgdGhlIGJ1aWxkLlxuICAgKiBAcGFyYW0gYnVpbGQudmFsIFByb2JhYmx5IGhvdyBtYW55IGl0ZW1zIHNob3VsZCBiZSBidWlsdCBpbiB0b3RhbC5cbiAgICogVE9ETzogV2h5IGlzIHRoaXMgcmVsZXZhbnQgaWYgd2Ugb25seSBjYXJlIGFib3V0IGEgc2luZ2xlIGJ1aWxkIGJlaW5nIHBvc3NpYmxlP1xuICAgKiBAcGFyYW0gcHJpY2VzIFRoZSBjdXJyZW50IHByaWNlcyBmb3IgdGhlIGJ1aWxkLlxuICAgKiBAcGFyYW0gcHJpY2VSYXRpbyBUaGUgZ2xvYmFsIHByaWNlIHJhdGlvIG1vZGlmaWVyLlxuICAgKiBAcGFyYW0gc291cmNlIFdoYXQgdGFiIGRpZCB0aGUgYnVpbGQgb3JpZ2luYXRlIGZyb20/XG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGQgaXMgcG9zc2libGU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc2luZ2xlQnVpbGRQb3NzaWJsZShcbiAgICBidWlsZDogeyBuYW1lOiBBbGxCdWlsZGluZ3M7IHZhbDogbnVtYmVyIH0sXG4gICAgcHJpY2VzOiBBcnJheTxQcmljZT4sXG4gICAgcHJpY2VSYXRpbzogbnVtYmVyLFxuICAgIHNvdXJjZT86IFRhYklkLFxuICApOiBib29sZWFuIHtcbiAgICAvLyBEZXRlcm1pbmUgcHJpY2UgcmVkdWN0aW9uIG9uIHRoaXMgYnVpbGQuXG4gICAgY29uc3QgcHJpY2VzRGlzY291bnQgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChgJHtidWlsZC5uYW1lfUNvc3RSZWR1Y3Rpb25gIGFzIGNvbnN0KSxcbiAgICAgIDEsXG4gICAgKTtcbiAgICBjb25zdCBwcmljZU1vZGlmaWVyID0gMSAtIHByaWNlc0Rpc2NvdW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgY2FuJ3QgYWZmb3JkIGFueSBvZiB0aGUgcHJpY2VzIGZvciB0aGlzIGJ1aWxkLlxuICAgIC8vIFJldHVybiBgZmFsc2VgIGlmIHdlIGNhbid0IGFmZm9yZCBzb21ldGhpbmcsIG90aGVyd2lzZSBgdHJ1ZWAgaXNcbiAgICAvLyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgIGZvciAoY29uc3QgcHJpY2Ugb2YgcHJpY2VzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZVByaWNlRGlzY291bnQgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KGAke3ByaWNlLm5hbWV9Q29zdFJlZHVjdGlvbmAgYXMgY29uc3QpLFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc291cmNlUHJpY2VNb2RpZmllciA9IDEgLSByZXNvdXJjZVByaWNlRGlzY291bnQ7XG4gICAgICBjb25zdCBmaW5hbFJlc291cmNlUHJpY2UgPSBwcmljZS52YWwgKiBwcmljZU1vZGlmaWVyICogcmVzb3VyY2VQcmljZU1vZGlmaWVyO1xuXG4gICAgICAvLyBGb3Igc3BhY2UgYnVpbGRzIHRoYXQgY29uc3VtZSBvaWwsIHRha2UgdGhlIG9pbCBwcmljZSByZWR1Y3Rpb24gaW50byBhY2NvdW50LlxuICAgICAgLy8gVGhpcyBpcyBjYXVzZWQgYnkgc3BhY2UgZWxldmF0b3JzLlxuICAgICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UgPT09IFwiU3BhY2VcIiAmJiBwcmljZS5uYW1lID09PSBcIm9pbFwiKSB7XG4gICAgICAgIGNvbnN0IG9pbE1vZGlmaWVyID0gdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUihcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwib2lsUmVkdWN0aW9uUmF0aW9cIiksXG4gICAgICAgICAgMC43NSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb2lsUHJpY2UgPSBmaW5hbFJlc291cmNlUHJpY2UgKiAoMSAtIG9pbE1vZGlmaWVyKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcIm9pbFwiKSA8IG9pbFByaWNlICogMS4wNSAqKiBidWlsZC52YWwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3IgY3J5b2NoYW1iZXJzLCB0YWtlIGJ1cm5lZCBwYXJhZ29uIGludG8gYWNjb3VudCBmb3IgdGhlIGthcm1hIGNvc3QuXG4gICAgICB9IGVsc2UgaWYgKGJ1aWxkLm5hbWUgPT09IFwiY3J5b2NoYW1iZXJzXCIgJiYgcHJpY2UubmFtZSA9PT0gXCJrYXJtYVwiKSB7XG4gICAgICAgIGNvbnN0IGthcm1hTW9kaWZpZXIgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgICAgIDAuMDEgKiB0aGlzLl9ob3N0LmdhbWUucHJlc3RpZ2UuZ2V0QnVybmVkUGFyYWdvblJhdGlvKCksXG4gICAgICAgICAgMS4wLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBrYXJtYVByaWNlID0gZmluYWxSZXNvdXJjZVByaWNlICogKDEgLSBrYXJtYU1vZGlmaWVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcImthcm1hXCIpIDxcbiAgICAgICAgICBrYXJtYVByaWNlICogcHJpY2VSYXRpbyAqKiBidWlsZC52YWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKHByaWNlLm5hbWUpIDxcbiAgICAgICAgICBmaW5hbFJlc291cmNlUHJpY2UgKiBwcmljZVJhdGlvICoqIGJ1aWxkLnZhbFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBjYW4gYWZmb3JkIHRoaXMgYnVpbGQuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSBKUXVlcnkgZnJvbSBcImpxdWVyeVwiO1xuaW1wb3J0IFwiZG9qb1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgQWNoaWV2ZW1lbnRzLCBBY2hpZXZlbWVudHNQYW5lbCwgQWNoVGFiLCBCYWRnZXNQYW5lbCB9IGZyb20gXCIuL2FjaGlldmVtZW50cy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXIsXG4gIEJ1aWxkaW5nTWV0YSxcbiAgQnVpbGRpbmdzTWFuYWdlcixcbiAgQnVpbGRpbmdzTW9kZXJuLFxuICBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyLFxuICBNZXRhZGF0YSxcbiAgUmVmaW5lQ2F0bmlwQnV0dG9uLFxuICBSZWZpbmVDYXRuaXBCdXR0b25Db250cm9sbGVyLFxuICBTdGFnaW5nQmxkQnRuLFxuICBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcixcbiAgVW5zYWZlQnVpbGRpbmcsXG59IGZyb20gXCIuL2J1aWxkaW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhciwgRXZlbnQgfSBmcm9tIFwiLi9jYWxlbmRhci5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDaGFsbGVuZ2VCdG5Db250cm9sbGVyLFxuICBDaGFsbGVuZ2VFZmZlY3RzUGFuZWwsXG4gIENoYWxsZW5nZVBhbmVsLFxuICBDaGFsbGVuZ2VzTWFuYWdlcixcbiAgQ2hhbGxlbmdlc1RhYixcbiAgUmVzZXJ2ZU1hbixcbiAgUmVzZXJ2ZXNQYW5lbCxcbiAgVW5zYWZlQ2hhbGxlbmdlLFxufSBmcm9tIFwiLi9jaGFsbGVuZ2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtHQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFsbEJ1aWxkaW5nQnRuT3B0aW9ucyxcbiAgQWxsQnVpbGRpbmdSZXNlYXJjaEJ0bk9wdGlvbnMsXG4gIEFsbEJ1aWxkaW5nU3RhY2thYmxlQnRuT3B0aW9ucyxcbiAgQWxsQnV0dG9uTW9kZXJuT3B0aW9ucyxcbiAgQWxsQnV0dG9uT3B0aW9ucyxcbiAgQnVpbGRpbmdCdG4sXG4gIEJ1aWxkaW5nQnRuQ29udHJvbGxlcixcbiAgQnVpbGRpbmdOb3RTdGFja2FibGVCdG5Db250cm9sbGVyLFxuICBCdWlsZGluZ1Jlc2VhcmNoQnRuLFxuICBCdWlsZGluZ1N0YWNrYWJsZUJ0bixcbiAgQnVpbGRpbmdTdGFja2FibGVCdG5Db250cm9sbGVyLFxuICBCdXR0b24sXG4gIEJ1dHRvbkNvbnRyb2xsZXIsXG4gIEJ1dHRvbk1vZGVybixcbiAgQnV0dG9uTW9kZXJuQ29udHJvbGxlcixcbiAgQ29uc29sZSxcbiAgQ29udGVudFJvd1JlbmRlcmVyLFxuICBDb250cm9sLFxuICBJQ2hpbGRyZW5Bd2FyZSxcbiAgSUdhbWVBd2FyZSxcbiAgUGFuZWwsXG4gIFNwYWNlcixcbiAgVGFiLFxuICBUYWJNYW5hZ2VyLFxuICBVbnNhZmVCdWlsZGluZ0J0bk1vZGVsLFxufSBmcm9tIFwiLi9jb3JlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF1dG9QaW5uZWRCdXR0b24sXG4gIEF1dG9QaW5uZWRCdXR0b25Db250cm9sbGVyLFxuICBDcmFzaEJjb2luQnV0dG9uQ29udHJvbGxlcixcbiAgRGlwbG9tYWN5LFxuICBEaXBsb21hY3lNYW5hZ2VyLFxuICBFbGRlcnNQYW5lbCxcbiAgRW1iYXNzeUJ1dHRvbixcbiAgRW1iYXNzeUJ1dHRvbkNvbnRyb2xsZXIsXG4gIFJhY2VQYW5lbCxcbiAgU2VuZEV4cGxvcmVyc0J1dHRvbixcbiAgU2VuZEV4cGxvcmVyc0J1dHRvbkNvbnRyb2xsZXIsXG4gIFRyYWRlQnV0dG9uLFxuICBUcmFkZUJ1dHRvbkNvbnRyb2xsZXIsXG59IGZyb20gXCIuL2RpcGxvbWFjeS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFZmZlY3RzTWFuYWdlcixcbiAgR2FtZVBhZ2UsXG4gIElEYXRhU3RvcmFnZUF3YXJlLFxuICBTZXJ2ZXIsXG4gIFRlbGVtZXRyeSxcbiAgVGltZXIsXG4gIFVuZG9DaGFuZ2UsXG59IGZyb20gXCIuL2dhbWUuanNcIjtcbmltcG9ydCB0eXBlIHsgTWF0aCBhcyBLR01hdGggfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1cm5QYXJhZ29uQnRuQ29udHJvbGxlcixcbiAgUHJlc3RpZ2VCdG5Db250cm9sbGVyLFxuICBQcmVzdGlnZU1hbmFnZXIsXG4gIFByZXN0aWdlUGFuZWwsXG4gIFR1cm5IR09mZkJ1dHRvbkNvbnRyb2xsZXIsXG4gIFVuc2FmZVBlcmssXG59IGZyb20gXCIuL3ByZXN0aWdlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFsbE11bHRpTGlua0J0bk9wdGlvbnMsXG4gIENyeXB0b3RoZW9sb2d5UGFuZWwsXG4gIENyeXB0b3RoZW9sb2d5V0dULFxuICBNdWx0aUxpbmtCdG4sXG4gIFBhY3RzQnRuQ29udHJvbGxlcixcbiAgUGFjdHNNYW5hZ2VyLFxuICBQYWN0c1BhbmVsLFxuICBQYWN0c1dHVCxcbiAgUHJhaXNlQnRuQ29udHJvbGxlcixcbiAgUmVmaW5lQnRuLFxuICBSZWZpbmVUZWFyc0J0bkNvbnRyb2xsZXIsXG4gIFJlbGlnaW9uQnRuQ29udHJvbGxlcixcbiAgUmVsaWdpb25NYW5hZ2VyLFxuICBSZWxpZ2lvblRhYixcbiAgUmVzZXRGYWl0aEJ0bkNvbnRyb2xsZXIsXG4gIFRyYW5zY2VuZEJ0bkNvbnRyb2xsZXIsXG4gIFRyYW5zY2VuZGVuY2VCdG5Db250cm9sbGVyLFxuICBUcmFuc2Zvcm1CdG5Db250cm9sbGVyLFxuICBVbnNhZmVQYWN0LFxuICBVbnNhZmVSZWxpZ2lvblVwZ3JhZGUsXG4gIFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlLFxuICBVbnNhZmVaaWdndXJhdFVwZ3JhZGUsXG4gIFppZ2d1cmF0QnRuQ29udHJvbGxlcixcbn0gZnJvbSBcIi4vcmVsaWdpb24uanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VNYW5hZ2VyIH0gZnJvbSBcIi4vcmVzb3VyY2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIExpYnJhcnksXG4gIFBvbGljeUJ0bkNvbnRyb2xsZXIsXG4gIFBvbGljeVBhbmVsLFxuICBTY2llbmNlTWFuYWdlcixcbiAgVGVjaEJ1dHRvbkNvbnRyb2xsZXIsXG4gIFVuc2FmZVBvbGljeSxcbiAgVW5zYWZlVGVjaCxcbn0gZnJvbSBcIi4vc2NpZW5jZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBGdXJ0aGVzdFJpbmdQYW5lbCxcbiAgUGxhbmV0QnVpbGRpbmdCdG5Db250cm9sbGVyLFxuICBQbGFuZXRQYW5lbCxcbiAgU3BhY2VNYW5hZ2VyLFxuICBTcGFjZVByb2dyYW1CdG5Db250cm9sbGVyLFxuICBTcGFjZVRhYixcbiAgVW5zYWZlUGxhbmV0LFxuICBVbnNhZmVTcGFjZUJ1aWxkaW5nLFxufSBmcm9tIFwiLi9zcGFjZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdGF0c01hbmFnZXIsIFN0YXRzVGFiIH0gZnJvbSBcIi4vc3RhdHMuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWNjZWxlcmF0ZVRpbWVCdG4sXG4gIEFjY2VsZXJhdGVUaW1lQnRuQ29udHJvbGxlcixcbiAgQ2hyb25vZm9yZ2VCdG5Db250cm9sbGVyLFxuICBDaHJvbm9mb3JnZVdndCxcbiAgRml4Q3J5b2NoYW1iZXJCdG5Db250cm9sbGVyLFxuICBNYW5hZ2VyLFxuICBRdWV1ZVRhYixcbiAgUmVzZXRXZ3QsXG4gIFNoYXR0ZXJUQ0J0bixcbiAgU2hhdHRlclRDQnRuQ29udHJvbGxlcixcbiAgVGltZUNvbnRyb2xXZ3QsXG4gIFRpbWVNYW5hZ2VyLFxuICBUaW1lVGFiLFxuICBVbnNhZmVDaHJvbm9Gb3JnZVVwZ3JhZGUsXG4gIFVuc2FmZVZvaWRTcGFjZVVwZ3JhZGUsXG4gIFZvaWRTcGFjZUJ0bkNvbnRyb2xsZXIsXG4gIFZvaWRTcGFjZVdndCxcbn0gZnJvbSBcIi4vdGltZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBUb29sYmFyLFxuICBUb29sYmFyRW5lcmd5LFxuICBUb29sYmFySGFwcGluZXNzLFxuICBUb29sYmFySWNvbixcbiAgVG9vbGJhck1PVEQsXG59IGZyb20gXCIuL3Rvb2xiYXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRGVza3RvcFVJLCBJUmVhY3RBd2FyZSwgVUlTeXN0ZW0gfSBmcm9tIFwiLi91aS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCaW9tZUJ0bixcbiAgQmlvbWVCdG5Db250cm9sbGVyLFxuICBDZW5zdXMsXG4gIENlbnN1c1BhbmVsLFxuICBGZXN0aXZhbEJ1dHRvbixcbiAgRmVzdGl2YWxCdXR0b25Db250cm9sbGVyLFxuICBKb2JCdXR0b24sXG4gIEpvYkJ1dHRvbkNvbnRyb2xsZXIsXG4gIEtpdHRlbixcbiAgS2l0dGVuU2ltLFxuICBMb2Fkb3V0LFxuICBMb2Fkb3V0QnV0dG9uLFxuICBMb2Fkb3V0QnV0dG9uQ29udHJvbGxlcixcbiAgTG9hZG91dENvbnRyb2xsZXIsXG4gIE1hcE92ZXJ2aWV3V2d0LFxuICBVbnNhZmVCaW9tZSxcbiAgVW5zYWZlSm9iLFxuICBVcGdyYWRlRXhwbG9yZXJzQ29udHJvbGxlcixcbiAgVXBncmFkZUhRQ29udHJvbGxlcixcbiAgVmlsbGFnZSxcbiAgVmlsbGFnZUJ1dHRvbkNvbnRyb2xsZXIsXG4gIFZpbGxhZ2VNYW5hZ2VyLFxufSBmcm9tIFwiLi92aWxsYWdlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJvcnNoYWNoV2d0LCBWb2lkTWFuYWdlciB9IGZyb20gXCIuL3ZvaWQuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ3JhZnRCdXR0b24sXG4gIENyYWZ0QnV0dG9uQ29udHJvbGxlcixcbiAgVW5zYWZlQ3JhZnQsXG4gIFVuc2FmZVVwZ3JhZGUsXG4gIFVwZ3JhZGVCdXR0b25Db250cm9sbGVyLFxuICBXb3Jrc2hvcCxcbiAgV29ya3Nob3BNYW5hZ2VyLFxuICBaZWJyYVVwZ3JhZGVCdXR0b25Db250cm9sbGVyLFxufSBmcm9tIFwiLi93b3Jrc2hvcC5qc1wiO1xuXG5leHBvcnQgY29uc3QgQnV5SXRlbVJlc3VsdFJlYXNvbnMgPSBbXG4gIFwiYWxyZWFkeS1ib3VnaHRcIixcbiAgXCJjYW5ub3QtYWZmb3JkXCIsXG4gIFwiZGV2LW1vZGVcIixcbiAgXCJpdGVtLWlzLWZyZWVcIixcbiAgXCJub3QtZW5hYmxlZFwiLFxuICBcIm5vdC11bmxvY2tlZFwiLFxuICBcInBhaWQtZm9yXCIsXG4gIFwicGxheWVyLWRlbmllZFwiLFxuICBcInJlcXVpcmUtY29uZmlybWF0aW9uXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQnV5SXRlbVJlc3VsdFJlYXNvbiA9ICh0eXBlb2YgQnV5SXRlbVJlc3VsdFJlYXNvbnMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIFVuc2FmZUJ1eUl0ZW1SZXN1bHQgPSB7XG4gIGl0ZW1Cb3VnaHQ6IGJvb2xlYW47XG4gIHJlYXNvbjogQnV5SXRlbVJlc3VsdFJlYXNvbjtcbn07XG5leHBvcnQgdHlwZSBVbnNhZmVCdXlJdGVtUmVzdWx0RGVmZXJyZWQgPSB7XG4gIGl0ZW1Cb3VnaHQ6IGJvb2xlYW47XG4gIHJlYXNvbjogXCJyZXF1aXJlLWNvbmZpcm1hdGlvblwiO1xuICBkZWY6IGRvam8uRGVmZXJyZWQgJiB7XG4gICAgdGhlbjogKGNhbGxhYmxlOiAocmVzdWx0OiBVbnNhZmVCdXlJdGVtUmVzdWx0KSA9PiB2b2lkKSA9PiB2b2lkO1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IEJ1aWxkaW5ncyA9IFtcbiAgXCJhY2FkZW15XCIsXG4gIFwiYWNjZWxlcmF0b3JcIixcbiAgXCJhaUNvcmVcIixcbiAgXCJhbXBoaXRoZWF0cmVcIixcbiAgXCJhcXVlZHVjdFwiLFxuICBcImJhcm5cIixcbiAgXCJiaW9sYWJcIixcbiAgXCJicmV3ZXJ5XCIsXG4gIFwiY2FsY2luZXJcIixcbiAgXCJjaGFwZWxcIixcbiAgXCJjaHJvbm9zcGhlcmVcIixcbiAgXCJmYWN0b3J5XCIsXG4gIFwiZmllbGRcIixcbiAgXCJoYXJib3JcIixcbiAgXCJodXRcIixcbiAgXCJsaWJyYXJ5XCIsXG4gIFwibG9nSG91c2VcIixcbiAgXCJsdW1iZXJNaWxsXCIsXG4gIFwibWFnbmV0b1wiLFxuICBcIm1hbnNpb25cIixcbiAgXCJtaW5lXCIsXG4gIFwibWludFwiLFxuICBcIm9ic2VydmF0b3J5XCIsXG4gIFwib2lsV2VsbFwiLFxuICBcInBhc3R1cmVcIixcbiAgXCJxdWFycnlcIixcbiAgXCJyZWFjdG9yXCIsXG4gIFwic21lbHRlclwiLFxuICBcInN0ZWFtd29ya3NcIixcbiAgXCJ0ZW1wbGVcIixcbiAgXCJ0cmFkZXBvc3RcIixcbiAgXCJ1bmljb3JuUGFzdHVyZVwiLFxuICBcIndhcmVob3VzZVwiLFxuICBcIndvcmtzaG9wXCIsXG4gIFwiemVicmFGb3JnZVwiLFxuICBcInplYnJhT3V0cG9zdFwiLFxuICBcInplYnJhV29ya3Nob3BcIixcbiAgXCJ6aWdndXJhdFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEJ1aWxkaW5nID0gKHR5cGVvZiBCdWlsZGluZ3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBTdGFnZWRCdWlsZGluZ3MgPSBbXG4gIFwiYnJvYWRjYXN0dG93ZXJcIixcbiAgXCJkYXRhQ2VudGVyXCIsXG4gIFwiaHlkcm9wbGFudFwiLFxuICBcInNvbGFyZmFybVwiLFxuICBcInNwYWNlcG9ydFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN0YWdlZEJ1aWxkaW5nID0gKHR5cGVvZiBTdGFnZWRCdWlsZGluZ3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBCdWlsZGluZ0VmZmVjdHMgPSBbXG4gIC8vIGZyb20gZ2FtZS5ibGRcbiAgXCJhY2FkZW15TWV0ZW9yQm9udXNcIixcbiAgXCJhaUxldmVsXCIsXG4gIFwiYWxpY29yblBlclRpY2tDb25cIixcbiAgXCJibG9vZHN0b25lUmF0aW9cIixcbiAgXCJjYXRoUG9sbHV0aW9uUGVyVGlja0NvblwiLFxuICBcImNhdGhQb2xsdXRpb25QZXJUaWNrUHJvZFwiLFxuICBcImNhdG5pcERlbWFuZFJhdGlvXCIsXG4gIFwiY2F0bmlwTWF4XCIsXG4gIFwiY2F0bmlwUGVyVGlja0Jhc2VcIixcbiAgXCJjYXRuaXBQZXJUaWNrQ29uXCIsXG4gIFwiY2F0bmlwUmF0aW9cIixcbiAgXCJjb2FsTWF4XCIsXG4gIFwiY29hbFBlclRpY2tBdXRvcHJvZFwiLFxuICBcImNvYWxQZXJUaWNrQmFzZVwiLFxuICBcImNvYWxQZXJUaWNrQ29uXCIsXG4gIFwiY29hbFJhdGlvR2xvYmFsXCIsXG4gIFwiY3JhZnRSYXRpb1wiLFxuICBcImN1bHR1cmVNYXhcIixcbiAgXCJjdWx0dXJlTWF4UmF0aW9cIixcbiAgXCJjdWx0dXJlUGVyVGlja0Jhc2VcIixcbiAgXCJlbmVyZ3lDb25zdW1wdGlvblwiLFxuICBcImVuZXJneVByb2R1Y3Rpb25cIixcbiAgXCJmYWl0aE1heFwiLFxuICBcImZhaXRoUGVyVGlja0Jhc2VcIixcbiAgXCJmZXN0aXZhbEFycml2YWxSYXRpb1wiLFxuICBcImZlc3RpdmFsUmF0aW9cIixcbiAgXCJmdXJzRGVtYW5kUmF0aW9cIixcbiAgXCJmdXJzUGVyVGlja1Byb2RcIixcbiAgXCJnZmxvcHNQZXJUaWNrQmFzZVwiLFxuICBcImdvbGRNYXhcIixcbiAgXCJnb2xkUGVyVGlja0F1dG9wcm9kXCIsXG4gIFwiZ29sZFBlclRpY2tDb25cIixcbiAgXCJoYXBwaW5lc3NcIixcbiAgXCJodW50ZXJSYXRpb1wiLFxuICBcImlyb25NYXhcIixcbiAgXCJpcm9uUGVyVGlja0F1dG9wcm9kXCIsXG4gIFwiaXJvblBlclRpY2tDb25cIixcbiAgXCJpdm9yeURlbWFuZFJhdGlvXCIsXG4gIFwiaXZvcnlQZXJUaWNrQ29uXCIsXG4gIFwiaXZvcnlQZXJUaWNrUHJvZFwiLFxuICBcIm1hZ25ldG9Cb29zdFJhdGlvXCIsXG4gIFwibWFnbmV0b1JhdGlvXCIsXG4gIFwibWFucG93ZXJNYXhcIixcbiAgXCJtYW5wb3dlclBlclRpY2tDb25cIixcbiAgXCJtYW51c2NyaXB0UGVyVGlja1Byb2RcIixcbiAgXCJtYXhLaXR0ZW5zXCIsXG4gIFwibWluZXJhbHNNYXhcIixcbiAgXCJtaW5lcmFsc1BlclRpY2tDb25cIixcbiAgXCJtaW5lcmFsc1BlclRpY2tQcm9kXCIsXG4gIFwibWluZXJhbHNSYXRpb1wiLFxuICBcIm9pbE1heFwiLFxuICBcIm9pbFBlclRpY2tcIixcbiAgXCJvaWxQZXJUaWNrQmFzZVwiLFxuICBcIm9pbFBlclRpY2tDb25cIixcbiAgXCJvaWxQZXJUaWNrUHJvZFwiLFxuICBcInByb2R1Y3Rpb25SYXRpb1wiLFxuICBcInJlZmluZVJhdGlvXCIsXG4gIFwicmVzU3Rhc2lzUmF0aW9cIixcbiAgXCJzY2llbmNlTWF4XCIsXG4gIFwic2NpZW5jZVJhdGlvXCIsXG4gIFwic2tpbGxYUFwiLFxuICBcInNwaWNlRGVtYW5kUmF0aW9cIixcbiAgXCJzcGljZVBlclRpY2tDb25cIixcbiAgXCJzdGFuZGluZ1JhdGlvXCIsXG4gIFwic3RhckF1dG9TdWNjZXNzQ2hhbmNlXCIsXG4gIFwic3RhckV2ZW50Q2hhbmNlXCIsXG4gIFwic3RlZWxQZXJUaWNrUHJvZFwiLFxuICBcInRNeXRocmlsQ3JhZnRSYXRpb1wiLFxuICBcInRNeXRocmlsUGVyVGlja1wiLFxuICBcInRlbXBvcmFsRmx1eFByb2R1Y3Rpb25cIixcbiAgXCJ0aG9yaXVtUGVyVGlja1wiLFxuICBcInRpdGFuaXVtTWF4XCIsXG4gIFwidGl0YW5pdW1QZXJUaWNrQXV0b3Byb2RcIixcbiAgXCJ0aXRhbml1bVBlclRpY2tDb25cIixcbiAgXCJ0cmFkZVJhdGlvXCIsXG4gIFwidW5oYXBwaW5lc3NSYXRpb1wiLFxuICBcInVuaWNvcm5zUGVyVGlja0Jhc2VcIixcbiAgXCJ1cmFuaXVtTWF4XCIsXG4gIFwidXJhbml1bVBlclRpY2tcIixcbiAgXCJ1cmFuaXVtUGVyVGlja0F1dG9wcm9kXCIsXG4gIFwidXJhbml1bVBlclRpY2tCYXNlXCIsXG4gIFwid29vZE1heFwiLFxuICBcIndvb2RQZXJUaWNrQ29uXCIsXG4gIFwid29vZFJhdGlvXCIsXG4gIFwiemVicmFQcmVwYXJhdGlvbnNcIixcblxuICAvLyBmcm9tIGdhbWUucmVsaWdpb25cbiAgXCJhY3RpdmVIR1wiLFxuICBcImFsaWNvcm5DaGFuY2VcIixcbiAgXCJhbGljb3JuUGVyVGlja1wiLFxuICBcImJsYWNrTGlicmFyeUJvbnVzXCIsXG4gIFwiYmxzQ29ycnVwdGlvblJhdGlvXCIsXG4gIFwiYmxzTGltaXRcIixcbiAgXCJjb21wZW5kaWFUVEJvb3N0UmF0aW9cIixcbiAgXCJjb3JydXB0aW9uQm9vc3RSYXRpb1wiLFxuICBcImNvcnJ1cHRpb25SYXRpb1wiLFxuICBcImN1bHR1cmVNYXhSYXRpb0JvbnVzXCIsXG4gIFwiZGVmaWNpdFJlY292ZXJ5UmF0aW9cIixcbiAgXCJlbmVyZ3lQcm9kdWN0aW9uUmF0aW9cIixcbiAgXCJmYWl0aFJhdGlvUmVsaWdpb25cIixcbiAgXCJnbG9iYWxSZXNvdXJjZVJhdGlvXCIsXG4gIFwiZ29sZE1heFJhdGlvXCIsXG4gIFwiaXZvcnlNZXRlb3JDaGFuY2VcIixcbiAgXCJpdm9yeU1ldGVvclJhdGlvXCIsXG4gIFwibWF4S2l0dGVuc1JhdGlvXCIsXG4gIFwibmVjcm9jb3JuUGVyRGF5XCIsXG4gIFwicGFjdEJsYWNrTGlicmFyeUJvb3N0XCIsXG4gIFwicGFjdERlZmljaXRSZWNvdmVyeVJhdGlvXCIsXG4gIFwicGFjdEZhaXRoUmF0aW9cIixcbiAgXCJwYWN0R2xvYmFsUHJvZHVjdGlvblJhdGlvXCIsXG4gIFwicGFjdEdsb2JhbFJlc291cmNlUmF0aW9cIixcbiAgXCJwYWN0U3BhY2VDb21wZW5kaXVtUmF0aW9cIixcbiAgXCJwYWN0c0F2YWlsYWJsZVwiLFxuICBcInB5cmFtaWRGYWl0aFJhdGlvXCIsXG4gIFwicHlyYW1pZEdsb2JhbFByb2R1Y3Rpb25SYXRpb1wiLFxuICBcInB5cmFtaWRHbG9iYWxSZXNvdXJjZVJhdGlvXCIsXG4gIFwicHlyYW1pZFJlY292ZXJ5UmF0aW9cIixcbiAgXCJweXJhbWlkU3BhY2VDb21wZW5kaXVtUmF0aW9cIixcbiAgXCJyZWxpY1JlZmluZVJhdGlvXCIsXG4gIFwicmlmdENoYW5jZVwiLFxuICBcInJyUmF0aW9cIixcbiAgXCJzaW1TY2FsaW5nUmF0aW9cIixcbiAgXCJzb2xhclJldm9sdXRpb25MaW1pdFwiLFxuICBcInNvbGFyUmV2b2x1dGlvblJhdGlvXCIsXG4gIFwidGNSZWZpbmVSYXRpb1wiLFxuICBcInRpbWVSYXRpb1wiLFxuICBcInVuaWNvcm5zUmF0aW9SZWxpZ2lvblwiLFxuXG4gIC8vIGZyb20gZ2FtZS53b3Jrc2hvcC51cGdyYWRlc1xuICBcImFjY2VsZXJhdG9yUmF0aW9cIixcbiAgXCJiYXJuUmF0aW9cIixcbiAgXCJiZWFjb25SZWxpY3NQZXJEYXlcIixcbiAgXCJiaW9mdWVsUmF0aW9cIixcbiAgXCJicm9hZGNhc3RUb3dlclJhdGlvXCIsXG4gIFwiY2FkQmx1ZXByaW50Q3JhZnRSYXRpb1wiLFxuICBcImNhbGNpbmVyUmF0aW9cIixcbiAgXCJjYWxjaW5lclN0ZWVsQ3JhZnRSYXRpb1wiLFxuICBcImNhbGNpbmVyU3RlZWxSYXRpb1wiLFxuICBcImNhbGNpbmVyU3RlZWxSZWFjdG9yQm9udXNcIixcbiAgXCJjYXRuaXBEZW1hbmRXb3JrZXJSYXRpb0dsb2JhbFwiLFxuICBcImNhdG5pcEpvYlJhdGlvXCIsXG4gIFwiY2F0bmlwTWF4UmF0aW9cIixcbiAgXCJjb2FsUmF0aW9HbG9iYWxSZWR1Y3Rpb25cIixcbiAgXCJjb2FsU3VwZXJSYXRpb1wiLFxuICBcImNyYWNrZXJSYXRpb1wiLFxuICBcImRhdGFDZW50ZXJBSVJhdGlvXCIsXG4gIFwiZWx1ZGl1bUF1dG9tYXRpb25Cb251c1wiLFxuICBcImZhY3RvcnlSZWZpbmVSYXRpb1wiLFxuICBcImhhcmJvckNvYWxSYXRpb1wiLFxuICBcImhhcmJvclJhdGlvXCIsXG4gIFwiaHV0UHJpY2VSYXRpb1wiLFxuICBcImh5ZHJvUGxhbnRSYXRpb1wiLFxuICBcImxpYnJhcnlSYXRpb1wiLFxuICBcImx1bWJlck1pbGxSYXRpb1wiLFxuICBcImx1bmFyT3V0cG9zdFJhdGlvXCIsXG4gIFwibWFucG93ZXJKb2JSYXRpb1wiLFxuICBcIm9pbFdlbGxSYXRpb1wiLFxuICBcInF1ZXVlQ2FwXCIsXG4gIFwicmVhY3RvckVuZXJneVJhdGlvXCIsXG4gIFwicmVhY3RvclRob3JpdW1QZXJUaWNrXCIsXG4gIFwicm91dGVTcGVlZFwiLFxuICBcInNhdG5hdlJhdGlvXCIsXG4gIFwic2hpcExpbWl0XCIsXG4gIFwic2tpbGxNdWx0aXBsaWVyXCIsXG4gIFwic21lbHRlclJhdGlvXCIsXG4gIFwic29sYXJGYXJtUmF0aW9cIixcbiAgXCJzb2xhckZhcm1TZWFzb25SYXRpb1wiLFxuICBcInNwYWNlU2NpZW5jZVJhdGlvXCIsXG4gIFwic3RhcmNoYXJ0R2xvYmFsUmF0aW9cIixcbiAgXCJ0MUNyYWZ0UmF0aW9cIixcbiAgXCJ0MkNyYWZ0UmF0aW9cIixcbiAgXCJ0M0NyYWZ0UmF0aW9cIixcbiAgXCJ0NENyYWZ0UmF0aW9cIixcbiAgXCJ0NUNyYWZ0UmF0aW9cIixcbiAgXCJ0ZW1wb3JhbEZsdXhQcm9kdWN0aW9uQ2hyb25vc3BoZXJlXCIsXG4gIFwidGVtcG9yYWxQYXJhZG94RGF5Qm9udXNcIixcbiAgXCJ1bmljb3Juc0dsb2JhbFJhdGlvXCIsXG4gIFwidXBsaW5rRENSYXRpb1wiLFxuICBcInVwbGlua0xhYlJhdGlvXCIsXG4gIFwidXJhbml1bVJhdGlvXCIsXG4gIFwid2FyZWhvdXNlUmF0aW9cIixcbiAgXCJ3b29kSm9iUmF0aW9cIixcblxuICAvLyBvdGhlciB0YWJzXG4gIFwiZ29sZFByaWNlUmF0aW9cIixcbiAgXCJoYXBwaW5lc3NLaXR0ZW5Qcm9kdWN0aW9uUmF0aW9cIixcbiAgXCJoZWF0TWF4XCIsXG4gIFwiaGVhdFBlclRpY2tcIixcbiAgXCJvYnNlcnZhdG9yeVJhdGlvXCIsXG4gIFwic3RhcmNoYXJ0UGVyVGlja0Jhc2VTcGFjZVwiLFxuICBcInRlbXBvcmFsRmx1eE1heFwiLFxuICBcInVub2J0YWluaXVtUGVyVGlja1NwYWNlXCIsXG4gIFwidXJhbml1bVBlclRpY2tDb25cIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBCdWlsZGluZ0VmZmVjdCA9ICh0eXBlb2YgQnVpbGRpbmdFZmZlY3RzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgU2Vhc29ucyA9IFtcImF1dHVtblwiLCBcInNwcmluZ1wiLCBcInN1bW1lclwiLCBcIndpbnRlclwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXNvbiA9ICh0eXBlb2YgU2Vhc29ucylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IEN5Y2xlcyA9IFtcbiAgXCJjaGFyb25cIixcbiAgXCJ1bWJyYVwiLFxuICBcInlhcm5cIixcbiAgXCJoZWxpb3NcIixcbiAgXCJjYXRoXCIsXG4gIFwicmVkbW9vblwiLFxuICBcImR1bmVcIixcbiAgXCJwaXNjaW5lXCIsXG4gIFwidGVybWludXNcIixcbiAgXCJrYWlyb1wiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEN5Y2xlID0gKHR5cGVvZiBDeWNsZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBSZXNvdXJjZXNDcmFmdGFibGUgPSBbXG4gIFwiYWxsb3lcIixcbiAgXCJiZWFtXCIsXG4gIFwiYmxvb2RzdG9uZVwiLFxuICBcImJsdWVwcmludFwiLFxuICBcImNvbXBlZGl1bVwiLFxuICBcImNvbmNyYXRlXCIsXG4gIFwiZWx1ZGl1bVwiLFxuICBcImdlYXJcIixcbiAgXCJrZXJvc2VuZVwiLFxuICBcIm1hbnVzY3JpcHRcIixcbiAgXCJtZWdhbGl0aFwiLFxuICBcInBhcmNobWVudFwiLFxuICBcInBsYXRlXCIsXG4gIFwic2NhZmZvbGRcIixcbiAgXCJzaGlwXCIsXG4gIFwic2xhYlwiLFxuICBcInN0ZWVsXCIsXG4gIFwidGFua2VyXCIsXG4gIFwidE15dGhyaWxcIixcbiAgXCJ0aG9yaXVtXCIsXG4gIFwid29vZFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlc291cmNlQ3JhZnRhYmxlID0gKHR5cGVvZiBSZXNvdXJjZXNDcmFmdGFibGUpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBSZXNvdXJjZXMgPSBbXG4gIC4uLlJlc291cmNlc0NyYWZ0YWJsZSxcbiAgXCJhbGljb3JuXCIsXG4gIFwiYW50aW1hdHRlclwiLFxuICBcImJsYWNrY29pblwiLFxuICBcImJ1cm5lZFBhcmFnb25cIixcbiAgXCJjYXRuaXBcIixcbiAgXCJjb2FsXCIsXG4gIFwiY3VsdHVyZVwiLFxuICBcImVsZGVyQm94XCIsXG4gIFwiZmFpdGhcIixcbiAgXCJmdXJzXCIsXG4gIFwiZ2Zsb3BzXCIsXG4gIFwiZ29sZFwiLFxuICBcImhhc2hyYXRlc1wiLFxuICBcImlyb25cIixcbiAgXCJpdm9yeVwiLFxuICBcImthcm1hXCIsXG4gIFwia2l0dGVuc1wiLFxuICBcIm1hbnBvd2VyXCIsXG4gIFwibWluZXJhbHNcIixcbiAgXCJuZWNyb2Nvcm5cIixcbiAgXCJvaWxcIixcbiAgXCJwYXJhZ29uXCIsXG4gIFwicmVsaWNcIixcbiAgXCJzY2llbmNlXCIsXG4gIFwic29ycm93XCIsXG4gIFwic3BpY2VcIixcbiAgXCJzdGFyY2hhcnRcIixcbiAgXCJ0ZWFyc1wiLFxuICBcInRlbXBvcmFsRmx1eFwiLFxuICBcInRpbWVDcnlzdGFsXCIsXG4gIFwidGl0YW5pdW1cIixcbiAgXCJ1bmljb3Juc1wiLFxuICBcInVub2J0YWluaXVtXCIsXG4gIFwidXJhbml1bVwiLFxuICBcInZvaWRcIixcbiAgXCJ3cmFwcGluZ1BhcGVyXCIsXG4gIFwiemVicmFzXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVzb3VyY2UgPSAodHlwZW9mIFJlc291cmNlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFRhYklkcyA9IFtcbiAgXCJCb25maXJlXCIsXG4gIFwiUmVsaWdpb25cIixcbiAgXCJTY2llbmNlXCIsXG4gIFwiU3BhY2VcIixcbiAgXCJUaW1lXCIsXG4gIFwiVHJhZGVcIixcbiAgXCJWaWxsYWdlXCIsXG4gIFwiV29ya3Nob3BcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUYWJJZCA9ICh0eXBlb2YgVGFiSWRzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgSm9icyA9IFtcbiAgXCJhbnlcIixcbiAgXCJlbmdpbmVlclwiLFxuICBcImZhcm1lclwiLFxuICBcImdlb2xvZ2lzdFwiLFxuICBcImh1bnRlclwiLFxuICBcIm1pbmVyXCIsXG4gIFwicHJpZXN0XCIsXG4gIFwic2Nob2xhclwiLFxuICBcIndvb2RjdXR0ZXJcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBKb2IgPSAodHlwZW9mIEpvYnMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBUcmFpdHMgPSBbXG4gIFwiY2hlbWlzdFwiLFxuICBcImVuZ2luZWVyXCIsXG4gIFwibWFuYWdlclwiLFxuICBcIm1ldGFsbHVyZ2lzdFwiLFxuICBcIm1lcmNoYW50XCIsXG4gIFwibm9uZVwiLFxuICBcInNjaWVudGlzdFwiLFxuICBcIndpc2VcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUcmFpdCA9ICh0eXBlb2YgVHJhaXRzKVtudW1iZXJdO1xuXG5leHBvcnQgZW51bSBVbmljb3JuSXRlbVZhcmlhbnQge1xuICBDcnlwdG90aGVvbG9neSA9IFwiY1wiLFxuICBPcmRlck9mVGhlU3VuID0gXCJzXCIsXG4gIFppZ2d1cmF0ID0gXCJ6XCIsXG4gIFVuaWNvcm5QYXN0dXJlID0gXCJ6cFwiLFxufVxuXG5leHBvcnQgY29uc3QgUmVsaWdpb25VcGdyYWRlcyA9IFtcbiAgXCJhcG9jcmlwaGFcIixcbiAgXCJiYXNpbGljYVwiLFxuICBcImdvbGRlblNwaXJlXCIsXG4gIFwic2Nob2xhc3RpY2lzbVwiLFxuICBcInNvbGFyUmV2b2x1dGlvblwiLFxuICBcInNvbGFyY2hhbnRcIixcbiAgXCJzdGFpbmVkR2xhc3NcIixcbiAgXCJzdW5BbHRhclwiLFxuICBcInRlbXBsYXJzXCIsXG4gIFwidHJhbnNjZW5kZW5jZVwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlbGlnaW9uVXBncmFkZSA9ICh0eXBlb2YgUmVsaWdpb25VcGdyYWRlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFRyYW5zY2VuZGVuY2VVcGdyYWRlcyA9IFtcbiAgXCJibGFja0NvcmVcIixcbiAgXCJibGFja0xpYnJhcnlcIixcbiAgXCJibGFja05leHVzXCIsXG4gIFwiYmxhY2tPYmVsaXNrXCIsXG4gIFwiYmxhY2tSYWRpYW5jZVwiLFxuICBcImJsYXphclwiLFxuICBcImRhcmtOb3ZhXCIsXG4gIFwiaG9seUdlbm9jaWRlXCIsXG4gIFwibWF1c29sZXVtXCIsXG4gIFwic2luZ3VsYXJpdHlcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUcmFuc2NlbmRlbmNlVXBncmFkZSA9ICh0eXBlb2YgVHJhbnNjZW5kZW5jZVVwZ3JhZGVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgWmlnZ3VyYXRVcGdyYWRlcyA9IFtcbiAgXCJibGFja1B5cmFtaWRcIixcbiAgXCJpdm9yeUNpdGFkZWxcIixcbiAgXCJpdm9yeVRvd2VyXCIsXG4gIFwibWFya2VyXCIsXG4gIFwic2t5UGFsYWNlXCIsXG4gIFwic3Vuc3BpcmVcIixcbiAgXCJ1bmljb3JuR3JhdmV5YXJkXCIsXG4gIFwidW5pY29ybk5lY3JvcG9saXNcIixcbiAgXCJ1bmljb3JuVG9tYlwiLFxuICBcInVuaWNvcm5VdG9waWFcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBaaWdndXJhdFVwZ3JhZGUgPSAodHlwZW9mIFppZ2d1cmF0VXBncmFkZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBQYWN0cyA9IFtcbiAgXCJmcmFjdHVyZWRcIixcbiAgXCJwYWN0T2ZDbGVhbnNpbmdcIixcbiAgXCJwYWN0T2ZEZXN0cnVjdGlvblwiLFxuICBcInBhY3RPZkV4dGVybWluYXRpb25cIixcbiAgXCJwYWN0T2ZQdXJpdHlcIixcbiAgXCJwYXlEZWJ0XCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGFjdCA9ICh0eXBlb2YgUGFjdHMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIEFsbEJ1aWxkaW5ncyA9XG4gIHwgQnVpbGRpbmdcbiAgfCBDaHJvbm9Gb3JnZVVwZ3JhZGVcbiAgfCBSZWxpZ2lvblVwZ3JhZGVcbiAgfCBTcGFjZUJ1aWxkaW5nXG4gIHwgVHJhbnNjZW5kZW5jZVVwZ3JhZGVcbiAgfCBWb2lkU3BhY2VVcGdyYWRlXG4gIHwgWmlnZ3VyYXRVcGdyYWRlO1xuXG5leHBvcnQgY29uc3QgUmFjZXMgPSBbXG4gIFwiZHJhZ29uc1wiLFxuICBcImdyaWZmaW5zXCIsXG4gIFwibmFnYXNcIixcbiAgXCJsZXZpYXRoYW5zXCIsXG4gIFwibGl6YXJkc1wiLFxuICBcInNoYXJrc1wiLFxuICBcInNwaWRlcnNcIixcbiAgXCJ6ZWJyYXNcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSYWNlID0gKHR5cGVvZiBSYWNlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFBvbGljaWVzID0gW1xuICBcImF1dGhvY3JhY3lcIixcbiAgXCJiaWdTdGlja1BvbGljeVwiLFxuICBcImNhcm5pdmFsZVwiLFxuICBcImNpdHlPbkFIaWxsXCIsXG4gIFwiY2xlYXJDdXR0aW5nXCIsXG4gIFwiY29tbXVuaXNtXCIsXG4gIFwiY29uc2VydmF0aW9uXCIsXG4gIFwiY3J5b2NoYW1iZXJFeHRyYWN0aW9uXCIsXG4gIFwiY3VsdHVyYWxFeGNoYW5nZVwiLFxuICBcImRpcGxvbWFjeVwiLFxuICBcImRyYWdvblJlbGF0aW9uc0FzdHJvbG9nZXJzXCIsXG4gIFwiZHJhZ29uUmVsYXRpb25zRHluYW1pY2lzdHNcIixcbiAgXCJkcmFnb25SZWxhdGlvbnNQaHlzaWNpc3RzXCIsXG4gIFwiZW52aXJvbm1lbnRhbGlzbVwiLFxuICBcImVwaWN1cmlhbmlzbVwiLFxuICBcImV4cGFuc2lvbmlzbVwiLFxuICBcImV4dHJhdmFnYW5jZVwiLFxuICBcImZhc2Npc21cIixcbiAgXCJmcnVnYWxpdHlcIixcbiAgXCJmdWxsSW5kdXN0cmlhbGl6YXRpb25cIixcbiAgXCJncmlmZmluUmVsYXRpb25zTWFjaGluaXN0c1wiLFxuICBcImdyaWZmaW5SZWxhdGlvbnNNZXRhbGx1cmdpc3RzXCIsXG4gIFwiZ3JpZmZpblJlbGF0aW9uc1Njb3V0c1wiLFxuICBcImlzb2xhdGlvbmlzbVwiLFxuICBcImtub3dsZWRnZVNoYXJpbmdcIixcbiAgXCJsaWJlcmFsaXNtXCIsXG4gIFwibGliZXJ0eVwiLFxuICBcImxpemFyZFJlbGF0aW9uc0RpcGxvbWF0c1wiLFxuICBcImxpemFyZFJlbGF0aW9uc0Vjb2xvZ2lzdHNcIixcbiAgXCJsaXphcmRSZWxhdGlvbnNQcmllc3RzXCIsXG4gIFwibWlsaXRhcml6ZVNwYWNlXCIsXG4gIFwibW9uYXJjaHlcIixcbiAgXCJteXN0aWNpc21cIixcbiAgXCJuYWdhUmVsYXRpb25zQXJjaGl0ZWN0c1wiLFxuICBcIm5hZ2FSZWxhdGlvbnNDdWx0aXN0c1wiLFxuICBcIm5hZ2FSZWxhdGlvbnNNYXNvbnNcIixcbiAgXCJuZWNyb2NyYWN5XCIsXG4gIFwib3Blbldvb2RsYW5kc1wiLFxuICBcIm91dGVyU3BhY2VUcmVhdHlcIixcbiAgXCJyYWRpY2FsWGVub3Bob2JpYVwiLFxuICBcInJhdGlvbmFsaXR5XCIsXG4gIFwicmF0aW9uaW5nXCIsXG4gIFwicmVwdWJsaWNcIixcbiAgXCJzY2llbnRpZmljQ29tbXVuaXNtXCIsXG4gIFwic2hhcmtSZWxhdGlvbnNCb3RhbmlzdHNcIixcbiAgXCJzaGFya1JlbGF0aW9uc01lcmNoYW50c1wiLFxuICBcInNoYXJrUmVsYXRpb25zU2NyaWJlc1wiLFxuICBcInNpcGhvbmluZ1wiLFxuICBcInNvY2lhbGlzbVwiLFxuICBcInNwaWRlclJlbGF0aW9uc0NoZW1pc3RzXCIsXG4gIFwic3BpZGVyUmVsYXRpb25zR2VvbG9naXN0c1wiLFxuICBcInNwaWRlclJlbGF0aW9uc1BhbGVvbnRvbG9naXN0c1wiLFxuICBcInN0b2ljaXNtXCIsXG4gIFwic3RyaXBNaW5pbmdcIixcbiAgXCJzdXN0YWluYWJpbGl0eVwiLFxuICBcInRlY2hub2NyYWN5XCIsXG4gIFwidGVycmFmb3JtaW5nSW5zaWdodFwiLFxuICBcInRoZW9jcmFjeVwiLFxuICBcInRyYWRpdGlvblwiLFxuICBcInRyYW5za2l0dGVuaXNtXCIsXG4gIFwiemVicmFSZWxhdGlvbnNBcHBlYXNlbWVudFwiLFxuICBcInplYnJhUmVsYXRpb25zQmVsbGljb3NpdHlcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQb2xpY3kgPSAodHlwZW9mIFBvbGljaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgVGVjaG5vbG9naWVzSWdub3JlZCA9IFtcImJyZXdlcnlcIl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBUZWNobm9sb2d5SWdub3JlZCA9ICh0eXBlb2YgVGVjaG5vbG9naWVzSWdub3JlZClbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFRlY2hub2xvZ2llcyA9IFtcbiAgXCJhY291c3RpY3NcIixcbiAgXCJhZHZFeG9nZW9sb2d5XCIsXG4gIFwiYWdyaWN1bHR1cmVcIixcbiAgXCJhaVwiLFxuICBcImFuaW1hbFwiLFxuICBcImFudGltYXR0ZXJcIixcbiAgXCJhcmNoZW9sb2d5XCIsXG4gIFwiYXJjaGVyeVwiLFxuICBcImFyY2hpdGVjdHVyZVwiLFxuICBcImFydGlmaWNpYWxHcmF2aXR5XCIsXG4gIFwiYXN0cm9ub215XCIsXG4gIFwiYmlvY2hlbWlzdHJ5XCIsXG4gIFwiYmlvbG9neVwiLFxuICBcImJsYWNrY2hhaW5cIixcbiAgXCJjYWxlbmRhclwiLFxuICBcImNoZW1pc3RyeVwiLFxuICBcImNocm9ub3BoeXNpY3NcIixcbiAgXCJjaXZpbFwiLFxuICBcImNvbWJ1c3Rpb25cIixcbiAgXCJjb25zdHJ1Y3Rpb25cIixcbiAgXCJjcnlwdG90aGVvbG9neVwiLFxuICBcImN1cnJlbmN5XCIsXG4gIFwiZGltZW5zaW9uYWxQaHlzaWNzXCIsXG4gIFwiZHJhbWFcIixcbiAgXCJlY29sb2d5XCIsXG4gIFwiZWxlY3RyaWNpdHlcIixcbiAgXCJlbGVjdHJvbmljc1wiLFxuICBcImVuZ2luZWVyaW5nXCIsXG4gIFwiZXhvZ2VvbG9neVwiLFxuICBcImV4b2dlb3BoeXNpY3NcIixcbiAgXCJnZW5ldGljc1wiLFxuICBcImh5ZHJvcG9uaWNzXCIsXG4gIFwiaW5kdXN0cmlhbGl6YXRpb25cIixcbiAgXCJtYWNoaW5lcnlcIixcbiAgXCJtYXRoXCIsXG4gIFwibWVjaGFuaXphdGlvblwiLFxuICBcIm1ldGFsXCIsXG4gIFwibWV0YWx1cmd5XCIsXG4gIFwibWV0YXBoeXNpY3NcIixcbiAgXCJtaW5pbmdcIixcbiAgXCJuYW5vdGVjaG5vbG9neVwiLFxuICBcIm5hdmlnYXRpb25cIixcbiAgXCJudWNsZWFyRmlzc2lvblwiLFxuICBcIm9pbFByb2Nlc3NpbmdcIixcbiAgXCJvcmJpdGFsRW5naW5lZXJpbmdcIixcbiAgXCJwYXJhZG94YWxLbm93bGVkZ2VcIixcbiAgXCJwYXJ0aWNsZVBoeXNpY3NcIixcbiAgXCJwaGlsb3NvcGh5XCIsXG4gIFwicGh5c2ljc1wiLFxuICBcInF1YW50dW1DcnlwdG9ncmFwaHlcIixcbiAgXCJyb2JvdGljc1wiLFxuICBcInJvY2tldHJ5XCIsXG4gIFwic2F0dGVsaXRlc1wiLFxuICBcInN0ZWVsXCIsXG4gIFwic3VwZXJjb25kdWN0b3JzXCIsXG4gIFwidGFjaHlvblRoZW9yeVwiLFxuICBcInRlcnJhZm9ybWF0aW9uXCIsXG4gIFwidGhlb2xvZ3lcIixcbiAgXCJ0aG9yaXVtXCIsXG4gIFwidm9pZFNwYWNlXCIsXG4gIFwid3JpdGluZ1wiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRlY2hub2xvZ3kgPSAodHlwZW9mIFRlY2hub2xvZ2llcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IE1pc3Npb25zID0gW1xuICBcImNlbnRhdXJ1c1N5c3RlbU1pc3Npb25cIixcbiAgXCJjaGFyb25NaXNzaW9uXCIsXG4gIFwiZHVuZU1pc3Npb25cIixcbiAgXCJmdXJ0aGVzdFJpbmdNaXNzaW9uXCIsXG4gIFwiaGVsaW9zTWlzc2lvblwiLFxuICBcImthaXJvTWlzc2lvblwiLFxuICBcIm1vb25NaXNzaW9uXCIsXG4gIFwib3JiaXRhbExhdW5jaFwiLFxuICBcInBpc2NpbmVNaXNzaW9uXCIsXG4gIFwicm9yc2NoYWNoTWlzc2lvblwiLFxuICBcInRlcm1pbnVzTWlzc2lvblwiLFxuICBcInVtYnJhTWlzc2lvblwiLFxuICBcInlhcm5NaXNzaW9uXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTWlzc2lvbiA9ICh0eXBlb2YgTWlzc2lvbnMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBQbGFuZXRzID0gW1xuICBcImNhdGhcIixcbiAgXCJjZW50YXVydXNTeXN0ZW1cIixcbiAgXCJjaGFyb25cIixcbiAgXCJkdW5lXCIsXG4gIFwiZnVydGhlc3RSaW5nXCIsXG4gIFwiaGVsaW9zXCIsXG4gIFwia2Fpcm9cIixcbiAgXCJtb29uXCIsXG4gIFwicGlzY2luZVwiLFxuICBcInRlcm1pbnVzXCIsXG4gIFwidW1icmFcIixcbiAgXCJ5YXJuXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGxhbmV0ID0gKHR5cGVvZiBQbGFuZXRzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgU3BhY2VCdWlsZGluZ3MgPSBbXG4gIFwiY29udGFpbm1lbnRDaGFtYmVyXCIsXG4gIFwiY3J5b3N0YXRpb25cIixcbiAgXCJlbnRhbmdsZXJcIixcbiAgXCJoZWF0c2lua1wiLFxuICBcImhySGFydmVzdGVyXCIsXG4gIFwiaHlkcm9mcmFjdHVyZXJcIixcbiAgXCJoeWRyb3Bvbmljc1wiLFxuICBcIm1vbHRlbkNvcmVcIixcbiAgXCJtb29uQmFzZVwiLFxuICBcIm1vb25PdXRwb3N0XCIsXG4gIFwib3JiaXRhbEFycmF5XCIsXG4gIFwicGxhbmV0Q3JhY2tlclwiLFxuICBcInJlc2VhcmNoVmVzc2VsXCIsXG4gIFwic2F0dGVsaXRlXCIsXG4gIFwic3BhY2VCZWFjb25cIixcbiAgXCJzcGFjZUVsZXZhdG9yXCIsXG4gIFwic3BhY2VTdGF0aW9uXCIsXG4gIFwic3BpY2VSZWZpbmVyeVwiLFxuICBcInN1bmZvcmdlXCIsXG4gIFwic3VubGlmdGVyXCIsXG4gIFwidGVjdG9uaWNcIixcbiAgXCJ0ZXJyYWZvcm1pbmdTdGF0aW9uXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgU3BhY2VCdWlsZGluZyA9ICh0eXBlb2YgU3BhY2VCdWlsZGluZ3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBTdGF0cyA9IFtcbiAgXCJhdmVyYWdlS2l0dGVuc1wiLFxuICBcImJ1aWxkaW5nc0NvbnN0cnVjdGVkXCIsXG4gIFwiZXZlbnRzT2JzZXJ2ZWRcIixcbiAgXCJraXR0ZW5zRGVhZFwiLFxuICBcInRpbWVQbGF5ZWRcIixcbiAgXCJ0b3RhbENoYWxsZW5nZXNDb21wbGV0ZWRcIixcbiAgXCJ0b3RhbENsaWNrc1wiLFxuICBcInRvdGFsQ3JhZnRzXCIsXG4gIFwidG90YWxLaXR0ZW5zXCIsXG4gIFwidG90YWxQYXJhZ29uXCIsXG4gIFwidG90YWxSZXNldHNcIixcbiAgXCJ0b3RhbFRyYWRlc1wiLFxuICBcInRvdGFsWWVhcnNcIixcbiAgXCJ0cmFuc2NlbmRlbmNlVGllclwiLFxuICBcInVuaWNvcm5zU2FjcmlmaWNlZFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN0YXQgPSAodHlwZW9mIFN0YXRzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgQ2hyb25vRm9yZ2VVcGdyYWRlcyA9IFtcbiAgXCJibGFzdEZ1cm5hY2VcIixcbiAgXCJyZXNzb3VyY2VSZXRyaWV2YWxcIixcbiAgXCJ0ZW1wb3JhbEFjY2VsZXJhdG9yXCIsXG4gIFwidGVtcG9yYWxCYXR0ZXJ5XCIsXG4gIFwidGVtcG9yYWxJbXBlZGFuY2VcIixcbiAgXCJ0ZW1wb3JhbFByZXNzXCIsXG4gIFwidGltZUJvaWxlclwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENocm9ub0ZvcmdlVXBncmFkZSA9ICh0eXBlb2YgQ2hyb25vRm9yZ2VVcGdyYWRlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFZvaWRTcGFjZVVwZ3JhZGVzID0gW1xuICBcImNyeW9jaGFtYmVyc1wiLFxuICBcInVzZWRDcnlvY2hhbWJlcnNcIixcbiAgXCJ2b2lkSG9vdmVyXCIsXG4gIFwidm9pZFJpZnRcIixcbiAgXCJjaHJvbm9jb250cm9sXCIsXG4gIFwidm9pZFJlc29uYXRvclwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFZvaWRTcGFjZVVwZ3JhZGUgPSAodHlwZW9mIFZvaWRTcGFjZVVwZ3JhZGVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgVXBncmFkZXMgPSBbXG4gIFwiYWR2YW5jZWRBdXRvbWF0aW9uXCIsXG4gIFwiYWR2YW5jZWRSZWZpbmVtZW50XCIsXG4gIFwiYWlCYXNlc1wiLFxuICBcImFpRW5naW5lZXJzXCIsXG4gIFwiYWxsb3lBcm1vclwiLFxuICBcImFsbG95QXhlXCIsXG4gIFwiYWxsb3lCYXJuc1wiLFxuICBcImFsbG95U2F3XCIsXG4gIFwiYWxsb3lXYXJlaG91c2VzXCIsXG4gIFwiYW1CYXNlc1wiLFxuICBcImFtRHJpdmVcIixcbiAgXCJhbUZpc3Npb25cIixcbiAgXCJhbVJlYWN0b3JzXCIsXG4gIFwiYW1SZWFjdG9yc01LMlwiLFxuICBcImFzc2lzdGFuY2VcIixcbiAgXCJhc3Ryb2xhYmVcIixcbiAgXCJhc3Ryb3BoeXNpY2lzdHNcIixcbiAgXCJhdWd1bWVudGF0aW9uXCIsXG4gIFwiYXV0b21hdGVkUGxhbnRzXCIsXG4gIFwiYmFyZ2VzXCIsXG4gIFwiYmlvZnVlbFwiLFxuICBcImJvbGFzXCIsXG4gIFwiY2FkU3lzdGVtc1wiLFxuICBcImNhcmF2YW5zZXJhaVwiLFxuICBcImNhcmJvblNlcXVlc3RyYXRpb25cIixcbiAgXCJjYXJnb1NoaXBzXCIsXG4gIFwiY2VsZXN0aWFsTWVjaGFuaWNzXCIsXG4gIFwiY2hyb25vRW5naW5lZXJzXCIsXG4gIFwiY2hyb25vZm9yZ2VcIixcbiAgXCJjb2FsRnVybmFjZVwiLFxuICBcImNvbGRGdXNpb25cIixcbiAgXCJjb21idXN0aW9uRW5naW5lXCIsXG4gIFwiY29tcG9zaXRlQm93XCIsXG4gIFwiY29uY3JldGVCYXJuc1wiLFxuICBcImNvbmNyZXRlSHV0c1wiLFxuICBcImNvbmNyZXRlV2FyZWhvdXNlc1wiLFxuICBcImNyb3NzYm93XCIsXG4gIFwiY3J5b2NvbXB1dGluZ1wiLFxuICBcImRhcmtFbmVyZ3lcIixcbiAgXCJkZWVwTWluaW5nXCIsXG4gIFwiZGlzdG9yc2lvblwiLFxuICBcImVsZWN0cm9seXRpY1NtZWx0aW5nXCIsXG4gIFwiZWx1ZGl1bUNyYWNrZXJcIixcbiAgXCJlbHVkaXVtSHV0c1wiLFxuICBcImVsdWRpdW1SZWZsZWN0b3JzXCIsXG4gIFwiZW5lcmd5UmlmdHNcIixcbiAgXCJlbnJpY2hlZFRob3JpdW1cIixcbiAgXCJlbnJpY2hlZFVyYW5pdW1cIixcbiAgXCJmYWN0b3J5QXV0b21hdGlvblwiLFxuICBcImZhY3RvcnlMb2dpc3RpY3NcIixcbiAgXCJmYWN0b3J5T3B0aW1pemF0aW9uXCIsXG4gIFwiZmFjdG9yeVByb2Nlc3NpbmdcIixcbiAgXCJmYWN0b3J5Um9ib3RpY3NcIixcbiAgXCJmbHVpZGl6ZWRSZWFjdG9yc1wiLFxuICBcImZsdXhDb25kZW5zYXRvclwiLFxuICBcImZ1ZWxJbmplY3RvcnNcIixcbiAgXCJnZW9kZXN5XCIsXG4gIFwiZ21vXCIsXG4gIFwiZ29sZE9yZVwiLFxuICBcImh1YmJsZVRlbGVzY29wZVwiLFxuICBcImh1bnRpbmdBcm1vclwiLFxuICBcImh5ZHJvUGxhbnRUdXJiaW5lc1wiLFxuICBcImludGVybmV0XCIsXG4gIFwiaW52aXNpYmxlQmxhY2tIYW5kXCIsXG4gIFwiaXJvbkF4ZXNcIixcbiAgXCJpcm9uSG9lc1wiLFxuICBcImlyb253b29kXCIsXG4gIFwibGhjXCIsXG4gIFwibG9naXN0aWNzXCIsXG4gIFwibG9uZ1JhbmdlU3BhY2VzaGlwc1wiLFxuICBcIm1hY2hpbmVMZWFybmluZ1wiLFxuICBcIm1pbmVyYWxBeGVzXCIsXG4gIFwibWluZXJhbEhvZXNcIixcbiAgXCJtaW5pbmdEcmlsbFwiLFxuICBcIm1XUmVhY3RvclwiLFxuICBcIm5hbm9zdWl0c1wiLFxuICBcIm5ldXJhbE5ldHdvcmtzXCIsXG4gIFwibnVjbGVhclBsYW50c1wiLFxuICBcIm51Y2xlYXJTbWVsdGVyc1wiLFxuICBcIm9mZnNldFByZXNzXCIsXG4gIFwib2lsRGlzdGlsbGF0aW9uXCIsXG4gIFwib2lsUmVmaW5lcnlcIixcbiAgXCJvcmJpdGFsR2VvZGVzeVwiLFxuICBcIm94aWRhdGlvblwiLFxuICBcInBob3RvbGl0aG9ncmFwaHlcIixcbiAgXCJwaG90b3ZvbHRhaWNcIixcbiAgXCJwbmV1bWF0aWNQcmVzc1wiLFxuICBcInByaW50aW5nUHJlc3NcIixcbiAgXCJwdW1wamFja1wiLFxuICBcInB5cm9seXNpc1wiLFxuICBcInFkb3RcIixcbiAgXCJyYWlsZ3VuXCIsXG4gIFwicmVhY3RvclZlc3NlbFwiLFxuICBcInJlZnJpZ2VyYXRpb25cIixcbiAgXCJyZWdpc3RlclwiLFxuICBcInJlaW5mb3JjZWRCYXJuc1wiLFxuICBcInJlaW5mb3JjZWRTYXdcIixcbiAgXCJyZWluZm9yY2VkV2FyZWhvdXNlc1wiLFxuICBcInJlbGljU3RhdGlvblwiLFxuICBcInJvdGFyeUtpbG5cIixcbiAgXCJzYXRlbGxpdGVSYWRpb1wiLFxuICBcInNhdG5hdlwiLFxuICBcInNldGlcIixcbiAgXCJzaWxvc1wiLFxuICBcInNvbGFyU2F0ZWxsaXRlc1wiLFxuICBcInNwYWNlRW5naW5lZXJzXCIsXG4gIFwic3BhY2VNYW51ZmFjdHVyaW5nXCIsXG4gIFwic3BpY2VOYXZpZ2F0aW9uXCIsXG4gIFwic3RhcmxpbmtcIixcbiAgXCJzdGFzaXNDaGFtYmVyc1wiLFxuICBcInN0ZWVsQXJtb3JcIixcbiAgXCJzdGVlbEF4ZVwiLFxuICBcInN0ZWVsUGxhbnRzXCIsXG4gIFwic3RlZWxTYXdcIixcbiAgXCJzdG9uZUJhcm5zXCIsXG4gIFwic3RvcmFnZUJ1bmtlcnNcIixcbiAgXCJzdHJlbmdodGVuQnVpbGRcIixcbiAgXCJ0YWNoeW9uQWNjZWxlcmF0b3JzXCIsXG4gIFwidGhpbkZpbG1cIixcbiAgXCJ0aG9yaXVtRW5naW5lXCIsXG4gIFwidGhvcml1bVJlYWN0b3JzXCIsXG4gIFwidGl0YW5pdW1BeGVcIixcbiAgXCJ0aXRhbml1bUJhcm5zXCIsXG4gIFwidGl0YW5pdW1NaXJyb3JzXCIsXG4gIFwidGl0YW5pdW1TYXdcIixcbiAgXCJ0aXRhbml1bVdhcmVob3VzZXNcIixcbiAgXCJ0dXJuU21vb3RobHlcIixcbiAgXCJ1bmljb3JuU2VsZWN0aW9uXCIsXG4gIFwidW5vYnRhaW5pdW1BeGVcIixcbiAgXCJ1bm9idGFpbml1bURyaWxsXCIsXG4gIFwidW5vYnRhaW5pdW1IdXRzXCIsXG4gIFwidW5vYnRhaW5pdW1SZWZsZWN0b3JzXCIsXG4gIFwidW5vYnRhaW5pdW1TYXdcIixcbiAgXCJ1cGxpbmtcIixcbiAgXCJ2b2lkQXNwaXJhdGlvblwiLFxuICBcInZvaWRFbmVyZ3lcIixcbiAgXCJ2b2lkUmVhY3RvcnNcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBVcGdyYWRlID0gKHR5cGVvZiBVcGdyYWRlcylbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IFplYnJhVXBncmFkZXMgPSBbXG4gIFwiYmxvb2RzdG9uZUluc3RpdHV0ZVwiLFxuICBcImRhcmtCcmV3XCIsXG4gIFwiZGFya1Jldm9sdXRpb25cIixcbiAgXCJtaW5lcm9sb2d5RGVwYXJ0bWVudFwiLFxuICBcIndoaXNwZXJzXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgWmVicmFVcGdyYWRlID0gKHR5cGVvZiBaZWJyYVVwZ3JhZGVzKVtudW1iZXJdO1xuXG5leHBvcnQgZW51bSBUaW1lSXRlbVZhcmlhbnQge1xuICBDaHJvbm9mb3JnZSA9IFwiY2hyb25vXCIsXG4gIFZvaWRTcGFjZSA9IFwidm9pZFwiLFxufVxuXG5leHBvcnQgdHlwZSBGYWl0aEl0ZW0gPSBFeGNsdWRlPFJlbGlnaW9uSXRlbSwgVW5pY29ybkl0ZW0+O1xuXG5leHBvcnQgY29uc3QgVW5pY29ybkl0ZW1zID0gW1xuICBcIml2b3J5Q2l0YWRlbFwiLFxuICBcIml2b3J5VG93ZXJcIixcbiAgXCJza3lQYWxhY2VcIixcbiAgXCJzdW5zcGlyZVwiLFxuICBcInVuaWNvcm5QYXN0dXJlXCIsXG4gIFwidW5pY29yblRvbWJcIixcbiAgXCJ1bmljb3JuVXRvcGlhXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVW5pY29ybkl0ZW0gPSAodHlwZW9mIFVuaWNvcm5JdGVtcylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgUmVsaWdpb25JdGVtID0gUmVsaWdpb25VcGdyYWRlIHwgVHJhbnNjZW5kZW5jZVVwZ3JhZGUgfCBaaWdndXJhdFVwZ3JhZGU7XG5leHBvcnQgdHlwZSBSZWxpZ2lvbkFkZGl0aW9uSXRlbSA9IFwiYWRvcmVcIiB8IFwiYXV0b1ByYWlzZVwiIHwgXCJiZXN0VW5pY29ybkJ1aWxkaW5nXCIgfCBcInRyYW5zY2VuZFwiO1xuXG5leHBvcnQgY29uc3QgUmVsaWdpb25PcHRpb25zID0gW1xuICBcInNhY3JpZmljZVVuaWNvcm5zXCIsXG4gIFwic2FjcmlmaWNlQWxpY29ybnNcIixcbiAgXCJyZWZpbmVUZWFyc1wiLFxuICBcInJlZmluZVRpbWVDcnlzdGFsc1wiLFxuICBcInRyYW5zY2VuZFwiLFxuICBcImFkb3JlXCIsXG4gIFwiYXV0b1ByYWlzZVwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlbGlnaW9uT3B0aW9uID0gKHR5cGVvZiBSZWxpZ2lvbk9wdGlvbnMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBCaW9tZXMgPSBbXG4gIFwiYmxvb2REZXNlcnRcIixcbiAgXCJib25lRm9yZXN0XCIsXG4gIFwiZGVzZXJ0XCIsXG4gIFwiZm9yZXN0XCIsXG4gIFwiaGlsbHNcIixcbiAgXCJtb3VudGFpblwiLFxuICBcInBsYWluc1wiLFxuICBcInJhaW5Gb3Jlc3RcIixcbiAgXCJzd2FtcFwiLFxuICBcInZpbGxhZ2VcIixcbiAgXCJ2b2xjYW5vXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQmlvbWUgPSAodHlwZW9mIEJpb21lcylbbnVtYmVyXTtcblxuZXhwb3J0IHR5cGUgVW5sb2NrcyA9IHtcbiAgYnVpbGRpbmdzOiBBcnJheTxCdWlsZGluZz47XG4gIGNoYWxsZW5nZXM6IEFycmF5PENoYWxsZW5nZT47XG4gIGNocm9ub2ZvcmdlOiBBcnJheTxDaHJvbm9Gb3JnZVVwZ3JhZGU+O1xuICBjcmFmdHM6IEFycmF5PFJlc291cmNlQ3JhZnRhYmxlPjtcbiAgam9iczogQXJyYXk8Sm9iPjtcbiAgcG9saWNpZXM6IEFycmF5PFBvbGljeT47XG4gIHN0YWdlczogQXJyYXk8U3RhZ2VkQnVpbGRpbmc+O1xuICB0YWJzOiBBcnJheTxUYWJJZD47XG4gIHRlY2g6IEFycmF5PFRlY2hub2xvZ3k+O1xuICB1cGdyYWRlczogQXJyYXk8VXBncmFkZT47XG4gIHZvaWRTcGFjZTogQXJyYXk8Vm9pZFNwYWNlVXBncmFkZT47XG4gIHplYnJhVXBncmFkZXM6IEFycmF5PHVua25vd24+O1xufTtcblxuZXhwb3J0IGNvbnN0IFBlcmtzID0gW1xuICBcImFkanVzdG1lbnRCdXJlYXVcIixcbiAgXCJhbmFjaHJvbm9tYW5jeVwiLFxuICBcImFzY29oXCIsXG4gIFwiYXN0cm9tYW5jeVwiLFxuICBcImJpbmFoXCIsXG4gIFwiYmxhY2tDb2RleFwiLFxuICBcImNhcm5pdmFsc1wiLFxuICBcImNoZXNlZFwiLFxuICBcImNob2tobWFoXCIsXG4gIFwiY2hyb25vbWFuY3lcIixcbiAgXCJjb2RleEFncnVtXCIsXG4gIFwiY29kZXhMZXZpYXRoYW5pYW51c1wiLFxuICBcImNvZGV4TG9nb3NcIixcbiAgXCJjb2RleFZveFwiLFxuICBcImRpcGxvbWFjeVwiLFxuICBcImRpdmluZVByb3BvcnRpb25cIixcbiAgXCJlbmdlbmVlcmluZ1wiLFxuICBcImdldnVyYWhcIixcbiAgXCJnb2xkZW5SYXRpb1wiLFxuICBcImhvZFwiLFxuICBcImtldGVyXCIsXG4gIFwibWFsa3V0aFwiLFxuICBcIm1lZ2Fsb21hbmlhXCIsXG4gIFwibmF2aWdhdGlvbkRpcGxvbWFjeVwiLFxuICBcIm5ldHphY2hcIixcbiAgXCJudW1lcm9sb2d5XCIsXG4gIFwibnVtZXJvbWFuY3lcIixcbiAgXCJwYXdnYW5cIixcbiAgXCJyZW5haXNzYW5jZVwiLFxuICBcInRpZmVyZXRcIixcbiAgXCJ1bmljb3JubWFuY3lcIixcbiAgXCJ2aXRydXZpYW5GZWxpbmVcIixcbiAgXCJ2b2lkT3JkZXJcIixcbiAgXCJ3aWxsZW5mbHVmZlwiLFxuICBcInllc29kXCIsXG4gIFwiemVicmFDb3ZlbmFudFwiLFxuICBcInplYnJhRGlwbG9tYWN5XCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGVyayA9ICh0eXBlb2YgUGVya3MpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBDb2xvclNjaGVtZXMgPSBbXG4gIFwiYW50aHJhY2l0ZVwiLFxuICBcImFyY3RpY1wiLFxuICBcImJsYWNrXCIsXG4gIFwiYmx1aXNoXCIsXG4gIFwiY2F0bmlwXCIsXG4gIFwiY2hvY29sYXRlXCIsXG4gIFwiY29tcHV0ZXJcIixcbiAgXCJjeWJlclwiLFxuICBcImRhcmtcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZHVuZVwiLFxuICBcImZhY3RvcnlcIixcbiAgXCJmbHVpZFwiLFxuICBcImdvbGRcIixcbiAgXCJncmFzc3lcIixcbiAgXCJncmF5aXNoXCIsXG4gIFwiZ3JlZW5pc2hcIixcbiAgXCJtaW5pbWFsaXN0XCIsXG4gIFwib2lsXCIsXG4gIFwic2Nob29sXCIsXG4gIFwic2xlZWtcIixcbiAgXCJzcGFjZVwiLFxuICBcInNwb29reVwiLFxuICBcInRvbWJzdG9uZVwiLFxuICBcInVuaWNvcm5cIixcbiAgXCJ2ZXNzZWxcIixcbiAgXCJ2aW50YWdlXCIsXG4gIFwid29vZFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENvbG9yU2NoZW1lID0gKHR5cGVvZiBDb2xvclNjaGVtZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBMb2NhbGVzID0gW1xuICBcImJlXCIsXG4gIFwiYnJcIixcbiAgXCJjelwiLFxuICBcImRlXCIsXG4gIFwiZW5cIixcbiAgXCJlc1wiLFxuICBcImVzbFwiLFxuICBcImZyXCIsXG4gIFwiaXRcIixcbiAgXCJqYVwiLFxuICBcImtvXCIsXG4gIFwicGxcIixcbiAgXCJydVwiLFxuICBcInVrXCIsXG4gIFwiemhcIixcbiAgXCJ6aHRcIixcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBMb2NhbGUgPSAodHlwZW9mIExvY2FsZXMpW251bWJlcl07XG5cbmV4cG9ydCBjb25zdCBOb3RhdGlvbnMgPSBbXCJzaVwiLCBcImVcIiwgXCJzaWVcIl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBOb3RhdGlvbiA9ICh0eXBlb2YgTm90YXRpb25zKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBDeWNsZUVmZmVjdHMgPSB7XG4gIFwiY3J5b3N0YXRpb24tY29hbE1heFwiOiBudW1iZXI7XG4gIFwiY3J5b3N0YXRpb24taXJvbk1heFwiOiBudW1iZXI7XG4gIFwiY3J5b3N0YXRpb24tbWluZXJhbHNNYXhcIjogbnVtYmVyO1xuICBcImNyeW9zdGF0aW9uLW9pbE1heFwiOiBudW1iZXI7XG4gIFwiY3J5b3N0YXRpb24tdGl0YW5pdW1NYXhcIjogbnVtYmVyO1xuICBcImNyeW9zdGF0aW9uLXVub2J0YWluaXVtTWF4XCI6IG51bWJlcjtcbiAgXCJjcnlvc3RhdGlvbi11cmFuaXVtTWF4XCI6IG51bWJlcjtcbiAgXCJjcnlvc3RhdGlvbi13b29kTWF4XCI6IG51bWJlcjtcbiAgXCJlbnRhbmdsZXItZ2Zsb3BzQ29uc3VtcHRpb25cIjogbnVtYmVyO1xuICBcImhySGFydmVzdGVyLWVuZXJneVByb2R1Y3Rpb25cIjogbnVtYmVyO1xuICBcImh5ZHJvZnJhY3R1cmVyLW9pbFBlclRpY2tBdXRvcHJvZFNwYWNlXCI6IG51bWJlcjtcbiAgXCJoeWRyb3Bvbmljcy1jYXRuaXBSYXRpb1wiOiBudW1iZXI7XG4gIFwibW9vbk91dHBvc3QtdW5vYnRhaW5pdW1QZXJUaWNrU3BhY2VcIjogbnVtYmVyO1xuICBcInBsYW5ldENyYWNrZXItdXJhbml1bVBlclRpY2tTcGFjZVwiOiBudW1iZXI7XG4gIFwicmVzZWFyY2hWZXNzZWwtc3RhcmNoYXJ0UGVyVGlja0Jhc2VTcGFjZVwiOiBudW1iZXI7XG4gIFwic2F0dGVsaXRlLW9ic2VydmF0b3J5UmF0aW9cIjogbnVtYmVyO1xuICBcInNhdHRlbGl0ZS1zdGFyY2hhcnRQZXJUaWNrQmFzZVNwYWNlXCI6IG51bWJlcjtcbiAgXCJzcGFjZUJlYWNvbi1zdGFyY2hhcnRQZXJUaWNrQmFzZVNwYWNlXCI6IG51bWJlcjtcbiAgXCJzcGFjZUVsZXZhdG9yLXByb2RUcmFuc2ZlckJvbnVzXCI6IG51bWJlcjtcbiAgXCJzcGFjZVN0YXRpb24tc2NpZW5jZVJhdGlvXCI6IG51bWJlcjtcbiAgXCJzdW5saWZ0ZXItZW5lcmd5UHJvZHVjdGlvblwiOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBGZXN0aXZhbEVmZmVjdHMgPSB7XG4gIGNhdG5pcDogbnVtYmVyO1xuICBjb2FsOiBudW1iZXI7XG4gIGN1bHR1cmU6IG51bWJlcjtcbiAgZmFpdGg6IG51bWJlcjtcbiAgZ29sZDogbnVtYmVyO1xuICBpcm9uOiBudW1iZXI7XG4gIG1hbnBvd2VyOiBudW1iZXI7XG4gIG1pbmVyYWxzOiBudW1iZXI7XG4gIG9pbDogbnVtYmVyO1xuICBzY2llbmNlOiBudW1iZXI7XG4gIHN0YXJjaGFydDogbnVtYmVyO1xuICB0aXRhbml1bTogbnVtYmVyO1xuICB1bmljb3JuczogbnVtYmVyO1xuICB1bm9idGFpbml1bTogbnVtYmVyO1xuICB1cmFuaXVtOiBudW1iZXI7XG4gIHdvb2Q6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFVubG9ja1R5cGVNYXAgPSB7XG4gIGJpb21lczogVW5zYWZlQmlvbWU7XG4gIGJ1aWxkaW5nczogVW5zYWZlQnVpbGRpbmc7XG4gIGNoYWxsZW5nZXM6IFVuc2FmZUNoYWxsZW5nZTtcbiAgY2hyb25vZm9yZ2U6IFVuc2FmZUNocm9ub0ZvcmdlVXBncmFkZTtcbiAgY3JhZnRzOiBVbnNhZmVDcmFmdDtcbiAgam9iczogVW5zYWZlSm9iO1xuICBwYWN0czogVW5zYWZlUGFjdDtcbiAgcGVya3M6IFVuc2FmZVBlcms7XG4gIHBsYW5ldDogVW5zYWZlUGxhbmV0O1xuICBwb2xpY2llczogVW5zYWZlUG9saWN5O1xuICByZWxpZ2lvbjogVW5zYWZlUmVsaWdpb25VcGdyYWRlO1xuICBzY2hlbWVzOiB1bmtub3duO1xuICBzcGFjZUJ1aWxkaW5nOiBVbnNhZmVTcGFjZUJ1aWxkaW5nO1xuICBzcGFjZU1pc3Npb246IFVuc2FmZVBsYW5ldDtcbiAgc3RhZ2VzOiBVbnNhZmVCdWlsZGluZztcbiAgdGFiczogVGFiO1xuICB0ZWNoOiBVbnNhZmVUZWNoO1xuICB0cmFuc2NlbmRlbmNlVXBncmFkZXM6IFVuc2FmZVRyYW5zY2VuZGVuY2VVcGdyYWRlO1xuICB1cGdyYWRlczogVW5zYWZlVXBncmFkZTtcbiAgdm9pZFNwYWNlOiBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlO1xuICB6ZWJyYVVwZ3JhZGVzOiBVbnNhZmVVcGdyYWRlO1xuICB6aWdndXJhdFVwZ3JhZGVzOiBVbnNhZmVaaWdndXJhdFVwZ3JhZGU7XG59O1xuZXhwb3J0IHR5cGUgVW5sb2NrID0ga2V5b2YgVW5sb2NrVHlwZU1hcDtcblxuLyoqXG4gKiBBIGNvbWJpbmF0aW9uIG9mIGEgcmVzb3VyY2UgYW5kIGFuIGFtb3VudC5cbiAqL1xuZXhwb3J0IHR5cGUgUHJpY2UgPSB7IG5hbWU6IFJlc291cmNlOyB2YWw6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgQ2hhbGxlbmdlcyA9IFtcbiAgXCIxMDAwWWVhcnNcIixcbiAgXCJhbmFyY2h5XCIsXG4gIFwiYXRoZWlzbVwiLFxuICBcImVuZXJneVwiLFxuICBcImlyb25XaWxsXCIsXG4gIFwicGFjaWZpc21cIixcbiAgXCJwb3N0QXBvY2FseXBzZVwiLFxuICBcIndpbnRlcklzQ29taW5nXCIsXG5dIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2hhbGxlbmdlID0gKHR5cGVvZiBDaGFsbGVuZ2VzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBMaW5rID0ge1xuICB2aXNpYmxlOiBib29sZWFuO1xuICB0aXRsZTogc3RyaW5nO1xuICB0b29sdGlwOiBzdHJpbmc7XG4gIGdldERpc3BsYXlWYWx1ZUV4dDogKCkgPT4gc3RyaW5nO1xuICBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50LCBjYWxsYmFjazogKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBDbGFzc0xpc3QgPSB7XG4gIEJ1aWxkaW5nTWV0YTogQnVpbGRpbmdNZXRhO1xuICBkaXBsb21hY3k6IHtcbiAgICB1aToge1xuICAgICAgYXV0b1Bpbm5lZEJ1dHRvbkNvbnRyb2xsZXI6IEF1dG9QaW5uZWRCdXR0b25Db250cm9sbGVyO1xuICAgICAgYXV0b1Bpbm5lZEJ1dHRvbjogQXV0b1Bpbm5lZEJ1dHRvbjtcbiAgICAgIEVsZGVyc1BhbmVsOiBFbGRlcnNQYW5lbDtcbiAgICAgIEVtYmFzc3lCdXR0b25Db250cm9sbGVyOiBFbWJhc3N5QnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIEVtYmFzc3lCdXR0b246IEVtYmFzc3lCdXR0b247XG4gICAgICBSYWNlUGFuZWw6IFJhY2VQYW5lbDtcbiAgICB9O1xuICB9O1xuICBnYW1lOiB7XG4gICAgU2VydmVyOiBTZXJ2ZXI7XG4gICAgVGVsZW1ldHJ5OiBUZWxlbWV0cnk7XG4gICAgVGltZXI6IFRpbWVyO1xuICAgIHVpOiB7XG4gICAgICBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyOiBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyO1xuICAgICAgUmVmaW5lQ2F0bmlwQnV0dG9uOiBSZWZpbmVDYXRuaXBCdXR0b247XG4gICAgICBSZWZpbmVDYXRuaXBCdXR0b25Db250cm9sbGVyOiBSZWZpbmVDYXRuaXBCdXR0b25Db250cm9sbGVyO1xuICAgIH07XG4gICAgVW5kb0NoYW5nZTogVW5kb0NoYW5nZTtcbiAgfTtcbiAgS0dDb25maWc6IEtHQ29uZmlnO1xuICBtYW5hZ2Vyczoge1xuICAgIEFjaGlldmVtZW50czogQWNoaWV2ZW1lbnRzO1xuICAgIEJ1aWxkaW5nc01hbmFnZXI6IEJ1aWxkaW5nc01hbmFnZXI7XG4gICAgQ2hhbGxlbmdlc01hbmFnZXI6IENoYWxsZW5nZXNNYW5hZ2VyO1xuICAgIERpcGxvbWFjeU1hbmFnZXI6IERpcGxvbWFjeU1hbmFnZXI7XG4gICAgUHJlc3RpZ2VNYW5hZ2VyOiBQcmVzdGlnZU1hbmFnZXI7XG4gICAgUmVsaWdpb25NYW5hZ2VyOiBSZWxpZ2lvbk1hbmFnZXI7XG4gICAgUmVzb3VyY2VNYW5hZ2VyOiBSZXNvdXJjZU1hbmFnZXI7XG4gICAgU2NpZW5jZU1hbmFnZXI6IFNjaWVuY2VNYW5hZ2VyO1xuICAgIFNwYWNlTWFuYWdlcjogU3BhY2VNYW5hZ2VyO1xuICAgIFN0YXRzTWFuYWdlcjogU3RhdHNNYW5hZ2VyO1xuICAgIFRpbWVNYW5hZ2VyOiBUaW1lTWFuYWdlcjtcbiAgICBWaWxsYWdlTWFuYWdlcjogVmlsbGFnZU1hbmFnZXI7XG4gICAgVm9pZE1hbmFnZXI6IFZvaWRNYW5hZ2VyO1xuICAgIFdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuICB9O1xuICBNZXRhZGF0YTogTWV0YWRhdGE7XG4gIHF1ZXVlOiB7XG4gICAgbWFuYWdlcjogTWFuYWdlcjtcbiAgfTtcbiAgcmVsaWdpb246IHtcbiAgICBwYWN0c01hbmFnZXI6IFBhY3RzTWFuYWdlcjtcbiAgfTtcbiAgcmVzZXJ2ZU1hbjogUmVzZXJ2ZU1hbjtcbiAgdGFiOiB7XG4gICAgQ2hhbGxlbmdlc1RhYjogQ2hhbGxlbmdlc1RhYjtcbiAgICBRdWV1ZVRhYjogUXVldWVUYWI7XG4gICAgU3RhdHNUYWI6IFN0YXRzVGFiO1xuICAgIFRpbWVUYWI6IFRpbWVUYWI7XG4gIH07XG4gIHRyYWRlOiB7XG4gICAgdWk6IHtcbiAgICAgIFNlbmRFeHBsb3JlcnNCdXR0b25Db250cm9sbGVyOiBTZW5kRXhwbG9yZXJzQnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIFNlbmRFeHBsb3JlcnNCdXR0b246IFNlbmRFeHBsb3JlcnNCdXR0b247XG4gICAgfTtcbiAgfTtcbiAgdWk6IHtcbiAgICBBY2hpZXZlbWVudHNQYW5lbDogQWNoaWV2ZW1lbnRzUGFuZWw7XG4gICAgQmFkZ2VzUGFuZWw6IEJhZGdlc1BhbmVsO1xuICAgIGJ0bjoge1xuICAgICAgQnVpbGRpbmdCdG5Nb2Rlcm5Db250cm9sbGVyOiBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXI7XG4gICAgICBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcjogU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXI7XG4gICAgICBTdGFnaW5nQmxkQnRuOiBTdGFnaW5nQmxkQnRuO1xuICAgIH07XG4gICAgQnVpbGRpbmdCdG5Db250cm9sbGVyOiBCdWlsZGluZ0J0bkNvbnRyb2xsZXI7XG4gICAgQnVyblBhcmFnb25CdG5Db250cm9sbGVyOiBCdXJuUGFyYWdvbkJ0bkNvbnRyb2xsZXI7XG4gICAgQnV0dG9uQ29udHJvbGxlcjogQnV0dG9uQ29udHJvbGxlcjtcbiAgICBCdXR0b25Nb2Rlcm5Db250cm9sbGVyOiBCdXR0b25Nb2Rlcm5Db250cm9sbGVyO1xuICAgIEJ1aWxkaW5nU3RhY2thYmxlQnRuQ29udHJvbGxlcjogQnVpbGRpbmdTdGFja2FibGVCdG5Db250cm9sbGVyO1xuICAgIENoYWxsZW5nZUJ0bkNvbnRyb2xsZXI6IENoYWxsZW5nZUJ0bkNvbnRyb2xsZXI7XG4gICAgQ2hhbGxlbmdlRWZmZWN0c1BhbmVsOiBDaGFsbGVuZ2VFZmZlY3RzUGFuZWw7XG4gICAgQ2hhbGxlbmdlUGFuZWw6IENoYWxsZW5nZVBhbmVsO1xuICAgIENocm9ub2ZvcmdlV2d0OiBDaHJvbm9mb3JnZVdndDtcbiAgICBDcnlwdG90aGVvbG9neVBhbmVsOiBDcnlwdG90aGVvbG9neVBhbmVsO1xuICAgIENyeXB0b3RoZW9sb2d5V0dUOiBDcnlwdG90aGVvbG9neVdHVDtcbiAgICBEZXNrdG9wVUk6IERlc2t0b3BVSTtcbiAgICBQYWN0c1BhbmVsOiBQYWN0c1BhbmVsO1xuICAgIFBhY3RzV0dUOiBQYWN0c1dHVDtcbiAgICBQb2xpY3lCdG5Db250cm9sbGVyOiBQb2xpY3lCdG5Db250cm9sbGVyO1xuICAgIFBvbGljeVBhbmVsOiBQb2xpY3lQYW5lbDtcbiAgICBQcmVzdGlnZUJ0bkNvbnRyb2xsZXI6IFByZXN0aWdlQnRuQ29udHJvbGxlcjtcbiAgICBQcmVzdGlnZVBhbmVsOiBQcmVzdGlnZVBhbmVsO1xuICAgIFJvcnNoYWNoV2d0OiBSb3JzaGFjaFdndDtcbiAgICByZWxpZ2lvbjoge1xuICAgICAgTXVsdGlMaW5rQnRuOiBNdWx0aUxpbmtCdG48QWxsTXVsdGlMaW5rQnRuT3B0aW9ucz47XG4gICAgICBSZWZpbmVCdG46IFJlZmluZUJ0bjtcbiAgICAgIFJlZmluZVRlYXJzQnRuQ29udHJvbGxlcjogUmVmaW5lVGVhcnNCdG5Db250cm9sbGVyO1xuICAgICAgVHJhbnNmb3JtQnRuQ29udHJvbGxlcjogVHJhbnNmb3JtQnRuQ29udHJvbGxlcjtcbiAgICB9O1xuICAgIFJlc2VydmVzUGFuZWw6IFJlc2VydmVzUGFuZWw7XG4gICAgUmVzZXRXZ3Q6IFJlc2V0V2d0O1xuICAgIHNwYWNlOiB7XG4gICAgICBGdXJ0aGVzdFJpbmdQYW5lbDogRnVydGhlc3RSaW5nUGFuZWw7XG4gICAgICBQbGFuZXRCdWlsZGluZ0J0bkNvbnRyb2xsZXI6IFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcjtcbiAgICAgIFBsYW5ldFBhbmVsOiBQbGFuZXRQYW5lbDtcbiAgICB9O1xuICAgIHRpbWU6IHtcbiAgICAgIEFjY2VsZXJhdGVUaW1lQnRuOiBBY2NlbGVyYXRlVGltZUJ0bjtcbiAgICAgIEFjY2VsZXJhdGVUaW1lQnRuQ29udHJvbGxlcjogQWNjZWxlcmF0ZVRpbWVCdG5Db250cm9sbGVyO1xuICAgICAgQ2hyb25vZm9yZ2VCdG5Db250cm9sbGVyOiBDaHJvbm9mb3JnZUJ0bkNvbnRyb2xsZXI7XG4gICAgICBGaXhDcnlvY2hhbWJlckJ0bkNvbnRyb2xsZXI6IEZpeENyeW9jaGFtYmVyQnRuQ29udHJvbGxlcjtcbiAgICAgIFNoYXR0ZXJUQ0J0bjogU2hhdHRlclRDQnRuO1xuICAgICAgU2hhdHRlclRDQnRuQ29udHJvbGxlcjogU2hhdHRlclRDQnRuQ29udHJvbGxlcjtcbiAgICAgIFZvaWRTcGFjZUJ0bkNvbnRyb2xsZXI6IFZvaWRTcGFjZUJ0bkNvbnRyb2xsZXI7XG4gICAgfTtcbiAgICBUaW1lQ29udHJvbFdndDogVGltZUNvbnRyb2xXZ3Q7XG4gICAgdG9vbGJhcjoge1xuICAgICAgVG9vbGJhckVuZXJneTogVG9vbGJhckVuZXJneTtcbiAgICAgIFRvb2xiYXJIYXBwaW5lc3M6IFRvb2xiYXJIYXBwaW5lc3M7XG4gICAgICBUb29sYmFyTU9URDogVG9vbGJhck1PVEQ7XG4gICAgfTtcbiAgICBUb29sYmFyOiBUb29sYmFyO1xuICAgIFRvb2xiYXJJY29uOiBUb29sYmFySWNvbjtcbiAgICBUcmFuc2NlbmRlbmNlQnRuQ29udHJvbGxlcjogVHJhbnNjZW5kZW5jZUJ0bkNvbnRyb2xsZXI7XG4gICAgdHVybkhHT2ZmQnV0dG9uQ29udHJvbGxlcjogVHVybkhHT2ZmQnV0dG9uQ29udHJvbGxlcjtcbiAgICBVSVN5c3RlbTogVUlTeXN0ZW07XG4gICAgdmlsbGFnZToge1xuICAgICAgQmlvbWVCdG46IEJpb21lQnRuO1xuICAgICAgQmlvbWVCdG5Db250cm9sbGVyOiBCaW9tZUJ0bkNvbnRyb2xsZXI7XG4gICAgICBDZW5zdXM6IENlbnN1cztcbiAgICB9O1xuICAgIFZvaWRTcGFjZVdndDogVm9pZFNwYWNlV2d0O1xuICB9O1xuICB2aWxsYWdlOiB7XG4gICAgS2l0dGVuU2ltOiBLaXR0ZW5TaW07XG4gICAgTG9hZG91dENvbnRyb2xsZXI6IExvYWRvdXRDb250cm9sbGVyO1xuICAgIHVpOiB7XG4gICAgICBGZXN0aXZhbEJ1dHRvbjogRmVzdGl2YWxCdXR0b247XG4gICAgICBGZXN0aXZhbEJ1dHRvbkNvbnRyb2xsZXI6IEZlc3RpdmFsQnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIG1hcDoge1xuICAgICAgICBVcGdyYWRlRXhwbG9yZXJzQ29udHJvbGxlcjogVXBncmFkZUV4cGxvcmVyc0NvbnRyb2xsZXI7XG4gICAgICAgIFVwZ3JhZGVIUUNvbnRyb2xsZXI6IFVwZ3JhZGVIUUNvbnRyb2xsZXI7XG4gICAgICB9O1xuICAgICAgTWFwT3ZlcnZpZXdXZ3Q6IE1hcE92ZXJ2aWV3V2d0O1xuICAgICAgVmlsbGFnZUJ1dHRvbkNvbnRyb2xsZXI6IFZpbGxhZ2VCdXR0b25Db250cm9sbGVyO1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBDb21JbnRlcmZhY2UgPSB7XG4gIG51Y2xlYXJ1bmljb3JuOiB7XG4gICAgY29yZToge1xuICAgICAgQ29udHJvbDogQ29udHJvbDtcbiAgICAgIFRhYk1hbmFnZXI6IFRhYk1hbmFnZXI7XG4gICAgfTtcbiAgICBnYW1lOiB7XG4gICAgICBDYWxlbmRhcjogQ2FsZW5kYXI7XG4gICAgICBjYWxlbmRhcjoge1xuICAgICAgICBFdmVudDogRXZlbnQ7XG4gICAgICB9O1xuICAgICAgRWZmZWN0c01hbmFnZXI6IEVmZmVjdHNNYW5hZ2VyO1xuICAgICAgbG9nOiB7XG4gICAgICAgIENvbnNvbGU6IENvbnNvbGU7XG4gICAgICB9O1xuICAgICAgTWF0aDogS0dNYXRoO1xuICAgICAgdWk6IHtcbiAgICAgICAgQnVpbGRpbmdCdG46IEJ1aWxkaW5nQnRuPEFsbEJ1aWxkaW5nQnRuT3B0aW9ucz47XG4gICAgICAgIEJ1aWxkaW5nQnRuQ29udHJvbGxlcjogQnVpbGRpbmdCdG5Db250cm9sbGVyO1xuICAgICAgICBCdWlsZGluZ05vdFN0YWNrYWJsZUJ0bkNvbnRyb2xsZXI6IEJ1aWxkaW5nTm90U3RhY2thYmxlQnRuQ29udHJvbGxlcjtcbiAgICAgICAgQnVpbGRpbmdSZXNlYXJjaEJ0bjogQnVpbGRpbmdSZXNlYXJjaEJ0bjxBbGxCdWlsZGluZ1Jlc2VhcmNoQnRuT3B0aW9ucz47XG4gICAgICAgIEJ1aWxkaW5nU3RhY2thYmxlQnRuOiBCdWlsZGluZ1N0YWNrYWJsZUJ0bjxBbGxCdWlsZGluZ1N0YWNrYWJsZUJ0bk9wdGlvbnM+O1xuICAgICAgICBCdWlsZGluZ1N0YWNrYWJsZUJ0bkNvbnRyb2xsZXI6IEJ1aWxkaW5nU3RhY2thYmxlQnRuQ29udHJvbGxlcjtcbiAgICAgICAgQnV0dG9uOiBCdXR0b248QWxsQnV0dG9uT3B0aW9ucz47XG4gICAgICAgIEJ1dHRvbkNvbnRyb2xsZXI6IEJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIEJ1dHRvbk1vZGVybjogQnV0dG9uTW9kZXJuPEFsbEJ1dHRvbk1vZGVybk9wdGlvbnM+O1xuICAgICAgICBCdXR0b25Nb2Rlcm5Db250cm9sbGVyOiBCdXR0b25Nb2Rlcm5Db250cm9sbGVyO1xuICAgICAgICBDZW5zdXNQYW5lbDogQ2Vuc3VzUGFuZWw7XG4gICAgICAgIENvbnRlbnRSb3dSZW5kZXJlcjogQ29udGVudFJvd1JlbmRlcmVyO1xuICAgICAgICBDcmFmdEJ1dHRvbjogQ3JhZnRCdXR0b247XG4gICAgICAgIENyYWZ0QnV0dG9uQ29udHJvbGxlcjogQ3JhZnRCdXR0b25Db250cm9sbGVyO1xuICAgICAgICBDcmFzaEJjb2luQnV0dG9uQ29udHJvbGxlcjogQ3Jhc2hCY29pbkJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIEdhbWVQYWdlOiBHYW1lUGFnZTtcbiAgICAgICAgSm9iQnV0dG9uOiBKb2JCdXR0b247XG4gICAgICAgIEpvYkJ1dHRvbkNvbnRyb2xsZXI6IEpvYkJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIExvYWRvdXRCdXR0b246IExvYWRvdXRCdXR0b247XG4gICAgICAgIExvYWRvdXRCdXR0b25Db250cm9sbGVyOiBMb2Fkb3V0QnV0dG9uQ29udHJvbGxlcjtcbiAgICAgICAgUGFjdHNCdG5Db250cm9sbGVyOiBQYWN0c0J0bkNvbnRyb2xsZXI7XG4gICAgICAgIFBhbmVsOiBQYW5lbDtcbiAgICAgICAgUHJhaXNlQnRuQ29udHJvbGxlcjogUHJhaXNlQnRuQ29udHJvbGxlcjtcbiAgICAgICAgUmVsaWdpb25CdG5Db250cm9sbGVyOiBSZWxpZ2lvbkJ0bkNvbnRyb2xsZXI7XG4gICAgICAgIFJlc2V0RmFpdGhCdG5Db250cm9sbGVyOiBSZXNldEZhaXRoQnRuQ29udHJvbGxlcjtcbiAgICAgICAgU3BhY2VQcm9ncmFtQnRuQ29udHJvbGxlcjogU3BhY2VQcm9ncmFtQnRuQ29udHJvbGxlcjxVbnNhZmVCdWlsZGluZ0J0bk1vZGVsPjtcbiAgICAgICAgU3BhY2VyOiBTcGFjZXI7XG4gICAgICAgIHRhYjogVGFiICYge1xuICAgICAgICAgIEFjaFRhYjogQWNoVGFiO1xuICAgICAgICAgIEJ1aWxkaW5nc01vZGVybjogQnVpbGRpbmdzTW9kZXJuO1xuICAgICAgICAgIERpcGxvbWFjeTogRGlwbG9tYWN5O1xuICAgICAgICAgIExpYnJhcnk6IExpYnJhcnk7XG4gICAgICAgICAgUmVsaWdpb25UYWI6IFJlbGlnaW9uVGFiO1xuICAgICAgICAgIFNwYWNlVGFiOiBTcGFjZVRhYjtcbiAgICAgICAgICBWaWxsYWdlOiBWaWxsYWdlO1xuICAgICAgICAgIFdvcmtzaG9wOiBXb3Jrc2hvcDtcbiAgICAgICAgfTtcbiAgICAgICAgVGVjaEJ1dHRvbkNvbnRyb2xsZXI6IFRlY2hCdXR0b25Db250cm9sbGVyO1xuICAgICAgICBUcmFkZUJ1dHRvbjogVHJhZGVCdXR0b247XG4gICAgICAgIFRyYWRlQnV0dG9uQ29udHJvbGxlcjogVHJhZGVCdXR0b25Db250cm9sbGVyO1xuICAgICAgICBUcmFuc2NlbmRCdG5Db250cm9sbGVyOiBUcmFuc2NlbmRCdG5Db250cm9sbGVyO1xuICAgICAgICBVcGdyYWRlQnV0dG9uQ29udHJvbGxlcjogVXBncmFkZUJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIFplYnJhVXBncmFkZUJ1dHRvbkNvbnRyb2xsZXI6IFplYnJhVXBncmFkZUJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICAgIFppZ2d1cmF0QnRuQ29udHJvbGxlcjogWmlnZ3VyYXRCdG5Db250cm9sbGVyO1xuICAgICAgfTtcbiAgICAgIHZpbGxhZ2U6IHtcbiAgICAgICAgS2l0dGVuOiBLaXR0ZW47XG4gICAgICAgIExvYWRvdXQ6IExvYWRvdXQ7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbkludGVyZmFjZSA9IHtcbiAgSUNoaWxkcmVuQXdhcmU6IElDaGlsZHJlbkF3YXJlO1xuICBJRGF0YVN0b3JhZ2VBd2FyZTogSURhdGFTdG9yYWdlQXdhcmU7XG4gIElHYW1lQXdhcmU6IElHYW1lQXdhcmU7XG4gIElSZWFjdEF3YXJlOiBJUmVhY3RBd2FyZTtcbn07XG5cbmV4cG9ydCB0eXBlIEkxOG5FbmdpbmUgPSAoa2V5OiBzdHJpbmcsIGFyZ3M/OiBBcnJheTxudW1iZXIgfCBzdHJpbmc+KSA9PiBzdHJpbmc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgY29uc3QgY2xhc3NlczogQ2xhc3NMaXN0O1xuICBjb25zdCBjb206IENvbUludGVyZmFjZTtcbiAgY29uc3QgZ2FtZTogR2FtZVBhZ2U7XG4gIGxldCB1bnNhZmVXaW5kb3c6IFdpbmRvdyB8IHVuZGVmaW5lZDtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgJDogSlF1ZXJ5O1xuICAgICRJPzogTWF5YmU8STE4bkVuZ2luZT47XG4gICAgZG9qbzoge1xuICAgICAgY2xvbmU6IDxUPihzdWJqZWN0OiBUKSA9PiBUO1xuICAgICAgc3Vic2NyaWJlOiA8VEV2ZW50IGV4dGVuZHMgc3RyaW5nPihcbiAgICAgICAgZXZlbnQ6IFRFdmVudCxcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOb3Qgb3VyIHR5cGUuXG4gICAgICAgIGhhbmRsZXI6ICguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiB2b2lkLFxuICAgICAgKSA9PiBbVEV2ZW50LCBudW1iZXJdO1xuICAgICAgdW5zdWJzY3JpYmU6IChoYW5kbGU6IFtzdHJpbmcsIG51bWJlcl0pID0+IHZvaWQ7XG4gICAgfTtcbiAgICBnYW1lPzogTWF5YmU8R2FtZVBhZ2U+O1xuICAgIGdhbWVQYWdlPzogTWF5YmU8R2FtZVBhZ2U+O1xuICAgIGtpdHRlblNjaWVudGlzdHM/OiBLaXR0ZW5TY2llbnRpc3RzO1xuICAgIExaU3RyaW5nOiB7XG4gICAgICBjb21wcmVzc1RvQmFzZTY0OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgY29tcHJlc3NUb1VURjE2OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZGVjb21wcmVzc0Zyb21CYXNlNjQ6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBkZWNvbXByZXNzRnJvbVVURjE2OiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0ICogZnJvbSBcIi4vX3JlbGVhc2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9fc2F2ZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYWNoaWV2ZW1lbnRzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9idWlsZGluZ3MuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NhbGVuZGFyLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jaGFsbGVuZ2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kaXBsb21hY3kuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2dhbWUuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ByZXN0aWdlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWxpZ2lvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVzb3VyY2VzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2llbmNlLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zcGFjZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGltZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdG9vbGJhci5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdWkuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZpbGxhZ2UuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZvaWQuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dvcmtzaG9wLmpzXCI7XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVsaWdpb25JdGVtLCBSZXNvdXJjZSwgU3BhY2VCdWlsZGluZyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25maXJlSXRlbSB9IGZyb20gXCIuL0JvbmZpcmVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lSXRlbSB9IGZyb20gXCIuL1RpbWVTZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBSZXF1aXJlbWVudCA9IFJlc291cmNlIHwgZmFsc2U7XG5cbi8qKlxuICogVGhlIHR5cGUgbmFtZXMgb2YgYWxsIHN1cHBvcnRlZCBidWlsZGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIEFsbEl0ZW1zID0gQm9uZmlyZUl0ZW0gfCBSZWxpZ2lvbkl0ZW0gfCBTcGFjZUJ1aWxkaW5nIHwgVGltZUl0ZW07XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nIHtcbiAgZW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmc+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW5hYmxlZCA9IHNldHRpbmcuZW5hYmxlZCA/PyB0aGlzLmVuYWJsZWQ7XG4gIH1cblxuICBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdMaW1pdGVkIGV4dGVuZHMgU2V0dGluZyB7XG4gIGxpbWl0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlLCBsaW1pdGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmxpbWl0ZWQgPSBsaW1pdGVkO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdMaW1pdGVkPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMubGltaXRlZCA9IHNldHRpbmcubGltaXRlZCA/PyB0aGlzLmxpbWl0ZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNldHRpbmcgdGhhdCBhbHNvIGluY2x1ZGVzIGEgdHJpZ2dlciB2YWx1ZS5cbiAqIFRyaWdnZXIgdmFsdWVzIHJhbmdlIGZyb20gMCB0byAxLiBUaGV5IHJlZmxlY3QgYSBwZXJjZW50YWdlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ1RyaWdnZXIgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgdHJpZ2dlcjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgdHJpZ2dlciA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nVHJpZ2dlcj4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLnRyaWdnZXIgPSBzZXR0aW5nLnRyaWdnZXIgPz8gdGhpcy50cmlnZ2VyO1xuICB9XG59XG5cbi8qKlxuICogQSBzZXR0aW5nIHRoYXQgYWxzbyBpbmNsdWRlcyBhbiBhYnNvbHV0ZSB2YWx1ZSB0cmlnZ2VyLlxuICogVHJpZ2dlciB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvIEluZmluaXR5LCB3aGlsZSAtMSBkZXNpZ25hdGVzIEluZmluaXR5IGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nVGhyZXNob2xkIGV4dGVuZHMgU2V0dGluZyB7XG4gIHRyaWdnZXI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHRocmVzaG9sZCA9IDEpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnRyaWdnZXIgPSB0aHJlc2hvbGQ7XG4gIH1cblxuICBsb2FkKHNldHRpbmc6IE1heWJlPFBhcnRpYWw8U2V0dGluZ1RocmVzaG9sZD4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLnRyaWdnZXIgPSBzZXR0aW5nLnRyaWdnZXIgPz8gdGhpcy50cmlnZ2VyO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTWF4IGV4dGVuZHMgU2V0dGluZyB7XG4gIG1heDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgbWF4ID0gMCkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdNYXg+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy5tYXggPSBzZXR0aW5nLm1heCA/PyB0aGlzLm1heDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpbWl0ZWRNYXggZXh0ZW5kcyBTZXR0aW5nTGltaXRlZCBpbXBsZW1lbnRzIFNldHRpbmdNYXgge1xuICBtYXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIGxpbWl0ZWQgPSBmYWxzZSwgbWF4ID0gMCkge1xuICAgIHN1cGVyKGVuYWJsZWQsIGxpbWl0ZWQpO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdMaW1pdGVkTWF4Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMubWF4ID0gc2V0dGluZy5tYXggPz8gdGhpcy5tYXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciBleHRlbmRzIFNldHRpbmdMaW1pdGVkTWF4IGltcGxlbWVudHMgU2V0dGluZ1RyaWdnZXIge1xuICB0cmlnZ2VyOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlLCBsaW1pdGVkID0gZmFsc2UsIG1heCA9IDAsIHRyaWdnZXIgPSAtMSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIGxpbWl0ZWQsIG1heCk7XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nTGltaXRlZE1heFRyaWdnZXI+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy50cmlnZ2VyID0gc2V0dGluZy50cmlnZ2VyID8/IHRoaXMudHJpZ2dlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyIGV4dGVuZHMgU2V0dGluZ0xpbWl0ZWQgaW1wbGVtZW50cyBTZXR0aW5nVHJpZ2dlciB7XG4gIHRyaWdnZXI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIGxpbWl0ZWQgPSBmYWxzZSwgdHJpZ2dlciA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgbGltaXRlZCk7XG4gICAgdGhpcy50cmlnZ2VyID0gdHJpZ2dlcjtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nTGltaXRlZFRyaWdnZXI+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy50cmlnZ2VyID0gc2V0dGluZy50cmlnZ2VyID8/IHRoaXMudHJpZ2dlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ1RyaWdnZXJNYXggZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciBpbXBsZW1lbnRzIFNldHRpbmdNYXgge1xuICBtYXg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHRyaWdnZXIgPSAtMSwgbWF4ID0gMCkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMubWF4ID0gbWF4O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdUcmlnZ2VyTWF4Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMubWF4ID0gc2V0dGluZy5tYXggPz8gdGhpcy5tYXg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdUaHJlc2hvbGRNYXggZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkIGltcGxlbWVudHMgU2V0dGluZ01heCB7XG4gIG1heDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgdHJpZ2dlciA9IDEsIG1heCA9IDApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyKTtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nVHJpZ2dlck1heD4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLm1heCA9IHNldHRpbmcubWF4ID8/IHRoaXMubWF4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nT3B0aW9uczxUID0gc3RyaW5nPiB7XG4gIHJlYWRvbmx5ICNvcHRpb25zOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBUIH0+O1xuICBzZWxlY3RlZDogVDtcblxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy4jb3B0aW9ucztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNlbGVjdGVkOiBULCBvcHRpb25zID0gbmV3IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IFQgfT4oKSkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvdmlkZWQgc2VsZWN0ZWQgdmFsdWUgZXhpc3RzIGluIG9wdGlvbnMuXG4gICAgaWYgKGlzTmlsKG9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBzZWxlY3RlZCB2YWx1ZSBpcyBub3QgaW4gcHJvdmlkZWQgb3B0aW9ucy5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgIHRoaXMuI29wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nOiBNYXliZTxQYXJ0aWFsPFNldHRpbmdPcHRpb25zPFQ+Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkID0gc2V0dGluZy5zZWxlY3RlZCA/PyB0aGlzLnNlbGVjdGVkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nQnV5IGV4dGVuZHMgU2V0dGluZyB7XG4gIGJ1eTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgYnV5ID0gLTEpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmJ1eSA9IGJ1eTtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nQnV5Pj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmcpO1xuICAgIHRoaXMuYnV5ID0gc2V0dGluZy5idXkgPz8gdGhpcy5idXk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdTZWxsIGV4dGVuZHMgU2V0dGluZyB7XG4gIHNlbGw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHNlbGwgPSAtMSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuc2VsbCA9IHNlbGw7XG4gIH1cblxuICBsb2FkKHNldHRpbmc6IE1heWJlPFBhcnRpYWw8U2V0dGluZ1NlbGw+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZyk7XG4gICAgdGhpcy5zZWxsID0gc2V0dGluZy5zZWxsID8/IHRoaXMuc2VsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0J1eVNlbGxUaHJlc2hvbGQgZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkIGltcGxlbWVudHMgU2V0dGluZ0J1eSwgU2V0dGluZ1NlbGwge1xuICBidXk6IG51bWJlcjtcbiAgc2VsbDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgYnV5ID0gOTUwLjAsIHNlbGwgPSAxMDAwLjAsIHRyaWdnZXIgPSAxKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdHJpZ2dlcik7XG4gICAgdGhpcy5idXkgPSBidXk7XG4gICAgdGhpcy5zZWxsID0gc2VsbDtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZzogTWF5YmU8UGFydGlhbDxTZXR0aW5nQnV5U2VsbFRocmVzaG9sZD4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5nKTtcbiAgICB0aGlzLmJ1eSA9IHNldHRpbmcuYnV5ID8/IHRoaXMuYnV5O1xuICAgIHRoaXMuc2VsbCA9IHNldHRpbmcuc2VsbCA/PyB0aGlzLnNlbGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFN0YWdlZEJ1aWxkaW5nLCBTdGFnZWRCdWlsZGluZ3MgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQnVpbGRpbmdVcGdyYWRlU2V0dGluZyBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSAjdXBncmFkZTogU3RhZ2VkQnVpbGRpbmc7XG5cbiAgZ2V0IHVwZ3JhZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VwZ3JhZGU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih1cGdyYWRlOiBTdGFnZWRCdWlsZGluZywgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jdXBncmFkZSA9IHVwZ3JhZGU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRpbmdVcGRhdGVCdWlsZGluZ1NldHRpbmdzID0gUmVjb3JkPFN0YWdlZEJ1aWxkaW5nLCBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5nPjtcblxuZXhwb3J0IGNsYXNzIEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIGJ1aWxkaW5nczogQnVpbGRpbmdVcGRhdGVCdWlsZGluZ1NldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogQnVpbGRpbmdVcGRhdGVCdWlsZGluZ1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIEJ1aWxkaW5nVXBkYXRlQnVpbGRpbmdTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgU3RhZ2VkQnVpbGRpbmdzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5nKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IHR5cGUgQnVpbGRpbmcsIEJ1aWxkaW5ncywgdHlwZSBTdGFnZWRCdWlsZGluZywgU3RhZ2VkQnVpbGRpbmdzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5ncyB9IGZyb20gXCIuL0J1aWxkaW5nVXBncmFkZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nVHJpZ2dlciwgU2V0dGluZ1RyaWdnZXJNYXggfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG4vKipcbiAqIE9uZSBvZiB0aGUgYnVpbGRpbmcgb3B0aW9ucyBpbiB0aGUgS1MgbWVudS5cbiAqIFRoZXNlIGFyZSBub3QgaWRlbnRpY2FsIHRvIGBCdWlsZGluZ2AhXG4gKiBgQnVpbGRpbmdgIGlzIElEcyBvZiBidWlsZGluZ3MgYXMgZGVmaW5lZCBieSBLRy4gS1MgZGVmaW5lcyB1cGdyYWRlIHN0YWdlcyBhcyB3ZWxsLlxuICovXG5leHBvcnQgdHlwZSBCb25maXJlSXRlbSA9IEJ1aWxkaW5nIHwgU3RhZ2VkQnVpbGRpbmc7XG5cbmV4cG9ydCBjbGFzcyBCb25maXJlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXJNYXgge1xuICAvKipcbiAgICogSW4gY2FzZSB0aGlzIGlzIGFuIHVwZ3JhZGUgb2YgYW5vdGhlciBidWlsZGluZywgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGVcbiAgICogYmFzZSBidWlsZGluZy5cbiAgICovXG4gIHJlYWRvbmx5ICNiYXNlQnVpbGRpbmc6IEJ1aWxkaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBnZXQgYmFzZUJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNiYXNlQnVpbGRpbmc7XG4gIH1cblxuICByZWFkb25seSAjYnVpbGRpbmc6IEJvbmZpcmVJdGVtO1xuICBnZXQgYnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2J1aWxkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIGNhc2UgdGhpcyBpcyBhbiB1cGdyYWRhYmxlIGJ1aWxkaW5nLCB0aGlzIGluZGljYXRlcyB0aGUgbGV2ZWwgb2ZcbiAgICogdGhlIHN0YWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgI3N0YWdlOiBudW1iZXIgPSAwO1xuICBnZXQgc3RhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0YWdlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVpbGRpbmc6IEJvbmZpcmVJdGVtLFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICB0cmlnZ2VyID0gLTEsXG4gICAgbWF4ID0gMCxcbiAgICBiYXNlU3RhZ2U/OiBCdWlsZGluZyB8IGZhbHNlLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyLCBtYXgpO1xuXG4gICAgdGhpcy4jYnVpbGRpbmcgPSBidWlsZGluZztcbiAgICBpZiAoYmFzZVN0YWdlKSB7XG4gICAgICB0aGlzLiNzdGFnZSA9IDE7XG4gICAgICB0aGlzLiNiYXNlQnVpbGRpbmcgPSBiYXNlU3RhZ2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEJvbmZpcmVCdWlsZGluZ1NldHRpbmdzID0gUmVjb3JkPFxuICBFeGNsdWRlPEJvbmZpcmVJdGVtLCBcInVuaWNvcm5QYXN0dXJlXCI+LFxuICBCb25maXJlQnVpbGRpbmdTZXR0aW5nXG4+O1xuXG5leHBvcnQgY2xhc3MgQm9uZmlyZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICBidWlsZGluZ3M6IEJvbmZpcmVCdWlsZGluZ1NldHRpbmdzO1xuXG4gIGdhdGhlckNhdG5pcDogU2V0dGluZztcbiAgdHVybk9uTWFnbmV0b3M6IFNldHRpbmc7XG4gIHR1cm5PblN0ZWFtd29ya3M6IFNldHRpbmc7XG4gIHR1cm5PblJlYWN0b3JzOiBTZXR0aW5nO1xuICB1cGdyYWRlQnVpbGRpbmdzOiBCdWlsZGluZ1VwZ3JhZGVTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgdHJpZ2dlciA9IC0xLFxuICAgIGdhdGhlckNhdG5pcCA9IG5ldyBTZXR0aW5nKCksXG4gICAgdHVybk9uU3RlYW13b3JrcyA9IG5ldyBTZXR0aW5nKCksXG4gICAgdHVybk9uTWFnbmV0b3MgPSBuZXcgU2V0dGluZygpLFxuICAgIHR1cm5PblJlYWN0b3JzID0gbmV3IFNldHRpbmcoKSxcbiAgICB1cGdyYWRlQnVpbGRpbmdzID0gbmV3IEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzKCksXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy5nYXRoZXJDYXRuaXAgPSBnYXRoZXJDYXRuaXA7XG4gICAgdGhpcy50dXJuT25TdGVhbXdvcmtzID0gdHVybk9uU3RlYW13b3JrcztcbiAgICB0aGlzLnR1cm5Pbk1hZ25ldG9zID0gdHVybk9uTWFnbmV0b3M7XG4gICAgdGhpcy50dXJuT25SZWFjdG9ycyA9IHR1cm5PblJlYWN0b3JzO1xuICAgIHRoaXMudXBncmFkZUJ1aWxkaW5ncyA9IHVwZ3JhZGVCdWlsZGluZ3M7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogQm9uZmlyZUJ1aWxkaW5nU2V0dGluZ3Mge1xuICAgIGNvbnN0IGJhc2VTdGFnZTogUGFydGlhbDxSZWNvcmQ8U3RhZ2VkQnVpbGRpbmcsIEJ1aWxkaW5nPj4gPSB7XG4gICAgICBicm9hZGNhc3R0b3dlcjogXCJhbXBoaXRoZWF0cmVcIixcbiAgICAgIGRhdGFDZW50ZXI6IFwibGlicmFyeVwiLFxuICAgICAgaHlkcm9wbGFudDogXCJhcXVlZHVjdFwiLFxuICAgICAgc29sYXJmYXJtOiBcInBhc3R1cmVcIixcbiAgICAgIHNwYWNlcG9ydDogXCJ3YXJlaG91c2VcIixcbiAgICB9O1xuXG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBCb25maXJlQnVpbGRpbmdTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQnVpbGRpbmdzKSB7XG4gICAgICBpZiAoaXRlbSA9PT0gXCJ1bmljb3JuUGFzdHVyZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFN0YWdlZEJ1aWxkaW5ncykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyhpdGVtLCBmYWxzZSwgLTEsIDAsIGJhc2VTdGFnZVtpdGVtXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxCb25maXJlU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5idWlsZGluZ3MsIHNldHRpbmdzLmJ1aWxkaW5ncywgKGJ1aWxkaW5nLCBpdGVtKSA9PiB7XG4gICAgICBidWlsZGluZy5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyBidWlsZGluZy5lbmFibGVkO1xuICAgICAgYnVpbGRpbmcubWF4ID0gaXRlbT8ubWF4ID8/IGJ1aWxkaW5nLm1heDtcbiAgICAgIGJ1aWxkaW5nLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IGJ1aWxkaW5nLnRyaWdnZXI7XG4gICAgfSk7XG5cbiAgICB0aGlzLmdhdGhlckNhdG5pcC5lbmFibGVkID0gc2V0dGluZ3MuZ2F0aGVyQ2F0bmlwPy5lbmFibGVkID8/IHRoaXMuZ2F0aGVyQ2F0bmlwLmVuYWJsZWQ7XG4gICAgdGhpcy50dXJuT25TdGVhbXdvcmtzLmVuYWJsZWQgPVxuICAgICAgc2V0dGluZ3MudHVybk9uU3RlYW13b3Jrcz8uZW5hYmxlZCA/PyB0aGlzLnR1cm5PblN0ZWFtd29ya3MuZW5hYmxlZDtcbiAgICB0aGlzLnR1cm5Pbk1hZ25ldG9zLmVuYWJsZWQgPSBzZXR0aW5ncy50dXJuT25NYWduZXRvcz8uZW5hYmxlZCA/PyB0aGlzLnR1cm5Pbk1hZ25ldG9zLmVuYWJsZWQ7XG4gICAgdGhpcy50dXJuT25SZWFjdG9ycy5lbmFibGVkID0gc2V0dGluZ3MudHVybk9uUmVhY3RvcnM/LmVuYWJsZWQgPz8gdGhpcy50dXJuT25SZWFjdG9ycy5lbmFibGVkO1xuICAgIHRoaXMudXBncmFkZUJ1aWxkaW5ncy5sb2FkKHNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgVGFiIH0gZnJvbSBcIi4vdHlwZXMvY29yZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUYWJJZCB9IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUYWJNYW5hZ2VyPFRUYWIgZXh0ZW5kcyBUYWIgPSBUYWI+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgdGFiOiBUVGFiO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsIG5hbWU6IFRhYklkKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG5cbiAgICBjb25zdCB0YWIgPSB0aGlzLl9ob3N0LmdhbWUudGFicy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC50YWJJZCA9PT0gbmFtZSkgYXMgVFRhYjtcbiAgICBpZiAoaXNOaWwodGFiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCB0YWIgJHtuYW1lfWApO1xuICAgIH1cblxuICAgIHRoaXMudGFiID0gdGFiO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICByZW5kZXIoKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS51aS5hY3RpdmVUYWJJZCAhPT0gdGhpcy50YWIudGFiSWQpIHtcbiAgICAgIHRoaXMudGFiLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRvbWF0aW9uLCBGcmFtZUNvbnRleHQgfSBmcm9tIFwiLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEJ1bGtQdXJjaGFzZUhlbHBlciB9IGZyb20gXCIuL2hlbHBlci9CdWxrUHVyY2hhc2VIZWxwZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQm9uZmlyZUJ1aWxkaW5nU2V0dGluZyxcbiAgdHlwZSBCb25maXJlSXRlbSxcbiAgQm9uZmlyZVNldHRpbmdzLFxufSBmcm9tIFwiLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXIsXG4gIEJ1aWxkaW5nTWV0YSxcbiAgQnVpbGRpbmdzTW9kZXJuLFxuICBHYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyLFxuICBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcixcbiAgVW5zYWZlQnVpbGRpbmcsXG4gIFVuc2FmZVN0YWdpbmdCbGRCdXR0b25PcHRpb25zLFxuICBVbnNhZmVVbnN0YWdlZEJ1aWxkaW5nQnV0dG9uT3B0aW9ucyxcbn0gZnJvbSBcIi4vdHlwZXMvYnVpbGRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWwgfSBmcm9tIFwiLi90eXBlcy9jb3JlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkaW5nIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBCb25maXJlTWFuYWdlciBpbXBsZW1lbnRzIEF1dG9tYXRpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICByZWFkb25seSBzZXR0aW5nczogQm9uZmlyZVNldHRpbmdzO1xuICByZWFkb25seSBtYW5hZ2VyOiBUYWJNYW5hZ2VyPEJ1aWxkaW5nc01vZGVybj47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1bGtNYW5hZ2VyOiBCdWxrUHVyY2hhc2VIZWxwZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsXG4gICAgd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXIsXG4gICAgc2V0dGluZ3MgPSBuZXcgQm9uZmlyZVNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcjxCdWlsZGluZ3NNb2Rlcm4+KHRoaXMuX2hvc3QsIFwiQm9uZmlyZVwiKTtcblxuICAgIHRoaXMuX3dvcmtzaG9wTWFuYWdlciA9IHdvcmtzaG9wTWFuYWdlcjtcbiAgICB0aGlzLl9idWxrTWFuYWdlciA9IG5ldyBCdWxrUHVyY2hhc2VIZWxwZXIodGhpcy5faG9zdCwgdGhpcy5fd29ya3Nob3BNYW5hZ2VyKTtcbiAgfVxuXG4gIHRpY2soY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXZSBtdXN0IGNhbGwgYC5yZW5kZXIoKWAgaGVyZSwgYmVjYXVzZSBldmFsdWF0aW9uIG9mIGF2YWlsYWJpbGl0eSBvZiBvdXIgb3B0aW9uc1xuICAgIC8vIGlzIG9ubHkgcGVyZm9ybWVkIHdoZW4gdGhlIGdhbWUgcmVuZGVycyB0aGUgY29udGVudHMgb2YgdGhhdCB0YWIuXG4gICAgdGhpcy5tYW5hZ2VyLnJlbmRlcigpO1xuXG4gICAgdGhpcy5hdXRvQnVpbGQoY29udGV4dCk7XG4gICAgdGhpcy5hdXRvTWlzYyhjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gYnVpbGQgYXMgbWFueSBvZiB0aGUgcGFzc2VkIGJ1aWxkaW5ncyBhcyBwb3NzaWJsZS5cbiAgICogVXN1YWxseSwgdGhpcyBpcyBjYWxsZWQgYXQgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGF1dG9tYXRpb24gZW5naW5lIHRvXG4gICAqIGhhbmRsZSB0aGUgYnVpbGRpbmcgb2YgaXRlbXMgb24gdGhlIEJvbmZpcmUgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRzIFRoZSBidWlsZGluZ3MgdG8gYnVpbGQuXG4gICAqL1xuICBhdXRvQnVpbGQoXG4gICAgY29udGV4dDogRnJhbWVDb250ZXh0LFxuICAgIGJ1aWxkczogUGFydGlhbDxSZWNvcmQ8Qm9uZmlyZUl0ZW0sIEJvbmZpcmVCdWlsZGluZ1NldHRpbmc+PiA9IHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLFxuICApIHtcbiAgICBjb25zdCBidWxrTWFuYWdlciA9IHRoaXMuX2J1bGtNYW5hZ2VyO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIGZvciBhbGwgdGhlIHJlZmVyZW5jZWQgYnVpbGRpbmdzLlxuICAgIGNvbnN0IG1ldGFEYXRhOiBQYXJ0aWFsPFJlY29yZDxCb25maXJlSXRlbSwgUmVxdWlyZWQ8VW5zYWZlQnVpbGRpbmc+Pj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIE9iamVjdC52YWx1ZXMoYnVpbGRzKSkge1xuICAgICAgbWV0YURhdGFbYnVpbGQuYnVpbGRpbmddID0gdGhpcy5nZXRCdWlsZChcbiAgICAgICAgKGJ1aWxkLmJhc2VCdWlsZGluZyA/PyBidWlsZC5idWlsZGluZykgYXMgQnVpbGRpbmcsXG4gICAgICApLm1ldGE7XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb25UcmlnZ2VyID0gdGhpcy5zZXR0aW5ncy50cmlnZ2VyO1xuXG4gICAgLy8gTGV0IHRoZSBidWxrbWFuYWdlciBkZXRlcm1pbmUgdGhlIGJ1aWxkcyB3ZSBjYW4gbWFrZS5cbiAgICBjb25zdCBidWlsZExpc3QgPSBidWxrTWFuYWdlci5idWxrKGJ1aWxkcywgbWV0YURhdGEsIHNlY3Rpb25UcmlnZ2VyLCBcIkJvbmZpcmVcIik7XG5cbiAgICAvLyBCdWlsZCBhbGwgZW50cmllcyBpbiB0aGUgYnVpbGQgbGlzdCwgd2hlcmUgd2UgY2FuIGJ1aWxkIGFueSBpdGVtcy5cbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIGJ1aWxkTGlzdC5maWx0ZXIoaXRlbSA9PiAwIDwgaXRlbS5jb3VudCkpIHtcbiAgICAgIHRoaXMuYnVpbGQoKGJ1aWxkLm5hbWUgfHwgYnVpbGQuaWQpIGFzIEJ1aWxkaW5nLCBidWlsZC5zdGFnZSwgYnVpbGQuY291bnQpO1xuICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYXV0b1VwZ3JhZGUoY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgLy8gR2V0IGN1cnJlbnQgY291bnQgb2YgcGFzdHVyZXMuXG4gICAgY29uc3QgcGFzdHVyZXMgPVxuICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInBhc3R1cmVcIikubWV0YS5zdGFnZSA9PT0gMFxuICAgICAgICA/IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJwYXN0dXJlXCIpLm1ldGEudmFsXG4gICAgICAgIDogMDtcbiAgICAvLyBHZXQgY3VycmVudCBjb3VudCBvZiBhcXVlZHVjdHMuXG4gICAgY29uc3QgYXF1ZWR1Y3RzID1cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJhcXVlZHVjdFwiKS5tZXRhLnN0YWdlID09PSAwXG4gICAgICAgID8gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImFxdWVkdWN0XCIpLm1ldGEudmFsXG4gICAgICAgIDogMDtcblxuICAgIGNvbnN0IHBhc3R1cmVNZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInBhc3R1cmVcIikubWV0YTtcbiAgICAvLyBJZiBwYXN0dXJlcyBoYXZlbid0IGJlZW4gdXBncmFkZWQgdG8gc29sYXIgZmFybXMgeWV0Li4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXR0aW5ncy51cGdyYWRlQnVpbGRpbmdzLmJ1aWxkaW5ncy5zb2xhcmZhcm0uZW5hYmxlZCAmJlxuICAgICAgcGFzdHVyZU1ldGEudW5sb2NrZWQgJiZcbiAgICAgIHBhc3R1cmVNZXRhLnN0YWdlID09PSAwICYmXG4gICAgICBtdXN0RXhpc3QocGFzdHVyZU1ldGEuc3RhZ2VzKVsxXS5zdGFnZVVubG9ja2VkXG4gICAgKSB7XG4gICAgICAvLyBJZiB3ZSB3b3VsZCByZWR1Y2Ugb3VyIHBhc3R1cmVzIHRvIDAsIGJ5IHVwZ3JhZGluZyB0aGVtLCB3b3VsZCB3ZSBsb3NlIGFueSBjYXRuaXA/XG4gICAgICBpZiAodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFBvdGVudGlhbENhdG5pcCh0cnVlLCAwLCBhcXVlZHVjdHMpID4gMCkge1xuICAgICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QocGFzdHVyZU1ldGEuc3RhZ2VzKVsxXS5wcmljZXM7XG4gICAgICAgIGlmICh0aGlzLl9idWxrTWFuYWdlci5zaW5nbGVCdWlsZFBvc3NpYmxlKHBhc3R1cmVNZXRhLCBwcmljZXMsIDEpKSB7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5nZXRCdWlsZEJ1dHRvbihcInBhc3R1cmVcIiwgMCk7XG4gICAgICAgICAgaWYgKCFpc05pbChidXR0b24/Lm1vZGVsKSkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBwZXJmb3JtIHRoZSBwcm9jZXNzIGxpa2UgdGhpcyB0byBhdm9pZCBVSSBjb25maXJtYXRpb25zXG4gICAgICAgICAgICAvLyBmb3Igc2VsbGluZyBpdGVtcy5cbiAgICAgICAgICAgIC8vIFNlbGwgYWxsIHBhc3R1cmVzICh0byByZWdhaW4gdGhlIHJlc291cmNlcykuXG4gICAgICAgICAgICBidXR0b24uY29udHJvbGxlci5zZWxsSW50ZXJuYWwoYnV0dG9uLm1vZGVsLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBNYW51YWxseSB1cGRhdGUgdGhlIG1ldGFkYXRhLCBhcyB3ZSBieXBhc3NlZCB0aGUgZnVsbCBzZWxsaW5nIGxvZ2ljLlxuICAgICAgICAgICAgcGFzdHVyZU1ldGEub24gPSAwO1xuICAgICAgICAgICAgcGFzdHVyZU1ldGEudmFsID0gMDtcbiAgICAgICAgICAgIHBhc3R1cmVNZXRhLnN0YWdlID0gMTtcblxuICAgICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5idWlsZGluZy5wYXN0dXJlXCIsIFtdLCBcImtzLXVwZ3JhZGVcIik7XG5cbiAgICAgICAgICAgIC8vIFVwZ3JhZGUgdGhlIHBhc3R1cmUuXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUudWk/LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5idWlsZChcInBhc3R1cmVcIiwgMSwgMSk7XG4gICAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcXVlZHVjdE1ldGEgPSB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiYXF1ZWR1Y3RcIikubWV0YTtcbiAgICAvLyBJZiBhcXVlZHVjdHMgaGF2ZW4ndCBiZWVuIHVwZ3JhZGVkIHRvIGh5ZHJvIHBsYW50cyB5ZXQuLi5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MuYnVpbGRpbmdzLmh5ZHJvcGxhbnQuZW5hYmxlZCAmJlxuICAgICAgYXF1ZWR1Y3RNZXRhLnVubG9ja2VkICYmXG4gICAgICBhcXVlZHVjdE1ldGEuc3RhZ2UgPT09IDAgJiZcbiAgICAgIG11c3RFeGlzdChhcXVlZHVjdE1ldGEuc3RhZ2VzKVsxXS5zdGFnZVVubG9ja2VkXG4gICAgKSB7XG4gICAgICAvLyBJZiB3ZSB3b3VsZCByZWR1Y2Ugb3VyIGFxdWVkdWN0cyB0byAwLCBieSB1cGdyYWRpbmcgdGhlbSwgd291bGQgd2UgbG9zZSBhbnkgY2F0bmlwP1xuICAgICAgaWYgKHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRQb3RlbnRpYWxDYXRuaXAodHJ1ZSwgcGFzdHVyZXMsIDApID4gMCkge1xuICAgICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QoYXF1ZWR1Y3RNZXRhLnN0YWdlcylbMV0ucHJpY2VzO1xuICAgICAgICBpZiAodGhpcy5fYnVsa01hbmFnZXIuc2luZ2xlQnVpbGRQb3NzaWJsZShhcXVlZHVjdE1ldGEsIHByaWNlcywgMSkpIHtcbiAgICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1aWxkQnV0dG9uKFwiYXF1ZWR1Y3RcIiwgMCk7XG4gICAgICAgICAgaWYgKCFpc05pbChidXR0b24/Lm1vZGVsKSkge1xuICAgICAgICAgICAgYnV0dG9uLmNvbnRyb2xsZXIuc2VsbEludGVybmFsKGJ1dHRvbi5tb2RlbCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgYXF1ZWR1Y3RNZXRhLm9uID0gMDtcbiAgICAgICAgICAgIGFxdWVkdWN0TWV0YS52YWwgPSAwO1xuICAgICAgICAgICAgYXF1ZWR1Y3RNZXRhLnN0YWdlID0gMTtcblxuICAgICAgICAgICAgLy8gVE9ETzogV2h5IGRvIHdlIGRvIHRoaXMgZm9yIHRoZSBhcXVlZHVjdCBhbmQgbm90IGZvciB0aGUgcGFzdHVyZT9cbiAgICAgICAgICAgIGFxdWVkdWN0TWV0YS5jYWxjdWxhdGVFZmZlY3RzPy4oYXF1ZWR1Y3RNZXRhLCB0aGlzLl9ob3N0LmdhbWUpO1xuXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLmJ1aWxkaW5nLmFxdWVkdWN0XCIsIFtdLCBcImtzLXVwZ3JhZGVcIik7XG5cbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51aT8ucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkKFwiYXF1ZWR1Y3RcIiwgMSwgMSk7XG4gICAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaWJyYXJ5TWV0YSA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJsaWJyYXJ5XCIpLm1ldGE7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXR0aW5ncy51cGdyYWRlQnVpbGRpbmdzLmJ1aWxkaW5ncy5kYXRhQ2VudGVyLmVuYWJsZWQgJiZcbiAgICAgIGxpYnJhcnlNZXRhLnVubG9ja2VkICYmXG4gICAgICBsaWJyYXJ5TWV0YS5zdGFnZSA9PT0gMCAmJlxuICAgICAgbXVzdEV4aXN0KGxpYnJhcnlNZXRhLnN0YWdlcylbMV0uc3RhZ2VVbmxvY2tlZFxuICAgICkge1xuICAgICAgbGV0IGVuZXJneUNvbnN1bXB0aW9uUmF0ZSA9IHRoaXMuX2hvc3QuZ2FtZS53b3Jrc2hvcC5nZXQoXCJjcnlvY29tcHV0aW5nXCIpLnJlc2VhcmNoZWQgPyAxIDogMjtcbiAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5jdXJyZW50Q2hhbGxlbmdlID09PSBcImVuZXJneVwiKSB7XG4gICAgICAgIGVuZXJneUNvbnN1bXB0aW9uUmF0ZSAqPSAyO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGluZGljYXRlcyBob3cgdmFsdWFibGUgYSBkYXRhIGNlbnRlciBpcywgY29tcGFyZWQgdG8gYSBzaW5nbGUgbGlicmFyeS5cbiAgICAgIC8vIFdlIGNoZWNrIGZvciBwb3NzaWJsZSB1cGdyYWRlcywgdGhhdCB3b3VsZCBtYWtlIHRoZW0gbW9yZSB2YWx1YWJsZS5cbiAgICAgIGxldCBsaWJUb0RhdCA9IDM7XG4gICAgICBpZiAodGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldChcInVwbGlua1wiKS5yZXNlYXJjaGVkKSB7XG4gICAgICAgIGxpYlRvRGF0ICo9XG4gICAgICAgICAgMSArXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImJpb2xhYlwiKS5tZXRhLnZhbCAqXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwidXBsaW5rRENSYXRpb1wiKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0KFwibWFjaGluZUxlYXJuaW5nXCIpLnJlc2VhcmNoZWQpIHtcbiAgICAgICAgbGliVG9EYXQgKj1cbiAgICAgICAgICAxICtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiYWlDb3JlXCIpLm1ldGEub24gKlxuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImRhdGFDZW50ZXJBSVJhdGlvXCIpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBub3cgaGF2ZSB0aGUgZW5lcmd5IGNvbnN1bXB0aW9uIG9mIGRhdGEgY2VudGVycyBhbmQgdGhlIHZhbHVlIG9mIGRhdGEgY2VudGVycy5cbiAgICAgIC8vIEFzc3VtaW5nLCB3ZSB3b3VsZCB1cGdyYWRlIHRvIGRhdGEgY2VudGVycyBhbmQgYnV5IGFzIG1hbnkgYXMgd2UgbmVlZCB0byBoYXZlIHZhbHVlXG4gICAgICAvLyBlcXVhbCB0byBvdXIgY3VycmVudCBsaWJyYXJpZXMsIGFuZCB0aGF0IHdvdWxkbid0IGNhcCBvdXIgZW5lcmd5LCB1cGdyYWRlIHRoZW0uXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmVuZXJneVByb2QgPj1cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZW5lcmd5Q29ucyArIChlbmVyZ3lDb25zdW1wdGlvblJhdGUgKiBsaWJyYXJ5TWV0YS52YWwpIC8gbGliVG9EYXRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QobGlicmFyeU1ldGEuc3RhZ2VzKVsxXS5wcmljZXM7XG4gICAgICAgIGlmICh0aGlzLl9idWxrTWFuYWdlci5zaW5nbGVCdWlsZFBvc3NpYmxlKGxpYnJhcnlNZXRhLCBwcmljZXMsIDEpKSB7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gbXVzdEV4aXN0KHRoaXMuZ2V0QnVpbGRCdXR0b24oXCJsaWJyYXJ5XCIsIDApKTtcbiAgICAgICAgICBpZiAoaXNOaWwoYnV0dG9uLm1vZGVsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJ1dHRvbi5jb250cm9sbGVyLnNlbGxJbnRlcm5hbChidXR0b24ubW9kZWwsIDAsIGZhbHNlKTtcbiAgICAgICAgICBsaWJyYXJ5TWV0YS5vbiA9IDA7XG4gICAgICAgICAgbGlicmFyeU1ldGEudmFsID0gMDtcbiAgICAgICAgICBsaWJyYXJ5TWV0YS5zdGFnZSA9IDE7XG4gICAgICAgICAgbGlicmFyeU1ldGEuY2FsY3VsYXRlRWZmZWN0cz8uKGxpYnJhcnlNZXRhLCB0aGlzLl9ob3N0LmdhbWUpO1xuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUuYnVpbGRpbmcubGlicmFyeVwiLCBbXSwgXCJrcy11cGdyYWRlXCIpO1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51aT8ucmVuZGVyKCk7XG4gICAgICAgICAgdGhpcy5idWlsZChcImxpYnJhcnlcIiwgMSwgMSk7XG4gICAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2FyZWhvdXNlTWV0YSA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJ3YXJlaG91c2VcIikubWV0YTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MuYnVpbGRpbmdzLnNwYWNlcG9ydC5lbmFibGVkICYmXG4gICAgICB3YXJlaG91c2VNZXRhLnVubG9ja2VkICYmXG4gICAgICB3YXJlaG91c2VNZXRhLnN0YWdlID09PSAwICYmXG4gICAgICBtdXN0RXhpc3Qod2FyZWhvdXNlTWV0YS5zdGFnZXMpWzFdLnN0YWdlVW5sb2NrZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHByaWNlcyA9IG11c3RFeGlzdCh3YXJlaG91c2VNZXRhLnN0YWdlcylbMV0ucHJpY2VzO1xuICAgICAgaWYgKHRoaXMuX2J1bGtNYW5hZ2VyLnNpbmdsZUJ1aWxkUG9zc2libGUod2FyZWhvdXNlTWV0YSwgcHJpY2VzLCAxKSkge1xuICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldEJ1aWxkQnV0dG9uKFwid2FyZWhvdXNlXCIsIDApO1xuICAgICAgICBpZiAoIWlzTmlsKGJ1dHRvbj8ubW9kZWwpKSB7XG4gICAgICAgICAgYnV0dG9uLmNvbnRyb2xsZXIuc2VsbEludGVybmFsKGJ1dHRvbi5tb2RlbCwgMCwgZmFsc2UpO1xuICAgICAgICAgIHdhcmVob3VzZU1ldGEub24gPSAwO1xuICAgICAgICAgIHdhcmVob3VzZU1ldGEudmFsID0gMDtcbiAgICAgICAgICB3YXJlaG91c2VNZXRhLnN0YWdlID0gMTtcblxuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUuYnVpbGRpbmcud2FyZWhvdXNlXCIsIFtdLCBcImtzLXVwZ3JhZGVcIik7XG5cbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUudWk/LnJlbmRlcigpO1xuICAgICAgICAgIHRoaXMuYnVpbGQoXCJ3YXJlaG91c2VcIiwgMSwgMSk7XG4gICAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbXBoaXRoZWF0cmVNZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImFtcGhpdGhlYXRyZVwiKS5tZXRhO1xuICAgIC8vIElmIGFtcGhpdGhlYXRocmVzIGhhdmVuJ3QgYmVlbiB1cGdyYWRlZCB0byBicm9hZGNhc3QgdG93ZXJzIHlldC4uLlxuICAgIC8vIFRoaXMgc2VlbXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBwYXN0dXJlIHVwZ3JhZGUuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXR0aW5ncy51cGdyYWRlQnVpbGRpbmdzLmJ1aWxkaW5ncy5icm9hZGNhc3R0b3dlci5lbmFibGVkICYmXG4gICAgICBhbXBoaXRoZWF0cmVNZXRhLnVubG9ja2VkICYmXG4gICAgICBhbXBoaXRoZWF0cmVNZXRhLnN0YWdlID09PSAwICYmXG4gICAgICBtdXN0RXhpc3QoYW1waGl0aGVhdHJlTWV0YS5zdGFnZXMpWzFdLnN0YWdlVW5sb2NrZWRcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IFRoaXMgaXMgcHJvYmxlbWF0aWMuIFVwZ3JhZGluZyBmcm9tIDUwIGFtcGhpdGhlYXRyZXMgdG8gMSBicm9hZGNhc3QgdG93ZXIgc3Vja3NcbiAgICAgIC8vICAgICAgIGlmIHlvdSBkb24ndCBoYXZlIGVub3VnaCByZXNvdXJjZXMgdG8gYnVpbGQgc2V2ZXJhbCBtb3JlLlxuICAgICAgY29uc3QgcHJpY2VzID0gbXVzdEV4aXN0KGFtcGhpdGhlYXRyZU1ldGEuc3RhZ2VzKVsxXS5wcmljZXM7XG4gICAgICBpZiAodGhpcy5fYnVsa01hbmFnZXIuc2luZ2xlQnVpbGRQb3NzaWJsZShhbXBoaXRoZWF0cmVNZXRhLCBwcmljZXMsIDEpKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnVpbGRCdXR0b24oXCJhbXBoaXRoZWF0cmVcIiwgMCk7XG4gICAgICAgIGlmICghaXNOaWwoYnV0dG9uPy5tb2RlbCkpIHtcbiAgICAgICAgICBidXR0b24uY29udHJvbGxlci5zZWxsSW50ZXJuYWwoYnV0dG9uLm1vZGVsLCAwLCBmYWxzZSk7XG4gICAgICAgICAgYW1waGl0aGVhdHJlTWV0YS5vbiA9IDA7XG4gICAgICAgICAgYW1waGl0aGVhdHJlTWV0YS52YWwgPSAwO1xuICAgICAgICAgIGFtcGhpdGhlYXRyZU1ldGEuc3RhZ2UgPSAxO1xuXG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5idWlsZGluZy5hbXBoaXRoZWF0cmVcIiwgW10sIFwia3MtdXBncmFkZVwiKTtcblxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS51aT8ucmVuZGVyKCk7XG4gICAgICAgICAgdGhpcy5idWlsZChcImFtcGhpdGhlYXRyZVwiLCAxLCAxKTtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9NaXNjKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIC8vIEF1dG8gdHVybiBvbiBzdGVhbXdvcmtzXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudHVybk9uU3RlYW13b3Jrcy5lbmFibGVkKSB7XG4gICAgICBjb25zdCBzdGVhbXdvcmtzID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInN0ZWFtd29ya3NcIik7XG4gICAgICBpZiAoc3RlYW13b3Jrcy5tZXRhLnZhbCAmJiBzdGVhbXdvcmtzLm1ldGEub24gPT09IDApIHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gbXVzdEV4aXN0KHRoaXMuZ2V0QnVpbGRCdXR0b24oXCJzdGVhbXdvcmtzXCIpKTtcbiAgICAgICAgaWYgKGlzTmlsKGJ1dHRvbi5tb2RlbCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBidXR0b24uY29udHJvbGxlci5vbkFsbChidXR0b24ubW9kZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF1dG8gdHVybiBvbiBtYWduZXRvc1xuICAgIGlmICh0aGlzLnNldHRpbmdzLnR1cm5Pbk1hZ25ldG9zLmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IG1hZ25ldG9zID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcIm1hZ25ldG9cIik7XG4gICAgICBpZiAobWFnbmV0b3MubWV0YS52YWwgJiYgbWFnbmV0b3MubWV0YS5vbiA8IG1hZ25ldG9zLm1ldGEudmFsKSB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IG11c3RFeGlzdCh0aGlzLmdldEJ1aWxkQnV0dG9uKFwibWFnbmV0b1wiKSk7XG4gICAgICAgIGlmIChpc05pbChidXR0b24ubW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnV0dG9uLmNvbnRyb2xsZXIub25BbGwoYnV0dG9uLm1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdXRvIHR1cm4gb24gcmVhY3RvcnNcbiAgICBpZiAodGhpcy5zZXR0aW5ncy50dXJuT25SZWFjdG9ycy5lbmFibGVkKSB7XG4gICAgICBjb25zdCByZWFjdG9ycyA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJyZWFjdG9yXCIpO1xuICAgICAgaWYgKHJlYWN0b3JzLm1ldGEudmFsICYmIHJlYWN0b3JzLm1ldGEub24gPCByZWFjdG9ycy5tZXRhLnZhbCkge1xuICAgICAgICBjb25zdCBidXR0b24gPSBtdXN0RXhpc3QodGhpcy5nZXRCdWlsZEJ1dHRvbihcInJlYWN0b3JcIikpO1xuICAgICAgICBpZiAoaXNOaWwoYnV0dG9uLm1vZGVsKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1dHRvbi5jb250cm9sbGVyLm9uQWxsKGJ1dHRvbi5tb2RlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYnVpbGRpbmdzICh1cGdyYWRlcyBvZiBib25maXJlIGl0ZW1zKSBhcmUgZW5hYmxlZC4uLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLnVwZ3JhZGVCdWlsZGluZ3MuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvVXBncmFkZShjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5nYXRoZXJDYXRuaXAuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvR2F0aGVyKCk7XG4gICAgfVxuICB9XG5cbiAgYXV0b0dhdGhlcigpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMuZ2FtZS51aS5HYXRoZXJDYXRuaXBCdXR0b25Db250cm9sbGVyKFxuICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICkgYXMgR2F0aGVyQ2F0bmlwQnV0dG9uQ29udHJvbGxlcjtcbiAgICBmb3IgKGxldCBjbGlja3MgPSAwOyBjbGlja3MgPCBNYXRoLmZsb29yKHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLmludGVydmFsIC8gMjApOyArK2NsaWNrcykge1xuICAgICAgY29udHJvbGxlci5idXlJdGVtKHVuZGVmaW5lZCwgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQobmFtZTogQnVpbGRpbmcsIF9zdGFnZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBhbW91bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBhbW91bnRDYWxjdWxhdGVkID0gYW1vdW50O1xuICAgIGNvbnN0IGFtb3VudFRlbXAgPSBhbW91bnRDYWxjdWxhdGVkO1xuICAgIGxldCBsYWJlbDogc3RyaW5nO1xuICAgIGNvbnN0IGl0ZW1NZXRhUmF3ID0gZ2FtZS5nZXRVbmxvY2tCeU5hbWUobmFtZSwgXCJidWlsZGluZ3NcIik7XG4gICAgY29uc3QgbWV0YSA9IG5ldyBjbGFzc2VzLkJ1aWxkaW5nTWV0YShpdGVtTWV0YVJhdykuZ2V0TWV0YSgpO1xuICAgIGlmIChcInN0YWdlc1wiIGluIG1ldGEpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY2xhc3Nlcy51aS5idG4uU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXI8VW5zYWZlQnVpbGRpbmdCdG5Nb2Rlcm5Nb2RlbDxVbnNhZmVTdGFnaW5nQmxkQnV0dG9uT3B0aW9ucz4+O1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoe1xuICAgICAgICBidWlsZGluZzogbmFtZSxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgZGVzY3JpcHRpb246IG11c3RFeGlzdChtZXRhLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgbmFtZTogbXVzdEV4aXN0KG1ldGEubGFiZWwpLFxuICAgICAgICB0d29Sb3c6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gbWV0YS5sYWJlbCA/PyBcIlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkuYnRuLkJ1aWxkaW5nQnRuTW9kZXJuQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBCdWlsZGluZ0J0bk1vZGVybkNvbnRyb2xsZXI8XG4gICAgICAgIFVuc2FmZUJ1aWxkaW5nQnRuTW9kZXJuTW9kZWw8VW5zYWZlVW5zdGFnZWRCdWlsZGluZ0J1dHRvbk9wdGlvbnM+XG4gICAgICA+O1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoe1xuICAgICAgICBidWlsZGluZzogbmFtZSxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgZGVzY3JpcHRpb246IG11c3RFeGlzdChtZXRhLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgbmFtZTogbXVzdEV4aXN0KG1ldGEubGFiZWwpLFxuICAgICAgICB0d29Sb3c6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gbWV0YS5sYWJlbCA/PyBcIlwiO1xuICAgIH1cblxuICAgIGlmIChhbW91bnRDYWxjdWxhdGVkICE9PSBhbW91bnRUZW1wKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIC4uLmNsKGAke2xhYmVsfSBBbW91bnQgb3JkZXJlZDogJHthbW91bnRUZW1wfSBBbW91bnQgQ29uc3RydWN0ZWQ6ICR7YW1vdW50Q2FsY3VsYXRlZH1gKSxcbiAgICAgICk7XG4gICAgICAvLyBCYWlsIG91dCB0byBub3QgZmxvb2QgdGhlIGxvZyB3aXRoIGdhcmJhZ2UuXG4gICAgICBpZiAoYW1vdW50Q2FsY3VsYXRlZCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShsYWJlbCwgYW1vdW50Q2FsY3VsYXRlZCwgXCJidWlsZFwiKTtcblxuICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAxKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuYnVpbGRcIiwgW2xhYmVsXSwgXCJrcy1idWlsZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFxuICAgICAgICBcImFjdC5idWlsZHNcIixcbiAgICAgICAgW2xhYmVsLCB0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKGFtb3VudENhbGN1bGF0ZWQpXSxcbiAgICAgICAgXCJrcy1idWlsZFwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRCdWlsZExhYmVsKG1ldGE6IFVuc2FmZUJ1aWxkaW5nLCBzdGFnZT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1ldGEuc3RhZ2VzICYmICFpc05pbChzdGFnZSkgPyBtZXRhLnN0YWdlc1tzdGFnZV0ubGFiZWwgOiBtdXN0RXhpc3QobWV0YS5sYWJlbCk7XG4gIH1cblxuICBnZXRCdWlsZChuYW1lOiBCdWlsZGluZyk6IEJ1aWxkaW5nTWV0YTxSZXF1aXJlZDxVbnNhZmVCdWlsZGluZz4+IHtcbiAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChuYW1lKSBhcyBCdWlsZGluZ01ldGE8UmVxdWlyZWQ8VW5zYWZlQnVpbGRpbmc+PjtcbiAgfVxuXG4gIGdldEJ1aWxkQnV0dG9uKG5hbWU6IEJ1aWxkaW5nLCBzdGFnZSA9IDApIHtcbiAgICBjb25zdCBtZXRhUmF3ID0gZ2FtZS5ibGQuZ2V0KG5hbWUpO1xuICAgIGNvbnN0IGJ1aWxkaW5nTWV0YSA9IChcbiAgICAgIG5ldyBjbGFzc2VzLkJ1aWxkaW5nTWV0YShtZXRhUmF3KSBhcyBCdWlsZGluZ01ldGE8VW5zYWZlQnVpbGRpbmc+XG4gICAgKS5nZXRNZXRhKCk7XG4gICAgY29uc3QgbWV0YSA9ICFpc05pbChidWlsZGluZ01ldGEuc3RhZ2VzKSA/IGJ1aWxkaW5nTWV0YS5zdGFnZXNbc3RhZ2VdIDogbWV0YVJhdztcbiAgICBjb25zdCBjb250cm9sbGVyID1cbiAgICAgIFwic3RhZ2VzXCIgaW4gbWV0YVxuICAgICAgICA/IChuZXcgY2xhc3Nlcy51aS5idG4uU3RhZ2luZ0JsZEJ0bkNvbnRyb2xsZXIoXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUsXG4gICAgICAgICAgKSBhcyBTdGFnaW5nQmxkQnRuQ29udHJvbGxlcjxVbnNhZmVCdWlsZGluZ0J0bk1vZGVybk1vZGVsPilcbiAgICAgICAgOiAobmV3IGNsYXNzZXMudWkuYnRuLkJ1aWxkaW5nQnRuTW9kZXJuQ29udHJvbGxlcihcbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICAgICApIGFzIEJ1aWxkaW5nQnRuTW9kZXJuQ29udHJvbGxlcjxVbnNhZmVCdWlsZGluZ0J0bk1vZGVybk1vZGVsPik7XG4gICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoe1xuICAgICAgYnVpbGRpbmc6IG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YS5kZXNjcmlwdGlvbixcbiAgICAgIGtleTogbmFtZSxcbiAgICAgIG5hbWU6IG1ldGEubGFiZWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgY29udHJvbGxlciwgbW9kZWwgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IHJvdW5kVG9Ud28sIHVjZmlyc3QgfSBmcm9tIFwiLi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5cbi8qKlxuICogVGhlIGRpZmZlcmVudCBzZWN0aW9ucyBvZiB0aGUgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiA9XG4gIHwgXCJidWlsZFwiXG4gIHwgXCJjcmFmdFwiXG4gIHwgXCJmYWl0aFwiXG4gIHwgXCJvdGhlclwiXG4gIHwgXCJyZWZpbmVcIlxuICB8IFwicmVzZWFyY2hcIlxuICB8IFwidHJhZGVcIlxuICB8IFwidXBncmFkZVwiO1xuXG4vKipcbiAqIEFjdGl2aXRpZXMgdGhhdCBhcmUgbG9nZ2VkIGluIHRoZSBcIm90aGVyXCIgc2VjdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlTZWN0aW9uT3RoZXIgPVxuICB8IFwiYWNjZWxlcmF0ZVwiXG4gIHwgXCJhZG9yZVwiXG4gIHwgXCJkaXN0cmlidXRlXCJcbiAgfCBcImVtYmFzc3lcIlxuICB8IFwiZmVlZFwiXG4gIHwgXCJmZXN0aXZhbFwiXG4gIHwgXCJmaXguY3J5XCJcbiAgfCBcImh1bnRcIlxuICB8IFwicHJhaXNlXCJcbiAgfCBcInByb21vdGVcIlxuICB8IFwic3RhcnNcIlxuICB8IFwidHJhbnNjZW5kXCI7XG5cbmV4cG9ydCB0eXBlIEFjdGl2aXR5ID1cbiAgfCBcImFjY2VsZXJhdGVcIlxuICB8IFwiYWRvcmVcIlxuICB8IFwiYnVpbGRcIlxuICB8IFwiY3JhZnRcIlxuICB8IFwiZGlzdHJpYnV0ZVwiXG4gIHwgXCJmYWl0aFwiXG4gIHwgXCJmZXN0aXZhbFwiXG4gIHwgXCJmaXhDcnlcIlxuICB8IFwiaHVudFwiXG4gIHwgXCJwcmFpc2VcIlxuICB8IFwicHJvbW90ZVwiXG4gIHwgXCJyZXNlYXJjaFwiXG4gIHwgXCJzdGFyXCJcbiAgfCBcInRpbWVTa2lwXCJcbiAgfCBcInRyYWRlXCJcbiAgfCBcInRyYW5zY2VuZFwiXG4gIHwgXCJ1cGdyYWRlXCI7XG5leHBvcnQgdHlwZSBBY3Rpdml0eUNsYXNzID0gYGtzLSR7QWN0aXZpdHl9YDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5VHlwZUNsYXNzID0gYHR5cGVfJHtBY3Rpdml0eUNsYXNzfWA7XG5cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eVN1bW1hcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF5IGF0IHdoaWNoIHRoZSBhY3Rpdml0eSBzdW1tYXJ5IHdhcyBsYXN0IHJlc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbGFzdGRheTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgeWVhciBhdCB3aGljaCB0aGUgYWN0aXZpdHkgc3VtbWFyeSB3YXMgbGFzdCByZXNldC5cbiAgICovXG4gIHByaXZhdGUgX2xhc3R5ZWFyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmRpdmlkdWFsIHNlY3Rpb25zL2NhdGVnb3JpZXMgb2YgdGhlIGFjdGl2aXR5IHN1bW1hcnkuXG4gICAqL1xuICBwcml2YXRlIF9zZWN0aW9ucyA9IG5ldyBNYXA8QWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiwgTWFwPHN0cmluZywgbnVtYmVyPj4oKTtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBLaXR0ZW5TY2llbnRpc3RzKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5yZXNldEFjdGl2aXR5KCk7XG4gIH1cblxuICByZXNldEFjdGl2aXR5KCk6IHZvaWQge1xuICAgIHRoaXMuX3NlY3Rpb25zID0gbmV3IE1hcDxBY3Rpdml0eVN1bW1hcnlTZWN0aW9uLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICAgIHRoaXMuX2xhc3RkYXkgPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZGF5O1xuICAgIHRoaXMuX2xhc3R5ZWFyID0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLnllYXI7XG4gIH1cblxuICBzdG9yZUFjdGl2aXR5KG5hbWU6IHN0cmluZywgYW1vdW50ID0gMSwgc2VjdGlvbjogQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiA9IFwib3RoZXJcIik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc2VjdGlvbnMuaGFzKHNlY3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZWN0aW9ucy5zZXQoc2VjdGlvbiwgbmV3IE1hcDxBY3Rpdml0eVNlY3Rpb25PdGhlciwgbnVtYmVyPigpKTtcbiAgICB9XG4gICAgY29uc3Qgc3VtbWFyeVNlY3Rpb24gPSBtdXN0RXhpc3QodGhpcy5fc2VjdGlvbnMuZ2V0KHNlY3Rpb24pKTtcblxuICAgIGlmICghc3VtbWFyeVNlY3Rpb24uaGFzKG5hbWUpKSB7XG4gICAgICBzdW1tYXJ5U2VjdGlvbi5zZXQobmFtZSwgMCk7XG4gICAgfVxuICAgIHN1bW1hcnlTZWN0aW9uLnNldChuYW1lLCBtdXN0RXhpc3Qoc3VtbWFyeVNlY3Rpb24uZ2V0KG5hbWUpKSArIGFtb3VudCk7XG4gIH1cblxuICByZW5kZXJTdW1tYXJ5KCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgLy8gVW5jYXRlZ29yaXplZCBpdGVtcy5cbiAgICBpZiAodGhpcy5fc2VjdGlvbnMuaGFzKFwib3RoZXJcIikpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBtdXN0RXhpc3QodGhpcy5fc2VjdGlvbnMuZ2V0KFwib3RoZXJcIikpIGFzIE1hcDxBY3Rpdml0eVNlY3Rpb25PdGhlciwgbnVtYmVyPjtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PlxuICAgICAgICBzdW1tYXJ5LnB1c2goXG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaTE4bihgc3VtbWFyeS4ke25hbWV9YCBhcyBjb25zdCwgW1xuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChhbW91bnQpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUZWNobm9sb2dpZXMuXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcInJlc2VhcmNoXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcInJlc2VhcmNoXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoX2Ftb3VudCwgbmFtZSkgPT4ge1xuICAgICAgICBzdW1tYXJ5LnB1c2godGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkudGVjaFwiLCBbdWNmaXJzdChuYW1lKV0pKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVwZ3JhZGVzLlxuICAgIGlmICh0aGlzLl9zZWN0aW9ucy5oYXMoXCJ1cGdyYWRlXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcInVwZ3JhZGVcIikpO1xuICAgICAgc2VjdGlvbi5mb3JFYWNoKChfYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaCh0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS51cGdyYWRlXCIsIFt1Y2ZpcnN0KG5hbWUpXSkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVXBncmFkZXMuXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcImJ1aWxkXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcImJ1aWxkXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS5idWlsZGluZ1wiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGFtb3VudCksXG4gICAgICAgICAgICB1Y2ZpcnN0KG5hbWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gWmlnZ3VyYXRzXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcInJlZmluZVwiKSkge1xuICAgICAgY29uc3Qgc2VjdGlvbiA9IG11c3RFeGlzdCh0aGlzLl9zZWN0aW9ucy5nZXQoXCJyZWZpbmVcIikpO1xuICAgICAgc2VjdGlvbi5mb3JFYWNoKChhbW91bnQsIG5hbWUpID0+IHtcbiAgICAgICAgc3VtbWFyeS5wdXNoKFxuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LnJlZmluZVwiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGFtb3VudCksXG4gICAgICAgICAgICB1Y2ZpcnN0KG5hbWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIE9yZGVyIG9mIHRoZSBzdW4uXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcImZhaXRoXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcImZhaXRoXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS5zdW5cIiwgW1xuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChhbW91bnQpLFxuICAgICAgICAgICAgdWNmaXJzdChuYW1lKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyYWZ0cy5cbiAgICBpZiAodGhpcy5fc2VjdGlvbnMuaGFzKFwiY3JhZnRcIikpIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBtdXN0RXhpc3QodGhpcy5fc2VjdGlvbnMuZ2V0KFwiY3JhZnRcIikpO1xuICAgICAgc2VjdGlvbi5mb3JFYWNoKChhbW91bnQsIG5hbWUpID0+IHtcbiAgICAgICAgc3VtbWFyeS5wdXNoKFxuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LmNyYWZ0XCIsIFtcbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoYW1vdW50KSxcbiAgICAgICAgICAgIHVjZmlyc3QobmFtZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUcmFkZXMuXG4gICAgaWYgKHRoaXMuX3NlY3Rpb25zLmhhcyhcInRyYWRlXCIpKSB7XG4gICAgICBjb25zdCBzZWN0aW9uID0gbXVzdEV4aXN0KHRoaXMuX3NlY3Rpb25zLmdldChcInRyYWRlXCIpKTtcbiAgICAgIHNlY3Rpb24uZm9yRWFjaCgoYW1vdW50LCBuYW1lKSA9PiB7XG4gICAgICAgIHN1bW1hcnkucHVzaChcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS50cmFkZVwiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGFtb3VudCksXG4gICAgICAgICAgICB1Y2ZpcnN0KG5hbWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xhc3RkYXkgJiYgdGhpcy5fbGFzdHllYXIpIHtcbiAgICAgIGxldCB5ZWFycyA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci55ZWFyIC0gdGhpcy5fbGFzdHllYXI7XG4gICAgICBsZXQgZGF5cyA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5kYXkgLSB0aGlzLl9sYXN0ZGF5O1xuXG4gICAgICBpZiAoZGF5cyA8IDApIHtcbiAgICAgICAgeWVhcnMgLT0gMTtcbiAgICAgICAgZGF5cyArPSA0MDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBkdXJhdGlvbiA9IFwiXCI7XG4gICAgICBpZiAoeWVhcnMgPiAwKSB7XG4gICAgICAgIGR1cmF0aW9uICs9IGAke3llYXJzfSBgO1xuICAgICAgICBkdXJhdGlvbiArPVxuICAgICAgICAgIHllYXJzID09PSAxXG4gICAgICAgICAgICA/IHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LnllYXJcIilcbiAgICAgICAgICAgIDogdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkueWVhcnNcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXlzID49IDApIHtcbiAgICAgICAgaWYgKHllYXJzID4gMCkgZHVyYXRpb24gKz0gdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkuc2VwYXJhdG9yXCIpO1xuICAgICAgICBkdXJhdGlvbiArPSBgJHtyb3VuZFRvVHdvKGRheXMpfSBgO1xuICAgICAgICBkdXJhdGlvbiArPVxuICAgICAgICAgIGRheXMgPT09IDFcbiAgICAgICAgICAgID8gdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkuZGF5XCIpXG4gICAgICAgICAgICA6IHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oXCJzdW1tYXJ5LmRheXNcIik7XG4gICAgICB9XG5cbiAgICAgIHN1bW1hcnkucHVzaCh0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwic3VtbWFyeS5oZWFkXCIsIFtkdXJhdGlvbl0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgRmFpdGhJdGVtLFxuICBSZWxpZ2lvblVwZ3JhZGVzLFxuICBUcmFuc2NlbmRlbmNlVXBncmFkZXMsXG4gIHR5cGUgVW5pY29ybkl0ZW0sXG4gIFVuaWNvcm5JdGVtVmFyaWFudCxcbiAgdHlwZSBaaWdndXJhdFVwZ3JhZGUsXG4gIFppZ2d1cmF0VXBncmFkZXMsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RocmVzaG9sZCwgU2V0dGluZ1RyaWdnZXIsIFNldHRpbmdUcmlnZ2VyTWF4IH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlbGlnaW9uU2V0dGluZ3NJdGVtIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXJNYXgge1xuICByZWFkb25seSAjYnVpbGRpbmc6IEZhaXRoSXRlbSB8IFVuaWNvcm5JdGVtO1xuICByZWFkb25seSAjdmFyaWFudDogVW5pY29ybkl0ZW1WYXJpYW50O1xuXG4gIGdldCBidWlsZGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jYnVpbGRpbmc7XG4gIH1cbiAgZ2V0IHZhcmlhbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3ZhcmlhbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihidWlsZGluZzogRmFpdGhJdGVtIHwgVW5pY29ybkl0ZW0sIHZhcmlhbnQ6IFVuaWNvcm5JdGVtVmFyaWFudCwgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jYnVpbGRpbmcgPSBidWlsZGluZztcbiAgICB0aGlzLiN2YXJpYW50ID0gdmFyaWFudDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZWxpZ2lvblNldHRpbmdzSXRlbXMgPSBSZWNvcmQ8RmFpdGhJdGVtIHwgVW5pY29ybkl0ZW0sIFJlbGlnaW9uU2V0dGluZ3NJdGVtPjtcblxuZXhwb3J0IGNsYXNzIFJlbGlnaW9uU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIGJ1aWxkaW5nczogUmVsaWdpb25TZXR0aW5nc0l0ZW1zO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBiZXN0IHVuaWNvcm4gYnVpbGRpbmcgZmlyc3QuXG4gICAqL1xuICBiZXN0VW5pY29ybkJ1aWxkaW5nOiBTZXR0aW5nO1xuXG4gIGJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50OiBaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTYWNyaWZpY2UgYWxpY29ybnMgZm9yIHRpbWUgY3J5c3RhbHMuXG4gICAqL1xuICBzYWNyaWZpY2VBbGljb3JuczogU2V0dGluZ1RocmVzaG9sZDtcblxuICAvKipcbiAgICogU2FjcmlmaWNlIHVuaWNvcm5zIGZvciB0ZWFycy5cbiAgICovXG4gIHNhY3JpZmljZVVuaWNvcm5zOiBTZXR0aW5nVGhyZXNob2xkO1xuXG4gIC8qKlxuICAgKiBSZWZpbmUgdGVhcnMgaW50byBCTFMuXG4gICAqL1xuICByZWZpbmVUZWFyczogU2V0dGluZ1RocmVzaG9sZDtcblxuICAvKipcbiAgICogUmVmaW5lIHRpbWUgY3J5c3RhbHMgaW50byByZWxpY3MuXG4gICAqL1xuICByZWZpbmVUaW1lQ3J5c3RhbHM6IFNldHRpbmdUaHJlc2hvbGQ7XG5cbiAgLyoqXG4gICAqIFByYWlzZSB0aGUgc3VuLlxuICAgKi9cbiAgYXV0b1ByYWlzZTogU2V0dGluZ1RyaWdnZXI7XG5cbiAgLyoqXG4gICAqIEFkb3JlIHRoZSBnYWxheHkuXG4gICAqL1xuICBhZG9yZTogU2V0dGluZ1RyaWdnZXI7XG5cbiAgLyoqXG4gICAqIFRyYW5zY2VuZC5cbiAgICovXG4gIHRyYW5zY2VuZDogU2V0dGluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgdHJpZ2dlciA9IC0xLFxuICAgIGJlc3RVbmljb3JuQnVpbGRpbmcgPSBuZXcgU2V0dGluZygpLFxuICAgIHNhY3JpZmljZUFsaWNvcm5zID0gbmV3IFNldHRpbmdUaHJlc2hvbGQoZmFsc2UsIC0xKSxcbiAgICBzYWNyaWZpY2VVbmljb3JucyA9IG5ldyBTZXR0aW5nVGhyZXNob2xkKGZhbHNlLCAtMSksXG4gICAgcmVmaW5lVGVhcnMgPSBuZXcgU2V0dGluZ1RocmVzaG9sZChmYWxzZSwgLTEpLFxuICAgIHJlZmluZVRpbWVDcnlzdGFscyA9IG5ldyBTZXR0aW5nVGhyZXNob2xkKGZhbHNlLCAtMSksXG4gICAgYXV0b1ByYWlzZSA9IG5ldyBTZXR0aW5nVHJpZ2dlcihmYWxzZSwgMSksXG4gICAgYWRvcmUgPSBuZXcgU2V0dGluZ1RyaWdnZXIoZmFsc2UsIDEpLFxuICAgIHRyYW5zY2VuZCA9IG5ldyBTZXR0aW5nKCksXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy5iZXN0VW5pY29ybkJ1aWxkaW5nID0gYmVzdFVuaWNvcm5CdWlsZGluZztcbiAgICB0aGlzLnNhY3JpZmljZUFsaWNvcm5zID0gc2FjcmlmaWNlQWxpY29ybnM7XG4gICAgdGhpcy5zYWNyaWZpY2VVbmljb3JucyA9IHNhY3JpZmljZVVuaWNvcm5zO1xuICAgIHRoaXMucmVmaW5lVGVhcnMgPSByZWZpbmVUZWFycztcbiAgICB0aGlzLnJlZmluZVRpbWVDcnlzdGFscyA9IHJlZmluZVRpbWVDcnlzdGFscztcbiAgICB0aGlzLmF1dG9QcmFpc2UgPSBhdXRvUHJhaXNlO1xuICAgIHRoaXMuYWRvcmUgPSBhZG9yZTtcbiAgICB0aGlzLnRyYW5zY2VuZCA9IHRyYW5zY2VuZDtcbiAgICB0aGlzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1aWxkaW5ncygpOiBSZWxpZ2lvblNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgUmVsaWdpb25TZXR0aW5nc0l0ZW1zO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSZWxpZ2lvblVwZ3JhZGVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBSZWxpZ2lvblNldHRpbmdzSXRlbShpdGVtLCBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBUcmFuc2NlbmRlbmNlVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlbGlnaW9uU2V0dGluZ3NJdGVtKGl0ZW0sIFVuaWNvcm5JdGVtVmFyaWFudC5DcnlwdG90aGVvbG9neSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBaaWdndXJhdFVwZ3JhZGVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBSZWxpZ2lvblNldHRpbmdzSXRlbShpdGVtLCBVbmljb3JuSXRlbVZhcmlhbnQuWmlnZ3VyYXQpO1xuICAgIH1cbiAgICBpdGVtcy51bmljb3JuUGFzdHVyZSA9IG5ldyBSZWxpZ2lvblNldHRpbmdzSXRlbShcbiAgICAgIFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgIFVuaWNvcm5JdGVtVmFyaWFudC5Vbmljb3JuUGFzdHVyZSxcbiAgICApO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8UmVsaWdpb25TZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmJ1aWxkaW5ncywgc2V0dGluZ3MuYnVpbGRpbmdzLCAoYnVpbGRpbmcsIGl0ZW0pID0+IHtcbiAgICAgIGJ1aWxkaW5nLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGJ1aWxkaW5nLmVuYWJsZWQ7XG4gICAgICBidWlsZGluZy5tYXggPSBpdGVtPy5tYXggPz8gYnVpbGRpbmcubWF4O1xuICAgICAgYnVpbGRpbmcudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gYnVpbGRpbmcudHJpZ2dlcjtcbiAgICB9KTtcblxuICAgIHRoaXMuYmVzdFVuaWNvcm5CdWlsZGluZy5sb2FkKHNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmcpO1xuICAgIHRoaXMuc2FjcmlmaWNlQWxpY29ybnMubG9hZChzZXR0aW5ncy5zYWNyaWZpY2VBbGljb3Jucyk7XG4gICAgdGhpcy5zYWNyaWZpY2VVbmljb3Jucy5sb2FkKHNldHRpbmdzLnNhY3JpZmljZVVuaWNvcm5zKTtcbiAgICB0aGlzLnJlZmluZVRlYXJzLmxvYWQoc2V0dGluZ3MucmVmaW5lVGVhcnMpO1xuICAgIHRoaXMucmVmaW5lVGltZUNyeXN0YWxzLmxvYWQoc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzKTtcbiAgICB0aGlzLmF1dG9QcmFpc2UubG9hZChzZXR0aW5ncy5hdXRvUHJhaXNlKTtcbiAgICB0aGlzLmFkb3JlLmxvYWQoc2V0dGluZ3MuYWRvcmUpO1xuICAgIHRoaXMudHJhbnNjZW5kLmxvYWQoc2V0dGluZ3MudHJhbnNjZW5kKTtcbiAgICB0aGlzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID1cbiAgICAgIHNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID8/IHRoaXMuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCBtdXN0RXhpc3QgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBJbnZhbGlkT3BlcmF0aW9uRXJyb3IgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Vycm9ycy9JbnZhbGlkT3BlcmF0aW9uRXJyb3IuanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZmlyZU1hbmFnZXIgfSBmcm9tIFwiLi9Cb25maXJlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRvbWF0aW9uLCBGcmFtZUNvbnRleHQgfSBmcm9tIFwiLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEJ1bGtQdXJjaGFzZUhlbHBlciB9IGZyb20gXCIuL2hlbHBlci9CdWxrUHVyY2hhc2VIZWxwZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IEJvbmZpcmVCdWlsZGluZ1NldHRpbmcgfSBmcm9tIFwiLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uU2V0dGluZ3MsIHR5cGUgUmVsaWdpb25TZXR0aW5nc0l0ZW0gfSBmcm9tIFwiLi9zZXR0aW5ncy9SZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUYWJNYW5hZ2VyIH0gZnJvbSBcIi4vVGFiTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgbmVnYXRpdmVPbmVUb0luZmluaXR5IH0gZnJvbSBcIi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBGYWl0aEl0ZW0sXG4gIHR5cGUgUmVsaWdpb25JdGVtLFxuICB0eXBlIFJlbGlnaW9uVXBncmFkZSxcbiAgdHlwZSBUcmFuc2NlbmRlbmNlVXBncmFkZSxcbiAgdHlwZSBVbmljb3JuSXRlbSxcbiAgVW5pY29ybkl0ZW1zLFxuICBVbmljb3JuSXRlbVZhcmlhbnQsXG4gIHR5cGUgWmlnZ3VyYXRVcGdyYWRlLFxufSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDcnlwdG90aGVvbG9neVBhbmVsLFxuICBDcnlwdG90aGVvbG9neVdHVCxcbiAgUmVsaWdpb25CdG5Db250cm9sbGVyLFxuICBSZWxpZ2lvblRhYixcbiAgVHJhbnNjZW5kZW5jZUJ0bkNvbnRyb2xsZXIsXG4gIFRyYW5zZm9ybUJ0bkNvbnRyb2xsZXIsXG4gIFVuc2FmZVJlbGlnaW9uVXBncmFkZSxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZUJ0bk1vZGVsLFxuICBVbnNhZmVUcmFuc2NlbmRlbmNlQnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlVHJhbnNjZW5kZW5jZVVwZ3JhZGUsXG4gIFVuc2FmZVRyYW5zZm9ybUJ0bk1vZGVsLFxuICBVbnNhZmVaaWdndXJhdFVwZ3JhZGUsXG4gIFppZ2d1cmF0QnRuQ29udHJvbGxlcixcbn0gZnJvbSBcIi4vdHlwZXMvcmVsaWdpb24uanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWxpZ2lvbk1hbmFnZXIgaW1wbGVtZW50cyBBdXRvbWF0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFJlbGlnaW9uU2V0dGluZ3M7XG4gIHJlYWRvbmx5IG1hbmFnZXI6IFRhYk1hbmFnZXI8UmVsaWdpb25UYWI+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9idWxrTWFuYWdlcjogQnVsa1B1cmNoYXNlSGVscGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ib25maXJlTWFuYWdlcjogQm9uZmlyZU1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsXG4gICAgYm9uZmlyZU1hbmFnZXI6IEJvbmZpcmVNYW5hZ2VyLFxuICAgIHdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyLFxuICAgIHNldHRpbmdzID0gbmV3IFJlbGlnaW9uU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiUmVsaWdpb25cIik7XG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICAgIHRoaXMuX2J1bGtNYW5hZ2VyID0gbmV3IEJ1bGtQdXJjaGFzZUhlbHBlcih0aGlzLl9ob3N0LCB0aGlzLl93b3Jrc2hvcE1hbmFnZXIpO1xuICAgIHRoaXMuX2JvbmZpcmVNYW5hZ2VyID0gYm9uZmlyZU1hbmFnZXI7XG4gIH1cblxuICBhc3luYyB0aWNrKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2UgbXVzdCBjYWxsIGAucmVuZGVyKClgIGhlcmUsIGJlY2F1c2UgZXZhbHVhdGlvbiBvZiBhdmFpbGFiaWxpdHkgb2Ygb3VyIG9wdGlvbnNcbiAgICAvLyBpcyBvbmx5IHBlcmZvcm1lZCB3aGVuIHRoZSBnYW1lIHJlbmRlcnMgdGhlIGNvbnRlbnRzIG9mIHRoYXQgdGFiLlxuICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcblxuICAgIHRoaXMuX2F1dG9CdWlsZChjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNhY3JpZmljZVVuaWNvcm5zLmVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2F1dG9TYWNyaWZpY2VVbmljb3JucygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNhY3JpZmljZUFsaWNvcm5zLmVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2F1dG9TYWNyaWZpY2VBbGljb3Jucyhjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5yZWZpbmVUZWFycy5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9hdXRvVGVhcnMoY29udGV4dCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzLmVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2F1dG9UQ3MoY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYXV0b1RBUCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0J1aWxkKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmcuZW5hYmxlZCkge1xuICAgICAgdGhpcy5fYnVpbGRCZXN0VW5pY29ybkJ1aWxkaW5nKCk7XG4gICAgICB0aGlzLl9idWlsZE5vblVuaWNvcm5CdWlsZGluZ3MoY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBvZiBidWlsZHMsIGV4Y2x1ZGluZyB0aGUgdW5pY29ybiBwYXN0dXJlLlxuICAgICAgLy8gVGhlIHVuaWNvcm4gcGFzdHVyZSByZXF1aXJlcyBhIHNwZWNpYWwgYnVpbGQgcGF0aCwgYmVjYXVzZSBpdCdzIHJlYWxseVxuICAgICAgLy8gYSBib25maXJlIGJ1aWxkaW5nLlxuICAgICAgY29uc3QgYnVpbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnNldHRpbmdzLmJ1aWxkaW5ncykuZmlsdGVyKFxuICAgICAgICAgIChbLCBidWlsZGluZ10pID0+IGJ1aWxkaW5nLnZhcmlhbnQgIT09IFVuaWNvcm5JdGVtVmFyaWFudC5Vbmljb3JuUGFzdHVyZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICAvLyBCdWlsZCBhIHVuaWNvcm4gcGFzdHVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIGNvbnN0IG1heFBhc3R1cmVzID0gbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLm1heCk7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInVuaWNvcm5QYXN0dXJlXCIpLm1ldGE7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5idWlsZGluZ3MudW5pY29yblBhc3R1cmUuZW5hYmxlZCAmJiBtZXRhLnZhbCA8IG1heFBhc3R1cmVzKSB7XG4gICAgICAgIHRoaXMuX2JvbmZpcmVNYW5hZ2VyLmF1dG9CdWlsZChjb250ZXh0LCB7XG4gICAgICAgICAgdW5pY29yblBhc3R1cmU6IG5ldyBCb25maXJlQnVpbGRpbmdTZXR0aW5nKFxuICAgICAgICAgICAgXCJ1bmljb3JuUGFzdHVyZVwiLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5idWlsZGluZ3MudW5pY29yblBhc3R1cmUuZW5hYmxlZCxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLnRyaWdnZXIsXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmJ1aWxkaW5ncy51bmljb3JuUGFzdHVyZS5tYXgsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBBbmQgdGhlbiB3ZSBidWlsZCBhbGwgb3RoZXIgcG9zc2libGUgcmVsaWdpb24gYnVpbGRpbmdzLlxuICAgICAgdGhpcy5fYnVpbGRSZWxpZ2lvbkJ1aWxkaW5ncyhjb250ZXh0LCBidWlsZHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkQmVzdFVuaWNvcm5CdWlsZGluZygpIHtcbiAgICBjb25zdCBiZXN0VW5pY29ybkJ1aWxkaW5nID0gdGhpcy5nZXRCZXN0VW5pY29ybkJ1aWxkaW5nKCk7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQgIT09IGJlc3RVbmljb3JuQnVpbGRpbmcpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3MuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQgPSBiZXN0VW5pY29ybkJ1aWxkaW5nO1xuICAgICAgdGhpcy5faG9zdC5yZWZyZXNoRW50aXJlVXNlckludGVyZmFjZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjdGlvblRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLnRyaWdnZXI7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5iZXN0VW5pY29ybkJ1aWxkaW5nQ3VycmVudCA9PT0gXCJ1bmljb3JuUGFzdHVyZVwiKSB7XG4gICAgICB0aGlzLl9ib25maXJlTWFuYWdlci5idWlsZCh0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50LCAwLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnVpbGRpbmdCdXR0b24gPSB0aGlzLl9nZXRCdWlsZEJ1dHRvbihcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5iZXN0VW5pY29ybkJ1aWxkaW5nQ3VycmVudCxcbiAgICAgICAgVW5pY29ybkl0ZW1WYXJpYW50LlppZ2d1cmF0LFxuICAgICAgKTtcbiAgICAgIGlmIChpc05pbChidWlsZGluZ0J1dHRvbj8ubW9kZWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHRlYXJzTmVlZGVkID0gMDtcbiAgICAgIGNvbnN0IHByaWNlVGVhcnMgPSBtdXN0RXhpc3QoYnVpbGRpbmdCdXR0b24ubW9kZWwucHJpY2VzKS5maW5kKFxuICAgICAgICBzdWJqZWN0ID0+IHN1YmplY3QubmFtZSA9PT0gXCJ0ZWFyc1wiLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNOaWwocHJpY2VUZWFycykpIHtcbiAgICAgICAgdGVhcnNOZWVkZWQgPSBwcmljZVRlYXJzLnZhbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGVhcnNBdmFpbGFibGVGb3JVc2UgPVxuICAgICAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWUoXCJ0ZWFyc1wiKSAtIHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRTdG9jayhcInRlYXJzXCIpO1xuXG4gICAgICBpZiAoIWlzTmlsKHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5zYWNyaWZpY2VCdG4pICYmIHRlYXJzQXZhaWxhYmxlRm9yVXNlIDwgdGVhcnNOZWVkZWQpIHtcbiAgICAgICAgLy8gaWYgbm8gemlnZ3VyYXQsIGdldEJlc3RVbmljb3JuQnVpbGRpbmcgd2lsbCByZXR1cm4gdW5pY29yblBhc3R1cmVcbiAgICAgICAgLy8gVE9ETzog4pidIFllYWguIFNvP1xuXG4gICAgICAgIC8vIEhvdyBtYW55IHRpbWVzIGNhbiB3ZSBzYWNyaWZpY2UgdW5pY29ybnMgdG8gbWFrZSB0ZWFycz9cbiAgICAgICAgY29uc3QgbWF4U2FjcmlmaWNlID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlKFwidW5pY29ybnNcIikgLVxuICAgICAgICAgICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFN0b2NrKFwidW5pY29ybnNcIikpIC9cbiAgICAgICAgICAgIDI1MDAsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSG93IG1hbnkgc2FjcmlmaWNlcyB3b3VsZCB3ZSBuZWVkLCBzbyB3ZSdkIGVuZCB1cCB3aXRoIGVub3VnaCB0ZWFycy5cbiAgICAgICAgY29uc3QgbmVlZFNhY3JpZmljZSA9IE1hdGguY2VpbChcbiAgICAgICAgICAodGVhcnNOZWVkZWQgLSB0ZWFyc0F2YWlsYWJsZUZvclVzZSkgL1xuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInppZ2d1cmF0XCIpLm1ldGEub24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2FjcmlmaWNlIHNvbWUgdW5pY29ybnMgdG8gZ2V0IHRoZSB0ZWFycyB0byBidXkgdGhlIGJ1aWxkaW5nLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgbmVlZFNhY3JpZmljZSA8IG1heFNhY3JpZmljZSAmJlxuICAgICAgICAgICFpc05pbCh0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQnRuLm1vZGVsKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQnRuPy5jb250cm9sbGVyPy5fdHJhbnNmb3JtKFxuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUJ0bi5tb2RlbCxcbiAgICAgICAgICAgIG5lZWRTYWNyaWZpY2UsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBpYWN0aXZpdHk/XG4gICAgICAgICAgLy8gVE9ETzog4pidIFllYWgsIHNlZW1zIGxpa2UgYSBnb29kIGlkZWEuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm90IGVub3VnaCB1bmljb3JucyB0byBzYWNyaWZpY2UgdG8gbWFrZSBlbm91Z2ggdGVhcnMuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExldCB0aGUgQnVsa01hbmFnZXIgZmlndXJlIG91dCBpZiB0aGUgYnVpbGQgY2FuIGJlIG1hZGUuXG4gICAgICBjb25zdCBidWlsZFJlcXVlc3QgPSB7XG4gICAgICAgIFt0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50XTpcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmJ1aWxkaW5nc1t0aGlzLnNldHRpbmdzLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50XSxcbiAgICAgIH07XG4gICAgICBjb25zdCBidWlsZCA9IHRoaXMuX2J1bGtNYW5hZ2VyLmJ1bGsoXG4gICAgICAgIGJ1aWxkUmVxdWVzdCxcbiAgICAgICAgdGhpcy5nZXRCdWlsZE1ldGFEYXRhKGJ1aWxkUmVxdWVzdCksXG4gICAgICAgIHNlY3Rpb25UcmlnZ2VyLFxuICAgICAgICBcIlJlbGlnaW9uXCIsXG4gICAgICApO1xuICAgICAgaWYgKDAgPCBidWlsZC5sZW5ndGggJiYgMCA8IGJ1aWxkWzBdLmNvdW50KSB7XG4gICAgICAgIC8vIFdlIGZvcmNlIG9ubHkgYnVpbGRpbmcgMSBvZiB0aGUgYmVzdCB1bmljb3JuIGJ1aWxkaW5nLCBiZWNhdXNlXG4gICAgICAgIC8vIGFmdGVyd2FyZHMgdGhlIGJlc3QgdW5pY29ybiBidWlsZGluZyBpcyBsaWtlbHkgZ29pbmcgdG8gY2hhbmdlLlxuICAgICAgICB0aGlzLmJ1aWxkKHRoaXMuc2V0dGluZ3MuYmVzdFVuaWNvcm5CdWlsZGluZ0N1cnJlbnQsIFVuaWNvcm5JdGVtVmFyaWFudC5aaWdndXJhdCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2J1aWxkTm9uVW5pY29ybkJ1aWxkaW5ncyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBjb25zdCBhbHJlYWR5SGFuZGxlZDogQXJyYXk8RmFpdGhJdGVtIHwgVW5pY29ybkl0ZW0+ID0gWy4uLlVuaWNvcm5JdGVtc107XG4gICAgY29uc3QgYnVpbGRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5zZXR0aW5ncy5idWlsZGluZ3MpLmZpbHRlcihcbiAgICAgICAgKFssIGJ1aWxkaW5nXSkgPT4gIWFscmVhZHlIYW5kbGVkLmluY2x1ZGVzKGJ1aWxkaW5nLmJ1aWxkaW5nKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLl9idWlsZFJlbGlnaW9uQnVpbGRpbmdzKGNvbnRleHQsIGJ1aWxkcyk7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZFJlbGlnaW9uQnVpbGRpbmdzKFxuICAgIGNvbnRleHQ6IEZyYW1lQ29udGV4dCxcbiAgICBidWlsZHM6IFBhcnRpYWw8UmVjb3JkPEZhaXRoSXRlbSwgUmVsaWdpb25TZXR0aW5nc0l0ZW0+PixcbiAgKTogdm9pZCB7XG4gICAgLy8gUmVuZGVyIHRoZSB0YWIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1dHRvbnMgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIERPTS4gT3RoZXJ3aXNlIHdlIGNhbid0IGNsaWNrIHRoZW0uXG4gICAgdGhpcy5tYW5hZ2VyLnJlbmRlcigpO1xuXG4gICAgY29uc3QgbWV0YURhdGE6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIEZhaXRoSXRlbSxcbiAgICAgICAgUmVxdWlyZWQ8VW5zYWZlUmVsaWdpb25VcGdyYWRlIHwgVW5zYWZlVHJhbnNjZW5kZW5jZVVwZ3JhZGUgfCBVbnNhZmVaaWdndXJhdFVwZ3JhZGU+XG4gICAgICA+XG4gICAgPiA9IHRoaXMuZ2V0QnVpbGRNZXRhRGF0YShidWlsZHMpO1xuICAgIGNvbnN0IHNlY3Rpb25UcmlnZ2VyID0gdGhpcy5zZXR0aW5ncy50cmlnZ2VyO1xuXG4gICAgLy8gTGV0IHRoZSBidWxrIG1hbmFnZXIgZmlndXJlIG91dCB3aGljaCBvZiB0aGUgYnVpbGRzIHRvIGFjdHVhbGx5IGJ1aWxkLlxuICAgIGNvbnN0IGJ1aWxkTGlzdCA9IHRoaXMuX2J1bGtNYW5hZ2VyLmJ1bGsoYnVpbGRzLCBtZXRhRGF0YSwgc2VjdGlvblRyaWdnZXIsIFwiUmVsaWdpb25cIik7XG5cbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIGJ1aWxkTGlzdCkge1xuICAgICAgaWYgKDAgPCBidWlsZC5jb3VudCkge1xuICAgICAgICB0aGlzLmJ1aWxkKFxuICAgICAgICAgIGJ1aWxkLmlkIGFzIFJlbGlnaW9uSXRlbSB8IFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgICAgICBtdXN0RXhpc3QoYnVpbGQudmFyaWFudCkgYXMgVW5pY29ybkl0ZW1WYXJpYW50LFxuICAgICAgICAgIGJ1aWxkLmNvdW50LFxuICAgICAgICApO1xuICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSBiZXN0IHVuaWNvcm4tcmVsYXRlZCBidWlsZGluZyB0byBidXkgbmV4dC5cbiAgICogVGhpcyBpcyB0aGUgYnVpbGRpbmcgd2hlcmUgdGhlIGNvc3QgaXMgaW4gdGhlIGJlc3QgcHJvcG9ydGlvbiB0byB0aGVcbiAgICogdW5pY29ybiBwcm9kdWN0aW9uIGJvbnVzIGl0IGdlbmVyYXRlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vQmlvbmljbGVnZW5pdXMvTnVtbW9uQ2FsYy9ibG9iLzExMmY3MTZlMmZkZTk5NTZkZmU1MjAwMjFiMDQwMGNiYTdiNzExM2UvTnVtbW9uQ2FsYy5qcyNMNDkwXG4gICAqIEByZXR1cm5zIFRoZSBiZXN0IHVuaWNvcm4gYnVpbGRpbmcuXG4gICAqL1xuICBnZXRCZXN0VW5pY29ybkJ1aWxkaW5nKCk6IFppZ2d1cmF0VXBncmFkZSB8IFwidW5pY29yblBhc3R1cmVcIiB8IG51bGwge1xuICAgIGNvbnN0IHBhc3R1cmVCdXR0b24gPSB0aGlzLl9ib25maXJlTWFuYWdlci5nZXRCdWlsZEJ1dHRvbihcInVuaWNvcm5QYXN0dXJlXCIpO1xuICAgIGlmIChwYXN0dXJlQnV0dG9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEJ1aWxkaW5nczogQXJyYXk8WmlnZ3VyYXRVcGdyYWRlIHwgXCJ1bmljb3JuUGFzdHVyZVwiPiA9IFsuLi5Vbmljb3JuSXRlbXNdLmZpbHRlcihcbiAgICAgIGl0ZW0gPT4gaXRlbSAhPT0gXCJ1bmljb3JuUGFzdHVyZVwiLFxuICAgICk7XG5cbiAgICAvLyBIb3cgbWFueSB1bmljb3JucyBhcmUgcHJvZHVjZWQgcGVyIHNlY29uZC5cbiAgICBjb25zdCB1bmljb3Juc1BlclNlY29uZEJhc2UgPVxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInVuaWNvcm5zUGVyVGlja0Jhc2VcIikgKiB0aGlzLl9ob3N0LmdhbWUuZ2V0VGlja3NQZXJTZWNvbmRVSSgpO1xuICAgIC8vIFVuaWNvcm4gcmF0aW8gbW9kaWZpZXIuIEZvciBleGFtcGxlLCB0aHJvdWdoIFwidW5pY29ybiBzZWxlY3Rpb25cIi5cbiAgICBjb25zdCBnbG9iYWxSYXRpbyA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJ1bmljb3Juc0dsb2JhbFJhdGlvXCIpICsgMTtcbiAgICAvLyBUaGUgdW5pY29ybiByYXRpbyBtb2RpZmllciB0aHJvdWdoIHJlbGlnaW9uIGJ1aWxkaW5ncy5cbiAgICBjb25zdCByZWxpZ2lvblJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInVuaWNvcm5zUmF0aW9SZWxpZ2lvblwiKSArIDE7XG4gICAgLy8gVGhlIHJhdGlvIG1vZGlmaWVyIHRocm91Z2ggcGFyYWdvbi5cbiAgICBjb25zdCBwYXJhZ29uUmF0aW8gPSB0aGlzLl9ob3N0LmdhbWUucHJlc3RpZ2UuZ2V0UGFyYWdvblByb2R1Y3Rpb25SYXRpbygpICsgMTtcbiAgICAvLyBCb251cyBmcm9tIGNvbGxlY3RlZCBmYWl0aC5cbiAgICBjb25zdCBmYWl0aEJvbnVzID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFNvbGFyUmV2b2x1dGlvblJhdGlvKCkgKyAxO1xuXG4gICAgY29uc3QgY3VycmVudEN5Y2xlSW5kZXggPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGU7XG4gICAgY29uc3QgY3VycmVudEN5Y2xlID0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmN5Y2xlc1tjdXJyZW50Q3ljbGVJbmRleF07XG5cbiAgICAvLyBUaGUgbW9kaWZpZXIgYXBwbGllZCBieSB0aGUgY3VycmVudCBjeWNsZSBhbmQgaG9sZGluZyBhIGZlc3RpdmFsLlxuICAgIGxldCBjeWNsZUJvbnVzID0gMTtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjeWNsZSBoYXMgYW4gZWZmZWN0IG9uIHVuaWNvcm4gcHJvZHVjdGlvbiBkdXJpbmcgZmVzdGl2YWxzXG4gICAgLy8gVE9ETzogU2ltcGxpZnlcbiAgICBpZiAoY3VycmVudEN5Y2xlLmZlc3RpdmFsRWZmZWN0cy51bmljb3JucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBOdW1lcm9tYW5jeSBpcyB0aGUgbWV0YXBoeXNpY3MgdXBncmFkZSB0aGF0IGdyYW50cyBib251c2VzIGJhc2VkIG9uIGN5Y2xlcy5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldFBlcmsoXCJudW1lcm9tYW5jeVwiKS5yZXNlYXJjaGVkICYmXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5mZXN0aXZhbERheXNcbiAgICAgICkge1xuICAgICAgICBjeWNsZUJvbnVzID0gY3VycmVudEN5Y2xlLmZlc3RpdmFsRWZmZWN0cy51bmljb3JucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1bmljb3Juc1BlclNlY29uZCA9XG4gICAgICB1bmljb3Juc1BlclNlY29uZEJhc2UgKiBnbG9iYWxSYXRpbyAqIHJlbGlnaW9uUmF0aW8gKiBwYXJhZ29uUmF0aW8gKiBmYWl0aEJvbnVzICogY3ljbGVCb251cztcblxuICAgIC8vIEJhc2VkIG9uIGhvdyBtYW55IHppZ2d1cmF0cyB3ZSBoYXZlLlxuICAgIGNvbnN0IHppZ2d1cmF0UmF0aW8gPSBNYXRoLm1heCh0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwiemlnZ3VyYXRcIikubWV0YS5vbiwgMSk7XG4gICAgLy8gSG93IG1hbnkgdW5pY29ybnMgZG8gd2UgcmVjZWl2ZSBpbiBhIHVuaWNvcm4gcmlmdD9cbiAgICBjb25zdCBiYXNlVW5pY29ybnNQZXJSaWZ0ID1cbiAgICAgIDUwMCAqICgxICsgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInVuaWNvcm5zUmF0aW9SZWxpZ2lvblwiKSAqIDAuMSk7XG5cbiAgICAvLyBIb3cgbGlrZWx5IGFyZSB1bmljb3JuIHJpZnRzIHRvIGhhcHBlbj8gVGhlIHVuaWNvcm5tYW5jeSBtZXRhcGh5c2ljcyB1cGdyYWRlIGluY3JlYXNlcyB0aGlzIGNoYW5jZS5cbiAgICBsZXQgcmlmdENoYW5jZVJhdGlvID0gMTtcbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldFBlcmsoXCJ1bmljb3JubWFuY3lcIikucmVzZWFyY2hlZCkge1xuICAgICAgcmlmdENoYW5jZVJhdGlvICo9IDEuMTtcbiAgICB9XG4gICAgLy8gP1xuICAgIGNvbnN0IHVuaWNvcm5SaWZ0Q2hhbmdlID1cbiAgICAgICgodGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInJpZnRDaGFuY2VcIikgKiByaWZ0Q2hhbmNlUmF0aW8pIC8gKDEwMDAwICogMikpICpcbiAgICAgIGJhc2VVbmljb3Juc1BlclJpZnQ7XG5cbiAgICAvLyBXZSBub3cgd2FudCB0byBkZXRlcm1pbmUgaG93IHF1aWNrbHkgdGhlIGNvc3Qgb2YgZ2l2ZW4gYnVpbGRpbmcgaXMgbmV1dHJhbGl6ZWRcbiAgICAvLyBieSBpdHMgZWZmZWN0IG9uIHByb2R1Y3Rpb24gb2YgdW5pY29ybnMuXG5cbiAgICBsZXQgYmVzdEFtb3J0aXphdGlvbiA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBsZXQgYmVzdEJ1aWxkaW5nOiBaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCIgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB1bmljb3Juc1BlclRpY2tCYXNlID0gbXVzdEV4aXN0KFxuICAgICAgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInVuaWNvcm5QYXN0dXJlXCIpLm1ldGEuZWZmZWN0cz8udW5pY29ybnNQZXJUaWNrQmFzZSxcbiAgICApO1xuICAgIGNvbnN0IHBhc3R1cmVQcm9kdWN0aW9uID1cbiAgICAgIHVuaWNvcm5zUGVyVGlja0Jhc2UgKlxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldFRpY2tzUGVyU2Vjb25kVUkoKSAqXG4gICAgICBnbG9iYWxSYXRpbyAqXG4gICAgICByZWxpZ2lvblJhdGlvICpcbiAgICAgIHBhcmFnb25SYXRpbyAqXG4gICAgICBmYWl0aEJvbnVzICpcbiAgICAgIGN5Y2xlQm9udXM7XG5cbiAgICAvLyBJZiB0aGUgdW5pY29ybiBwYXN0dXJlIGFtb3J0aXplcyBpdHNlbGYgaW4gbGVzcyB0aGFuIGluZmluaXR5IHRpY2tzLFxuICAgIC8vIHNldCBpdCBhcyB0aGUgZGVmYXVsdC4gVGhpcyBpcyBsaWtlbHkgdG8gcHJvdGVjdCBhZ2FpbnN0IGNhc2VzIHdoZXJlXG4gICAgLy8gcHJvZHVjdGlvbiBvZiB1bmljb3JucyBpcyAwLlxuICAgIGNvbnN0IHBhc3R1cmVBbW9ydGl6YXRpb24gPSBtdXN0RXhpc3QocGFzdHVyZUJ1dHRvbi5tb2RlbD8ucHJpY2VzKVswXS52YWwgLyBwYXN0dXJlUHJvZHVjdGlvbjtcbiAgICBpZiAocGFzdHVyZUFtb3J0aXphdGlvbiA8IGJlc3RBbW9ydGl6YXRpb24pIHtcbiAgICAgIGJlc3RBbW9ydGl6YXRpb24gPSBwYXN0dXJlQW1vcnRpemF0aW9uO1xuICAgICAgYmVzdEJ1aWxkaW5nID0gXCJ1bmljb3JuUGFzdHVyZVwiO1xuICAgIH1cblxuICAgIC8vIEZvciBhbGwgemlnZ3VyYXQgdXBncmFkZSBidXR0b25zLi4uXG4gICAgZm9yIChjb25zdCBidXR0b24gb2YgdGhpcy5tYW5hZ2VyLnRhYi56Z1VwZ3JhZGVCdXR0b25zKSB7XG4gICAgICAvLyAuLi50aGF0IGFyZSBpbiB0aGUgXCJ2YWxpZFwiIGJ1aWxkaW5ncyAoYXJlIHVuaWNvcm4tcmVsYXRlZCkgYW5kIHZpc2libGUgKHVubG9ja2VkKS4uLlxuICAgICAgaWYgKHZhbGlkQnVpbGRpbmdzLmluY2x1ZGVzKGJ1dHRvbi5pZCkgJiYgYnV0dG9uLm1vZGVsLnZpc2libGUpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGEgcHJpY2UgdmFsdWUgZm9yIHRoaXMgYnVpbGRpbmcuXG4gICAgICAgIGxldCB1bmljb3JuUHJpY2UgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHByaWNlIG9mIG11c3RFeGlzdChidXR0b24ubW9kZWwucHJpY2VzKSkge1xuICAgICAgICAgIC8vIEFkZCB0aGUgYW1vdW50IG9mIHVuaWNvcm5zIHRoZSBidWlsZGluZyBjb3N0cyAoaWYgYW55KS5cbiAgICAgICAgICBpZiAocHJpY2UubmFtZSA9PT0gXCJ1bmljb3Juc1wiKSB7XG4gICAgICAgICAgICB1bmljb3JuUHJpY2UgKz0gcHJpY2UudmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUZWFycyByZXN1bHQgZnJvbSB1bmljb3JuIHNhY3JpZmljZXMsIHNvIGZhY3RvciB0aGF0IGludG8gdGhlIHByaWNlIHByb3BvcnRpb25hbGx5LlxuICAgICAgICAgIGlmIChwcmljZS5uYW1lID09PSBcInRlYXJzXCIpIHtcbiAgICAgICAgICAgIHVuaWNvcm5QcmljZSArPSAocHJpY2UudmFsICogMjUwMCkgLyB6aWdndXJhdFJhdGlvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgZWZmZWN0IHRoZSBidWlsZGluZyB3aWxsIGhhdmUgb24gdW5pY29ybiBwcm9kdWN0aW9uIGFuZCB1bmljb3JuIHJpZnRzLlxuICAgICAgICBjb25zdCBidWlsZGluZ0luZm8gPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFpVKGJ1dHRvbi5pZCkpO1xuICAgICAgICBsZXQgcmVsaWdpb25Cb251cyA9IHJlbGlnaW9uUmF0aW87XG4gICAgICAgIGxldCByaWZ0Q2hhbmNlID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInJpZnRDaGFuY2VcIik7XG4gICAgICAgIGZvciAoY29uc3QgZWZmZWN0IGluIGJ1aWxkaW5nSW5mby5lZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKGVmZmVjdCA9PT0gXCJ1bmljb3Juc1JhdGlvUmVsaWdpb25cIikge1xuICAgICAgICAgICAgcmVsaWdpb25Cb251cyArPSBtdXN0RXhpc3QoYnVpbGRpbmdJbmZvLmVmZmVjdHMudW5pY29ybnNSYXRpb1JlbGlnaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVmZmVjdCA9PT0gXCJyaWZ0Q2hhbmNlXCIpIHtcbiAgICAgICAgICAgIHJpZnRDaGFuY2UgKz0gbXVzdEV4aXN0KGJ1aWxkaW5nSW5mby5lZmZlY3RzLnJpZnRDaGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSByZXN0IHNob3VsZCBiZSBzdHJhaWdodCBmb3J3YXJkLlxuICAgICAgICBjb25zdCB1bmljb3Juc1BlclJpZnQgPSA1MDAgKiAoKHJlbGlnaW9uQm9udXMgLSAxKSAqIDAuMSArIDEpO1xuICAgICAgICBsZXQgcmlmdEJvbnVzID0gKChyaWZ0Q2hhbmNlICogcmlmdENoYW5jZVJhdGlvKSAvICgxMDAwMCAqIDIpKSAqIHVuaWNvcm5zUGVyUmlmdDtcbiAgICAgICAgcmlmdEJvbnVzIC09IHVuaWNvcm5SaWZ0Q2hhbmdlO1xuICAgICAgICBsZXQgYnVpbGRpbmdQcm9kdWN0aW9uID1cbiAgICAgICAgICB1bmljb3Juc1BlclNlY29uZEJhc2UgKlxuICAgICAgICAgIGdsb2JhbFJhdGlvICpcbiAgICAgICAgICByZWxpZ2lvbkJvbnVzICpcbiAgICAgICAgICBwYXJhZ29uUmF0aW8gKlxuICAgICAgICAgIGZhaXRoQm9udXMgKlxuICAgICAgICAgIGN5Y2xlQm9udXM7XG4gICAgICAgIGJ1aWxkaW5nUHJvZHVjdGlvbiAtPSB1bmljb3Juc1BlclNlY29uZDtcbiAgICAgICAgYnVpbGRpbmdQcm9kdWN0aW9uICs9IHJpZnRCb251cztcbiAgICAgICAgY29uc3QgYW1vcnRpemF0aW9uID0gdW5pY29yblByaWNlIC8gYnVpbGRpbmdQcm9kdWN0aW9uO1xuXG4gICAgICAgIGlmIChhbW9ydGl6YXRpb24gPCBiZXN0QW1vcnRpemF0aW9uKSB7XG4gICAgICAgICAgaWYgKDAgPCByaWZ0Qm9udXMgfHwgKHJlbGlnaW9uUmF0aW8gPCByZWxpZ2lvbkJvbnVzICYmIDAgPCB1bmljb3JuUHJpY2UpKSB7XG4gICAgICAgICAgICBiZXN0QW1vcnRpemF0aW9uID0gYW1vcnRpemF0aW9uO1xuICAgICAgICAgICAgYmVzdEJ1aWxkaW5nID0gYnV0dG9uLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdEJ1aWxkaW5nO1xuICB9XG5cbiAgYnVpbGQobmFtZTogUmVsaWdpb25JdGVtIHwgXCJ1bmljb3JuUGFzdHVyZVwiLCB2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQsIGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGFtb3VudENhbGN1bGF0ZWQgPSBhbW91bnQ7XG4gICAgY29uc3QgYW1vdW50VGVtcCA9IGFtb3VudENhbGN1bGF0ZWQ7XG4gICAgbGV0IGxhYmVsOiBzdHJpbmc7XG4gICAgaWYgKHZhcmlhbnQgPT09IFVuaWNvcm5JdGVtVmFyaWFudC5DcnlwdG90aGVvbG9neSkge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInRyYW5zY2VuZGVuY2VVcGdyYWRlc1wiKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY2xhc3Nlcy51aS5UcmFuc2NlbmRlbmNlQnRuQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBUcmFuc2NlbmRlbmNlQnRuQ29udHJvbGxlcjxcbiAgICAgICAgVW5zYWZlVHJhbnNjZW5kZW5jZUJ0bk1vZGVsPFVuc2FmZVRyYW5zY2VuZGVuY2VCdXR0b25PcHRpb25zPlxuICAgICAgPjtcbiAgICAgIGNvbnN0IG1vZGVsID0gY29udHJvbGxlci5mZXRjaE1vZGVsKHsgY29udHJvbGxlciwgaWQ6IGl0ZW1NZXRhUmF3Lm5hbWUgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gaXRlbU1ldGFSYXcubGFiZWw7XG4gICAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bikge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInJlbGlnaW9uXCIpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBjb20ubnVjbGVhcnVuaWNvcm4uZ2FtZS51aS5SZWxpZ2lvbkJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgUmVsaWdpb25CdG5Db250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoeyBjb250cm9sbGVyLCBpZDogaXRlbU1ldGFSYXcubmFtZSB9KTtcbiAgICAgIGFtb3VudENhbGN1bGF0ZWQgPSB0aGlzLl9idWxrTWFuYWdlci5jb25zdHJ1Y3QobW9kZWwsIGNvbnRyb2xsZXIsIGFtb3VudENhbGN1bGF0ZWQpO1xuICAgICAgbGFiZWwgPSBpdGVtTWV0YVJhdy5sYWJlbDtcbiAgICB9IGVsc2UgaWYgKHZhcmlhbnQgPT09IFVuaWNvcm5JdGVtVmFyaWFudC5aaWdndXJhdCkge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInppZ2d1cmF0VXBncmFkZXNcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNvbS5udWNsZWFydW5pY29ybi5nYW1lLnVpLlppZ2d1cmF0QnRuQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBaaWdndXJhdEJ0bkNvbnRyb2xsZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IGNvbnRyb2xsZXIuZmV0Y2hNb2RlbCh7IGNvbnRyb2xsZXIsIGlkOiBpdGVtTWV0YVJhdy5uYW1lIH0pO1xuICAgICAgYW1vdW50Q2FsY3VsYXRlZCA9IHRoaXMuX2J1bGtNYW5hZ2VyLmNvbnN0cnVjdChtb2RlbCwgY29udHJvbGxlciwgYW1vdW50Q2FsY3VsYXRlZCk7XG4gICAgICBsYWJlbCA9IGl0ZW1NZXRhUmF3LmxhYmVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkVycm9yKFwidW5zdXBwb3J0ZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgIT09IGFtb3VudFRlbXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woYCR7bGFiZWx9IEFtb3VudCBvcmRlcmVkOiAke2Ftb3VudFRlbXB9IEFtb3VudCBDb25zdHJ1Y3RlZDogJHthbW91bnRDYWxjdWxhdGVkfWApLFxuICAgICAgKTtcbiAgICAgIC8vIEJhaWwgb3V0IHRvIG5vdCBmbG9vZCB0aGUgbG9nIHdpdGggZ2FyYmFnZS5cbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFyaWFudCA9PT0gVW5pY29ybkl0ZW1WYXJpYW50Lk9yZGVyT2ZUaGVTdW4pIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShsYWJlbCwgYW1vdW50Q2FsY3VsYXRlZCwgXCJmYWl0aFwiKTtcbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5zdW4uZGlzY292ZXJcIiwgW2xhYmVsXSwgXCJrcy1mYWl0aFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgICBcImFjdC5zdW4uZGlzY292ZXJzXCIsXG4gICAgICAgICAgW2xhYmVsLCB0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKGFtb3VudENhbGN1bGF0ZWQpXSxcbiAgICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShsYWJlbCwgYW1vdW50Q2FsY3VsYXRlZCwgXCJidWlsZFwiKTtcbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5idWlsZFwiLCBbbGFiZWxdLCBcImtzLWJ1aWxkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFxuICAgICAgICAgIFwiYWN0LmJ1aWxkc1wiLFxuICAgICAgICAgIFtsYWJlbCwgdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShhbW91bnRDYWxjdWxhdGVkKV0sXG4gICAgICAgICAgXCJrcy1idWlsZFwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEJ1aWxkTWV0YURhdGEoYnVpbGRzOiBQYXJ0aWFsPFJlY29yZDxGYWl0aEl0ZW0sIFJlbGlnaW9uU2V0dGluZ3NJdGVtPj4pIHtcbiAgICBjb25zdCBtZXRhRGF0YTogUGFydGlhbDxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgRmFpdGhJdGVtLFxuICAgICAgICBSZXF1aXJlZDxVbnNhZmVSZWxpZ2lvblVwZ3JhZGUgfCBVbnNhZmVUcmFuc2NlbmRlbmNlVXBncmFkZSB8IFVuc2FmZVppZ2d1cmF0VXBncmFkZT5cbiAgICAgID5cbiAgICA+ID0ge307XG4gICAgZm9yIChjb25zdCBidWlsZCBvZiBPYmplY3QudmFsdWVzKGJ1aWxkcykpIHtcbiAgICAgIGNvbnN0IGJ1aWxkSW5mbyA9IHRoaXMuZ2V0QnVpbGQoYnVpbGQuYnVpbGRpbmcsIGJ1aWxkLnZhcmlhbnQpO1xuICAgICAgaWYgKGJ1aWxkSW5mbyA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1ldGFEYXRhW2J1aWxkLmJ1aWxkaW5nIGFzIEZhaXRoSXRlbV0gPSBidWlsZEluZm87XG4gICAgICBjb25zdCBidWlsZE1ldGFEYXRhID0gbXVzdEV4aXN0KG1ldGFEYXRhW2J1aWxkLmJ1aWxkaW5nIGFzIEZhaXRoSXRlbV0pO1xuXG4gICAgICAvLyBJZiBhbiBpdGVtIGlzIG1hcmtlZCBhcyBgckhpZGRlbmAsIGl0IHdvdWxkbid0IGJlIGJ1aWxkLlxuICAgICAgLy8gVE9ETzogV2h5IG5vdCByZW1vdmUgaXQgZnJvbSB0aGUgYGJ1aWxkc2AgdGhlbj9cbiAgICAgIGlmICghdGhpcy5fZ2V0QnVpbGRCdXR0b24oYnVpbGQuYnVpbGRpbmcsIGJ1aWxkLnZhcmlhbnQpKSB7XG4gICAgICAgIGJ1aWxkTWV0YURhdGEuckhpZGRlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG11c3RFeGlzdCh0aGlzLl9nZXRCdWlsZEJ1dHRvbihidWlsZC5idWlsZGluZywgYnVpbGQudmFyaWFudCkpLm1vZGVsO1xuICAgICAgICBjb25zdCBwYW5lbCA9XG4gICAgICAgICAgYnVpbGQudmFyaWFudCA9PT0gVW5pY29ybkl0ZW1WYXJpYW50LkNyeXB0b3RoZW9sb2d5XG4gICAgICAgICAgICA/IHRoaXMuX2hvc3QuZ2FtZS5zY2llbmNlLmdldChcImNyeXB0b3RoZW9sb2d5XCIpLnJlc2VhcmNoZWRcbiAgICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgYnVpbGRNZXRhRGF0YS5ySGlkZGVuID0gIShtb2RlbD8udmlzaWJsZSAmJiBtb2RlbC5lbmFibGVkICYmIHBhbmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YURhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYW4gdXBncmFkZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHVwZ3JhZGUuXG4gICAqIEBwYXJhbSB2YXJpYW50IFRoZSB2YXJpYW50IG9mIHRoZSB1cGdyYWRlLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGQgaW5mb3JtYXRpb24gZm9yIHRoZSB1cGdyYWRlLlxuICAgKi9cbiAgZ2V0QnVpbGQobmFtZTogUmVsaWdpb25JdGVtIHwgXCJ1bmljb3JuUGFzdHVyZVwiLCB2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQpIHtcbiAgICBzd2l0Y2ggKHZhcmlhbnQpIHtcbiAgICAgIGNhc2UgVW5pY29ybkl0ZW1WYXJpYW50LlppZ2d1cmF0OlxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFpVKG5hbWUgYXMgWmlnZ3VyYXRVcGdyYWRlKSA/PyBudWxsO1xuICAgICAgY2FzZSBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi5nZXRSVShuYW1lIGFzIFJlbGlnaW9uVXBncmFkZSkgPz8gbnVsbDtcbiAgICAgIGNhc2UgVW5pY29ybkl0ZW1WYXJpYW50LkNyeXB0b3RoZW9sb2d5OlxuICAgICAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFRVKG5hbWUgYXMgVHJhbnNjZW5kZW5jZVVwZ3JhZGUpID8/IG51bGw7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBidWlsZDogJHtuYW1lfSAoJHt2YXJpYW50fSlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBidXR0b24gdGhhdCBhbGxvd3MgcHVyY2hhc2luZyBhIGdpdmVuIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB1cGdyYWRlLlxuICAgKiBAcGFyYW0gdmFyaWFudCBUaGUgdmFyaWFudCBvZiB0aGUgdXBncmFkZS5cbiAgICogQHJldHVybnMgVGhlIGJ1dHRvbiB0byBidXkgdGhlIHVwZ3JhZGUsIG9yIGBudWxsYC5cbiAgICovXG4gIHByaXZhdGUgX2dldEJ1aWxkQnV0dG9uKG5hbWU6IFJlbGlnaW9uSXRlbSB8IFwidW5pY29yblBhc3R1cmVcIiwgdmFyaWFudDogVW5pY29ybkl0ZW1WYXJpYW50KSB7XG4gICAgbGV0IGJ1dHRvbnM6XG4gICAgICB8IHR5cGVvZiB0aGlzLm1hbmFnZXIudGFiLnpnVXBncmFkZUJ1dHRvbnNcbiAgICAgIHwgdHlwZW9mIHRoaXMubWFuYWdlci50YWIuclVwZ3JhZGVCdXR0b25zXG4gICAgICB8IENyeXB0b3RoZW9sb2d5V0dUW1wiY2hpbGRyZW5cIl07XG4gICAgc3dpdGNoICh2YXJpYW50KSB7XG4gICAgICBjYXNlIFVuaWNvcm5JdGVtVmFyaWFudC5aaWdndXJhdDpcbiAgICAgICAgYnV0dG9ucyA9IHRoaXMubWFuYWdlci50YWIuemdVcGdyYWRlQnV0dG9ucztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFVuaWNvcm5JdGVtVmFyaWFudC5PcmRlck9mVGhlU3VuOlxuICAgICAgICBidXR0b25zID0gdGhpcy5tYW5hZ2VyLnRhYi5yVXBncmFkZUJ1dHRvbnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVbmljb3JuSXRlbVZhcmlhbnQuQ3J5cHRvdGhlb2xvZ3k6XG4gICAgICAgIGJ1dHRvbnMgPSAodGhpcy5tYW5hZ2VyLnRhYi5jaGlsZHJlblswXSBhcyBDcnlwdG90aGVvbG9neVBhbmVsKS5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFyaWFudCAnJHt2YXJpYW50fSdgKTtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFNlcmllcyBvZiB1cGdyYWRlcyBpcyBub3QgdW5sb2NrZWQgeWV0LlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9uID0gYnV0dG9ucy5maW5kKGJ1dHRvbiA9PiBidXR0b24uaWQgPT09IG5hbWUpID8/IG51bGw7XG5cbiAgICBpZiAoYnV0dG9uID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb3VsZG4ndCBmaW5kIGJ1dHRvbiBmb3IgJHtuYW1lfSEgVGhpcyB3aWxsIGxpa2VseSBjcmVhdGUgcHJvYmxlbXMuYCkpO1xuICAgIH1cblxuICAgIHJldHVybiBidXR0b247XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2Zvcm1CdG5TYWNyaWZpY2VIZWxwZXI8VE1vZGVsIGV4dGVuZHMgVW5zYWZlVHJhbnNmb3JtQnRuTW9kZWw+KFxuICAgIGF2YWlsYWJsZTogbnVtYmVyLFxuICAgIHRvdGFsOiBudW1iZXIsXG4gICAgY29udHJvbGxlcjogVHJhbnNmb3JtQnRuQ29udHJvbGxlcjxUTW9kZWw+LFxuICAgIG1vZGVsOiBUTW9kZWwsXG4gICkge1xuICAgIGNvbnN0IGNvbnZlcnNpb25QZXJjZW50YWdlID0gYXZhaWxhYmxlIC8gdG90YWw7XG4gICAgY29uc3QgcGVyY2VudGFnZUludmVyc2UgPSAxIC8gY29udmVyc2lvblBlcmNlbnRhZ2U7XG5cbiAgICBjb25zdCBjdXN0b21Db250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkucmVsaWdpb24uVHJhbnNmb3JtQnRuQ29udHJvbGxlcihcbiAgICAgIGdhbWUsXG4gICAgICBjb250cm9sbGVyLmNvbnRyb2xsZXJPcHRzLFxuICAgICkgYXMgVHJhbnNmb3JtQnRuQ29udHJvbGxlcjxUTW9kZWwsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuICAgIGNvbnN0IGxpbmsgPSBjdXN0b21Db250cm9sbGVyLl9uZXdMaW5rKG1vZGVsLCBwZXJjZW50YWdlSW52ZXJzZSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KHJlc29sdmUgPT4ge1xuICAgICAgbGluay5oYW5kbGVyKG5ldyBFdmVudChcImRlY295XCIpLCByZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2F1dG9TYWNyaWZpY2VVbmljb3JucygpIHtcbiAgICBjb25zdCB1bmljb3JucyA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcInVuaWNvcm5zXCIpO1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInVuaWNvcm5zXCIpO1xuXG4gICAgaWYgKFxuICAgICAgIWlzTmlsKHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5zYWNyaWZpY2VCdG4pICYmXG4gICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5zYWNyaWZpY2VVbmljb3Jucy50cmlnZ2VyKSA8PSBhdmFpbGFibGUgJiZcbiAgICAgIG5lZ2F0aXZlT25lVG9JbmZpbml0eSh0aGlzLnNldHRpbmdzLnNhY3JpZmljZVVuaWNvcm5zLnRyaWdnZXIpIDw9IHVuaWNvcm5zLnZhbHVlXG4gICAgKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUJ0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQnRuLm1vZGVsO1xuXG4gICAgICBpZiAoaXNOaWwobW9kZWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNmb3JtQnRuU2FjcmlmaWNlSGVscGVyKGF2YWlsYWJsZSwgdW5pY29ybnMudmFsdWUsIGNvbnRyb2xsZXIsIG1vZGVsKTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlTm93ID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwidW5pY29ybnNcIik7XG4gICAgICBjb25zdCBjb3N0ID0gYXZhaWxhYmxlIC0gYXZhaWxhYmxlTm93O1xuXG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICAgIFwiYWN0LnNhY3JpZmljZVVuaWNvcm5zXCIsXG4gICAgICAgIFt0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGNvc3QpXSxcbiAgICAgICAgXCJrcy1mYWl0aFwiLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaTE4bihcIiRyZXNvdXJjZXMudW5pY29ybnMudGl0bGVcIiksXG4gICAgICAgIGNvc3QsXG4gICAgICAgIFwicmVmaW5lXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2F1dG9TYWNyaWZpY2VBbGljb3Jucyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBjb25zdCBhbGljb3JucyA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImFsaWNvcm5cIik7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwiYWxpY29yblwiKTtcbiAgICBpZiAoXG4gICAgICAhaXNOaWwodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUFsaWNvcm5zQnRuKSAmJlxuICAgICAgbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3Muc2FjcmlmaWNlQWxpY29ybnMudHJpZ2dlcikgPD0gYXZhaWxhYmxlICYmXG4gICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5zYWNyaWZpY2VBbGljb3Jucy50cmlnZ2VyKSA8PSBhbGljb3Jucy52YWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnNhY3JpZmljZUFsaWNvcm5zQnRuLnJlbmRlcigpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5zYWNyaWZpY2VBbGljb3Juc0J0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIuc2FjcmlmaWNlQWxpY29ybnNCdG4ubW9kZWw7XG5cbiAgICAgIGlmIChpc05pbChtb2RlbCkpIHtcbiAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNmb3JtQnRuU2FjcmlmaWNlSGVscGVyKGF2YWlsYWJsZSwgYWxpY29ybnMudmFsdWUsIGNvbnRyb2xsZXIsIG1vZGVsKTtcblxuICAgICAgY29uc3QgYXZhaWxhYmxlTm93ID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwiYWxpY29yblwiKTtcbiAgICAgIGNvbnN0IGNvc3QgPSBhdmFpbGFibGUgLSBhdmFpbGFibGVOb3c7XG5cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3Quc2FjcmlmaWNlQWxpY29ybnNcIixcbiAgICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoY29zdCldLFxuICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICApO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFxuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlc291cmNlcy5hbGljb3JuLnRpdGxlXCIpLFxuICAgICAgICBjb3N0LFxuICAgICAgICBcInJlZmluZVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hdXRvVGVhcnMoY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgY29uc3QgdGVhcnMgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJ0ZWFyc1wiKTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0ZWFyc1wiKTtcbiAgICBjb25zdCBzb3Jyb3cgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJzb3Jyb3dcIik7XG4gICAgaWYgKFxuICAgICAgIWlzTmlsKHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5yZWZpbmVCdG4pICYmXG4gICAgICBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5yZWZpbmVUZWFycy50cmlnZ2VyKSA8PSBhdmFpbGFibGUgJiZcbiAgICAgIG5lZ2F0aXZlT25lVG9JbmZpbml0eSh0aGlzLnNldHRpbmdzLnJlZmluZVRlYXJzLnRyaWdnZXIpIDw9IHRlYXJzLnZhbHVlICYmXG4gICAgICBzb3Jyb3cudmFsdWUgPCBzb3Jyb3cubWF4VmFsdWVcbiAgICApIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUZvckNvbnZlcnNpb24gPSBhdmFpbGFibGUgLSB0aGlzLnNldHRpbmdzLnJlZmluZVRlYXJzLnRyaWdnZXI7XG5cbiAgICAgIGlmIChhdmFpbGFibGVGb3JDb252ZXJzaW9uIDwgMTAwMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnJlZmluZUJ0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIucmVmaW5lQnRuLm1vZGVsO1xuXG4gICAgICBpZiAoaXNOaWwobW9kZWwpKSB7XG4gICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2xsZXIuYnV5SXRlbShtb2RlbCwgbmV3IEV2ZW50KFwiZGVjb3lcIiksIGF2YWlsYWJsZUZvckNvbnZlcnNpb24pO1xuXG4gICAgICBjb25zdCBhdmFpbGFibGVOb3cgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0ZWFyc1wiKTtcbiAgICAgIGNvbnN0IGNvc3QgPSBhdmFpbGFibGUgLSBhdmFpbGFibGVOb3c7XG5cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QucmVmaW5lVGVhcnNcIixcbiAgICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoY29zdCldLFxuICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICApO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFxuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlc291cmNlcy50ZWFycy50aXRsZVwiKSxcbiAgICAgICAgY29zdCxcbiAgICAgICAgXCJyZWZpbmVcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfYXV0b1RDcyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBjb25zdCB0aW1lQ3J5c3RhbHMgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJ0aW1lQ3J5c3RhbFwiKTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0aW1lQ3J5c3RhbFwiKTtcbiAgICBpZiAoXG4gICAgICAhaXNOaWwodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uVGFiLnJlZmluZVRDQnRuKSAmJlxuICAgICAgbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzLnRyaWdnZXIpIDw9IGF2YWlsYWJsZSAmJlxuICAgICAgbmVnYXRpdmVPbmVUb0luZmluaXR5KHRoaXMuc2V0dGluZ3MucmVmaW5lVGltZUNyeXN0YWxzLnRyaWdnZXIpIDw9IHRpbWVDcnlzdGFscy52YWx1ZVxuICAgICkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvblRhYi5yZWZpbmVUQ0J0bi5jb250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb25UYWIucmVmaW5lVENCdG4ubW9kZWw7XG5cbiAgICAgIGlmIChpc05pbChtb2RlbCkpIHtcbiAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNmb3JtQnRuU2FjcmlmaWNlSGVscGVyKGF2YWlsYWJsZSwgdGltZUNyeXN0YWxzLnZhbHVlLCBjb250cm9sbGVyLCBtb2RlbCk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZU5vdyA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInRpbWVDcnlzdGFsXCIpO1xuICAgICAgY29uc3QgY29zdCA9IGF2YWlsYWJsZSAtIGF2YWlsYWJsZU5vdztcblxuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFxuICAgICAgICBcImFjdC5yZWZpbmVUQ3NcIixcbiAgICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoY29zdCldLFxuICAgICAgICBcImtzLWZhaXRoXCIsXG4gICAgICApO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFxuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlc291cmNlcy50aW1lQ3J5c3RhbC50aXRsZVwiKSxcbiAgICAgICAgY29zdCxcbiAgICAgICAgXCJyZWZpbmVcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b1RBUCgpIHtcbiAgICBjb25zdCBmYWl0aCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImZhaXRoXCIpO1xuICAgIGNvbnN0IGZhaXRoTGV2ZWwgPSBmYWl0aC52YWx1ZSAvIGZhaXRoLm1heFZhbHVlO1xuICAgIC8vIGVub3VnaCBmYWl0aCwgYW5kIHRoZW4gVEFQICh0cmFuc2NlbmQsIGFkb3JlLCBwcmFpc2UpXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudHJhbnNjZW5kLmVuYWJsZWQgJiYgdGhpcy5zZXR0aW5ncy5hdXRvUHJhaXNlLnRyaWdnZXIgLSAwLjAyIDw9IGZhaXRoTGV2ZWwpIHtcbiAgICAgIHRoaXMuX2F1dG9UcmFuc2NlbmQoKTtcbiAgICB9XG5cbiAgICAvLyBQcmFpc2UgKGZhaXRoIOKGkiB3b3JzaGlwKVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QcmFpc2UudHJpZ2dlciA8PSBmYWl0aExldmVsKSB7XG4gICAgICAvLyBBZG9yZSB0aGUgZ2FsYXh5ICh3b3JzaGlwIOKGkiBlcGlwaGFueSlcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hZG9yZS5lbmFibGVkICYmXG4gICAgICAgIG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24uZ2V0UlUoXCJhcG9jcmlwaGFcIikpLm9uXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fYXV0b0Fkb3JlKHRoaXMuc2V0dGluZ3MuYWRvcmUudHJpZ2dlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9QcmFpc2UuZW5hYmxlZCkge1xuICAgICAgICB0aGlzLl9hdXRvUHJhaXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b0Fkb3JlKHRyaWdnZXI6IG51bWJlcikge1xuICAgIGNvbnN0IGZhaXRoID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiZmFpdGhcIik7XG5cbiAgICBjb25zdCB3b3JzaGlwID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmZhaXRoO1xuICAgIGNvbnN0IGVwaXBoYW55ID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmZhaXRoUmF0aW87XG4gICAgY29uc3QgdHJhbnNjZW5kZW5jZVJlYWNoZWQgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFJVKFwidHJhbnNjZW5kZW5jZVwiKSkub247XG4gICAgY29uc3QgdHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50ID0gdHJhbnNjZW5kZW5jZVJlYWNoZWRcbiAgICAgID8gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLnRyYW5zY2VuZGVuY2VUaWVyXG4gICAgICA6IDA7XG4gICAgLy8gZ2FtZSB2ZXJzaW9uOiAxLjQuOC4xXG4gICAgLy8gc29sYXJSZXZvbHV0aW9uTGltaXQgaXMgaW5jcmVhc2VkIGJ5IGJsYWNrIG9iZWxpc2tzLlxuICAgIGNvbnN0IG1heFNvbGFyUmV2b2x1dGlvbiA9IDEwICsgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInNvbGFyUmV2b2x1dGlvbkxpbWl0XCIpO1xuICAgIC8vIFRoZSBhYnNvbHV0ZSB2YWx1ZSBhdCB3aGljaCB0byB0cmlnZ2VyIGFkb3JpbmcgdGhlIGdhbGF4eS5cbiAgICBjb25zdCB0cmlnZ2VyU29sYXJSZXZvbHV0aW9uID0gbWF4U29sYXJSZXZvbHV0aW9uICogdHJpZ2dlcjtcbiAgICAvLyBIb3cgbXVjaCBlcGlwaGFueSB3ZSdsbCBnZXQgZnJvbSBjb252ZXJ0aW5nIG91ciB3b3JzaGlwLlxuICAgIGNvbnN0IGVwaXBoYW55SW5jcmVhc2UgPVxuICAgICAgKHdvcnNoaXAgLyAxMDAwMDAwKSAqIHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCAqIHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCAqIDEuMDE7XG4gICAgLy8gSG93IG11Y2ggZXBpcGhhbnkgd2UnbGwgaGF2ZSBhZnRlciBhZG9yaW5nLlxuICAgIGNvbnN0IGVwaXBoYW55QWZ0ZXJBZG9yZSA9IGVwaXBoYW55ICsgZXBpcGhhbnlJbmNyZWFzZTtcbiAgICAvLyBIb3cgbXVjaCB3b3JzaGlwIHdlJ2xsIGhhdmUgYWZ0ZXIgYWRvcmluZy5cbiAgICBjb25zdCB3b3JzaGlwQWZ0ZXJBZG9yZSA9XG4gICAgICAwLjAxICsgZmFpdGgudmFsdWUgKiAoMSArIHRoaXMuX2hvc3QuZ2FtZS5nZXRVbmxpbWl0ZWREUihlcGlwaGFueUFmdGVyQWRvcmUsIDAuMSkgKiAwLjEpO1xuICAgIC8vIEhvdyBtdWNoIHNvbGFyIHJldm9sdXRpb24gYm9udXMgd2UnbGwgaGF2ZSBhZnRlciBhZG9yaW5nLlxuICAgIGNvbnN0IHNvbGFyUmV2b2x1dGlvbkFmdGVyQWRvcmUgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKFxuICAgICAgdGhpcy5faG9zdC5nYW1lLmdldFVubGltaXRlZERSKHdvcnNoaXBBZnRlckFkb3JlLCAxMDAwKSAvIDEwMCxcbiAgICAgIG1heFNvbGFyUmV2b2x1dGlvbixcbiAgICApO1xuICAgIC8vIEFmdGVyIGFkb3JpbmcgdGhlIGdhbGF4eSwgd2Ugd2FudCBhIHNpbmdsZSBwcmFpc2UgdG8gYmUgYWJsZSB0byByZWFjaCB0aGUgdHJpZ2dlclxuICAgIC8vIGxldmVsIG9mIHNvbGFyIHJldm9sdXRpb24gYm9udXMuXG4gICAgaWYgKHRyaWdnZXJTb2xhclJldm9sdXRpb24gPD0gc29sYXJSZXZvbHV0aW9uQWZ0ZXJBZG9yZSkge1xuICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIGFkb3JhdGlvbi5cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi5fcmVzZXRGYWl0aEludGVybmFsKDEuMDEpO1xuXG4gICAgICAvLyBMb2cgdGhlIGFjdGlvbi5cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QuYWRvcmVcIixcbiAgICAgICAgW1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQod29yc2hpcCksXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChlcGlwaGFueUluY3JlYXNlKSxcbiAgICAgICAgXSxcbiAgICAgICAgXCJrcy1hZG9yZVwiLFxuICAgICAgKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcImFkb3JlXCIsIGVwaXBoYW55SW5jcmVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F1dG9UcmFuc2NlbmQoKSB7XG4gICAgbGV0IGVwaXBoYW55ID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmZhaXRoUmF0aW87XG4gICAgY29uc3QgdHJhbnNjZW5kZW5jZVJlYWNoZWQgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFJVKFwidHJhbnNjZW5kZW5jZVwiKSkub247XG4gICAgbGV0IHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCA9IHRyYW5zY2VuZGVuY2VSZWFjaGVkXG4gICAgICA/IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi50cmFuc2NlbmRlbmNlVGllclxuICAgICAgOiAwO1xuXG4gICAgLy8gVHJhbnNjZW5kXG4gICAgaWYgKHRyYW5zY2VuZGVuY2VSZWFjaGVkKSB7XG4gICAgICAvLyBIb3cgbXVjaCBvdXIgYWRvcmF0aW9uIHJhdGlvIGluY3JlYXNlcyBmcm9tIHRyYW5zY2VuZGluZy5cbiAgICAgIGNvbnN0IGFkb3JlSW5jcmVhc2VSYXRpbyA9XG4gICAgICAgICgodHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50ICsgMikgLyAodHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50ICsgMSkpICoqIDI7XG4gICAgICAvLyBUaGUgYW1vdW50IG9mIHdvcnNoaXAgbmVlZGVkIHRvIHVwZ3JhZGUgdG8gdGhlIG5leHQgbGV2ZWwuXG4gICAgICBjb25zdCBuZWVkTmV4dExldmVsID1cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLl9nZXRUcmFuc2NlbmRUb3RhbFByaWNlKHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCArIDEpIC1cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLl9nZXRUcmFuc2NlbmRUb3RhbFByaWNlKHRyYW5zY2VuZGVuY2VUaWVyQ3VycmVudCk7XG5cbiAgICAgIC8vIFdlIHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSBpZGVhbCB2YWx1ZSBmb3Igd2hlbiB0byB0cmFuc2NlbmQuXG4gICAgICAvLyBUT0RPOiBIb3cgZXhhY3RseSB0aGlzIHdvcmtzIGlzbid0IHVuZGVyc3Rvb2QgeWV0LlxuICAgICAgY29uc3QgeCA9IG5lZWROZXh0TGV2ZWw7XG4gICAgICBjb25zdCBrID0gYWRvcmVJbmNyZWFzZVJhdGlvO1xuICAgICAgY29uc3QgZXBpcGhhbnlSZWNvbW1lbmQgPVxuICAgICAgICAoKDEgLSBrICsgTWF0aC5zcXJ0KDgwICogKGsgKiBrIC0gMSkgKiB4ICsgKGsgLSAxKSAqIChrIC0gMSkpKSAqIGspIC9cbiAgICAgICAgICAoNDAgKiAoayArIDEpICogKGsgKyAxKSAqIChrIC0gMSkpICtcbiAgICAgICAgeCArXG4gICAgICAgIHggLyAoayAqIGsgLSAxKTtcblxuICAgICAgaWYgKGVwaXBoYW55UmVjb21tZW5kIDw9IGVwaXBoYW55KSB7XG4gICAgICAgIC8vIGNvZGUgY29weSBmcm9tIGtpdHRlbnMgZ2FtZSdzIHJlbGlnaW9uLmpzOiB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kKClcbiAgICAgICAgLy8gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLnRyYW5zY2VuZCgpIG5lZWQgY29uZmlybSBieSBwbGF5ZXJcbiAgICAgICAgLy8gZ2FtZSB2ZXJzaW9uOiAxLjQuOC4xXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERPIFRSQU5TQ0VORCBTVEFSVFxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24uZmFpdGhSYXRpbyAtPSBuZWVkTmV4dExldmVsO1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udGNyYXRpbyArPSBuZWVkTmV4dExldmVsO1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVRpZXIgKz0gMTtcblxuICAgICAgICBjb25zdCBhdGhlaXNtID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmdldENoYWxsZW5nZShcImF0aGVpc21cIikpO1xuICAgICAgICBhdGhlaXNtLmNhbGN1bGF0ZUVmZmVjdHM/LihhdGhlaXNtLCB0aGlzLl9ob3N0LmdhbWUpO1xuICAgICAgICBjb25zdCBibGFja09iZWxpc2sgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFRVKFwiYmxhY2tPYmVsaXNrXCIpKTtcbiAgICAgICAgYmxhY2tPYmVsaXNrLmNhbGN1bGF0ZUVmZmVjdHM/LihibGFja09iZWxpc2ssIHRoaXMuX2hvc3QuZ2FtZSk7XG5cbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLm1zZyhcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnRyYW5zY2VuZC5tc2cuc3VjY2Vzc1wiLCBbXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVRpZXIsXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERPIFRSQU5TQ0VORCBFTkRcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgICBlcGlwaGFueSA9IHRoaXMuX2hvc3QuZ2FtZS5yZWxpZ2lvbi5mYWl0aFJhdGlvO1xuICAgICAgICB0cmFuc2NlbmRlbmNlVGllckN1cnJlbnQgPSB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVRpZXI7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgICBcImFjdC50cmFuc2NlbmRcIixcbiAgICAgICAgICBbdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChuZWVkTmV4dExldmVsKSwgdHJhbnNjZW5kZW5jZVRpZXJDdXJyZW50XSxcbiAgICAgICAgICBcImtzLXRyYW5zY2VuZFwiLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJ0cmFuc2NlbmRcIiwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXV0b1ByYWlzZSgpIHtcbiAgICBjb25zdCBmYWl0aCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImZhaXRoXCIpO1xuICAgIGNvbnN0IGFwb2NyeXBoYUJvbnVzID0gdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldEFwb2NyeXBoYUJvbnVzKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggd29yc2hpcCB3ZSdsbCBnYWluIGFuZCBsb2cgaXQuXG4gICAgY29uc3Qgd29yc2hpcEluY3JlYXNlID0gZmFpdGgudmFsdWUgKiAoMSArIGFwb2NyeXBoYUJvbnVzKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJwcmFpc2VcIiwgd29yc2hpcEluY3JlYXNlKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICBcImFjdC5wcmFpc2VcIixcbiAgICAgIFtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChmYWl0aC52YWx1ZSksXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQod29yc2hpcEluY3JlYXNlKSxcbiAgICAgIF0sXG4gICAgICBcImtzLXByYWlzZVwiLFxuICAgICk7XG5cbiAgICAvLyBOb3cgZmluYWxseSBwcmFpc2UgdGhlIHN1bi5cbiAgICB0aGlzLl9ob3N0LmdhbWUucmVsaWdpb24ucHJhaXNlKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvYXJyYXkuanNcIjtcbmltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZVBhZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHsgUG9saWNpZXMsIHR5cGUgUG9saWN5IH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFBvbGljeVNldHRpbmcgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgI3BvbGljeTogUG9saWN5O1xuXG4gIGdldCBwb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BvbGljeTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBvbGljeTogUG9saWN5LCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLiNwb2xpY3kgPSBwb2xpY3k7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUG9saWN5UG9saWN5U2V0dGluZ3MgPSBSZWNvcmQ8UG9saWN5LCBQb2xpY3lTZXR0aW5nPjtcblxuZXhwb3J0IGNsYXNzIFBvbGljeVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIHBvbGljaWVzOiBQb2xpY3lQb2xpY3lTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnBvbGljaWVzID0gdGhpcy5pbml0UG9saWNpZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBvbGljaWVzKCk6IFBvbGljeVBvbGljeVNldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFBvbGljeVBvbGljeVNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBQb2xpY2llcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUG9saWN5U2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IFBvbGljeVNldHRpbmdzKSB7XG4gICAgY29uc3QgaW5TZXR0aW5ncyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnBvbGljaWVzKTtcbiAgICBjb25zdCBpbkdhbWUgPSBnYW1lLnNjaWVuY2UucG9saWNpZXMubWFwKHBvbGljeSA9PiBwb2xpY3kubmFtZSk7XG5cbiAgICBjb25zdCBtaXNzaW5nSW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5HYW1lLCBpblNldHRpbmdzKTtcbiAgICBjb25zdCByZWR1bmRhbnRJblNldHRpbmdzID0gZGlmZmVyZW5jZShpblNldHRpbmdzLCBpbkdhbWUpO1xuXG4gICAgZm9yIChjb25zdCBwb2xpY3kgb2YgbWlzc2luZ0luU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChgVGhlIHBvbGljeSAnJHtwb2xpY3l9JyBpcyBub3QgdHJhY2tlZCBpbiBLaXR0ZW4gU2NpZW50aXN0cyFgKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcG9saWN5IG9mIHJlZHVuZGFudEluU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChgVGhlIHBvbGljeSAnJHtwb2xpY3l9JyBpcyBub3QgYSBwb2xpY3kgaW4gS2l0dGVucyBHYW1lIWApKTtcbiAgICB9XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFBvbGljeVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMucG9saWNpZXMsIHNldHRpbmdzLnBvbGljaWVzLCAocG9saWN5LCBpdGVtKSA9PiB7XG4gICAgICBwb2xpY3kuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gcG9saWN5LmVuYWJsZWQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGRpZmZlcmVuY2UgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvYXJyYXkuanNcIjtcbmltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZVBhZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHtcbiAgVGVjaG5vbG9naWVzLFxuICBUZWNobm9sb2dpZXNJZ25vcmVkLFxuICB0eXBlIFRlY2hub2xvZ3ksXG4gIHR5cGUgVGVjaG5vbG9neUlnbm9yZWQsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG50eXBlIEFueVRlY2hub2xvZ3kgPSBUZWNobm9sb2d5IHwgVGVjaG5vbG9neUlnbm9yZWQ7XG5cbmV4cG9ydCBjbGFzcyBUZWNoU2V0dGluZyBleHRlbmRzIFNldHRpbmdUcmlnZ2VyIHtcbiAgcmVhZG9ubHkgI3RlY2g6IFRlY2hub2xvZ3k7XG5cbiAgZ2V0IHRlY2goKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RlY2g7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0ZWNoOiBUZWNobm9sb2d5LCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkLCAtMSk7XG4gICAgdGhpcy4jdGVjaCA9IHRlY2g7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVGVjaFRlY2hTZXR0aW5ncyA9IFJlY29yZDxUZWNobm9sb2d5LCBUZWNoU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBUZWNoU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIHRlY2hzOiBUZWNoVGVjaFNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIC0xKTtcbiAgICB0aGlzLnRlY2hzID0gdGhpcy5pbml0VGVjaHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRlY2hzKCk6IFRlY2hUZWNoU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVGVjaFRlY2hTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVGVjaG5vbG9naWVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBUZWNoU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IFRlY2hTZXR0aW5ncykge1xuICAgIGNvbnN0IGluU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy50ZWNocyk7XG4gICAgY29uc3QgaW5HYW1lID0gZ2FtZS5zY2llbmNlLnRlY2hzLm1hcCh0ZWNoID0+IHRlY2gubmFtZSk7XG5cbiAgICBjb25zdCBtaXNzaW5nSW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5HYW1lLCBpblNldHRpbmdzKSBhcyBBcnJheTxBbnlUZWNobm9sb2d5PjtcbiAgICBjb25zdCByZWR1bmRhbnRJblNldHRpbmdzID0gZGlmZmVyZW5jZShpblNldHRpbmdzLCBpbkdhbWUpIGFzIEFycmF5PEFueVRlY2hub2xvZ3k+O1xuXG4gICAgZm9yIChjb25zdCB0ZWNoIG9mIG1pc3NpbmdJblNldHRpbmdzKSB7XG4gICAgICBpZiAoVGVjaG5vbG9naWVzSWdub3JlZC5pbmNsdWRlcyh0ZWNoIGFzIFRlY2hub2xvZ3lJZ25vcmVkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBUaGUgdGVjaG5vbG9neSAnJHt0ZWNofScgaXMgbm90IHRyYWNrZWQgaW4gS2l0dGVuIFNjaWVudGlzdHMhYCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRlY2ggb2YgcmVkdW5kYW50SW5TZXR0aW5ncykge1xuICAgICAgaWYgKFRlY2hub2xvZ2llc0lnbm9yZWQuaW5jbHVkZXModGVjaCBhcyBUZWNobm9sb2d5SWdub3JlZCkpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIC4uLmNsKFxuICAgICAgICAgICAgYFRoZSB0ZWNobm9sb2d5ICcke3RlY2h9JyBpcyBhIHRlY2hub2xvZ3kgaW4gS2l0dGVucyBHYW1lLCBidXQgaXQncyBubyBsb25nZXIgdXNlZC5gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB0ZWNobm9sb2d5ICcke3RlY2h9JyBpcyBub3QgYSB0ZWNobm9sb2d5IGluIEtpdHRlbnMgR2FtZSFgKSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxUZWNoU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy50ZWNocywgc2V0dGluZ3MudGVjaHMsICh0ZWNoLCBpdGVtKSA9PiB7XG4gICAgICB0ZWNoLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHRlY2guZW5hYmxlZDtcbiAgICAgIHRlY2gudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gdGVjaC50cmlnZ2VyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZVBhZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHsgUG9saWN5U2V0dGluZ3MgfSBmcm9tIFwiLi9Qb2xpY3lTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUZWNoU2V0dGluZ3MgfSBmcm9tIFwiLi9UZWNoU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IHR5cGUgU2NpZW5jZUl0ZW0gPSBcInBvbGljaWVzXCIgfCBcInRlY2hzXCI7XG5leHBvcnQgdHlwZSBTY2llbmNlU2V0dGluZ3NJdGVtID0gVGVjaFNldHRpbmdzIHwgUG9saWN5U2V0dGluZ3M7XG5cbmV4cG9ydCBjbGFzcyBTY2llbmNlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcG9saWNpZXM6IFBvbGljeVNldHRpbmdzO1xuICB0ZWNoczogVGVjaFNldHRpbmdzO1xuICBvYnNlcnZlOiBTZXR0aW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICBwb2xpY2llcyA9IG5ldyBQb2xpY3lTZXR0aW5ncygpLFxuICAgIHRlY2hzID0gbmV3IFRlY2hTZXR0aW5ncygpLFxuICAgIG9ic2VydmUgPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnBvbGljaWVzID0gcG9saWNpZXM7XG4gICAgdGhpcy50ZWNocyA9IHRlY2hzO1xuICAgIHRoaXMub2JzZXJ2ZSA9IG9ic2VydmU7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVHYW1lKGdhbWU6IEdhbWVQYWdlLCBzZXR0aW5nczogU2NpZW5jZVNldHRpbmdzKSB7XG4gICAgUG9saWN5U2V0dGluZ3MudmFsaWRhdGVHYW1lKGdhbWUsIHNldHRpbmdzLnBvbGljaWVzKTtcbiAgICBUZWNoU2V0dGluZ3MudmFsaWRhdGVHYW1lKGdhbWUsIHNldHRpbmdzLnRlY2hzKTtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8U2NpZW5jZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICB0aGlzLnBvbGljaWVzLmxvYWQoc2V0dGluZ3MucG9saWNpZXMpO1xuICAgIHRoaXMudGVjaHMubG9hZChzZXR0aW5ncy50ZWNocyk7XG5cbiAgICB0aGlzLm9ic2VydmUuZW5hYmxlZCA9IHNldHRpbmdzLm9ic2VydmU/LmVuYWJsZWQgPz8gdGhpcy5vYnNlcnZlLmVuYWJsZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB0eXBlIHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9saWN5LCBUZWNobm9sb2d5LCBVcGdyYWRlIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgUG9saWN5QnRuQ29udHJvbGxlciwgVGVjaEJ1dHRvbkNvbnRyb2xsZXIgfSBmcm9tIFwiLi90eXBlcy9zY2llbmNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVwZ3JhZGVCdXR0b25Db250cm9sbGVyIH0gZnJvbSBcIi4vdHlwZXMvd29ya3Nob3AuanNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVwZ3JhZGVNYW5hZ2VyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICBhYnN0cmFjdCBtYW5hZ2VyOiBUYWJNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEtpdHRlblNjaWVudGlzdHMpIHtcbiAgICB0aGlzLl9ob3N0ID0gaG9zdDtcbiAgfVxuXG4gIHVwZ3JhZGUoXG4gICAgdXBncmFkZTogeyBsYWJlbDogc3RyaW5nOyBuYW1lOiBQb2xpY3kgfCBVcGdyYWRlIHwgVGVjaG5vbG9neSB9LFxuICAgIHZhcmlhbnQ6IFwicG9saWN5XCIgfCBcInNjaWVuY2VcIiB8IFwid29ya3Nob3BcIixcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICBpZiAodmFyaWFudCA9PT0gXCJwb2xpY3lcIikge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZSh1cGdyYWRlLm5hbWUsIFwicG9saWNpZXNcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkuUG9saWN5QnRuQ29udHJvbGxlcih0aGlzLl9ob3N0LmdhbWUpIGFzIFBvbGljeUJ0bkNvbnRyb2xsZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IGNvbnRyb2xsZXIuZmV0Y2hNb2RlbCh7IGNvbnRyb2xsZXIsIGlkOiBpdGVtTWV0YVJhdy5uYW1lIH0pO1xuICAgICAgc3VjY2VzcyA9IFVwZ3JhZGVNYW5hZ2VyLnNraXBDb25maXJtKCgpID0+IGNvbnRyb2xsZXIuYnV5SXRlbShtb2RlbCkpLml0ZW1Cb3VnaHQ7XG4gICAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBcInNjaWVuY2VcIikge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZSh1cGdyYWRlLm5hbWUsIFwidGVjaFwiKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY29tLm51Y2xlYXJ1bmljb3JuLmdhbWUudWkuVGVjaEJ1dHRvbkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgVGVjaEJ1dHRvbkNvbnRyb2xsZXI7XG4gICAgICBjb25zdCBtb2RlbCA9IGNvbnRyb2xsZXIuZmV0Y2hNb2RlbCh7IGNvbnRyb2xsZXIsIGlkOiBpdGVtTWV0YVJhdy5uYW1lIH0pO1xuICAgICAgc3VjY2VzcyA9IFVwZ3JhZGVNYW5hZ2VyLnNraXBDb25maXJtKCgpID0+IGNvbnRyb2xsZXIuYnV5SXRlbShtb2RlbCkpLml0ZW1Cb3VnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZW1NZXRhUmF3ID0gZ2FtZS5nZXRVbmxvY2tCeU5hbWUodXBncmFkZS5uYW1lLCBcInVwZ3JhZGVzXCIpO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBjb20ubnVjbGVhcnVuaWNvcm4uZ2FtZS51aS5VcGdyYWRlQnV0dG9uQ29udHJvbGxlcihcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLFxuICAgICAgKSBhcyBVcGdyYWRlQnV0dG9uQ29udHJvbGxlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gY29udHJvbGxlci5mZXRjaE1vZGVsKHsgY29udHJvbGxlciwgaWQ6IGl0ZW1NZXRhUmF3Lm5hbWUgfSk7XG4gICAgICBzdWNjZXNzID0gVXBncmFkZU1hbmFnZXIuc2tpcENvbmZpcm0oKCkgPT4gY29udHJvbGxlci5idXlJdGVtKG1vZGVsKSkuaXRlbUJvdWdodDtcbiAgICB9XG5cbiAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbCA9IHVwZ3JhZGUubGFiZWw7XG5cbiAgICBpZiAodmFyaWFudCA9PT0gXCJ3b3Jrc2hvcFwiKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkobGFiZWwsIDEsIFwidXBncmFkZVwiKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUudXBncmFkZVwiLCBbbGFiZWxdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBcInBvbGljeVwiKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnBvbGljeVwiLCBbbGFiZWxdKTtcbiAgICB9IGVsc2UgaWYgKHZhcmlhbnQgPT09IFwic2NpZW5jZVwiKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkobGFiZWwsIDEsIFwicmVzZWFyY2hcIik7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnRlY2hcIiwgW2xhYmVsXSwgXCJrcy1yZXNlYXJjaFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBwaWVjZSBvZiBjb2RlIHRoYXQgbWlnaHQgaW52b2tlIFVJIGNvbmZpcm1hdGlvbiBhbmRcbiAgICogc2tpcCB0aGF0IFVJIGNvbmZpcm1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbiBUaGUgZnVuY3Rpb24gdG8gcnVuIHdpdGhvdXQgVUkgY29uZmlybWF0aW9uLlxuICAgKiBAcmV0dXJucyBXaGF0ZXZlciBgYWN0aW9uYCByZXR1cm5zLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNraXBDb25maXJtQXN5bmM8VD4oYWN0aW9uOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25maXJtID0gZ2FtZS51aS5jb25maXJtO1xuICAgIHRyeSB7XG4gICAgICBnYW1lLnVpLmNvbmZpcm0gPSAoKSA9PiB0cnVlO1xuICAgICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBnYW1lLnVpLmNvbmZpcm0gPSBvcmlnaW5hbENvbmZpcm07XG4gICAgfVxuICB9XG4gIHN0YXRpYyBza2lwQ29uZmlybTxUPihhY3Rpb246ICgpID0+IFQpOiBUIHtcbiAgICBjb25zdCBvcmlnaW5hbENvbmZpcm0gPSBnYW1lLnVpLmNvbmZpcm07XG4gICAgdHJ5IHtcbiAgICAgIGdhbWUudWkuY29uZmlybSA9ICgpID0+IHRydWU7XG4gICAgICByZXR1cm4gYWN0aW9uKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGdhbWUudWkuY29uZmlybSA9IG9yaWdpbmFsQ29uZmlybTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIi4uL2Vycm9ycy9jb25zb2xlLmpzXCI7XG4vKipcbiAqIFdyYXBzIHRoZSBnaXZlbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYSBuZXcgZnVuY3Rpb24gdGhhdCB3aWxsIGlnbm9yZSBhbnkgb3V0Y29tZSBvZlxuICogdGhlIGNvbnRleHQgYXMgaXQgcmVzb2x2ZXMuXG4gKlxuICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gcHJvdmlkaW5nIGFzeW5jaG9ub3VzIGV2ZW50IGhhbmRsZXIgdG8gYC5hZGRFdmVudGxpc3RlbmVyKClgLFxuICogd2hpY2ggb25seSBleHBlY3RzIHN5bmNocm9ub3VzIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBleGVjdXRlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiByZXR1cm5pbmcgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IHByZXBhcmVBc3luY0NvbnRleHQgPSAoY29udGV4dCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0aGF0IG91ciBuZXcgZnVuY3Rpb24gd2FzIGNhbGxlZCB3aXRoLlxuICAgICAqL1xuICAgIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgdm9pZCBjb250ZXh0KC4uLmFyZ3MpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB1bmRlZmluZWQpXG4gICAgICAgICAgICAuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgIH07XG59O1xuLyoqXG4gKiBFeGVjdXRlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJlc29sdmVzIHdpdGggYW4gYWx0ZXJuYXRpdmUgcmVzdWx0XG4gKiBpbiBjYXNlIHRoZSBmdW5jdGlvbiBmYWlsZWQuXG4gKiBAcGFyYW0gZXhlY3V0YWJsZSAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSB0byAtIFRoZSByZXN1bHQgd2Ugd2FudCB0byByZXR1cm4gd2hlbiB0aGUgZnVuY3Rpb24gZXJyb3JzLlxuICogQHBhcmFtIGZpbHRlciAtIEFuIHtAbGlua2NvZGUgIUVycm9yfSBzdWJjbGFzcy4gSWYgZGVmaW5lZCwgb25seSBlcnJvcnMgb2ZcbiAqIHRoaXMgdHlwZSB3aWxsIGJlIGNvYWxlc2NlZC5cbiAqIEB0eXBlUGFyYW0gVEV4ZWN1dGFibGVSZXR1cm4gLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLlxuICogQHR5cGVQYXJhbSBUQ29hbGVzY2UgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGNvYWxlc2NlIHRvLlxuICogQHR5cGVQYXJhbSBURmlsdGVyIC0gVGhlIHR5cGUgb2YgdGhlIGVycm9yIGZpbHRlci5cbiAqIEByZXR1cm5zIFdoYXRldmVyIHRoZSBmdW5jdGlvbiByZXNvbHZlZCB0bywgb3IgdGhlIHByb3ZpZGVkIHJlcGxhY2VtZW50LFxuICogaW4gY2FzZSB0aGUgZnVuY3Rpb24gZmFpbGVkLlxuICovXG5leHBvcnQgY29uc3QgY29hbGVzY2VPblJlamVjdGlvbiA9IGFzeW5jIChleGVjdXRhYmxlLCB0bywgZmlsdGVyKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGFibGUoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZXJyb3IgaW5zdGFuY2VvZiBmaWx0ZXIpIHx8ICFmaWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0bztcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59O1xuLyoqXG4gKiBXYWl0IGEgZ2l2ZW4gcGVyaW9kIGJlZm9yZSBjb250aW51aW5nIGV4ZWN1dGlvbi5cbiAqIEBwYXJhbSBkdXJhdGlvbiAtIEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICogQHJldHVybnMgTm90aGluZ1xuICovXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAoZHVyYXRpb24pID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGR1cmF0aW9uKSk7XG59O1xuLyoqXG4gKiBFeGVjdXRlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHJpZXMgdGhlIGV4ZWN1dGlvbiBpZiBpdCByZWplY3RzLlxuICogQHBhcmFtIGV4ZWN1dGFibGUgLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiBAcGFyYW0gcmV0cnlEZWxheSAtIFRoZSBkdXJhdGlvbiB0byB3YWl0IGFmdGVyIGEgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gSG93IG9mdGVuIHNob3VsZCB0aGUgZXhlY3V0aW9uIGJlIHJldHJpZWQ/XG4gKiBAdHlwZVBhcmFtIFRFeGVjdXRhYmxlUmV0dXJuIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFdoYXRldmVyIHRoZSBmdW5jdGlvbiByZXNvbHZlZCB0by5cbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5ID0gYXN5bmMgKGV4ZWN1dGFibGUsIHJldHJ5RGVsYXkgPSAwLCByZXRyeUNvdW50ID0gMCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRhYmxlKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoMCA8IHJldHJ5Q291bnQpIHtcbiAgICAgICAgICAgIGlmICgwIDwgcmV0cnlEZWxheSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHJldHJ5RGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldHJ5KGV4ZWN1dGFibGUsIHJldHJ5RGVsYXksIC0tcmV0cnlDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLmpzLm1hcCIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9hc3luYy9hc3luYy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3Rvck9mIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9jb3JlLmpzXCI7XG5pbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVTdGF0ZSwgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuXG5leHBvcnQgY29uc3QgRmFsbGJhY2tMb2NhbGU6IFN1cHBvcnRlZExvY2FsZSA9IFwiZW4tVVNcIjtcblxuLy8gSG93IGxvbmcgdG8gd2FpdCBmb3IgS0cgdG8gbG9hZCwgaW4gbWlsbGlzZWNvbmRzLlxuY29uc3QgVElNRU9VVF9ERUZBVUxUID0gMiAqIDYwICogMTAwMDtcblxuLy8gQWxsb3dzIHRoZSB1c2VyIHRvIGRlZmluZSBhIHRpbWVvdXQgb3ZlcnJpZGUgaW4gdGhlaXIgYnJvd3NlcidzIHdlYiBzdG9yYWdlLlxuLy8gVGhpcyBhbGxvd3MgdXNlcnMgdG8gZXh0ZW5kIHRoZSB0aW1lb3V0IHBlcmlvZCwgaW4gY2FzZSB0aGVpciBsb2NhbCBjb25maWd1cmF0aW9uXG4vLyByZXF1aXJlcyBpdC5cbmNvbnN0IFRJTUVPVVRfT1ZFUlJJREUgPVxuICBcImxvY2FsU3RvcmFnZVwiIGluIGdsb2JhbFRoaXMgJiYgIWlzTmlsKGxvY2FsU3RvcmFnZVtcImtzLnRpbWVvdXRcIl0pXG4gICAgPyBOdW1iZXIobG9jYWxTdG9yYWdlW1wia3MudGltZW91dFwiXSlcbiAgICA6IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNsYXNzIFVzZXJTY3JpcHRMb2FkZXIge1xuICAvKipcbiAgICogU3RvcmVzIGlmIHdlIGNhdWdodCB0aGUgYGdhbWUvc3RhcnRgIHNpZ25hbCBmcm9tIHRoZSBnYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2FtZVN0YXJ0U2lnbmFsOiBQcm9taXNlPGJvb2xlYW4+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9nYW1lU3RhcnRTaWduYWxSZXNvbHZlcjogdW5kZWZpbmVkIHwgKCh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCk7XG5cbiAgcHJpdmF0ZSBfcG9zc2libGVFbmdpbmVTdGF0ZTogdW5rbm93bjtcblxuICBzdGF0aWMgdHJ5RW5naW5lU3RhdGVGcm9tU2F2ZURhdGEoc2F2ZURhdGFLZXk6IHN0cmluZywgc2F2ZURhdGE6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBzYXZlRGF0YVByb3h5ID0gc2F2ZURhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKCEoc2F2ZURhdGFLZXkgaW4gc2F2ZURhdGFQcm94eSkpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYEZhaWxlZDogXFxgJHtzYXZlRGF0YUtleX1cXGAgbm90IGZvdW5kIGluIHNhdmUgZGF0YS5gKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGtzRGF0YSA9IHNhdmVEYXRhUHJveHkua3MgYXMgeyBzdGF0ZT86IEFycmF5PEVuZ2luZVN0YXRlPiB9O1xuICAgIGlmICghKFwic3RhdGVcIiBpbiBrc0RhdGEpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBGYWlsZWQ6IFxcYCR7c2F2ZURhdGFLZXl9LnN0YXRlXFxgIG5vdCBmb3VuZCBpbiBzYXZlIGRhdGEuYCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGtzRGF0YS5zdGF0ZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGUpKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBGYWlsZWQ6IFxcYCR7c2F2ZURhdGFLZXl9LnN0YXRlXFxgIG5vdCBcXGBBcnJheVxcYC5gKSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZVswXTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JHYW1lPFRVc2VyU2NyaXB0PihcbiAgICBVc2VyU2NyaXB0OiBDb25zdHJ1Y3Rvck9mPFRVc2VyU2NyaXB0PixcbiAgICBzYXZlRGF0YUtleT86IHN0cmluZyxcbiAgICB0aW1lb3V0ID0gVElNRU9VVF9PVkVSUklERSA/PyBUSU1FT1VUX0RFRkFVTFQsXG4gICk6IFByb21pc2U8VFVzZXJTY3JpcHQ+IHtcbiAgICBpZiAoVXNlclNjcmlwdExvYWRlci5faXNHYW1lTG9hZGVkKCkpIHtcbiAgICAgIGNvbnN0IGdhbWUgPSBtdXN0RXhpc3QoVXNlclNjcmlwdExvYWRlci53aW5kb3cuZ2FtZSk7XG4gICAgICBjb25zdCBpMThuRW5naW5lID0gbXVzdEV4aXN0KFVzZXJTY3JpcHRMb2FkZXIud2luZG93LiRJKTtcbiAgICAgIGNvbnN0IGdhbWVMYW5ndWFnZSA9IGxvY2FsU3RvcmFnZVtcImNvbS5udWNsZWFydW5pY29ybi5raXR0ZW5nYW1lLmxhbmd1YWdlXCJdIGFzXG4gICAgICAgIHwgTG9jYWxlXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gbmV3IFVzZXJTY3JpcHQoZ2FtZSwgaTE4bkVuZ2luZSwgZ2FtZUxhbmd1YWdlLCB0aGlzLl9wb3NzaWJsZUVuZ2luZVN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduYWxzOiBBcnJheTxQcm9taXNlPHVua25vd24+PiA9IFtzbGVlcCgyMDAwKV07XG5cbiAgICBpZiAoaXNOaWwodGhpcy5fZ2FtZVN0YXJ0U2lnbmFsKSAmJiB0eXBlb2YgVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9qbyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5fZ2FtZVN0YXJ0U2lnbmFsID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHRoaXMuX2dhbWVTdGFydFNpZ25hbFJlc29sdmVyID0gcmVzb2x2ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdWJHYW1lU3RhcnQgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2pvLnN1YnNjcmliZShcImdhbWUvc3RhcnRcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgIC4uLmNsKGAnZ2FtZS9zdGFydCcgc2lnbmFsIGNhdWdodC4gRmFzdC10cmFja2luZyBzY3JpcHQgbG9hZCBmb3IgJyR7c2F2ZURhdGFLZXl9Jy4uLmApLFxuICAgICAgICApO1xuICAgICAgICBtdXN0RXhpc3QodGhpcy5fZ2FtZVN0YXJ0U2lnbmFsUmVzb2x2ZXIpKHRydWUpO1xuICAgICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2pvLnVuc3Vic2NyaWJlKHN1YkdhbWVTdGFydCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHNhdmVEYXRhS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3ViU2VydmVyTG9hZCA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uc3Vic2NyaWJlKFxuICAgICAgICAgIFwic2VydmVyL2xvYWRcIixcbiAgICAgICAgICAoc2F2ZURhdGE6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICAgICAgYCdzZXJ2ZXIvbG9hZCcgc2lnbmFsIGNhdWdodC4gTG9va2luZyBmb3Igc2NyaXB0IHN0YXRlIHdpdGgga2V5ICcke3NhdmVEYXRhS2V5fScgaW4gc2F2ZSBkYXRhLi4uYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gVXNlclNjcmlwdExvYWRlci50cnlFbmdpbmVTdGF0ZUZyb21TYXZlRGF0YShzYXZlRGF0YUtleSwgc2F2ZURhdGEpO1xuXG4gICAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgICAuLi5jbChcbiAgICAgICAgICAgICAgICAgIGBUaGUgS2l0dGVucyBHYW1lIHNhdmUgZGF0YSBkaWQgbm90IGNvbnRhaW4gYSBzY3JpcHQgc3RhdGUgZm9yICcke3NhdmVEYXRhS2V5fScuYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICAgICAgYEZvdW5kIGtleSAnJHtzYXZlRGF0YUtleX0nISBQcm92aWRlZCBzYXZlIGRhdGEgd2lsbCBiZSB1c2VkIGFzIHNlZWQgZm9yIG5leHQgc2NyaXB0IGluc3RhbmNlLmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5fcG9zc2libGVFbmdpbmVTdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9qby51bnN1YnNjcmliZShzdWJTZXJ2ZXJMb2FkKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNOaWwodGhpcy5fZ2FtZVN0YXJ0U2lnbmFsKSkge1xuICAgICAgc2lnbmFscy5wdXNoKHRoaXMuX2dhbWVTdGFydFNpZ25hbCk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWVvdXQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVW5hYmxlIHRvIGZpbmQgZ2FtZS4gR2l2aW5nIHVwLiBNYXliZSB0aGUgZ2FtZSBpcyBub3QgZXhwb3J0ZWQgYXQgYHdpbmRvdy5nYW1lYD9cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgV2FpdGluZyBmb3IgZ2FtZS4uLiAodGltZW91dDogJHtNYXRoLnJvdW5kKHRpbWVvdXQgLyAxMDAwKX1zKWApKTtcblxuICAgIGF3YWl0IFByb21pc2UucmFjZShzaWduYWxzKTtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yR2FtZShVc2VyU2NyaXB0LCBzYXZlRGF0YUtleSwgdGltZW91dCAtIDIwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2lzR2FtZUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIWlzTmlsKFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmdhbWUpICYmXG4gICAgICAoVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJnYW1lXCIpPy5jaGVja1Zpc2liaWxpdHkoKSA/PyBmYWxzZSkgJiZcbiAgICAgICFpc05pbChVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy4kSSlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldCB3aW5kb3coKTogV2luZG93IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG11c3RFeGlzdCh1bnNhZmVXaW5kb3cpO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgRW5naW5lLCB0eXBlIEZyYW1lQ29udGV4dCB9IGZyb20gXCIuL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgU2NpZW5jZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvU2NpZW5jZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUYWJNYW5hZ2VyIH0gZnJvbSBcIi4vVGFiTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgTGlicmFyeSwgVW5zYWZlUG9saWN5LCBVbnNhZmVUZWNoIH0gZnJvbSBcIi4vdHlwZXMvc2NpZW5jZS5qc1wiO1xuaW1wb3J0IHsgVXBncmFkZU1hbmFnZXIgfSBmcm9tIFwiLi9VcGdyYWRlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3Nob3BNYW5hZ2VyIH0gZnJvbSBcIi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTY2llbmNlTWFuYWdlciBleHRlbmRzIFVwZ3JhZGVNYW5hZ2VyIHtcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxMaWJyYXJ5PjtcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFNjaWVuY2VTZXR0aW5ncztcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogS2l0dGVuU2NpZW50aXN0cyxcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBTY2llbmNlU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgc3VwZXIoaG9zdCk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiU2NpZW5jZVwiKTtcbiAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIgPSB3b3Jrc2hvcE1hbmFnZXI7XG4gIH1cblxuICBhc3luYyB0aWNrKF9jb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIG11c3QgY2FsbCBgLnJlbmRlcigpYCBoZXJlLCBiZWNhdXNlIGV2YWx1YXRpb24gb2YgYXZhaWxhYmlsaXR5IG9mIG91ciBvcHRpb25zXG4gICAgLy8gaXMgb25seSBwZXJmb3JtZWQgd2hlbiB0aGUgZ2FtZSByZW5kZXJzIHRoZSBjb250ZW50cyBvZiB0aGF0IHRhYi5cbiAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG5cbiAgICAvLyBJZiB0ZWNocyAoc2NpZW5jZSBpdGVtcykgYXJlIGVuYWJsZWQuLi5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy50ZWNocy5lbmFibGVkICYmIHRoaXMuX2hvc3QuZ2FtZS50YWJzWzJdLnZpc2libGUpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b1VubG9jaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnBvbGljaWVzLmVuYWJsZWQgJiYgdGhpcy5faG9zdC5nYW1lLnRhYnNbMl0udmlzaWJsZSkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvUG9saWN5KCk7XG4gICAgfVxuXG4gICAgLy8gT2JzZXJ2ZSBhc3Ryb25vbWljYWwgZXZlbnRzLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLm9ic2VydmUuZW5hYmxlZCkge1xuICAgICAgdGhpcy5vYnNlcnZlU3RhcnMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvVW5sb2NrKCkge1xuICAgIGNvbnN0IHRlY2hzID0gdGhpcy5faG9zdC5nYW1lLnNjaWVuY2UudGVjaHM7XG4gICAgY29uc3QgdG9VbmxvY2sgPSBuZXcgQXJyYXk8VW5zYWZlVGVjaD4oKTtcblxuICAgIHdvcmtMb29wOiBmb3IgKGNvbnN0IHNldHRpbmcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNldHRpbmdzLnRlY2hzLnRlY2hzKSkge1xuICAgICAgaWYgKCFzZXR0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlY2ggPSB0ZWNocy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5uYW1lID09PSBzZXR0aW5nLnRlY2gpO1xuICAgICAgaWYgKGlzTmlsKHRlY2gpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woYFRlY2ggJyR7c2V0dGluZy50ZWNofScgbm90IGZvdW5kIGluIGdhbWUhYCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRlY2gucmVzZWFyY2hlZCB8fCAhdGVjaC51bmxvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHByaWNlcyA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uY2xvbmUodGVjaC5wcmljZXMpO1xuICAgICAgcHJpY2VzID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0RWZmZWN0TGVhZGVyKFwic2NpZW50aXN0XCIsIHByaWNlcyk7XG4gICAgICBmb3IgKGNvbnN0IHByaWNlIG9mIHByaWNlcykge1xuICAgICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocHJpY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKHByaWNlLm5hbWUpO1xuICAgICAgICBjb25zdCB0cmlnZ2VyID0gRW5naW5lLmV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoXG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy50ZWNocy50cmlnZ2VyLFxuICAgICAgICAgIHNldHRpbmcudHJpZ2dlcixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRyaWdnZXIgPCAwIHx8IGF2YWlsYWJsZSA8IHJlc291cmNlLm1heFZhbHVlICogdHJpZ2dlciB8fCBhdmFpbGFibGUgPCBwcmljZS52YWwpIHtcbiAgICAgICAgICBjb250aW51ZSB3b3JrTG9vcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0b1VubG9jay5wdXNoKHRlY2gpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0b1VubG9jaykge1xuICAgICAgYXdhaXQgdGhpcy51cGdyYWRlKGl0ZW0sIFwic2NpZW5jZVwiKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvUG9saWN5KCkge1xuICAgIGNvbnN0IHBvbGljaWVzID0gdGhpcy5faG9zdC5nYW1lLnNjaWVuY2UucG9saWNpZXM7XG4gICAgY29uc3QgdG9VbmxvY2sgPSBuZXcgQXJyYXk8VW5zYWZlUG9saWN5PigpO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIE9iamVjdC52YWx1ZXModGhpcy5zZXR0aW5ncy5wb2xpY2llcy5wb2xpY2llcykpIHtcbiAgICAgIGlmICghc2V0dGluZy5lbmFibGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRQb2xpY3kgPSBwb2xpY2llcy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5uYW1lID09PSBzZXR0aW5nLnBvbGljeSk7XG4gICAgICBpZiAoaXNOaWwodGFyZ2V0UG9saWN5KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKC4uLmNsKGBQb2xpY3kgJyR7c2V0dGluZy5wb2xpY3l9JyBub3QgZm91bmQgaW4gZ2FtZSFgKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRhcmdldFBvbGljeS5yZXNlYXJjaGVkICYmICF0YXJnZXRQb2xpY3kuYmxvY2tlZCAmJiB0YXJnZXRQb2xpY3kudW5sb2NrZWQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRhcmdldFBvbGljeS5yZXF1aXJlZExlYWRlckpvYiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmxlYWRlciAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UubGVhZGVyLmpvYiA9PT0gdGFyZ2V0UG9saWN5LnJlcXVpcmVkTGVhZGVySm9iKVxuICAgICAgICApIHtcbiAgICAgICAgICB0b1VubG9jay5wdXNoKHRhcmdldFBvbGljeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdG9VbmxvY2spIHtcbiAgICAgIGF3YWl0IHRoaXMudXBncmFkZShpdGVtLCBcInBvbGljeVwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgaXMgY3VycmVudGx5IGFuIGFzdHJvbm9taWNhbCBldmVudCwgb2JzZXJ2ZSBpdC5cbiAgICovXG4gIG9ic2VydmVTdGFycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLm9ic2VydmVCdG4gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5vYnNlcnZlSGFuZGxlcigpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYWN0Lm9ic2VydmVcIiwgW10sIFwia3Mtc3RhclwiKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcInN0YXJzXCIsIDEpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9hcnJheS5qc1wiO1xuaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHYW1lUGFnZSB9IGZyb20gXCIuLi90eXBlcy9nYW1lLmpzXCI7XG5pbXBvcnQgeyB0eXBlIE1pc3Npb24sIE1pc3Npb25zIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIE1pc3Npb25TZXR0aW5nIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5ICNtaXNzaW9uOiBNaXNzaW9uO1xuXG4gIGdldCBtaXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNtaXNzaW9uO1xuICB9XG5cbiAgY29uc3RydWN0b3IobWlzc2lvbjogTWlzc2lvbiwgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jbWlzc2lvbiA9IG1pc3Npb247XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTWlzc2lvbk1pc3Npb25TZXR0aW5ncyA9IFJlY29yZDxNaXNzaW9uLCBNaXNzaW9uU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW9uU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgbWlzc2lvbnM6IE1pc3Npb25NaXNzaW9uU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5taXNzaW9ucyA9IHRoaXMuaW5pdE1pc3Npb25zKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRNaXNzaW9ucygpOiBNaXNzaW9uTWlzc2lvblNldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIE1pc3Npb25NaXNzaW9uU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIE1pc3Npb25zKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBNaXNzaW9uU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IE1pc3Npb25TZXR0aW5ncykge1xuICAgIGNvbnN0IGluU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5taXNzaW9ucyk7XG4gICAgY29uc3QgaW5HYW1lID0gZ2FtZS5zcGFjZS5wcm9ncmFtcy5tYXAocHJvZ3JhbSA9PiBwcm9ncmFtLm5hbWUpO1xuXG4gICAgY29uc3QgbWlzc2luZ0luU2V0dGluZ3MgPSBkaWZmZXJlbmNlKGluR2FtZSwgaW5TZXR0aW5ncyk7XG4gICAgY29uc3QgcmVkdW5kYW50SW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5TZXR0aW5ncywgaW5HYW1lKTtcblxuICAgIGZvciAoY29uc3QgbWlzc2lvbiBvZiBtaXNzaW5nSW5TZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBUaGUgc3BhY2UgbWlzc2lvbiAnJHttaXNzaW9ufScgaXMgbm90IHRyYWNrZWQgaW4gS2l0dGVuIFNjaWVudGlzdHMhYCkpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1pc3Npb24gb2YgcmVkdW5kYW50SW5TZXR0aW5ncykge1xuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBUaGUgc3BhY2UgbWlzc2lvbiAnJHttaXNzaW9ufScgaXMgbm90IGEgc3BhY2UgbWlzc2lvbiBpbiBLaXR0ZW5zIEdhbWUhYCkpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8TWlzc2lvblNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMubWlzc2lvbnMsIHNldHRpbmdzLm1pc3Npb25zLCAobWlzc2lvbiwgaXRlbSkgPT4ge1xuICAgICAgbWlzc2lvbi5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyBtaXNzaW9uLmVuYWJsZWQ7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVQYWdlIH0gZnJvbSBcIi4uL3R5cGVzL2dhbWUuanNcIjtcbmltcG9ydCB7IHR5cGUgU3BhY2VCdWlsZGluZywgU3BhY2VCdWlsZGluZ3MgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IE1pc3Npb25TZXR0aW5ncyB9IGZyb20gXCIuL01pc3Npb25TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXIsIFNldHRpbmdUcmlnZ2VyTWF4IH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFNwYWNlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXJNYXgge1xuICByZWFkb25seSAjYnVpbGRpbmc6IFNwYWNlQnVpbGRpbmc7XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGJ1aWxkaW5nOiBTcGFjZUJ1aWxkaW5nKSB7XG4gICAgc3VwZXIoZmFsc2UsIC0xLCAwKTtcbiAgICB0aGlzLiNidWlsZGluZyA9IGJ1aWxkaW5nO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFNwYWNlQnVpbGRpbmdTZXR0aW5ncyA9IFJlY29yZDxTcGFjZUJ1aWxkaW5nLCBTcGFjZUJ1aWxkaW5nU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBTcGFjZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICBidWlsZGluZ3M6IFNwYWNlQnVpbGRpbmdTZXR0aW5ncztcblxuICB1bmxvY2tNaXNzaW9uczogTWlzc2lvblNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgdHJpZ2dlciA9IC0xLCB1bmxvY2tNaXNzaW9ucyA9IG5ldyBNaXNzaW9uU2V0dGluZ3MoKSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy51bmxvY2tNaXNzaW9ucyA9IHVubG9ja01pc3Npb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnVpbGRpbmdzKCk6IFNwYWNlQnVpbGRpbmdTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBTcGFjZUJ1aWxkaW5nU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFNwYWNlQnVpbGRpbmdzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBTcGFjZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlR2FtZShnYW1lOiBHYW1lUGFnZSwgc2V0dGluZ3M6IFNwYWNlU2V0dGluZ3MpIHtcbiAgICBNaXNzaW9uU2V0dGluZ3MudmFsaWRhdGVHYW1lKGdhbWUsIHNldHRpbmdzLnVubG9ja01pc3Npb25zKTtcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8U3BhY2VTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmJ1aWxkaW5ncywgc2V0dGluZ3MuYnVpbGRpbmdzLCAoYnVpbGRpbmcsIGl0ZW0pID0+IHtcbiAgICAgIGJ1aWxkaW5nLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGJ1aWxkaW5nLmVuYWJsZWQ7XG4gICAgICBidWlsZGluZy5tYXggPSBpdGVtPy5tYXggPz8gYnVpbGRpbmcubWF4O1xuICAgICAgYnVpbGRpbmcudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gYnVpbGRpbmcudHJpZ2dlcjtcbiAgICB9KTtcblxuICAgIHRoaXMudW5sb2NrTWlzc2lvbnMubG9hZChzZXR0aW5ncy51bmxvY2tNaXNzaW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCBtdXN0RXhpc3QgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dG9tYXRpb24sIEZyYW1lQ29udGV4dCB9IGZyb20gXCIuL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgQnVsa1B1cmNoYXNlSGVscGVyIH0gZnJvbSBcIi4vaGVscGVyL0J1bGtQdXJjaGFzZUhlbHBlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBTcGFjZUJ1aWxkaW5nU2V0dGluZywgU3BhY2VTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzL1NwYWNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZGluZ1N0YWNrYWJsZUJ0biwgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbCB9IGZyb20gXCIuL3R5cGVzL2NvcmUuanNcIjtcbmltcG9ydCB0eXBlIHsgTWlzc2lvbiwgU3BhY2VCdWlsZGluZyB9IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcixcbiAgU3BhY2VUYWIsXG4gIFVuc2FmZVBsYW5ldCxcbiAgVW5zYWZlUGxhbmV0QnVpbGRpbmdCdXR0b25PcHRpb25zLFxuICBVbnNhZmVTcGFjZUJ1aWxkaW5nLFxuICBVbnNhZmVTcGFjZVByb2dyYW0sXG4gIFVuc2FmZVNwYWNlUHJvZ3JhbUJ1dHRvbk9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzL3NwYWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzaG9wTWFuYWdlciB9IGZyb20gXCIuL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU3BhY2VNYW5hZ2VyIGltcGxlbWVudHMgQXV0b21hdGlvbiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG4gIHJlYWRvbmx5IHNldHRpbmdzOiBTcGFjZVNldHRpbmdzO1xuICByZWFkb25seSBtYW5hZ2VyOiBUYWJNYW5hZ2VyPFNwYWNlVGFiPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVsa01hbmFnZXI6IEJ1bGtQdXJjaGFzZUhlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogS2l0dGVuU2NpZW50aXN0cyxcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBTcGFjZVNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIlNwYWNlXCIpO1xuXG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICAgIHRoaXMuX2J1bGtNYW5hZ2VyID0gbmV3IEJ1bGtQdXJjaGFzZUhlbHBlcih0aGlzLl9ob3N0LCB0aGlzLl93b3Jrc2hvcE1hbmFnZXIpO1xuICB9XG5cbiAgdGljayhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIG11c3QgY2FsbCBgLnJlbmRlcigpYCBoZXJlLCBiZWNhdXNlIGV2YWx1YXRpb24gb2YgYXZhaWxhYmlsaXR5IG9mIG91ciBvcHRpb25zXG4gICAgLy8gaXMgb25seSBwZXJmb3JtZWQgd2hlbiB0aGUgZ2FtZSByZW5kZXJzIHRoZSBjb250ZW50cyBvZiB0aGF0IHRhYi5cbiAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG5cbiAgICB0aGlzLmF1dG9CdWlsZChjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnVubG9ja01pc3Npb25zLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b1VubG9jayhjb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGJ1aWxkIGFzIG1hbnkgb2YgdGhlIHBhc3NlZCBidWlsZGluZ3MgYXMgcG9zc2libGUuXG4gICAqIFVzdWFsbHksIHRoaXMgaXMgY2FsbGVkIGF0IGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBhdXRvbWF0aW9uIGVuZ2luZSB0b1xuICAgKiBoYW5kbGUgdGhlIGJ1aWxkaW5nIG9mIGl0ZW1zIG9uIHRoZSBTcGFjZSB0YWIuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZHMgVGhlIGJ1aWxkaW5ncyB0byBidWlsZC5cbiAgICovXG4gIGF1dG9CdWlsZChcbiAgICBjb250ZXh0OiBGcmFtZUNvbnRleHQsXG4gICAgYnVpbGRzOiBQYXJ0aWFsPFJlY29yZDxTcGFjZUJ1aWxkaW5nLCBTcGFjZUJ1aWxkaW5nU2V0dGluZz4+ID0gdGhpcy5zZXR0aW5ncy5idWlsZGluZ3MsXG4gICkge1xuICAgIGNvbnN0IGJ1bGtNYW5hZ2VyID0gdGhpcy5fYnVsa01hbmFnZXI7XG4gICAgY29uc3Qgc2VjdGlvblRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLnRyaWdnZXI7XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWV0YWRhdGEgZm9yIGFsbCB0aGUgcmVmZXJlbmNlZCBidWlsZGluZ3MuXG4gICAgY29uc3QgbWV0YURhdGE6IFBhcnRpYWw8UmVjb3JkPFNwYWNlQnVpbGRpbmcsIFJlcXVpcmVkPFVuc2FmZVNwYWNlQnVpbGRpbmc+Pj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIE9iamVjdC52YWx1ZXMoYnVpbGRzKSkge1xuICAgICAgbWV0YURhdGFbYnVpbGQuYnVpbGRpbmddID0gdGhpcy5nZXRCdWlsZChidWlsZC5idWlsZGluZyk7XG4gICAgfVxuXG4gICAgLy8gTGV0IHRoZSBidWxrbWFuYWdlciBkZXRlcm1pbmUgdGhlIGJ1aWxkcyB3ZSBjYW4gbWFrZS5cbiAgICBjb25zdCBidWlsZExpc3QgPSBidWxrTWFuYWdlci5idWxrKGJ1aWxkcywgbWV0YURhdGEsIHNlY3Rpb25UcmlnZ2VyLCBcIlNwYWNlXCIpO1xuXG4gICAgLy8gQnVpbGQgYWxsIGVudHJpZXMgaW4gdGhlIGJ1aWxkIGxpc3QsIHdoZXJlIHdlIGNhbiBidWlsZCBhbnkgaXRlbXMuXG4gICAgZm9yIChjb25zdCBidWlsZCBvZiBidWlsZExpc3QpIHtcbiAgICAgIGlmIChidWlsZC5jb3VudCA8PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKDAgPT09IHRoaXMuYnVpbGQoYnVpbGQuaWQgYXMgU3BhY2VCdWlsZGluZywgYnVpbGQuY291bnQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgYXV0b1VubG9jayhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS50YWJzWzZdLnZpc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtaXNzaW9ucyA9IHRoaXMuX2hvc3QuZ2FtZS5zcGFjZS5tZXRhWzBdLm1ldGEgYXMgQXJyYXk8UmVxdWlyZWQ8VW5zYWZlU3BhY2VQcm9ncmFtPj47XG4gICAgbWlzc2lvbkxvb3A6IGZvciAobGV0IGkgPSAwOyBpIDwgbWlzc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIElmIHRoZSBtaXNzaW9uIGlzIGFscmVhZHkgcHVyY2hhc2VkIG9yIG5vdCBhdmFpbGFibGUgeWV0LCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZS5cbiAgICAgIGlmIChcbiAgICAgICAgMCA8IG1pc3Npb25zW2ldLnZhbCB8fFxuICAgICAgICAhbWlzc2lvbnNbaV0udW5sb2NrZWQgfHxcbiAgICAgICAgIXRoaXMuc2V0dGluZ3MudW5sb2NrTWlzc2lvbnMubWlzc2lvbnNbbWlzc2lvbnNbaV0ubmFtZSBhcyBNaXNzaW9uXS5lbmFibGVkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tYW5hZ2VyLnRhYi5HQ1BhbmVsPy5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc05pbChtb2RlbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QobW9kZWwubW9kZWw/LnByaWNlcyk7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHByaWNlcykge1xuICAgICAgICAvLyBJZiB3ZSBjYW4ndCBhZmZvcmQgdGhpcyByZXNvdXJjZSBwcmljZSwgY29udGludWUgd2l0aCB0aGUgbmV4dCBtaXNzaW9uLlxuICAgICAgICBpZiAodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKHJlc291cmNlLm5hbWUpIDwgcmVzb3VyY2UudmFsKSB7XG4gICAgICAgICAgY29udGludWUgbWlzc2lvbkxvb3A7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgdGhlIG1pc3Npb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbi5cbiAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBpbnRvIHRoZSBTcGFjZU1hbmFnZXI/XG4gICAgICBtb2RlbC5kb21Ob2RlLmNsaWNrKCk7XG4gICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgIGlmIChpID09PSA3IHx8IGkgPT09IDEyKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUuc3BhY2UubWlzc2lvblwiLCBbbWlzc2lvbnNbaV0ubGFiZWxdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnNwYWNlXCIsIFttaXNzaW9uc1tpXS5sYWJlbF0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBidWlsZChuYW1lOiBTcGFjZUJ1aWxkaW5nLCBhbW91bnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGFtb3VudENhbGN1bGF0ZWQgPSBhbW91bnQ7XG4gICAgY29uc3QgYW1vdW50VGVtcCA9IGFtb3VudENhbGN1bGF0ZWQ7XG4gICAgbGV0IGxhYmVsOiBzdHJpbmc7XG4gICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInNwYWNlQnVpbGRpbmdcIik7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBjbGFzc2VzLnVpLnNwYWNlLlBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcihcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICApIGFzIFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcjxcbiAgICAgIFVuc2FmZUJ1aWxkaW5nU3RhY2thYmxlQnRuTW9kZWw8VW5zYWZlUGxhbmV0QnVpbGRpbmdCdXR0b25PcHRpb25zPlxuICAgID47XG4gICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoeyBjb250cm9sbGVyLCBpZDogaXRlbU1ldGFSYXcubmFtZSB9KTtcbiAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICBsYWJlbCA9IGl0ZW1NZXRhUmF3LmxhYmVsO1xuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgIT09IGFtb3VudFRlbXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woYCR7bGFiZWx9IEFtb3VudCBvcmRlcmVkOiAke2Ftb3VudFRlbXB9IEFtb3VudCBDb25zdHJ1Y3RlZDogJHthbW91bnRDYWxjdWxhdGVkfWApLFxuICAgICAgKTtcbiAgICAgIC8vIEJhaWwgb3V0IHRvIG5vdCBmbG9vZCB0aGUgbG9nIHdpdGggZ2FyYmFnZS5cbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkobGFiZWwsIGFtb3VudENhbGN1bGF0ZWQsIFwiYnVpbGRcIik7XG5cbiAgICBpZiAoYW1vdW50Q2FsY3VsYXRlZCA9PT0gMSkge1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYWN0LmJ1aWxkXCIsIFtsYWJlbF0sIFwia3MtYnVpbGRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QuYnVpbGRzXCIsXG4gICAgICAgIFtsYWJlbCwgdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShhbW91bnRDYWxjdWxhdGVkKV0sXG4gICAgICAgIFwia3MtYnVpbGRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFtb3VudENhbGN1bGF0ZWQ7XG4gIH1cblxuICBnZXRCdWlsZChuYW1lOiBTcGFjZUJ1aWxkaW5nKTogUmVxdWlyZWQ8VW5zYWZlU3BhY2VCdWlsZGluZz4ge1xuICAgIHJldHVybiB0aGlzLl9ob3N0LmdhbWUuc3BhY2UuZ2V0QnVpbGRpbmcobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCdWlsZEJ1dHRvbihpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFuZWxzID0gdGhpcy5tYW5hZ2VyLnRhYi5wbGFuZXRQYW5lbHM7XG5cbiAgICBpZiAoaXNOaWwocGFuZWxzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGJ1dHRvbjogQnVpbGRpbmdTdGFja2FibGVCdG48e1xuICAgICAgaWQ6IFNwYWNlQnVpbGRpbmc7XG4gICAgICBwbGFuZXQ6IFVuc2FmZVBsYW5ldDtcbiAgICAgIGNvbnRyb2xsZXI6IFBsYW5ldEJ1aWxkaW5nQnRuQ29udHJvbGxlcjxcbiAgICAgICAgVW5zYWZlQnVpbGRpbmdTdGFja2FibGVCdG5Nb2RlbDxVbnNhZmVTcGFjZVByb2dyYW1CdXR0b25PcHRpb25zPlxuICAgICAgPjtcbiAgICB9PiB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgcGFuZWwgb2YgcGFuZWxzKSB7XG4gICAgICBidXR0b24gPSBwYW5lbC5jaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLmlkID09PSBpZCkgPz8gbnVsbDtcblxuICAgICAgaWYgKCFpc05pbChidXR0b24pKSB7XG4gICAgICAgIHJldHVybiBidXR0b247XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGJ1dHRvbiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJ1dHRvbiBmb3IgJHtpZH0hYCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBlbnVtIExvZ0ZpbHRlckl0ZW1WYXJpYW50IHtcbiAgYnVpbGQgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtYnVpbGRcIixcbiAgY3JhZnQgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtY3JhZnRcIixcbiAgdXBncmFkZSA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy11cGdyYWRlXCIsXG4gIHJlc2VhcmNoID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLXJlc2VhcmNoXCIsXG4gIHRyYWRlID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLXRyYWRlXCIsXG4gIGh1bnQgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtaHVudFwiLFxuICBwcmFpc2UgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtcHJhaXNlXCIsXG4gIGFkb3JlID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLWFkb3JlXCIsXG4gIHRyYW5zY2VuZCA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy10cmFuc2NlbmRcIixcbiAgZmFpdGggPSBcImtzLWFjdGl2aXR5IHR5cGVfa3MtZmFpdGhcIixcbiAgYWNjZWxlcmF0ZSA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy1hY2NlbGVyYXRlXCIsXG4gIHRpbWVTa2lwID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLXRpbWVTa2lwXCIsXG4gIGZlc3RpdmFsID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLWZlc3RpdmFsXCIsXG4gIHN0YXIgPSBcImtzLWFjdGl2aXR5IHR5cGVfa3Mtc3RhclwiLFxuICBkaXN0cmlidXRlID0gXCJrcy1hY3Rpdml0eSB0eXBlX2tzLWRpc3RyaWJ1dGVcIixcbiAgcHJvbW90ZSA9IFwia3MtYWN0aXZpdHkgdHlwZV9rcy1wcm9tb3RlXCIsXG4gIG1pc2MgPSBcImtzLWFjdGl2aXR5XCIsXG59XG5cbmV4cG9ydCBjb25zdCBGaWx0ZXJJdGVtcyA9IFtcbiAgXCJhY2NlbGVyYXRlXCIsXG4gIFwiYWRvcmVcIixcbiAgXCJidWlsZFwiLFxuICBcImNyYWZ0XCIsXG4gIFwiZGlzdHJpYnV0ZVwiLFxuICBcImZhaXRoXCIsXG4gIFwiZmVzdGl2YWxcIixcbiAgXCJodW50XCIsXG4gIFwibWlzY1wiLFxuICBcInByYWlzZVwiLFxuICBcInByb21vdGVcIixcbiAgXCJyZXNlYXJjaFwiLFxuICBcInN0YXJcIixcbiAgXCJ0aW1lU2tpcFwiLFxuICBcInRyYWRlXCIsXG4gIFwidHJhbnNjZW5kXCIsXG4gIFwidXBncmFkZVwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZpbHRlckl0ZW0gPSAodHlwZW9mIEZpbHRlckl0ZW1zKVtudW1iZXJdO1xuXG5leHBvcnQgY2xhc3MgTG9nRmlsdGVyU2V0dGluZ3NJdGVtIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5ICN2YXJpYW50OiBMb2dGaWx0ZXJJdGVtVmFyaWFudDtcblxuICBnZXQgdmFyaWFudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmFyaWFudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZhcmlhbnQ6IExvZ0ZpbHRlckl0ZW1WYXJpYW50KSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gICAgdGhpcy4jdmFyaWFudCA9IHZhcmlhbnQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTG9nRmlsdGVyU2V0dGluZ3NJdGVtcyA9IFJlY29yZDxGaWx0ZXJJdGVtLCBMb2dGaWx0ZXJTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgTG9nRmlsdGVyU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgZmlsdGVyczogTG9nRmlsdGVyU2V0dGluZ3NJdGVtcztcbiAgZGlzYWJsZUtHTG9nOiBTZXR0aW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSwgZGlzYWJsZUtHTG9nID0gbmV3IFNldHRpbmcodHJ1ZSkpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmluaXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5kaXNhYmxlS0dMb2cgPSBkaXNhYmxlS0dMb2c7XG4gIH1cblxuICBwcml2YXRlIGluaXRGaWx0ZXJzKCk6IExvZ0ZpbHRlclNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgTG9nRmlsdGVyU2V0dGluZ3NJdGVtcztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgRmlsdGVySXRlbXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IExvZ0ZpbHRlclNldHRpbmdzSXRlbShMb2dGaWx0ZXJJdGVtVmFyaWFudFtpdGVtXSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8TG9nRmlsdGVyU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5maWx0ZXJzLCBzZXR0aW5ncy5maWx0ZXJzLCAoZmlsdGVyLCBpdGVtKSA9PiB7XG4gICAgICBmaWx0ZXIuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gZmlsdGVyLmVuYWJsZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5kaXNhYmxlS0dMb2cuZW5hYmxlZCA9IHNldHRpbmdzLmRpc2FibGVLR0xvZz8uZW5hYmxlZCA/PyB0aGlzLmRpc2FibGVLR0xvZy5lbmFibGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL2FycmF5LmpzXCI7XG5pbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVQYWdlIH0gZnJvbSBcIi4uL3R5cGVzL2dhbWUuanNcIjtcbmltcG9ydCB7IHR5cGUgVXBncmFkZSwgVXBncmFkZXMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFVwZ3JhZGVTZXR0aW5nc0l0ZW0gZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIHJlYWRvbmx5ICN1cGdyYWRlOiBVcGdyYWRlO1xuXG4gIGdldCB1cGdyYWRlKCkge1xuICAgIHJldHVybiB0aGlzLiN1cGdyYWRlO1xuICB9XG5cbiAgY29uc3RydWN0b3IodXBncmFkZTogVXBncmFkZSwgZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgLTEpO1xuICAgIHRoaXMuI3VwZ3JhZGUgPSB1cGdyYWRlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFVwZ3JhZGVTZXR0aW5nc0l0ZW1zID0gUmVjb3JkPFVwZ3JhZGUsIFVwZ3JhZGVTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgVXBncmFkZVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByZWFkb25seSB1cGdyYWRlczogVXBncmFkZVNldHRpbmdzSXRlbXM7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgLTEpO1xuICAgIHRoaXMudXBncmFkZXMgPSB0aGlzLmluaXRVcGdyYWRlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VXBncmFkZXMoKTogVXBncmFkZVNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVXBncmFkZVNldHRpbmdzSXRlbXM7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFVwZ3JhZGVzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBVcGdyYWRlU2V0dGluZ3NJdGVtKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVHYW1lKGdhbWU6IEdhbWVQYWdlLCBzZXR0aW5nczogVXBncmFkZVNldHRpbmdzKSB7XG4gICAgY29uc3QgaW5TZXR0aW5ncyA9IE9iamVjdC5rZXlzKHNldHRpbmdzLnVwZ3JhZGVzKTtcbiAgICBjb25zdCBpbkdhbWUgPSBnYW1lLndvcmtzaG9wLnVwZ3JhZGVzLm1hcCh1cGdyYWRlID0+IHVwZ3JhZGUubmFtZSk7XG5cbiAgICBjb25zdCBtaXNzaW5nSW5TZXR0aW5ncyA9IGRpZmZlcmVuY2UoaW5HYW1lLCBpblNldHRpbmdzKTtcbiAgICBjb25zdCByZWR1bmRhbnRJblNldHRpbmdzID0gZGlmZmVyZW5jZShpblNldHRpbmdzLCBpbkdhbWUpO1xuXG4gICAgZm9yIChjb25zdCB1cGdyYWRlIG9mIG1pc3NpbmdJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCB1cGdyYWRlICcke3VwZ3JhZGV9JyBpcyBub3QgdHJhY2tlZCBpbiBLaXR0ZW4gU2NpZW50aXN0cyFgKSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXBncmFkZSBvZiByZWR1bmRhbnRJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCB1cGdyYWRlICcke3VwZ3JhZGV9JyBpcyBub3QgYW4gdXBncmFkZSBpbiBLaXR0ZW5zIEdhbWUhYCkpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8VXBncmFkZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMudXBncmFkZXMsIHNldHRpbmdzLnVwZ3JhZGVzLCAodXBncmFkZSwgaXRlbSkgPT4ge1xuICAgICAgdXBncmFkZS5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyB1cGdyYWRlLmVuYWJsZWQ7XG4gICAgICB1cGdyYWRlLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IHVwZ3JhZGUudHJpZ2dlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGlmZmVyZW5jZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9hcnJheS5qc1wiO1xuaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHYW1lUGFnZSB9IGZyb20gXCIuLi90eXBlcy9nYW1lLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc291cmNlQ3JhZnRhYmxlLCBSZXNvdXJjZXNDcmFmdGFibGUgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVXBncmFkZVNldHRpbmdzIH0gZnJvbSBcIi4vVXBncmFkZVNldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBDcmFmdFNldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciB7XG4gIHJlYWRvbmx5ICNyZXNvdXJjZTogUmVzb3VyY2VDcmFmdGFibGU7XG5cbiAgZ2V0IHJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLiNyZXNvdXJjZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHJlc291cmNlOiBSZXNvdXJjZUNyYWZ0YWJsZSwgZW5hYmxlZCA9IGZhbHNlLCBsaW1pdGVkID0gdHJ1ZSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIGxpbWl0ZWQpO1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgV29ya3Nob3BSZXNvdXJjZVNldHRpbmdzID0gUmVjb3JkPFJlc291cmNlQ3JhZnRhYmxlLCBDcmFmdFNldHRpbmdzSXRlbT47XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hvcFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByZXNvdXJjZXM6IFdvcmtzaG9wUmVzb3VyY2VTZXR0aW5ncztcblxuICBzaGlwT3ZlcnJpZGU6IFNldHRpbmc7XG4gIHVubG9ja1VwZ3JhZGVzOiBVcGdyYWRlU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIHRyaWdnZXIgPSAtMSxcbiAgICB1bmxvY2tVcGdyYWRlcyA9IG5ldyBVcGdyYWRlU2V0dGluZ3MoKSxcbiAgICBzaGlwT3ZlcnJpZGUgPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyKTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHRoaXMuaW5pdFJlc291cmNlcygpO1xuICAgIHRoaXMuc2hpcE92ZXJyaWRlID0gc2hpcE92ZXJyaWRlO1xuICAgIHRoaXMudW5sb2NrVXBncmFkZXMgPSB1bmxvY2tVcGdyYWRlcztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFJlc291cmNlcygpOiBXb3Jrc2hvcFJlc291cmNlU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgV29ya3Nob3BSZXNvdXJjZVNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSZXNvdXJjZXNDcmFmdGFibGUpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IENyYWZ0U2V0dGluZ3NJdGVtKGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVHYW1lKGdhbWU6IEdhbWVQYWdlLCBzZXR0aW5nczogV29ya3Nob3BTZXR0aW5ncykge1xuICAgIGNvbnN0IGluU2V0dGluZ3MgPSBPYmplY3Qua2V5cyhzZXR0aW5ncy5yZXNvdXJjZXMpO1xuICAgIGNvbnN0IGluR2FtZSA9IGdhbWUud29ya3Nob3AuY3JhZnRzLm1hcChjcmFmdCA9PiBjcmFmdC5uYW1lKTtcblxuICAgIGNvbnN0IG1pc3NpbmdJblNldHRpbmdzID0gZGlmZmVyZW5jZShpbkdhbWUsIGluU2V0dGluZ3MpO1xuICAgIGNvbnN0IHJlZHVuZGFudEluU2V0dGluZ3MgPSBkaWZmZXJlbmNlKGluU2V0dGluZ3MsIGluR2FtZSk7XG5cbiAgICBmb3IgKGNvbnN0IGNyYWZ0IG9mIG1pc3NpbmdJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCBjcmFmdCAnJHtjcmFmdH0nIGlzIG5vdCB0cmFja2VkIGluIEtpdHRlbiBTY2llbnRpc3RzIWApKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjcmFmdCBvZiByZWR1bmRhbnRJblNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oLi4uY2woYFRoZSB3b3Jrc2hvcCBjcmFmdCAnJHtjcmFmdH0nIGlzIG5vdCBhbiB1cGdyYWRlIGluIEtpdHRlbnMgR2FtZSFgKSk7XG4gICAgfVxuXG4gICAgVXBncmFkZVNldHRpbmdzLnZhbGlkYXRlR2FtZShnYW1lLCBzZXR0aW5ncy51bmxvY2tVcGdyYWRlcyk7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFdvcmtzaG9wU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5yZXNvdXJjZXMsIHNldHRpbmdzLnJlc291cmNlcywgKHJlc291cmNlLCBpdGVtKSA9PiB7XG4gICAgICByZXNvdXJjZS5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyByZXNvdXJjZS5lbmFibGVkO1xuICAgICAgcmVzb3VyY2UubGltaXRlZCA9IGl0ZW0/LmxpbWl0ZWQgPz8gcmVzb3VyY2UubGltaXRlZDtcbiAgICAgIHJlc291cmNlLm1heCA9IGl0ZW0/Lm1heCA/PyByZXNvdXJjZS5tYXg7XG4gICAgICByZXNvdXJjZS50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyByZXNvdXJjZS50cmlnZ2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy51bmxvY2tVcGdyYWRlcy5sb2FkKHNldHRpbmdzLnVubG9ja1VwZ3JhZGVzKTtcblxuICAgIHRoaXMuc2hpcE92ZXJyaWRlLmVuYWJsZWQgPSBzZXR0aW5ncy5zaGlwT3ZlcnJpZGU/LmVuYWJsZWQgPz8gdGhpcy5zaGlwT3ZlcnJpZGUuZW5hYmxlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIG11c3RFeGlzdCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHR5cGUgQXV0b21hdGlvbiwgRW5naW5lLCB0eXBlIEZyYW1lQ29udGV4dCB9IGZyb20gXCIuL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBNYXRlcmlhbHNDYWNoZSB9IGZyb20gXCIuL2hlbHBlci9NYXRlcmlhbHNDYWNoZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBDcmFmdFNldHRpbmdzSXRlbSwgV29ya3Nob3BTZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzL1dvcmtzaG9wU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBvYmplY3RFbnRyaWVzIH0gZnJvbSBcIi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgbmVnYXRpdmVPbmVUb0luZmluaXR5IH0gZnJvbSBcIi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSwgUmVzb3VyY2VDcmFmdGFibGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1hbmFnZXIsIFVuc2FmZVJlc291cmNlIH0gZnJvbSBcIi4vdHlwZXMvcmVzb3VyY2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFZpbGxhZ2UgfSBmcm9tIFwiLi90eXBlcy92aWxsYWdlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVuc2FmZUNyYWZ0LCBVbnNhZmVVcGdyYWRlIH0gZnJvbSBcIi4vdHlwZXMvd29ya3Nob3AuanNcIjtcbmltcG9ydCB7IFVwZ3JhZGVNYW5hZ2VyIH0gZnJvbSBcIi4vVXBncmFkZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFVzZXJTY3JpcHRMb2FkZXIgfSBmcm9tIFwiLi9Vc2VyU2NyaXB0TG9hZGVyLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hvcE1hbmFnZXIgZXh0ZW5kcyBVcGdyYWRlTWFuYWdlciBpbXBsZW1lbnRzIEF1dG9tYXRpb24ge1xuICByZWFkb25seSBzZXR0aW5nczogV29ya3Nob3BTZXR0aW5ncztcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxWaWxsYWdlPjtcblxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DT05TVU1FX1JBVEUgPSAxO1xuXG4gIGNvbnN0cnVjdG9yKGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsIHNldHRpbmdzID0gbmV3IFdvcmtzaG9wU2V0dGluZ3MoKSkge1xuICAgIHN1cGVyKGhvc3QpO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIldvcmtzaG9wXCIpO1xuICB9XG5cbiAgdGljayhfY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dG9DcmFmdCgpO1xuICAgIHRoaXMucmVmcmVzaFN0b2NrKCk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy51bmxvY2tVcGdyYWRlcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5hdXRvVW5sb2NrKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgYXN5bmMgYXV0b1VubG9jaygpIHtcbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS53b3Jrc2hvcFRhYi52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXBncmFkZXMgPSB0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AudXBncmFkZXM7XG4gICAgY29uc3QgdG9VbmxvY2sgPSBuZXcgQXJyYXk8VW5zYWZlVXBncmFkZT4oKTtcblxuICAgIHdvcmtMb29wOiBmb3IgKGNvbnN0IHNldHRpbmcgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNldHRpbmdzLnVubG9ja1VwZ3JhZGVzLnVwZ3JhZGVzKSkge1xuICAgICAgaWYgKCFzZXR0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZ3JhZGUgPSB1cGdyYWRlcy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5uYW1lID09PSBzZXR0aW5nLnVwZ3JhZGUpO1xuICAgICAgaWYgKGlzTmlsKHVwZ3JhZGUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woYFVwZ3JhZGUgJyR7c2V0dGluZy51cGdyYWRlfScgbm90IGZvdW5kIGluIGdhbWUhYCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZ3JhZGUucmVzZWFyY2hlZCB8fCAhdXBncmFkZS51bmxvY2tlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgcHJpY2VzIGZvciB0aGlzIHVwZ3JhZGUsIHNvIHRoYXQgd2UgY2FuIGFwcGx5IGVmZmVjdHMgdG8gaXQuXG4gICAgICBsZXQgcHJpY2VzID0gVXNlclNjcmlwdExvYWRlci53aW5kb3cuZG9qby5jbG9uZSh1cGdyYWRlLnByaWNlcyk7XG4gICAgICBwcmljZXMgPSB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5nZXRFZmZlY3RMZWFkZXIoXCJzY2llbnRpc3RcIiwgcHJpY2VzKTtcbiAgICAgIGZvciAoY29uc3QgcHJpY2Ugb2YgcHJpY2VzKSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IHRoaXMuZ2V0VmFsdWVBdmFpbGFibGUocHJpY2UubmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZShwcmljZS5uYW1lKTtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IEVuZ2luZS5ldmFsdWF0ZVN1YlNlY3Rpb25UcmlnZ2VyKFxuICAgICAgICAgIHRoaXMuc2V0dGluZ3MudW5sb2NrVXBncmFkZXMudHJpZ2dlcixcbiAgICAgICAgICBzZXR0aW5nLnRyaWdnZXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0cmlnZ2VyIDwgMCB8fFxuICAgICAgICAgICgwIDwgdHJpZ2dlciAmJiBhdmFpbGFibGUgPCByZXNvdXJjZS5tYXhWYWx1ZSAqIHRyaWdnZXIpIHx8XG4gICAgICAgICAgYXZhaWxhYmxlIDwgcHJpY2UudmFsXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlIHdvcmtMb29wO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRvVW5sb2NrLnB1c2godXBncmFkZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRvVW5sb2NrKSB7XG4gICAgICBhd2FpdCB0aGlzLnVwZ3JhZGUoaXRlbSwgXCJ3b3Jrc2hvcFwiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGNyYWZ0IGFzIG1hbnkgb2YgdGhlIHBhc3NlZCByZXNvdXJjZXMgYXMgcG9zc2libGUuXG4gICAqIFVzdWFsbHksIHRoaXMgaXMgY2FsbGVkIGF0IGVhY2ggaXRlcmF0aW9uIG9mIHRoZSBhdXRvbWF0aW9uIGVuZ2luZSB0b1xuICAgKiBoYW5kbGUgdGhlIGNyYWZ0aW5nIG9mIGl0ZW1zIG9uIHRoZSBXb3Jrc2hvcCB0YWIuXG4gICAqXG4gICAqIEBwYXJhbSBjcmFmdHMgVGhlIHJlc291cmNlcyB0byBidWlsZC5cbiAgICovXG4gIGF1dG9DcmFmdChcbiAgICBjcmFmdHM6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlQ3JhZnRhYmxlLCBDcmFmdFNldHRpbmdzSXRlbT4+ID0gdGhpcy5zZXR0aW5ncy5yZXNvdXJjZXMsXG4gICkge1xuICAgIGNvbnN0IGNyYWZ0UmVxdWVzdHMgPSBuZXcgTWFwPFxuICAgICAgQ3JhZnRTZXR0aW5nc0l0ZW0sXG4gICAgICB7XG4gICAgICAgIGNvdW50UmVxdWVzdGVkOiBudW1iZXI7XG4gICAgICAgIG1hdGVyaWFsczogQXJyYXk8e1xuICAgICAgICAgIHJlc291cmNlOiBSZXNvdXJjZTtcbiAgICAgICAgICBjb25zdW1lOiBudW1iZXI7XG4gICAgICAgIH0+O1xuICAgICAgfVxuICAgID4oKTtcbiAgICBjb25zdCBzZWN0aW9uVHJpZ2dlciA9IHRoaXMuc2V0dGluZ3MudHJpZ2dlcjtcblxuICAgIC8vIEZpbmQgYWxsIHJlc291cmNlcyB3ZSB3b3VsZCB3YW50IHRvIGNyYWZ0LlxuICAgIC8vIEZvciBjcmFmdHMgdGhhdCByZXF1aXJlIHJlc291cmNlcyB3aXRoIGEgY2FwYWNpdHksIHRob3NlIHJlc291cmNlcyBtdXN0XG4gICAgLy8gYmUgYXQgb3IgYWJvdmUgdGhlIHRyaWdnZXIgZm9yIHRoZW0gdG8gYmUgY29uc2lkZXJlZCB0byBiZSBjcmFmdGVkLlxuICAgIGZvciAoY29uc3QgY3JhZnQgb2YgT2JqZWN0LnZhbHVlcyhjcmFmdHMpKSB7XG4gICAgICBjb25zdCB0cmlnZ2VyID0gRW5naW5lLmV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoc2VjdGlvblRyaWdnZXIsIGNyYWZ0LnRyaWdnZXIpO1xuICAgICAgaWYgKHRyaWdnZXIgPCAwIHx8ICFjcmFmdC5lbmFibGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50ID0gIWNyYWZ0Lm1heCA/IGZhbHNlIDogdGhpcy5nZXRSZXNvdXJjZShjcmFmdC5yZXNvdXJjZSk7XG4gICAgICBjb25zdCBtYXggPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkoY3JhZnQubWF4KTtcbiAgICAgIGlmIChjdXJyZW50ICYmIG1heCA8IGN1cnJlbnQudmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIGNhbid0IGV2ZW4gY3JhZnQgYSBzaW5nbGUgaXRlbSBvZiB0aGUgcmVzb3VyY2UsIHNraXAgaXQuXG4gICAgICBpZiAoIXRoaXMuc2luZ2xlQ3JhZnRQb3NzaWJsZShjcmFmdC5yZXNvdXJjZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IE9iamVjdC5rZXlzKHRoaXMuZ2V0TWF0ZXJpYWxzKGNyYWZ0LnJlc291cmNlKSkgYXMgQXJyYXk8UmVzb3VyY2U+O1xuICAgICAgLy8gVGhlIHJlc291cmNlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWlyZW1lbnQgb2YgdGhpcyBjcmFmdCB3aGljaCBoYXZlIGEgY2FwYWNpdHkuXG4gICAgICBjb25zdCByZXF1aXJlZE1hdGVyaWFscyA9IG1hdGVyaWFsc1xuICAgICAgICAubWFwKG1hdGVyaWFsID0+IHRoaXMuZ2V0UmVzb3VyY2UobWF0ZXJpYWwpKVxuICAgICAgICAuZmlsdGVyKG1hdGVyaWFsID0+IDAgPCBtYXRlcmlhbC5tYXhWYWx1ZSk7XG5cbiAgICAgIGNvbnN0IGFsbE1hdGVyaWFsc0Fib3ZlVHJpZ2dlciA9XG4gICAgICAgIHJlcXVpcmVkTWF0ZXJpYWxzLmZpbHRlcihtYXRlcmlhbCA9PiBtYXRlcmlhbC52YWx1ZSAvIG1hdGVyaWFsLm1heFZhbHVlIDwgdHJpZ2dlcilcbiAgICAgICAgICAubGVuZ3RoID09PSAwO1xuXG4gICAgICBpZiAoIWFsbE1hdGVyaWFsc0Fib3ZlVHJpZ2dlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY3JhZnRSZXF1ZXN0cy5zZXQoY3JhZnQsIHtcbiAgICAgICAgY291bnRSZXF1ZXN0ZWQ6IDEsXG4gICAgICAgIG1hdGVyaWFsczogbWF0ZXJpYWxzLm1hcChtYXRlcmlhbCA9PiAoe1xuICAgICAgICAgIGNvbnN1bWU6IDAsXG4gICAgICAgICAgcmVzb3VyY2U6IG1hdGVyaWFsLFxuICAgICAgICB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY3JhZnRSZXF1ZXN0cy5zaXplIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBhbGwgY3JhZnRzIHVuZGVyIGNvbnNpZGVyYXRpb24sIGZpbmQgdGhlIGNyYWZ0cyB0aGF0IHNoYXJlIHJlc291cmNlcyBpbiB0aGVpciByZXF1aXJlbWVudHMuXG4gICAgLy8gV2Ugd2lsbCB1c2UgdGhpcyB0byBzcGxpdCBjcmFmdHMgZXZlbmx5IGFtb25nIHRoZSBhdmFpbGFibGUgc3RvY2sgb2YgdGhhdCByZXNvdXJjZS5cbiAgICBjb25zdCBiaWxsT2ZNYXRlcmlhbHMgPSBuZXcgTWFwPFJlc291cmNlLCBBcnJheTxSZXNvdXJjZUNyYWZ0YWJsZT4+KCk7XG4gICAgZm9yIChjb25zdCBbY3JhZnQsIHJlcXVlc3RdIG9mIGNyYWZ0UmVxdWVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgcmVxdWVzdC5tYXRlcmlhbHMpIHtcbiAgICAgICAgaWYgKCFiaWxsT2ZNYXRlcmlhbHMuaGFzKG1hdGVyaWFsLnJlc291cmNlKSkge1xuICAgICAgICAgIGJpbGxPZk1hdGVyaWFscy5zZXQobWF0ZXJpYWwucmVzb3VyY2UsIG5ldyBBcnJheTxSZXNvdXJjZUNyYWZ0YWJsZT4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uc3VtZXJzID0gbXVzdEV4aXN0KGJpbGxPZk1hdGVyaWFscy5nZXQobWF0ZXJpYWwucmVzb3VyY2UpKTtcbiAgICAgICAgY29uc3VtZXJzLnB1c2goY3JhZnQucmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBob3cgbXVjaCBvZiBlYWNoIHJlc291cmNlIHdlIHdhbnQgdG8gc3BlbmQgb24gZWFjaCBjcmFmdC5cbiAgICBmb3IgKGNvbnN0IFssIHJlcXVlc3RdIG9mIGNyYWZ0UmVxdWVzdHMpIHtcbiAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2YgcmVxdWVzdC5tYXRlcmlhbHMpIHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlID0gdGhpcy5nZXRWYWx1ZUF2YWlsYWJsZShtYXRlcmlhbC5yZXNvdXJjZSk7XG4gICAgICAgIG1hdGVyaWFsLmNvbnN1bWUgPSBhdmFpbGFibGUgLyBtdXN0RXhpc3QoYmlsbE9mTWF0ZXJpYWxzLmdldChtYXRlcmlhbC5yZXNvdXJjZSkpLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggb2YgZWFjaCBjcmFmdCB3ZSB3YW50IHRvIHBlcmZvcm0sIGdpdmVuIG91ciByZXNvdXJjZSBhbGxvY2F0aW9ucy5cbiAgICBmb3IgKGNvbnN0IFtjcmFmdCwgcmVxdWVzdF0gb2YgY3JhZnRSZXF1ZXN0cykge1xuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gdGhpcy5nZXRNYXRlcmlhbHMoY3JhZnQucmVzb3VyY2UpO1xuICAgICAgbGV0IGFtb3VudCA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICBmb3IgKGNvbnN0IG1hdGVyaWFsIG9mIHJlcXVlc3QubWF0ZXJpYWxzKSB7XG4gICAgICAgIC8vIEhvdyBtdWNoIG9mIHRoZSBtYXRlcmlhbCBpcyBuZWVkZWQgdG8gY3JhZnQgMSBuZXcgcmVzb3VyY2UuXG4gICAgICAgIGNvbnN0IG1hdGVyaWFsQW1vdW50ID0gbXVzdEV4aXN0KG1hdGVyaWFsc1ttYXRlcmlhbC5yZXNvdXJjZV0pO1xuXG4gICAgICAgIGNvbnN0IG1hdGVyaWFsUmVzb3VyY2UgPSB0aGlzLmdldFJlc291cmNlKG1hdGVyaWFsLnJlc291cmNlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgLy8gRm9yIHVubGltaXRlZCBjcmFmdHMsIGFzc2lnbiBhbGwgcmVzb3VyY2VzLlxuICAgICAgICAgICFjcmFmdC5saW1pdGVkIHx8XG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBzaGlwIG92ZXJyaWRlLlxuICAgICAgICAgIChjcmFmdC5yZXNvdXJjZSA9PT0gXCJzaGlwXCIgJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc2hpcE92ZXJyaWRlLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzb3VyY2UoXCJzaGlwXCIpLnZhbHVlIDwgMjQzKVxuICAgICAgICApIHtcbiAgICAgICAgICBhbW91bnQgPSBNYXRoLm1pbihhbW91bnQsIG1hdGVyaWFsLmNvbnN1bWUgLyBtYXRlcmlhbEFtb3VudCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXRpbyA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRSZXNDcmFmdFJhdGlvKGNyYWZ0LnJlc291cmNlKTtcblxuICAgICAgICAvLyBRdWFudGl0eSBvZiBzb3VyY2UgYW5kIHRhcmdldCByZXNvdXJjZSBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgICAgICBjb25zdCBhdmFpbGFibGVTb3VyY2UgPVxuICAgICAgICAgIHRoaXMuZ2V0VmFsdWVBdmFpbGFibGUobWF0ZXJpYWwucmVzb3VyY2UpIC9cbiAgICAgICAgICBtdXN0RXhpc3QoYmlsbE9mTWF0ZXJpYWxzLmdldChtYXRlcmlhbC5yZXNvdXJjZSkpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlVGFyZ2V0ID0gdGhpcy5nZXRWYWx1ZUF2YWlsYWJsZShjcmFmdC5yZXNvdXJjZSk7XG5cbiAgICAgICAgLy8gSG93IG11Y2ggc291cmNlIHJlc291cmNlIGlzIGNvbnN1bWVkIGFuZCB0YXJnZXQgcmVzb3VyY2UgaXMgY3JhZnRlZCBwZXIgY3JhZnQgb3BlcmF0aW9uLlxuICAgICAgICBjb25zdCByZWNpcGVSZXF1aXJlcyA9IG1hdGVyaWFsQW1vdW50O1xuICAgICAgICBjb25zdCByZWNpcGVQcm9kdWNlcyA9IDEgKyByYXRpbztcblxuICAgICAgICAvLyBIb3cgbWFueSBjcmFmdHMgY291bGQgd2UgZG8gZ2l2ZW4gdGhlIGFtb3VudCBvZiBzb3VyY2UgcmVzb3VyY2UgYXZhaWxhYmxlLlxuICAgICAgICBjb25zdCBjcmFmdHNQb3NzaWJsZSA9IGF2YWlsYWJsZVNvdXJjZSAvIHJlY2lwZVJlcXVpcmVzO1xuXG4gICAgICAgIC8vIEhvdyBtYW55IGNyYWZ0cyB3ZXJlIGh5cG90aGV0aWNhbGx5IGRvbmUgdG8gcHJvZHVjZSB0aGUgY3VycmVudCBhbW91bnQgb2YgdGFyZ2V0IHJlc291cmNlLlxuICAgICAgICBjb25zdCBjcmFmdHNEb25lID0gYXZhaWxhYmxlVGFyZ2V0IC8gcmVjaXBlUHJvZHVjZXM7XG4gICAgICAgIC8vIFRoZSBcIm9yZGVyIG9mIG1hZ25pdHVkZVwiIChob3cgbWFueSBwb3dlcnMgb2YgMTApIG9mIHRoZSBleGlzdGluZyB0YXJnZXQgcmVzb3VyY2UuXG4gICAgICAgIGNvbnN0IG9yZGVyRG9uZSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTWF0aC5sb2coY3JhZnRzRG9uZSkgLyBNYXRoLkxOMTAgKyAwLjAwMDAwMDAwMSkpO1xuXG4gICAgICAgIC8vIENyYWZ0aW5nIGdldHMgcHJvZ3Jlc3NpdmVseSBtb3JlIGV4cGVuc2l2ZSBhcyB0aGUgYW1vdW50IG9mIHRoZSB0YXJnZXQgaW5jcmVhc2VzLlxuICAgICAgICAvLyBUaGlzIGhldXJpc3RpYyBnaXZlcyBvdGhlciwgY2hlYXBlciwgdGFyZ2V0cyBhIGNoYW5jZSB0byBnZXQgYnVpbHQgZnJvbSB0aGUgc2FtZSBzb3VyY2UgcmVzb3VyY2UuXG4gICAgICAgIGFtb3VudCA9IE1hdGgubWluKFxuICAgICAgICAgIC8vIFdoYXRldmVyIHdhcyBwcmV2aW91c2x5IGFzc3VtZWQgYXMgdGhlIGJlc3QgYW1vdW50LlxuICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAvLyBXZSB3YW50IHRvIGNyYWZ0IHRoZSBsb3dlc3QgYW1vdW50IG9mIHRoZXNlIHZhbHVlcywgYXMgd2UncmUgaW4gdGhlIFwibGltaXRlZFwiIG1vZGUuXG4gICAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgICAvLyBXZSB0YWtlIHRoZSBwb3NzaWJsZSBjcmFmdHMgYXMgdGhlIGJhc2VsaW5lXG4gICAgICAgICAgICBjcmFmdHNQb3NzaWJsZSAtXG4gICAgICAgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgbWF0ZXJpYWwgaXMgb25lIHRoYXQgaGFzIGEgc3RvcmFnZSBjYXBhY2l0eSwgYW5kIHRoZSBzdG9yYWdlIGlzIGZ1bGwsXG4gICAgICAgICAgICAgIC8vIHRoZW4gd2Ugd2FudCB0byBhbGxvdyBhbGwgcG9zc2libGUgY3JhZnRzIHRvIGJlIGNyYWZ0ZWQuIFNvIHdlIHN1YnRyYWN0IDAuXG4gICAgICAgICAgICAgICgwIDwgbWF0ZXJpYWxSZXNvdXJjZS5tYXhWYWx1ZSAmJiBtYXRlcmlhbFJlc291cmNlLm1heFZhbHVlIDw9IG1hdGVyaWFsUmVzb3VyY2UudmFsdWVcbiAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICA6IC8vIElmIHRoZSByZXNvdXJjZSBpcyBub3QgY2FwcGVkLCB3ZSBzdWJ0cmFjdCB0aGUgY3JhZnRzIHdlIGhhdmUgYWxyZWFkeSBkb25lLlxuICAgICAgICAgICAgICAgICAgY3JhZnRzRG9uZSksXG4gICAgICAgICAgICAvLyBUaGUgc2FmZSBsaW1pdCBpcyB0byBidXkgdGhlIG5leHQgaGlnaGVyIG9yZGVyIG9mIG1hZ25pdHVkZSBvZiBpdGVtcywgdG8gbm90XG4gICAgICAgICAgICAvLyB3YXN0ZSBhbGwgcmVzb3VyY2VzIGlmIHRoZSB0YXJnZXQgcmVzb3VyY2UgaXMgdmVyeSBsb3csIGxpa2UgYWZ0ZXIgYSByZXNldCB3aXRoIGNocm9ub3NwaGVyZXMuXG4gICAgICAgICAgICAxMCAqKiAob3JkZXJEb25lICsgMSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICAvLyBUaGUgYW1vdW50IG9mIHJlc291cmNlcyB3ZSBjb3VsZCBjcmFmdCwgYmFzZWQgb24gb3VyIGNvbnN1bWUgcmF0ZS5cbiAgICAgICAgICBtYXRlcmlhbC5jb25zdW1lIC8gbWF0ZXJpYWxBbW91bnQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZVRhcmdldCA9IHRoaXMuZ2V0VmFsdWVBdmFpbGFibGUoY3JhZnQucmVzb3VyY2UpO1xuICAgICAgY29uc3QgcmVjaXBlUHJvZHVjZXMgPSAxICsgdGhpcy5faG9zdC5nYW1lLmdldFJlc0NyYWZ0UmF0aW8oY3JhZnQucmVzb3VyY2UpO1xuXG4gICAgICAvLyBJbiBhbnkgY2FzZSwgYXV0b0NyYWZ0IGFtb3VudCBzaG91bGQgbm90IGV4Y2VlZCBOdW1iZXIuTUFYX1ZBTFVFXG4gICAgICBjb25zdCBjcmFmdHNNYXhMaW1pdCA9IE51bWJlci5NQVhfVkFMVUUgLyByZWNpcGVQcm9kdWNlcyAtIGF2YWlsYWJsZVRhcmdldCAvIHJlY2lwZVByb2R1Y2VzO1xuICAgICAgYW1vdW50ID0gTWF0aC5taW4oYW1vdW50LCBjcmFmdHNNYXhMaW1pdCk7XG5cbiAgICAgIHJlcXVlc3QuY291bnRSZXF1ZXN0ZWQgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgY3JhZnQubWF4ID09PSAtMVxuICAgICAgICAgID8gYW1vdW50XG4gICAgICAgICAgOiBNYXRoLm1pbihhbW91bnQsIChjcmFmdC5tYXggLSBhdmFpbGFibGVUYXJnZXQpIC8gcmVjaXBlUHJvZHVjZXMpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjcmFmdCwgcmVxdWVzdF0gb2YgY3JhZnRSZXF1ZXN0cykge1xuICAgICAgaWYgKHJlcXVlc3QuY291bnRSZXF1ZXN0ZWQgPCAxKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5jcmFmdChjcmFmdC5yZXNvdXJjZSwgcmVxdWVzdC5jb3VudFJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyYWZ0IGEgY2VydGFpbiBhbW91bnQgb2YgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSB0byBjcmFmdC5cbiAgICogQHBhcmFtIGFtb3VudCBIb3cgbWFueSBpdGVtcyBvZiB0aGUgcmVzb3VyY2UgdG8gY3JhZnQuXG4gICAqL1xuICBjcmFmdChuYW1lOiBSZXNvdXJjZUNyYWZ0YWJsZSwgYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgYW1vdW50Q2FsY3VsYXRlZCA9IE1hdGguZmxvb3IoYW1vdW50KTtcblxuICAgIGlmIChhbW91bnRDYWxjdWxhdGVkIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2NhbkNyYWZ0KG5hbWUsIGFtb3VudENhbGN1bGF0ZWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3JhZnQgPSB0aGlzLmdldENyYWZ0KG5hbWUpO1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5faG9zdC5nYW1lLmdldFJlc0NyYWZ0UmF0aW8oY3JhZnQubmFtZSk7XG5cbiAgICB0aGlzLl9ob3N0LmdhbWUuY3JhZnQoY3JhZnQubmFtZSwgYW1vdW50Q2FsY3VsYXRlZCk7XG5cbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KG5hbWUpKS50aXRsZTtcblxuICAgIC8vIERldGVybWluZSBhY3R1YWwgYW1vdW50IGFmdGVyIGNyYWZ0aW5nIHVwZ3JhZGVzXG4gICAgYW1vdW50Q2FsY3VsYXRlZCA9IE51bWJlci5wYXJzZUZsb2F0KChhbW91bnRDYWxjdWxhdGVkICogKDEgKyByYXRpbykpLnRvRml4ZWQoMikpO1xuXG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KHJlc291cmNlTmFtZSwgYW1vdW50Q2FsY3VsYXRlZCwgXCJjcmFmdFwiKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICBcImFjdC5jcmFmdFwiLFxuICAgICAgW3RoaXMuX2hvc3QuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQoYW1vdW50Q2FsY3VsYXRlZCksIHJlc291cmNlTmFtZV0sXG4gICAgICBcImtzLWNyYWZ0XCIsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkNyYWZ0KG5hbWU6IFJlc291cmNlQ3JhZnRhYmxlLCBhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIENhbid0IGNyYWZ0IGFueXRoaW5nIGJ1dCB3b29kIHVudGlsIHdvcmtzaG9wIGlzIHVubG9ja2VkLlxuICAgIGlmICghdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wVGFiLnZpc2libGUgJiYgbmFtZSAhPT0gXCJ3b29kXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmFmdCA9IHRoaXMuZ2V0Q3JhZnQobmFtZSk7XG4gICAgY29uc3QgZW5hYmxlZCA9IG11c3RFeGlzdCh0aGlzLnNldHRpbmdzLnJlc291cmNlc1tuYW1lXSkuZW5hYmxlZDtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICBpZiAoY3JhZnQudW5sb2NrZWQgJiYgZW5hYmxlZCkge1xuICAgICAgcmVzdWx0ID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcHJpY2VzID0gdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldENyYWZ0UHJpY2UoY3JhZnQpO1xuICAgICAgZm9yIChjb25zdCBwcmljZSBvZiBwcmljZXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlQXZhaWxhYmxlKHByaWNlLm5hbWUpO1xuXG4gICAgICAgIGlmICh2YWx1ZSA8IHByaWNlLnZhbCAqIGFtb3VudCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcmVzb3VyY2UgaW5mb3JtYXRpb24gb2JqZWN0IGZyb20gdGhlIGdhbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjcmFmdGFibGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiBvYmplY3QgZm9yIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIGdldENyYWZ0KG5hbWU6IFJlc291cmNlQ3JhZnRhYmxlKTogVW5zYWZlQ3JhZnQge1xuICAgIGNvbnN0IGNyYWZ0ID0gdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldENyYWZ0KG5hbWUpO1xuICAgIGlmICghY3JhZnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgY3JhZnQgJyR7bmFtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBjcmFmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCByZXNvdXJjZXMgdG8gY3JhZnQgYSBzaW5nbGUgY3JhZnRhYmxlIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYnVpbGQgaXMgcG9zc2libGU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc2luZ2xlQ3JhZnRQb3NzaWJsZShuYW1lOiBSZXNvdXJjZUNyYWZ0YWJsZSk6IGJvb2xlYW4ge1xuICAgIC8vIENhbid0IGNyYWZ0IGFueXRoaW5nIGJ1dCB3b29kIHVudGlsIHdvcmtzaG9wIGlzIHVubG9ja2VkLlxuICAgIGlmICghdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wVGFiLnZpc2libGUgJiYgbmFtZSAhPT0gXCJ3b29kXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcbiAgICBmb3IgKGNvbnN0IFttYXRlcmlhbCwgYW1vdW50XSBvZiBvYmplY3RFbnRyaWVzKG1hdGVyaWFscykpIHtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlQXZhaWxhYmxlKG1hdGVyaWFsKSA8IGFtb3VudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBoYXNoIG9mIHRoZSByZXF1aXJlZCBzb3VyY2UgcmVzb3VyY2VzIGFuZCB0aGVpclxuICAgKiBhbW91bnQgdG8gY3JhZnQgdGhlIGdpdmVuIHJlc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcmVzb3VyY2UgdG8gY3JhZnQuXG4gICAqIEByZXR1cm5zIFRoZSBzb3VyY2UgcmVzb3VyY2VzIHlvdSBuZWVkIGFuZCBob3cgbWFueS5cbiAgICovXG4gIGdldE1hdGVyaWFscyhuYW1lOiBSZXNvdXJjZUNyYWZ0YWJsZSk6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlLCBudW1iZXI+PiB7XG4gICAgY29uc3QgbWF0ZXJpYWxzOiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj4gPSB7fTtcbiAgICBjb25zdCBjcmFmdCA9IHRoaXMuZ2V0Q3JhZnQobmFtZSk7XG5cbiAgICBjb25zdCBwcmljZXMgPSB0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0Q3JhZnRQcmljZShjcmFmdCk7XG5cbiAgICBmb3IgKGNvbnN0IHByaWNlIG9mIHByaWNlcykge1xuICAgICAgbWF0ZXJpYWxzW3ByaWNlLm5hbWVdID0gcHJpY2UudmFsO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRlcmlhbHM7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGhvdyBtdWNoIG9mIGEgcmVzb3VyY2UgaXMgcHJvZHVjZWQgcGVyIHRpY2suIEZvciBjcmFmdGFibGUgcmVzb3VyY2VzLFxuICAgKiB0aGlzIGFsc28gaW5jbHVkZXMgaG93IG1hbnkgb2YgdGhlbSB3ZSAqY291bGQqIGNyYWZ0IHRoaXMgdGljay5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byByZXRyaWV2ZSB0aGUgcHJvZHVjdGlvbiBmb3IuXG4gICAqIEBwYXJhbSBjYWNoZU1hbmFnZXIgQSBgQ2FjaGVNYW5hZ2VyYCB0byB1c2UgaW4gdGhlIHByb2Nlc3MuXG4gICAqIEBwYXJhbSBwcmVUcmFkZSA/XG4gICAqIEByZXR1cm5zIFRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIHByb2R1Y2VkIHBlciB0aWNrLCBhZGp1c3RlZCBhcmJpdHJhcmlseS5cbiAgICovXG4gIGdldFRpY2tWYWwoXG4gICAgcmVzb3VyY2U6IFVuc2FmZVJlc291cmNlLFxuICAgIGNhY2hlTWFuYWdlcj86IE1hdGVyaWFsc0NhY2hlLFxuICAgIHByZVRyYWRlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICApOiBudW1iZXIgfCBcImlnbm9yZVwiIHtcbiAgICBsZXQgcHJvZHVjdGlvbiA9IHRoaXMuX2hvc3QuZ2FtZS5nZXRSZXNvdXJjZVBlclRpY2socmVzb3VyY2UubmFtZSwgdHJ1ZSk7XG5cbiAgICAvLyBGb3IgY3JhZnRhYmxlIHJlc291cmNlcywgd2UgYWxzbyB3YW50IHRvIHRha2UgaW50byBhY2NvdW50IGhvdyBtdWNoIG9mIHRoZW1cbiAgICAvLyB3ZSAqY291bGQqIGNyYWZ0LlxuICAgIGlmIChyZXNvdXJjZS5jcmFmdGFibGUpIHtcbiAgICAgIGxldCBtaW5Qcm9kID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IHRoaXMuZ2V0TWF0ZXJpYWxzKHJlc291cmNlLm5hbWUgYXMgUmVzb3VyY2VDcmFmdGFibGUpO1xuICAgICAgZm9yIChjb25zdCBbbWF0LCBhbW91bnRdIG9mIG9iamVjdEVudHJpZXM8UmVzb3VyY2UsIG51bWJlcj4obWF0ZXJpYWxzKSkge1xuICAgICAgICBjb25zdCByYXQgPVxuICAgICAgICAgICgxICsgdGhpcy5faG9zdC5nYW1lLmdldFJlc0NyYWZ0UmF0aW8ocmVzb3VyY2UubmFtZSBhcyBSZXNvdXJjZUNyYWZ0YWJsZSkpIC8gYW1vdW50O1xuICAgICAgICAvLyBDdXJyZW50bHkgcHJlVHJhZGUgaXMgb25seSB0cnVlIGZvciB0aGUgZmVzdGl2YWwgc3R1ZmYsIHNvIGluY2x1ZGluZyBmdXJzIGZyb20gaHVudGluZyBpcyBpZGVhbC5cbiAgICAgICAgY29uc3QgYWRkUHJvZCA9IHRoaXMuZ2V0VGlja1ZhbCh0aGlzLmdldFJlc291cmNlKG1hdCkpO1xuICAgICAgICBpZiAoYWRkUHJvZCA9PT0gXCJpZ25vcmVcIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1pblByb2QgPSBNYXRoLm1pbihhZGRQcm9kICogcmF0LCBtaW5Qcm9kKTtcbiAgICAgIH1cbiAgICAgIHByb2R1Y3Rpb24gKz0gbWluUHJvZCAhPT0gTnVtYmVyLk1BWF9WQUxVRSA/IG1pblByb2QgOiAwO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbmVnYXRpdmUgcHJvZHVjdGlvbiAob3Igbm9uZSksIGFuZCB3ZSdyZSBsb29raW5nIGF0IGVpdGhlciBzcGljZSBvclxuICAgIC8vIGJsdWVwcmludHMsIHJldHVybiBcImlnbm9yZVwiLlxuICAgIC8vIFRPRE86IFRoaXMgc3BlY2lhbCBjYXNlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIHRyYWRpbmcuIEFzIHRyYWRpbmcgcmVzdWx0cyBpblxuICAgIC8vICAgICAgIHNwaWNlIGFuZCBibHVlcHJpbnRzLlxuICAgIGlmIChwcm9kdWN0aW9uIDw9IDAgJiYgKHJlc291cmNlLm5hbWUgPT09IFwic3BpY2VcIiB8fCByZXNvdXJjZS5uYW1lID09PSBcImJsdWVwcmludFwiKSkge1xuICAgICAgcmV0dXJuIFwiaWdub3JlXCI7XG4gICAgfVxuXG4gICAgLy8gSWYgXCJwcmVUcmFkZVwiIHdhcyBzZXQsIGluY3JlYXNlIHRoZSBwcm9kdWN0aW9uLiBUaGUgXCJyZXNWYWx1ZVwiIHN0b3JlZCBpbiB0aGUgY2FjaGVcbiAgICAvLyBtYWtlcyBubyBzZW5zZS5cbiAgICAvLyBUT0RPOiBUaGUgb25seSB0aW1lIHRoaXMgaXMgdXNlZCBpcyBmb3IgaG9sZGluZyBmZXN0aXZhbHMuXG4gICAgLy8gICAgICAgSXQncyB1bmNsZWFyIHdoeSB0aGlzIHdvdWxkIGJlIG5lY2Vzc2FyeS5cbiAgICBpZiAoIXByZVRyYWRlICYmICFpc05pbChjYWNoZU1hbmFnZXIpKSB7XG4gICAgICBwcm9kdWN0aW9uICs9IGNhY2hlTWFuYWdlci5nZXRSZXNWYWx1ZShyZXNvdXJjZS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2R1Y3Rpb247XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSByZXNvdXJjZXMgYW5kIHRoZWlyIGFtb3VudCB0aGF0IHdvdWxkIHVzdWFsbHkgcmVzdWx0IGZyb20gYSBodW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgYW1vdW50cyBvZiByZXNvdXJjZXMgdXN1YWxseSBnYWluZWQgZnJvbSBodW50aW5nLlxuICAgKi9cbiAgZ2V0QXZlcmFnZUh1bnQoKTogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+IHtcbiAgICBjb25zdCBvdXRwdXQ6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlLCBudW1iZXI+PiA9IHt9O1xuICAgIGNvbnN0IGh1bnRlclJhdGlvID1cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJodW50ZXJSYXRpb1wiKSArXG4gICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5nZXRFZmZlY3RMZWFkZXIoXCJtYW5hZ2VyXCIsIDApO1xuXG4gICAgb3V0cHV0LmZ1cnMgPSA0MCArIDMyLjUgKiBodW50ZXJSYXRpbztcblxuICAgIG91dHB1dC5pdm9yeSA9XG4gICAgICA1MCAqIE1hdGgubWluKDAuMjI1ICsgMC4wMSAqIGh1bnRlclJhdGlvLCAwLjUpICtcbiAgICAgIDQwICogaHVudGVyUmF0aW8gKiBNYXRoLm1pbigwLjIyNSArIDAuMDEgKiBodW50ZXJSYXRpbywgMC41KTtcblxuICAgIG91dHB1dC51bmljb3JucyA9IDAuMDU7XG5cbiAgICBpZiAodGhpcy5nZXRWYWx1ZShcInplYnJhc1wiKSA+PSAxMCkge1xuICAgICAgb3V0cHV0LmJsb29kc3RvbmUgPSB0aGlzLmdldFZhbHVlKFwiYmxvb2RzdG9uZVwiKSA9PT0gMCA/IDAuMDUgOiAwLjAwMDU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS5pcm9uV2lsbCAmJiB0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0KFwiZ29sZE9yZVwiKS5yZXNlYXJjaGVkKSB7XG4gICAgICBvdXRwdXQuZ29sZCA9IDAuNjI1ICsgMC42MjUgKiBodW50ZXJSYXRpbztcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBvYmplY3QgZm9yIGEgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSB0byByZXRyaWV2ZSBpbmZvIGZvci5cbiAgICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIG9iamVjdCBmb3IgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgZ2V0UmVzb3VyY2UobmFtZTogUmVzb3VyY2UpOiBSZXR1cm5UeXBlPFJlc291cmNlTWFuYWdlcltcImdldFwiXT4ge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChuYW1lKTtcbiAgICBpZiAoaXNOaWwocmVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCByZXNvdXJjZSAke25hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGhvdyBtYW55IGl0ZW1zIG9mIGEgcmVzb3VyY2UgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZS5cbiAgICogQHJldHVybnMgSG93IG1hbnkgaXRlbXMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBnZXRWYWx1ZShuYW1lOiBSZXNvdXJjZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2UobmFtZSkudmFsdWUgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaG93IG1hbnkgaXRlbXMgb2YgdGhlIHJlc291cmNlIHRvIGFsd2F5cyBrZWVwIGluIHN0b2NrLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIEhvdyBtYW55IGl0ZW1zIG9mIHRoZSByZXNvdXJjZSB0byBhbHdheXMga2VlcCBpbiBzdG9jay5cbiAgICovXG4gIGdldFN0b2NrKG5hbWU6IFJlc291cmNlKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLnJlc291cmNlcy5yZXNvdXJjZXNbbmFtZV07XG4gICAgY29uc3Qgc3RvY2sgPSByZXNvdXJjZS5lbmFibGVkID8gcmVzb3VyY2Uuc3RvY2sgOiAwO1xuXG4gICAgcmV0dXJuIHN0b2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjb25zdW1lIHJhdGUgZm9yIGEgcmVzb3VyY2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHJlc291cmNlLlxuICAgKiBAcmV0dXJucyBUaGUgY29uc3VtZSByYXRlIGZvciB0aGUgcmVzb3VyY2UuXG4gICAqL1xuICBnZXRDb25zdW1lKG5hbWU6IFJlc291cmNlKTogbnVtYmVyIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLnJlc291cmNlcy5yZXNvdXJjZXNbbmFtZV07XG4gICAgY29uc3QgY29uc3VtZSA9IHJlc291cmNlLmVuYWJsZWQgPyByZXNvdXJjZS5jb25zdW1lIDogMTtcblxuICAgIHJldHVybiBjb25zdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBob3cgbXVjaCBvZiBhIHJlc291cmNlIGlzIGF2YWlsYWJsZSBmb3IgYSBjZXJ0YWluIG9wZXJhdGlvblxuICAgKiB0byB1c2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByZXNvdXJjZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBhbW91bnQgb2YgdGhlIHJlc291cmNlLlxuICAgKi9cbiAgZ2V0VmFsdWVBdmFpbGFibGUobmFtZTogUmVzb3VyY2UpOiBudW1iZXIge1xuICAgIC8vIEhvdyBtYW55IGl0ZW1zIHRvIGtlZXAgaW4gc3RvY2suXG4gICAgbGV0IHN0b2NrID0gdGhpcy5nZXRTdG9jayhuYW1lKTtcblxuICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyBjYXRuaXAsIGVuc3VyZSB0byBub3QgdXNlIHNvIG11Y2ggdGhhdCB3ZSBjYW4ndCBzYXRpc2Z5XG4gICAgLy8gY29uc3VtcHRpb24gYnkga2l0dGVucy5cbiAgICBpZiAoXCJjYXRuaXBcIiA9PT0gbmFtZSkge1xuICAgICAgY29uc3QgcGFzdHVyZU1ldGEgPSB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KFwicGFzdHVyZVwiKS5tZXRhO1xuICAgICAgY29uc3QgYXF1ZWR1Y3RNZXRhID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcImFxdWVkdWN0XCIpLm1ldGE7XG4gICAgICBjb25zdCBwYXN0dXJlcyA9IHBhc3R1cmVNZXRhLnN0YWdlID09PSAwID8gcGFzdHVyZU1ldGEudmFsIDogMDtcbiAgICAgIGNvbnN0IGFxdWVkdWN0cyA9IGFxdWVkdWN0TWV0YS5zdGFnZSA9PT0gMCA/IGFxdWVkdWN0TWV0YS52YWwgOiAwO1xuICAgICAgLy8gSG93IG1hbnkgY2F0bmlwIHBlciB0aWNrIGRvIHdlIGhhdmUgYXZhaWxhYmxlPyBUaGlzIGNhbiBiZSBuZWdhdGl2ZS5cbiAgICAgIGNvbnN0IHJlc1BlclRpY2sgPSB0aGlzLmdldFBvdGVudGlhbENhdG5pcCh0cnVlLCBwYXN0dXJlcywgYXF1ZWR1Y3RzKTtcblxuICAgICAgLy8gSWYgb3VyIHN0b2NrIGlzIGN1cnJlbnRseSBkZWNyZWFzaW5nLiBFbnN1cmUgd2Ugd29yayB3aXRoIHRoZSB2YWx1ZVxuICAgICAgLy8gd2hlcmUgaXQgc2hvdWxkIGJlIGluIDUgdGlja3MuXG4gICAgICAvLyBUT0RPOiBJJ20gYXNzdW1pbmcgMjAyIGlzIHRoZSBjYXRuaXAgY29uc3VtcHRpb24gcGVyIHRpY2sgYW5kIHRoZSA1IGFyZSBhXG4gICAgICAvLyAgICAgICBtYWdpYyB2YWx1ZSB0aGF0IGp1c3QgbWFkZSBzZW5zZSwgb3IgdGhlIHNjcmlwdCBhc3N1bWVzIGl0IHJ1bnMgZXZlcnlcbiAgICAgIC8vICAgICAgIDUgdGlja3MuIFdoaWNoIHdvdWxkIG1lYW4gaXQgcHJvYmFibHkgaWdub3JlcyB0aGUgYGludGVydmFsYCBzZXR0aW5nLlxuICAgICAgaWYgKHJlc1BlclRpY2sgPCAwKSB7XG4gICAgICAgIHN0b2NrIC09IHJlc1BlclRpY2sgKiAyMDIgKiA1O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhvdyBtYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUobmFtZSk7XG4gICAgLy8gU3VidHJhY3QgdGhlIGFtb3VudCB0byBrZWVwIGluIHN0b2NrLlxuICAgIHZhbHVlID0gTWF0aC5tYXgodmFsdWUgLSBzdG9jaywgMCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGNvbnN1bWUgcmF0ZS5cbiAgICBjb25zdCBjb25zdW1lID0gdGhpcy5nZXRDb25zdW1lKG5hbWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlICogY29uc3VtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaG93IG11Y2ggY2F0bmlwIHdlIGhhdmUgYXZhaWxhYmxlIHRvIFwid29yayB3aXRoXCIgcGVyIHRpY2suXG4gICAqXG4gICAqIEBwYXJhbSB3b3JzdFdlYXRoZXIgU2hvdWxkIHRoZSB3b3JzdCB3ZWF0aGVyIGJlIGFzc3VtZWQgZm9yIHRoaXMgY2FsY3VsYXRpb24/XG4gICAqIEBwYXJhbSBwYXN0dXJlcyBIb3cgbWFueSBwYXN0dXJlcyB0byB0YWtlIGludG8gYWNjb3VudC5cbiAgICogQHBhcmFtIGFxdWVkdWN0cyBIb3cgbWFueSBhcXVlZHVjdHMgdG8gdGFrZSBpbnRvIGFjY291bnRcbiAgICogQHJldHVybnMgVGhlIHBvdGVudGlhbCBjYXRuaXAgcGVyIHRpY2suXG4gICAqL1xuICBnZXRQb3RlbnRpYWxDYXRuaXAod29yc3RXZWF0aGVyOiBib29sZWFuLCBwYXN0dXJlczogbnVtYmVyLCBhcXVlZHVjdHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gU3RhcnQgb2YgYnkgY2hlY2tpbmcgaG93IG11Y2ggY2F0bmlwIHdlIHByb2R1Y2UgcGVyIHRpY2sgYXQgYmFzZSBsZXZlbC5cbiAgICBsZXQgcHJvZHVjdGlvbkZpZWxkID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImNhdG5pcFBlclRpY2tCYXNlXCIpO1xuXG4gICAgaWYgKHdvcnN0V2VhdGhlcikge1xuICAgICAgLy8gQXNzdW1lIGZpZWxkcyBydW4gYXQgLTkwJVxuICAgICAgcHJvZHVjdGlvbkZpZWxkICo9IDAuMTtcbiAgICAgIC8vIEZhY3RvciBpbiBjb2xkIGhhcnNobmVzcy5cbiAgICAgIHByb2R1Y3Rpb25GaWVsZCAqPVxuICAgICAgICAxICsgdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUih0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwiY29sZEhhcnNobmVzc1wiKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2R1Y3Rpb25GaWVsZCAqPVxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZ2V0V2VhdGhlck1vZCh7IG5hbWU6IFwiY2F0bmlwXCIgfSkgK1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZ2V0Q3VyU2Vhc29uKCkubW9kaWZpZXJzLmNhdG5pcDtcbiAgICB9XG5cbiAgICAvLyBXaGVuIHRoZSBjb21tdW5pc20gcG9saWN5IGlzIGFjdGl2ZSxcbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnNjaWVuY2UuZ2V0UG9saWN5KFwiY29tbXVuaXNtXCIpLnJlc2VhcmNoZWQpIHtcbiAgICAgIHByb2R1Y3Rpb25GaWVsZCA9IDA7XG4gICAgfVxuXG4gICAgLy8gR2V0IGJhc2UgcHJvZHVjdGlvbiB2YWx1ZXMgZm9yIGpvYnMuXG4gICAgY29uc3QgcmVzb3VyY2VQcm9kdWN0aW9uID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0UmVzUHJvZHVjdGlvbigpO1xuICAgIC8vIENoZWNrIGhvdyBtdWNoIGNhdG5pcCB3ZSdyZSBwcm9kdWNpbmcgdGhyb3VnaCBraXR0ZW4gam9icy5cbiAgICBjb25zdCBwcm9kdWN0aW9uVmlsbGFnZXIgPSByZXNvdXJjZVByb2R1Y3Rpb24uY2F0bmlwXG4gICAgICA/IHJlc291cmNlUHJvZHVjdGlvbi5jYXRuaXAgKiAoMSArIHRoaXMuX2hvc3QuZ2FtZS5nZXRFZmZlY3QoXCJjYXRuaXBKb2JSYXRpb1wiKSlcbiAgICAgIDogMDtcblxuICAgIC8vIEJhc2UgcHJvZHVjdGlvbiBpcyBjYXRuaXAgZmllbGRzICsgZmFybWVycy5cbiAgICBsZXQgYmFzZVByb2QgPSBwcm9kdWN0aW9uRmllbGQgKyBwcm9kdWN0aW9uVmlsbGFnZXI7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGVmZmVjdCBvZiBvdGhlciBidWlsZGluZ3Mgb24gdGhlIHByb2R1Y3Rpb24gdmFsdWUuXG4gICAgbGV0IGh5ZHJvcG9uaWNzID0gdGhpcy5faG9zdC5nYW1lLnNwYWNlLmdldEJ1aWxkaW5nKFwiaHlkcm9wb25pY3NcIikudmFsO1xuICAgIC8vIEluZGV4IDIxIGlzIHRoZSBcInBhd2dhbiByaXR1YWxzXCIgbWV0YXBoeXNpY3MgdXBncmFkZS4gVGhpcyBtYWtlcyBubyBzZW5zZS5cbiAgICAvLyBUaGlzIGxpa2VseSB3YW50cyBpbmRleCAyMiwgd2hpY2ggaXMgXCJudW1lcm9tYW5jeVwiLCB3aGljaCBoYXMgZWZmZWN0cyBvblxuICAgIC8vIGNhdG5pcCBwcm9kdWN0aW9uIGluIGN5Y2xlcyBhdCBpbmRleCAyIGFuZCA3LlxuICAgIC8vIFRPRE86IEZpeCB0aGlzIHNvIHRoZSB1cGdyYWRlIGlzIHByb3Blcmx5IHRha2VuIGludG8gYWNjb3VudC5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLm1ldGFbMF0ubWV0YVsyMV0ucmVzZWFyY2hlZCkge1xuICAgICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jeWNsZSA9PT0gMikge1xuICAgICAgICBoeWRyb3BvbmljcyAqPSAyO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jeWNsZSA9PT0gNykge1xuICAgICAgICBoeWRyb3BvbmljcyAqPSAwLjU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3VyIGJhc2UgcHJvZHVjdGlvbiB2YWx1ZSBpcyBib29zdGVkIGJ5IG91ciBhcXVlZHVjdHMgYW5kIGh5ZHJvcG9uaWNzIGFjY29yZGluZ2x5LlxuICAgIGJhc2VQcm9kICo9IDEgKyAwLjAzICogYXF1ZWR1Y3RzICsgMC4wMjUgKiBoeWRyb3BvbmljcztcblxuICAgIC8vIEFwcGx5IHBhcmFnb24gYm9udXMsIGV4Y2VwdCBkdXJpbmcgdGhlIFwid2ludGVyIGlzIGNvbWluZ1wiIGNoYWxsZW5nZS5cbiAgICBjb25zdCBpc1dpbnRlckNvbWluZyA9IHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmN1cnJlbnRDaGFsbGVuZ2UgPT09IFwid2ludGVySXNDb21pbmdcIjtcbiAgICBjb25zdCBwYXJhZ29uQm9udXMgPSBpc1dpbnRlckNvbWluZyA/IDAgOiB0aGlzLl9ob3N0LmdhbWUucHJlc3RpZ2UuZ2V0UGFyYWdvblByb2R1Y3Rpb25SYXRpbygpO1xuICAgIGJhc2VQcm9kICo9IDEgKyBwYXJhZ29uQm9udXM7XG5cbiAgICAvLyBBcHBseSBmYWl0aCBib251cy5cbiAgICBiYXNlUHJvZCAqPSAxICsgdGhpcy5faG9zdC5nYW1lLnJlbGlnaW9uLmdldFNvbGFyUmV2b2x1dGlvblJhdGlvKCk7XG5cbiAgICAvLyBVbmxlc3MgdGhlIHVzZXIgZGlzYWJsZWQgdGhlIFwiZ2xvYmFsIGRvbmF0ZSBib251c1wiLCBhcHBseSBpdC5cbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS5vcHRzLmRpc2FibGVDTUJSKSB7XG4gICAgICBiYXNlUHJvZCAqPSAxICsgdGhpcy5faG9zdC5nYW1lLmdldENNQlJCb251cygpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHRoZSBlZmZlY3RzIG9mIHBvc3NpYmx5IHJ1bm5pbmcgZmVzdGl2YWwuXG4gICAgYmFzZVByb2QgPSBtdXN0RXhpc3QoXG4gICAgICB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGVFZmZlY3RzRmVzdGl2YWwoeyBjYXRuaXA6IGJhc2VQcm9kIH0pLmNhdG5pcCxcbiAgICApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIG91ciBkZW1hbmQgZm9yIGNhdG5pcC4gVGhpcyBpcyB1c3VhbGx5IGEgbmVnYXRpdmUgdmFsdWUuXG4gICAgbGV0IGJhc2VEZW1hbmQgPSB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5nZXRSZXNDb25zdW1wdGlvbigpLmNhdG5pcDtcbiAgICAvLyBQYXN0dXJlcyBhbmQgdW5pY3JvbiBwYXN0dXJlcyByZWR1Y2UgY2F0bmlwIGRlbWFuZC4gRmFjdG9yIHRoYXQgaW4uXG4gICAgY29uc3QgdW5pY29yblBhc3R1cmVzID0gdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRCdWlsZGluZ0V4dChcInVuaWNvcm5QYXN0dXJlXCIpLm1ldGEudmFsO1xuICAgIGJhc2VEZW1hbmQgKj1cbiAgICAgIDEgKyB0aGlzLl9ob3N0LmdhbWUuZ2V0TGltaXRlZERSKHBhc3R1cmVzICogLTAuMDA1ICsgdW5pY29yblBhc3R1cmVzICogLTAuMDAxNSwgMS4wKTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW55IGtpdHRlbnMgYW5kIGhhcHBpbmVzcyBvdmVyIDEwMCUuXG4gICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zLmxlbmd0aCA+IDAgJiYgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuaGFwcGluZXNzID4gMSkge1xuICAgICAgLy8gSG93IGhhcHB5IGJleW9uZCAxMDAlIGFyZSB3ZT9cbiAgICAgIGNvbnN0IGhhcHB5Q29uID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuaGFwcGluZXNzIC0gMTtcbiAgICAgIGNvbnN0IGNhdG5pcERlbWFuZFdvcmtlclJhdGlvR2xvYmFsID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcbiAgICAgICAgXCJjYXRuaXBEZW1hbmRXb3JrZXJSYXRpb0dsb2JhbFwiLFxuICAgICAgKTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBlZmZlY3Qgb2Yga2l0dGVucyB3aXRob3V0IGpvYnMuXG4gICAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuY3VycmVudENoYWxsZW5nZSA9PT0gXCJhbmFyY2h5XCIpIHtcbiAgICAgICAgLy8gRHVyaW5nIGFuYXJjaHksIHRoZXkgaGF2ZSBubyBlZmZlY3QuIFRoZXkgZWF0IGFsbCB0aGUgY2F0bmlwLlxuICAgICAgICBiYXNlRGVtYW5kICo9IDEgKyBoYXBweUNvbiAqICgxICsgY2F0bmlwRGVtYW5kV29ya2VyUmF0aW9HbG9iYWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sIHJlZHVjZSB0aGUgZGVtYW5kIHByb3BvcnRpb25hbGx5LlxuICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBzcGxpdCB1cCBpbnRvIDIgc3RlcHMuXG4gICAgICAgIGJhc2VEZW1hbmQgKj1cbiAgICAgICAgICAxICtcbiAgICAgICAgICBoYXBweUNvbiAqXG4gICAgICAgICAgICAoMSArIGNhdG5pcERlbWFuZFdvcmtlclJhdGlvR2xvYmFsKSAqXG4gICAgICAgICAgICAoMSAtXG4gICAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmdldEZyZWVLaXR0ZW5zKCkgL1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VidHJhY3QgdGhlIGRlbWFuZCBmcm9tIHRoZSBwcm9kdWN0aW9uLiBEZW1hbmQgaXMgbmVnYXRpdmUuXG4gICAgYmFzZVByb2QgKz0gYmFzZURlbWFuZDtcblxuICAgIC8vIFN1YnRyYWN0IHBvc3NpYmxlIGNhdG5pcCBjb25zdW1lcnMsIGxpa2UgYnJld2VyaWVzLlxuICAgIGJhc2VQcm9kICs9IHRoaXMuX2hvc3QuZ2FtZS5nZXRSZXNvdXJjZVBlclRpY2tDb252ZXJ0aW9uKFwiY2F0bmlwXCIpO1xuXG4gICAgLy8gTWlnaHQgbmVlZCB0byBldmVudHVhbGx5IGZhY3RvciBpbiB0aW1lIGFjY2VsZXJhdGlvbiB1c2luZyB0aGlzLl9ob3N0LmdhbWVQYWdlLnRpbWVBY2NlbGVyYXRpb25SYXRpbygpLlxuICAgIHJldHVybiBiYXNlUHJvZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWludGFpbnMgdGhlIENTUyBjbGFzc2VzIGluIHRoZSByZXNvdXJjZSBpbmRpY2F0b3JzIGluIHRoZSBnYW1lIFVJIHRvXG4gICAqIHJlZmxlY3QgaWYgdGhlIGFtb3VudCBvZiByZXNvdXJjZSBpbiBzdG9jayBpcyBiZWxvdyBvciBhYm92ZSB0aGUgZGVzaXJlZFxuICAgKiB0b3RhbCBhbW91bnQgdG8ga2VlcCBpbiBzdG9jay5cbiAgICogVGhlIHVzZXIgY2FuIGNvbmZpZ3VyZSB0aGlzIGluIHRoZSBXb3Jrc2hvcCBhdXRvbWF0aW9uIHNlY3Rpb24uXG4gICAqL1xuICByZWZyZXNoU3RvY2soKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgcmVzb3VyY2VdIG9mIG9iamVjdEVudHJpZXModGhpcy5faG9zdC5lbmdpbmUuc2V0dGluZ3MucmVzb3VyY2VzLnJlc291cmNlcykpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlQ2VsbHMgPSBbXG4gICAgICAgIC8vIFJlc291cmNlIHRhYmxlIG9uIHRoZSB0b3AuXG4gICAgICAgIC4uLiQoYCNnYW1lIC5yZXMtcm93LnJlc291cmNlXyR7bmFtZX0gLnJlcy1jZWxsLnJlc0Ftb3VudGApLFxuICAgICAgICAvLyBDcmFmdCB0YWJsZSBvbiB0aGUgYm90dG9tLlxuICAgICAgICAuLi4kKGAjZ2FtZSAucmVzLXJvdy5yZXNvdXJjZV8ke25hbWV9IC5yZXMtY2VsbC5yZXNvdXJjZS12YWx1ZWApLFxuICAgICAgXTtcblxuICAgICAgaWYgKCFyZXNvdXJjZS5lbmFibGVkIHx8IHJlc291cmNlLnN0b2NrID09PSAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2VDZWxsIG9mIHJlc291cmNlQ2VsbHMpIHtcbiAgICAgICAgICByZXNvdXJjZUNlbGwuY2xhc3NMaXN0LnJlbW92ZShcImtzLXN0b2NrLWFib3ZlXCIsIFwia3Mtc3RvY2stYmVsb3dcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQmVsb3cgPSB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQobmFtZSkudmFsdWUgPCByZXNvdXJjZS5zdG9jaztcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZUNlbGwgb2YgcmVzb3VyY2VDZWxscykge1xuICAgICAgICByZXNvdXJjZUNlbGwuY2xhc3NMaXN0LmFkZChpc0JlbG93ID8gXCJrcy1zdG9jay1iZWxvd1wiIDogXCJrcy1zdG9jay1hYm92ZVwiKTtcbiAgICAgICAgcmVzb3VyY2VDZWxsLmNsYXNzTGlzdC5yZW1vdmUoaXNCZWxvdyA/IFwia3Mtc3RvY2stYWJvdmVcIiA6IFwia3Mtc3RvY2stYmVsb3dcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBSZXNvdXJjZSwgUmVzb3VyY2VzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi4vV29ya3Nob3BNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlc1NldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSAjcmVzb3VyY2U6IFJlc291cmNlO1xuICBjb25zdW1lOiBudW1iZXI7XG4gIHN0b2NrID0gMDtcblxuICBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlLFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICBjb25zdW1lID0gV29ya3Nob3BNYW5hZ2VyLkRFRkFVTFRfQ09OU1VNRV9SQVRFLFxuICAgIHN0b2NrID0gMCxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy4jcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICB0aGlzLmNvbnN1bWUgPSBjb25zdW1lO1xuICAgIHRoaXMuc3RvY2sgPSBzdG9jaztcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXNvdXJjZXNSZXNvdXJjZVNldHRpbmdzID0gUmVjb3JkPFJlc291cmNlLCBSZXNvdXJjZXNTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VzU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVzb3VyY2VzOiBSZXNvdXJjZXNSZXNvdXJjZVNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMucmVzb3VyY2VzID0gdGhpcy5pbml0UmVzb3VyY2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRSZXNvdXJjZXMoKTogUmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBSZXNvdXJjZXNSZXNvdXJjZVNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSZXNvdXJjZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc291cmNlc1NldHRpbmdzSXRlbShpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNvdXJjZXNTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnJlc291cmNlcywgc2V0dGluZ3MucmVzb3VyY2VzLCAocmVzb3VyY2UsIGl0ZW0pID0+IHtcbiAgICAgIHJlc291cmNlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHJlc291cmNlLmVuYWJsZWQ7XG4gICAgICByZXNvdXJjZS5jb25zdW1lID0gaXRlbT8uY29uc3VtZSA/PyByZXNvdXJjZS5jb25zdW1lO1xuICAgICAgcmVzb3VyY2Uuc3RvY2sgPSBpdGVtPy5zdG9jayA/PyByZXNvdXJjZS5zdG9jaztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFN0YXRlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgbm9Db25maXJtOiBTZXR0aW5nO1xuICByZWFkb25seSBjb21wcmVzczogU2V0dGluZztcblxuICBjb25zdHJ1Y3Rvcihub0NvbmZpcm0gPSBuZXcgU2V0dGluZygpLCBjb21wcmVzcyA9IG5ldyBTZXR0aW5nKHRydWUpKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gICAgdGhpcy5ub0NvbmZpcm0gPSBub0NvbmZpcm07XG4gICAgdGhpcy5jb21wcmVzcyA9IGNvbXByZXNzO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxTdGF0ZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICB0aGlzLm5vQ29uZmlybS5sb2FkKHNldHRpbmdzLm5vQ29uZmlybSk7XG4gICAgdGhpcy5jb21wcmVzcy5sb2FkKHNldHRpbmdzLmNvbXByZXNzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEZhbGxiYWNrTG9jYWxlIH0gZnJvbSBcIi4uL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IExvZ0ZpbHRlclNldHRpbmdzIH0gZnJvbSBcIi4vTG9nRmlsdGVyU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlc291cmNlc1NldHRpbmdzIH0gZnJvbSBcIi4vUmVzb3VyY2VzU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFN0YXRlU2V0dGluZ3MgfSBmcm9tIFwiLi9TdGF0ZVNldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmVTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICAvKipcbiAgICogVGhlIGludGVydmFsIGF0IHdoaWNoIHRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIGxvb3AgaXMgcnVuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBpbnRlcnZhbCA9IDIwMDA7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbGFuZ3VhZ2UuXG4gICAqL1xuICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT47XG5cbiAgLyoqXG4gICAqIFVzZSBhIGRlZGljYXRlZCBjb2x1bW4gaW4gdGhlIFVJIGZvciBLUy5cbiAgICovXG4gIGtzQ29sdW1uOiBTZXR0aW5nO1xuXG4gIGZpbHRlcnM6IExvZ0ZpbHRlclNldHRpbmdzO1xuICByZXNvdXJjZXM6IFJlc291cmNlc1NldHRpbmdzO1xuICByZWFkb25seSBzdGF0ZXM6IFN0YXRlU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIGZpbHRlcnMgPSBuZXcgTG9nRmlsdGVyU2V0dGluZ3MoKSxcbiAgICByZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VzU2V0dGluZ3MoKSxcbiAgICBzdGF0ZXMgPSBuZXcgU3RhdGVTZXR0aW5ncygpLFxuICAgIGxhbmd1YWdlID0gRmFsbGJhY2tMb2NhbGUsXG4gICAga3NDb2x1bW4gPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzO1xuICAgIHRoaXMuc3RhdGVzID0gc3RhdGVzO1xuICAgIHRoaXMubG9jYWxlID0gbmV3IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4obGFuZ3VhZ2UsIFtcbiAgICAgIHsgbGFiZWw6IFwiRGV1dHNjaFwiLCB2YWx1ZTogXCJkZS1ERVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkVuZ2xpc2hcIiwgdmFsdWU6IFwiZW4tVVNcIiB9LFxuICAgICAgeyBsYWJlbDogXCLXota015HXqNa015nXqlwiLCB2YWx1ZTogXCJoZS1JTFwiIH0sXG4gICAgICB7IGxhYmVsOiBcIuS4reaWh1wiLCB2YWx1ZTogXCJ6aC1DTlwiIH0sXG4gICAgXSk7XG4gICAgdGhpcy5rc0NvbHVtbiA9IGtzQ29sdW1uO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxFbmdpbmVTZXR0aW5ncz4+LCByZXRhaW5NZXRhQmVoYXZpb3IgPSBmYWxzZSkge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGlmICghcmV0YWluTWV0YUJlaGF2aW9yKSB7XG4gICAgICB0aGlzLmludGVydmFsID0gc2V0dGluZ3MuaW50ZXJ2YWwgPz8gdGhpcy5pbnRlcnZhbDtcbiAgICAgIHRoaXMuc3RhdGVzLmxvYWQoc2V0dGluZ3Muc3RhdGVzKTtcbiAgICAgIHRoaXMubG9jYWxlLmxvYWQoc2V0dGluZ3MubG9jYWxlKTtcbiAgICAgIHRoaXMua3NDb2x1bW4ubG9hZChzZXR0aW5ncy5rc0NvbHVtbik7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzLmxvYWQoc2V0dGluZ3MuZmlsdGVycyk7XG4gICAgdGhpcy5yZXNvdXJjZXMubG9hZChzZXR0aW5ncy5yZXNvdXJjZXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBCdWlsZGluZywgQnVpbGRpbmdzLCB0eXBlIFN0YWdlZEJ1aWxkaW5nLCBTdGFnZWRCdWlsZGluZ3MgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgQm9uZmlyZUl0ZW0gfSBmcm9tIFwiLi9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGQgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIC8qKlxuICAgKiBJbiBjYXNlIHRoaXMgaXMgYW4gdXBncmFkZSBvZiBhbm90aGVyIGJ1aWxkaW5nLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZVxuICAgKiBiYXNlIGJ1aWxkaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgI2Jhc2VCdWlsZGluZzogQnVpbGRpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIGdldCBiYXNlQnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Jhc2VCdWlsZGluZztcbiAgfVxuXG4gIHJlYWRvbmx5ICNidWlsZGluZzogQm9uZmlyZUl0ZW07XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlIHRoaXMgaXMgYW4gdXBncmFkYWJsZSBidWlsZGluZywgdGhpcyBpbmRpY2F0ZXMgdGhlIGxldmVsIG9mXG4gICAqIHRoZSBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5ICNzdGFnZTogbnVtYmVyID0gMDtcbiAgZ2V0IHN0YWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGFnZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkaW5nOiBCb25maXJlSXRlbSxcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgdGhyZXNob2xkID0gLTEsXG4gICAgYmFzZVN0YWdlPzogQnVpbGRpbmcgfCBmYWxzZSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdGhyZXNob2xkKTtcblxuICAgIHRoaXMuI2J1aWxkaW5nID0gYnVpbGRpbmc7XG4gICAgaWYgKGJhc2VTdGFnZSkge1xuICAgICAgdGhpcy4jc3RhZ2UgPSAxO1xuICAgICAgdGhpcy4jYmFzZUJ1aWxkaW5nID0gYmFzZVN0YWdlO1xuICAgIH1cbiAgfVxufVxuXG4vLyB1bmljb3JuUGFzdHVyZSBpcyBoYW5kbGVkIGluIHRoZSBSZWxpZ2lvbiBzZWN0aW9uLlxuZXhwb3J0IHR5cGUgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5ncyA9IFJlY29yZDxcbiAgRXhjbHVkZTxCb25maXJlSXRlbSwgXCJ1bmljb3JuUGFzdHVyZVwiPixcbiAgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nXG4+O1xuXG5leHBvcnQgY2xhc3MgUmVzZXRCb25maXJlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgYnVpbGRpbmdzOiBSZXNldEJvbmZpcmVCdWlsZGluZ1NldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5ncyB7XG4gICAgY29uc3QgYmFzZVN0YWdlOiBQYXJ0aWFsPFJlY29yZDxTdGFnZWRCdWlsZGluZywgQnVpbGRpbmc+PiA9IHtcbiAgICAgIGJyb2FkY2FzdHRvd2VyOiBcImFtcGhpdGhlYXRyZVwiLFxuICAgICAgZGF0YUNlbnRlcjogXCJsaWJyYXJ5XCIsXG4gICAgICBoeWRyb3BsYW50OiBcImFxdWVkdWN0XCIsXG4gICAgICBzb2xhcmZhcm06IFwicGFzdHVyZVwiLFxuICAgICAgc3BhY2Vwb3J0OiBcIndhcmVob3VzZVwiLFxuICAgIH07XG5cbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFJlc2V0Qm9uZmlyZUJ1aWxkaW5nU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIEJ1aWxkaW5ncykge1xuICAgICAgaWYgKGl0ZW0gPT09IFwidW5pY29yblBhc3R1cmVcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0Qm9uZmlyZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFN0YWdlZEJ1aWxkaW5ncykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRCb25maXJlQnVpbGRpbmdTZXR0aW5nKGl0ZW0sIGZhbHNlLCAtMSwgYmFzZVN0YWdlW2l0ZW1dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFJlc2V0Qm9uZmlyZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICAgIGJ1aWxkaW5nLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IGJ1aWxkaW5nLnRyaWdnZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIEZhaXRoSXRlbSxcbiAgUmVsaWdpb25VcGdyYWRlcyxcbiAgVHJhbnNjZW5kZW5jZVVwZ3JhZGVzLFxuICB0eXBlIFVuaWNvcm5JdGVtLFxuICBVbmljb3JuSXRlbVZhcmlhbnQsXG4gIFppZ2d1cmF0VXBncmFkZXMsXG59IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RocmVzaG9sZCB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIHJlYWRvbmx5ICNidWlsZGluZzogRmFpdGhJdGVtIHwgVW5pY29ybkl0ZW07XG4gIHJlYWRvbmx5ICN2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQ7XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuICBnZXQgdmFyaWFudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmFyaWFudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1aWxkaW5nOiBGYWl0aEl0ZW0gfCBVbmljb3JuSXRlbSxcbiAgICB2YXJpYW50OiBVbmljb3JuSXRlbVZhcmlhbnQsXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIHRocmVzaG9sZCA9IC0xLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0aHJlc2hvbGQpO1xuICAgIHRoaXMuI2J1aWxkaW5nID0gYnVpbGRpbmc7XG4gICAgdGhpcy4jdmFyaWFudCA9IHZhcmlhbnQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZ3MgPSBSZWNvcmQ8XG4gIEZhaXRoSXRlbSB8IFVuaWNvcm5JdGVtLFxuICBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5nXG4+O1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZWxpZ2lvblNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5IGJ1aWxkaW5nczogUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5idWlsZGluZ3MgPSB0aGlzLmluaXRCdWlsZGluZ3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1aWxkaW5ncygpOiBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBSZXNldFJlbGlnaW9uQnVpbGRpbmdTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgUmVsaWdpb25VcGdyYWRlcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZyhpdGVtLCBVbmljb3JuSXRlbVZhcmlhbnQuT3JkZXJPZlRoZVN1bik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBUcmFuc2NlbmRlbmNlVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0UmVsaWdpb25CdWlsZGluZ1NldHRpbmcoaXRlbSwgVW5pY29ybkl0ZW1WYXJpYW50LkNyeXB0b3RoZW9sb2d5KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFppZ2d1cmF0VXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0UmVsaWdpb25CdWlsZGluZ1NldHRpbmcoaXRlbSwgVW5pY29ybkl0ZW1WYXJpYW50LlppZ2d1cmF0KTtcbiAgICB9XG4gICAgaXRlbXMudW5pY29yblBhc3R1cmUgPSBuZXcgUmVzZXRSZWxpZ2lvbkJ1aWxkaW5nU2V0dGluZyhcbiAgICAgIFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgIFVuaWNvcm5JdGVtVmFyaWFudC5Vbmljb3JuUGFzdHVyZSxcbiAgICApO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8UmVzZXRSZWxpZ2lvblNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICAgIGJ1aWxkaW5nLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IGJ1aWxkaW5nLnRyaWdnZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsLCB0eXBlIE1heWJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgY29uc3VtZUVudHJpZXNQZWRhbnRpYyB9IGZyb20gXCIuLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc291cmNlLCBSZXNvdXJjZXMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGQgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0gZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkIHtcbiAgcmVhZG9ubHkgI3Jlc291cmNlOiBSZXNvdXJjZTtcblxuICBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgY29uc3RydWN0b3IocmVzb3VyY2U6IFJlc291cmNlLCBlbmFibGVkID0gZmFsc2UsIHRocmVzaG9sZCA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdGhyZXNob2xkKTtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJlc2V0UmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncyA9IFJlY29yZDxSZXNvdXJjZSwgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0+O1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICByZXNvdXJjZXM6IFJlc2V0UmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHRoaXMuaW5pdFJlc291cmNlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0UmVzb3VyY2VzKCk6IFJlc2V0UmVzb3VyY2VzUmVzb3VyY2VTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBSZXNldFJlc291cmNlc1Jlc291cmNlU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFJlc291cmNlcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc0l0ZW0oaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8UmVzZXRSZXNvdXJjZXNTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnJlc291cmNlcywgc2V0dGluZ3MucmVzb3VyY2VzLCAocmVzb3VyY2UsIGl0ZW0pID0+IHtcbiAgICAgIHJlc291cmNlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHJlc291cmNlLmVuYWJsZWQ7XG4gICAgICByZXNvdXJjZS50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyByZXNvdXJjZS50cmlnZ2VyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBTcGFjZUJ1aWxkaW5nLCBTcGFjZUJ1aWxkaW5ncyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RocmVzaG9sZCB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNwYWNlQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIHJlYWRvbmx5ICNidWlsZGluZzogU3BhY2VCdWlsZGluZztcblxuICBnZXQgYnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2J1aWxkaW5nO1xuICB9XG5cbiAgY29uc3RydWN0b3IoYnVpbGRpbmc6IFNwYWNlQnVpbGRpbmcsIGVuYWJsZWQgPSBmYWxzZSwgdGhyZXNob2xkID0gLTEpIHtcbiAgICBzdXBlcihlbmFibGVkLCB0aHJlc2hvbGQpO1xuICAgIHRoaXMuI2J1aWxkaW5nID0gYnVpbGRpbmc7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzZXRTcGFjZUJ1aWxkaW5nU2V0dGluZ3MgPSBSZWNvcmQ8U3BhY2VCdWlsZGluZywgU2V0dGluZ1RocmVzaG9sZD47XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNwYWNlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgYnVpbGRpbmdzOiBSZXNldFNwYWNlQnVpbGRpbmdTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmJ1aWxkaW5ncyA9IHRoaXMuaW5pdEJ1aWxkaW5ncygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnVpbGRpbmdzKCk6IFJlc2V0U3BhY2VCdWlsZGluZ1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFJlc2V0U3BhY2VCdWlsZGluZ1NldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBTcGFjZUJ1aWxkaW5ncykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgUmVzZXRTcGFjZUJ1aWxkaW5nU2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNldFNwYWNlU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5idWlsZGluZ3MsIHNldHRpbmdzLmJ1aWxkaW5ncywgKGJ1aWxkaW5nLCBpdGVtKSA9PiB7XG4gICAgICBidWlsZGluZy5lbmFibGVkID0gaXRlbT8uZW5hYmxlZCA/PyBidWlsZGluZy5lbmFibGVkO1xuICAgICAgYnVpbGRpbmcudHJpZ2dlciA9IGl0ZW0/LnRyaWdnZXIgPz8gYnVpbGRpbmcudHJpZ2dlcjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IENocm9ub0ZvcmdlVXBncmFkZXMsIFRpbWVJdGVtVmFyaWFudCwgVm9pZFNwYWNlVXBncmFkZXMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGQgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lSXRlbSB9IGZyb20gXCIuL1RpbWVTZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRUaW1lQnVpbGRpbmdTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ1RocmVzaG9sZCB7XG4gIHJlYWRvbmx5ICNidWlsZGluZzogVGltZUl0ZW07XG4gIHJlYWRvbmx5ICN2YXJpYW50OiBUaW1lSXRlbVZhcmlhbnQ7XG5cbiAgZ2V0IGJ1aWxkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNidWlsZGluZztcbiAgfVxuICBnZXQgdmFyaWFudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdmFyaWFudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGlkOiBUaW1lSXRlbSwgdmFyaWFudDogVGltZUl0ZW1WYXJpYW50LCBlbmFibGVkID0gZmFsc2UsIHRocmVzaG9sZCA9IC0xKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgdGhyZXNob2xkKTtcbiAgICB0aGlzLiNidWlsZGluZyA9IGlkO1xuICAgIHRoaXMuI3ZhcmlhbnQgPSB2YXJpYW50O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZ3MgPSBSZWNvcmQ8VGltZUl0ZW0sIFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZz47XG5cbmV4cG9ydCBjbGFzcyBSZXNldFRpbWVTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSBidWlsZGluZ3M6IFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoZW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5idWlsZGluZ3MgPSB0aGlzLmluaXRCdWlsZGluZ3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJ1aWxkaW5ncygpOiBSZXNldFRpbWVCdWlsZGluZ1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIENocm9ub0ZvcmdlVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZyhpdGVtLCBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2UpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVm9pZFNwYWNlVXBncmFkZXMpIHtcbiAgICAgIGlmIChpdGVtID09PSBcInVzZWRDcnlvY2hhbWJlcnNcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0VGltZUJ1aWxkaW5nU2V0dGluZyhpdGVtLCBUaW1lSXRlbVZhcmlhbnQuVm9pZFNwYWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNldFRpbWVTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmJ1aWxkaW5ncywgc2V0dGluZ3MuYnVpbGRpbmdzLCAoYnVpbGRpbmcsIGl0ZW0pID0+IHtcbiAgICAgIGJ1aWxkaW5nLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGJ1aWxkaW5nLmVuYWJsZWQ7XG4gICAgICBidWlsZGluZy50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyBidWlsZGluZy50cmlnZ2VyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBVcGdyYWRlLCBVcGdyYWRlcyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFVwZ3JhZGVTZXR0aW5nc0l0ZW0gZXh0ZW5kcyBTZXR0aW5nIHtcbiAgcmVhZG9ubHkgI3VwZ3JhZGU6IFVwZ3JhZGU7XG5cbiAgZ2V0IHVwZ3JhZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3VwZ3JhZGU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih1cGdyYWRlOiBVcGdyYWRlLCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLiN1cGdyYWRlID0gdXBncmFkZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXNldFVwZ3JhZGVTZXR0aW5nc0l0ZW1zID0gUmVjb3JkPFVwZ3JhZGUsIFJlc2V0VXBncmFkZVNldHRpbmdzSXRlbT47XG5cbmV4cG9ydCBjbGFzcyBSZXNldFVwZ3JhZGVTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICByZWFkb25seSB1cGdyYWRlczogUmVzZXRVcGdyYWRlU2V0dGluZ3NJdGVtcztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnVwZ3JhZGVzID0gdGhpcy5pbml0VXBncmFkZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFVwZ3JhZGVzKCk6IFJlc2V0VXBncmFkZVNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgUmVzZXRVcGdyYWRlU2V0dGluZ3NJdGVtcztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVXBncmFkZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFJlc2V0VXBncmFkZVNldHRpbmdzSXRlbShpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxSZXNldFVwZ3JhZGVTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnVwZ3JhZGVzLCBzZXR0aW5ncy51cGdyYWRlcywgKHVwZ3JhZGUsIGl0ZW0pID0+IHtcbiAgICAgIHVwZ3JhZGUuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gdXBncmFkZS5lbmFibGVkO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IFJlc2V0Qm9uZmlyZVNldHRpbmdzIH0gZnJvbSBcIi4vUmVzZXRCb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlc2V0UmVsaWdpb25TZXR0aW5ncyB9IGZyb20gXCIuL1Jlc2V0UmVsaWdpb25TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncyB9IGZyb20gXCIuL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlc2V0U3BhY2VTZXR0aW5ncyB9IGZyb20gXCIuL1Jlc2V0U3BhY2VTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgUmVzZXRUaW1lU2V0dGluZ3MgfSBmcm9tIFwiLi9SZXNldFRpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgUmVzZXRVcGdyYWRlU2V0dGluZ3MgfSBmcm9tIFwiLi9SZXNldFVwZ3JhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIGJvbmZpcmU6IFJlc2V0Qm9uZmlyZVNldHRpbmdzO1xuICByZWxpZ2lvbjogUmVzZXRSZWxpZ2lvblNldHRpbmdzO1xuICByZXNvdXJjZXM6IFJlc2V0UmVzb3VyY2VzU2V0dGluZ3M7XG4gIHNwYWNlOiBSZXNldFNwYWNlU2V0dGluZ3M7XG4gIHRpbWU6IFJlc2V0VGltZVNldHRpbmdzO1xuICB1cGdyYWRlczogUmVzZXRVcGdyYWRlU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIGJvbmZpcmUgPSBuZXcgUmVzZXRCb25maXJlU2V0dGluZ3MoKSxcbiAgICByZWxpZ2lvbiA9IG5ldyBSZXNldFJlbGlnaW9uU2V0dGluZ3MoKSxcbiAgICByZXNvdXJjZXMgPSBuZXcgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncygpLFxuICAgIHNwYWNlID0gbmV3IFJlc2V0U3BhY2VTZXR0aW5ncygpLFxuICAgIHRpbWUgPSBuZXcgUmVzZXRUaW1lU2V0dGluZ3MoKSxcbiAgICB1cGdyYWRlcyA9IG5ldyBSZXNldFVwZ3JhZGVTZXR0aW5ncygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLmJvbmZpcmUgPSBib25maXJlO1xuICAgIHRoaXMucmVsaWdpb24gPSByZWxpZ2lvbjtcbiAgICB0aGlzLnJlc291cmNlcyA9IHJlc291cmNlcztcbiAgICB0aGlzLnNwYWNlID0gc3BhY2U7XG4gICAgdGhpcy50aW1lID0gdGltZTtcbiAgICB0aGlzLnVwZ3JhZGVzID0gdXBncmFkZXM7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFJlc2V0U2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIHRoaXMuYm9uZmlyZS5sb2FkKHNldHRpbmdzLmJvbmZpcmUpO1xuICAgIHRoaXMucmVsaWdpb24ubG9hZChzZXR0aW5ncy5yZWxpZ2lvbik7XG4gICAgdGhpcy5yZXNvdXJjZXMubG9hZChzZXR0aW5ncy5yZXNvdXJjZXMpO1xuICAgIHRoaXMuc3BhY2UubG9hZChzZXR0aW5ncy5zcGFjZSk7XG4gICAgdGhpcy50aW1lLmxvYWQoc2V0dGluZ3MudGltZSk7XG4gICAgdGhpcy51cGdyYWRlcy5sb2FkKHNldHRpbmdzLnVwZ3JhZGVzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IEN5Y2xlcyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDeWNsZXNTZXR0aW5ncyB9IGZyb20gXCIuL1RpbWVTa2lwU2V0dGluZ3MuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRpbWVTa2lwSGVhdFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByZWFkb25seSBjeWNsZXM6IEN5Y2xlc1NldHRpbmdzO1xuICByZWFkb25seSBhY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXM6IFNldHRpbmc7XG5cbiAgY29uc3RydWN0b3IoYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzID0gbmV3IFNldHRpbmcoKSkge1xuICAgIHN1cGVyKGZhbHNlLCAxKTtcbiAgICB0aGlzLmN5Y2xlcyA9IHRoaXMuaW5pdEN5Y2xlcygpO1xuICAgIHRoaXMuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzID0gYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q3ljbGVzKCk6IEN5Y2xlc1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIEN5Y2xlc1NldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBDeWNsZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFNldHRpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxUaW1lU2tpcEhlYXRTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLmN5Y2xlcywgc2V0dGluZ3MuY3ljbGVzLCAoY3ljbGUsIGl0ZW0pID0+IHtcbiAgICAgIGN5Y2xlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IGN5Y2xlLmVuYWJsZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMubG9hZChzZXR0aW5ncy5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IFRpbWVTa2lwSGVhdFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1RpbWVTa2lwSGVhdFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IHR5cGUgQ3ljbGUsIEN5Y2xlcywgdHlwZSBTZWFzb24sIFNlYXNvbnMgfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmcsIFNldHRpbmdUaHJlc2hvbGRNYXggfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBDeWNsZXNTZXR0aW5ncyA9IFJlY29yZDxDeWNsZSwgU2V0dGluZz47XG5leHBvcnQgdHlwZSBTZWFzb25zU2V0dGluZ3MgPSBSZWNvcmQ8U2Vhc29uLCBTZXR0aW5nPjtcblxuZXhwb3J0IGNsYXNzIFRpbWVTa2lwU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVGhyZXNob2xkTWF4IHtcbiAgcmVhZG9ubHkgY3ljbGVzOiBDeWNsZXNTZXR0aW5ncztcbiAgcmVhZG9ubHkgc2Vhc29uczogU2Vhc29uc1NldHRpbmdzO1xuICByZWFkb25seSBhY3RpdmVIZWF0VHJhbnNmZXI6IFRpbWVTa2lwSGVhdFNldHRpbmdzO1xuICByZWFkb25seSBpZ25vcmVPdmVyaGVhdDogU2V0dGluZztcblxuICBjb25zdHJ1Y3RvcihpZ25vcmVPdmVyaGVhdCA9IG5ldyBTZXR0aW5nKCksIGFjdGl2ZUhlYXRUcmFuc2ZlciA9IG5ldyBUaW1lU2tpcEhlYXRTZXR0aW5ncygpKSB7XG4gICAgc3VwZXIoZmFsc2UsIDUpO1xuICAgIHRoaXMuY3ljbGVzID0gdGhpcy5pbml0Q3ljbGVzKCk7XG4gICAgdGhpcy5zZWFzb25zID0gdGhpcy5pbml0U2Vhc29uKCk7XG4gICAgdGhpcy5hY3RpdmVIZWF0VHJhbnNmZXIgPSBhY3RpdmVIZWF0VHJhbnNmZXI7XG4gICAgdGhpcy5pZ25vcmVPdmVyaGVhdCA9IGlnbm9yZU92ZXJoZWF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Q3ljbGVzKCk6IEN5Y2xlc1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIEN5Y2xlc1NldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBDeWNsZXMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFNldHRpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U2Vhc29uKCk6IFNlYXNvbnNTZXR0aW5ncyB7XG4gICAgY29uc3QgaXRlbXMgPSB7fSBhcyBTZWFzb25zU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIFNlYXNvbnMpIHtcbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFNldHRpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxUaW1lU2tpcFNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuY3ljbGVzLCBzZXR0aW5ncy5jeWNsZXMsIChjeWNsZSwgaXRlbSkgPT4ge1xuICAgICAgY3ljbGUuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gY3ljbGUuZW5hYmxlZDtcbiAgICB9KTtcbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuc2Vhc29ucywgc2V0dGluZ3Muc2Vhc29ucywgKHNlYXNvbiwgaXRlbSkgPT4ge1xuICAgICAgc2Vhc29uLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHNlYXNvbi5lbmFibGVkO1xuICAgIH0pO1xuICAgIHRoaXMuaWdub3JlT3ZlcmhlYXQubG9hZChzZXR0aW5ncy5pZ25vcmVPdmVyaGVhdCk7XG4gICAgdGhpcy5hY3RpdmVIZWF0VHJhbnNmZXIubG9hZChzZXR0aW5ncy5hY3RpdmVIZWF0VHJhbnNmZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IFJlc2V0U2V0dGluZ3MgfSBmcm9tIFwiLi9SZXNldFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUaW1lU2tpcFNldHRpbmdzIH0gZnJvbSBcIi4vVGltZVNraXBTZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBDeWNsZUluZGljZXMgPSAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5O1xuXG5leHBvcnQgdHlwZSBUaW1lQ29udHJvbEl0ZW0gPSBcImFjY2VsZXJhdGVUaW1lXCIgfCBcInJlc2V0XCIgfCBcInRpbWVTa2lwXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lQ29udHJvbFNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIGFjY2VsZXJhdGVUaW1lOiBTZXR0aW5nVHJpZ2dlcjtcbiAgdGltZVNraXA6IFRpbWVTa2lwU2V0dGluZ3M7XG4gIHJlc2V0OiBSZXNldFNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVuYWJsZWQgPSBmYWxzZSxcbiAgICBhY2NlbGVyYXRlVGltZSA9IG5ldyBTZXR0aW5nVHJpZ2dlcihmYWxzZSwgMSksXG4gICAgcmVzZXQgPSBuZXcgUmVzZXRTZXR0aW5ncygpLFxuICAgIHRpbWVTa2lwID0gbmV3IFRpbWVTa2lwU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5hY2NlbGVyYXRlVGltZSA9IGFjY2VsZXJhdGVUaW1lO1xuICAgIHRoaXMucmVzZXQgPSByZXNldDtcbiAgICB0aGlzLnRpbWVTa2lwID0gdGltZVNraXA7XG4gIH1cblxuICBsb2FkKHNldHRpbmdzOiBNYXliZTxQYXJ0aWFsPFRpbWVDb250cm9sU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIHRoaXMuYWNjZWxlcmF0ZVRpbWUubG9hZChzZXR0aW5ncy5hY2NlbGVyYXRlVGltZSk7XG4gICAgdGhpcy5yZXNldC5sb2FkKHNldHRpbmdzLnJlc2V0KTtcbiAgICB0aGlzLnRpbWVTa2lwLmxvYWQoc2V0dGluZ3MudGltZVNraXApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDaHJvbm9Gb3JnZVVwZ3JhZGUsXG4gIENocm9ub0ZvcmdlVXBncmFkZXMsXG4gIFRpbWVJdGVtVmFyaWFudCxcbiAgdHlwZSBWb2lkU3BhY2VVcGdyYWRlLFxuICBWb2lkU3BhY2VVcGdyYWRlcyxcbn0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nVHJpZ2dlciwgU2V0dGluZ1RyaWdnZXJNYXggfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG4vKipcbiAqIFRoZSB1cGdyYWRlcyBvbiB0aGUgVGltZSB0YWIgdGhhdCB3ZSBoYXZlIG9wdGlvbnMgZm9yLlxuICovXG5leHBvcnQgdHlwZSBUaW1lSXRlbSA9IEV4Y2x1ZGU8Q2hyb25vRm9yZ2VVcGdyYWRlIHwgVm9pZFNwYWNlVXBncmFkZSwgXCJ1c2VkQ3J5b2NoYW1iZXJzXCI+O1xuXG5leHBvcnQgY2xhc3MgVGltZVNldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmdUcmlnZ2VyTWF4IHtcbiAgcmVhZG9ubHkgI2J1aWxkaW5nOiBUaW1lSXRlbTtcbiAgcmVhZG9ubHkgI3ZhcmlhbnQ6IFRpbWVJdGVtVmFyaWFudDtcblxuICBnZXQgYnVpbGRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2J1aWxkaW5nO1xuICB9XG4gIGdldCB2YXJpYW50KCkge1xuICAgIHJldHVybiB0aGlzLiN2YXJpYW50O1xuICB9XG5cbiAgY29uc3RydWN0b3IoYnVpbGRpbmc6IFRpbWVJdGVtLCB2YXJpYW50OiBUaW1lSXRlbVZhcmlhbnQsIGVuYWJsZWQgPSBmYWxzZSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIC0xLCAwKTtcbiAgICB0aGlzLiNidWlsZGluZyA9IGJ1aWxkaW5nO1xuICAgIHRoaXMuI3ZhcmlhbnQgPSB2YXJpYW50O1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRpbWVCdWlsZGluZ3NTZXR0aW5ncyA9IFJlY29yZDxUaW1lSXRlbSwgVGltZVNldHRpbmdzSXRlbT47XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIGJ1aWxkaW5nczogVGltZUJ1aWxkaW5nc1NldHRpbmdzO1xuXG4gIGZpeENyeW9jaGFtYmVyczogU2V0dGluZztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UsIHRyaWdnZXIgPSAtMSwgZml4Q3J5b2NoYW1iZXJzID0gbmV3IFNldHRpbmcoKSkge1xuICAgIHN1cGVyKGVuYWJsZWQsIHRyaWdnZXIpO1xuICAgIHRoaXMuYnVpbGRpbmdzID0gdGhpcy5pbml0QnVpbGRpbmdzKCk7XG4gICAgdGhpcy5maXhDcnlvY2hhbWJlcnMgPSBmaXhDcnlvY2hhbWJlcnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRCdWlsZGluZ3MoKTogVGltZUJ1aWxkaW5nc1NldHRpbmdzIHtcbiAgICBjb25zdCBpdGVtcyA9IHt9IGFzIFRpbWVCdWlsZGluZ3NTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQ2hyb25vRm9yZ2VVcGdyYWRlcykge1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgVGltZVNldHRpbmdzSXRlbShpdGVtLCBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2UpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgVm9pZFNwYWNlVXBncmFkZXMpIHtcbiAgICAgIGlmIChpdGVtID09PSBcInVzZWRDcnlvY2hhbWJlcnNcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGl0ZW1zW2l0ZW1dID0gbmV3IFRpbWVTZXR0aW5nc0l0ZW0oaXRlbSwgVGltZUl0ZW1WYXJpYW50LlZvaWRTcGFjZSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8VGltZVNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICBjb25zdW1lRW50cmllc1BlZGFudGljKHRoaXMuYnVpbGRpbmdzLCBzZXR0aW5ncy5idWlsZGluZ3MsIChidWlsZGluZywgaXRlbSkgPT4ge1xuICAgICAgYnVpbGRpbmcuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gYnVpbGRpbmcuZW5hYmxlZDtcbiAgICAgIGJ1aWxkaW5nLm1heCA9IGl0ZW0/Lm1heCA/PyBidWlsZGluZy5tYXg7XG4gICAgICBidWlsZGluZy50cmlnZ2VyID0gaXRlbT8udHJpZ2dlciA/PyBidWlsZGluZy50cmlnZ2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maXhDcnlvY2hhbWJlcnMubG9hZChzZXR0aW5ncy5maXhDcnlvY2hhbWJlcnMpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBSYWNlLCBSYWNlcyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ01heCwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRW1iYXNzeVNldHRpbmcgZXh0ZW5kcyBTZXR0aW5nTWF4IHtcbiAgcmVhZG9ubHkgI3JhY2U6IFJhY2U7XG5cbiAgZ2V0IHJhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JhY2U7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihyYWNlOiBSYWNlLCBlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLiNyYWNlID0gcmFjZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBFbWJhc3N5UmFjZVNldHRpbmdzID0gUmVjb3JkPFJhY2UsIFNldHRpbmdNYXg+O1xuXG5leHBvcnQgY2xhc3MgRW1iYXNzeVNldHRpbmdzIGV4dGVuZHMgU2V0dGluZ1RyaWdnZXIge1xuICByYWNlczogRW1iYXNzeVJhY2VTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihlbmFibGVkID0gZmFsc2UpIHtcbiAgICBzdXBlcihlbmFibGVkKTtcbiAgICB0aGlzLnJhY2VzID0gdGhpcy5pbml0UmFjZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFJhY2VzKCk6IEVtYmFzc3lSYWNlU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgRW1iYXNzeVJhY2VTZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgUmFjZXMpIHtcbiAgICAgIC8vIExldmlhdGhhbnMgaGF2ZSBubyBlbWJhc3NpZXMuXG4gICAgICBpZiAoaXRlbSA9PT0gXCJsZXZpYXRoYW5zXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBFbWJhc3N5U2V0dGluZyhpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxFbWJhc3N5U2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5yYWNlcywgc2V0dGluZ3MucmFjZXMsIChyYWNlLCBpdGVtKSA9PiB7XG4gICAgICByYWNlLmVuYWJsZWQgPSBpdGVtPy5lbmFibGVkID8/IHJhY2UuZW5hYmxlZDtcbiAgICAgIHJhY2UubWF4ID0gaXRlbT8ubWF4ID8/IHJhY2UubWF4O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IGNvbnN1bWVFbnRyaWVzUGVkYW50aWMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgdHlwZSBSYWNlLCBSYWNlcywgdHlwZSBTZWFzb24gfSBmcm9tIFwiLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IEVtYmFzc3lTZXR0aW5ncyB9IGZyb20gXCIuL0VtYmFzc3lTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBSZXF1aXJlbWVudCxcbiAgU2V0dGluZyxcbiAgU2V0dGluZ0J1eVNlbGxUaHJlc2hvbGQsXG4gIFNldHRpbmdMaW1pdGVkVHJpZ2dlcixcbiAgU2V0dGluZ1RyaWdnZXIsXG59IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmFkZVNldHRpbmdzSXRlbSBleHRlbmRzIFNldHRpbmdMaW1pdGVkVHJpZ2dlciB7XG4gIHJlYWRvbmx5ICNyYWNlOiBSYWNlO1xuICByZWFkb25seSBzZWFzb25zOiBSZWNvcmQ8U2Vhc29uLCBTZXR0aW5nPjtcblxuICAvKipcbiAgICogQSByZXNvdXJjZSB0aGF0IGlzIHJlcXVpcmVkIHRvIHRyYWRlIHdpdGggdGhlIHJhY2UuXG4gICAqL1xuICByZWFkb25seSAjcmVxdWlyZTogUmVxdWlyZW1lbnQ7XG5cbiAgZ2V0IHJhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JhY2U7XG4gIH1cbiAgZ2V0IHJlcXVpcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JlcXVpcmU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICByYWNlOiBSYWNlLFxuICAgIGVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgbGltaXRlZDogYm9vbGVhbixcbiAgICBzdW1tZXI6IGJvb2xlYW4sXG4gICAgYXV0dW1uOiBib29sZWFuLFxuICAgIHdpbnRlcjogYm9vbGVhbixcbiAgICBzcHJpbmc6IGJvb2xlYW4sXG4gICAgcmVxdWlyZTogUmVxdWlyZW1lbnQgPSBmYWxzZSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCwgbGltaXRlZCk7XG4gICAgdGhpcy4jcmFjZSA9IHJhY2U7XG4gICAgdGhpcy5zZWFzb25zID0ge1xuICAgICAgYXV0dW1uOiBuZXcgU2V0dGluZyhhdXR1bW4pLFxuICAgICAgc3ByaW5nOiBuZXcgU2V0dGluZyhzcHJpbmcpLFxuICAgICAgc3VtbWVyOiBuZXcgU2V0dGluZyhzdW1tZXIpLFxuICAgICAgd2ludGVyOiBuZXcgU2V0dGluZyh3aW50ZXIpLFxuICAgIH07XG4gICAgdGhpcy4jcmVxdWlyZSA9IHJlcXVpcmU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVHJhZGVTZXR0aW5nc0l0ZW1zID0gUmVjb3JkPFJhY2UsIFRyYWRlU2V0dGluZ3NJdGVtPjtcblxuZXhwb3J0IGNsYXNzIFRyYWRlU2V0dGluZ3MgZXh0ZW5kcyBTZXR0aW5nVHJpZ2dlciB7XG4gIHJhY2VzOiBUcmFkZVNldHRpbmdzSXRlbXM7XG5cbiAgZmVlZExldmlhdGhhbnM6IFNldHRpbmc7XG4gIGJ1aWxkRW1iYXNzaWVzOiBFbWJhc3N5U2V0dGluZ3M7XG4gIHRyYWRlQmxhY2tjb2luOiBTZXR0aW5nQnV5U2VsbFRocmVzaG9sZDtcbiAgdW5sb2NrUmFjZXM6IFNldHRpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIHRyaWdnZXIgPSAtMSxcbiAgICBidWlsZEVtYmFzc2llcyA9IG5ldyBFbWJhc3N5U2V0dGluZ3MoKSxcbiAgICBmZWVkTGV2aWF0aGFucyA9IG5ldyBTZXR0aW5nKCksXG4gICAgdHJhZGVCbGFja2NvaW4gPSBuZXcgU2V0dGluZ0J1eVNlbGxUaHJlc2hvbGQoZmFsc2UsIDEwOTAuMCwgMTA5NS4wLCAxMDAwMCksXG4gICAgdW5sb2NrUmFjZXMgPSBuZXcgU2V0dGluZygpLFxuICApIHtcbiAgICBzdXBlcihlbmFibGVkLCB0cmlnZ2VyKTtcbiAgICB0aGlzLnJhY2VzID0gdGhpcy5pbml0UmFjZXMoKTtcbiAgICB0aGlzLmJ1aWxkRW1iYXNzaWVzID0gYnVpbGRFbWJhc3NpZXM7XG4gICAgdGhpcy5mZWVkTGV2aWF0aGFucyA9IGZlZWRMZXZpYXRoYW5zO1xuICAgIHRoaXMudHJhZGVCbGFja2NvaW4gPSB0cmFkZUJsYWNrY29pbjtcbiAgICB0aGlzLnVubG9ja1JhY2VzID0gdW5sb2NrUmFjZXM7XG4gIH1cblxuICBwcml2YXRlIGluaXRSYWNlcygpOiBUcmFkZVNldHRpbmdzSXRlbXMge1xuICAgIGNvbnN0IGRlZmF1bHRSZXF1aXJlOiBQYXJ0aWFsPFJlY29yZDxSYWNlLCBSZXF1aXJlbWVudD4+ID0ge1xuICAgICAgZHJhZ29uczogXCJ0aXRhbml1bVwiLFxuICAgICAgZ3JpZmZpbnM6IFwid29vZFwiLFxuICAgICAgbGV2aWF0aGFuczogXCJ1bm9idGFpbml1bVwiLFxuICAgICAgbGl6YXJkczogXCJtaW5lcmFsc1wiLFxuICAgICAgc2hhcmtzOiBcImlyb25cIixcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVHJhZGVTZXR0aW5nc0l0ZW1zO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBSYWNlcykge1xuICAgICAgY29uc3QgcmVxdWlyZSA9IGRlZmF1bHRSZXF1aXJlW2l0ZW1dID8/IGZhbHNlO1xuICAgICAgaXRlbXNbaXRlbV0gPSBuZXcgVHJhZGVTZXR0aW5nc0l0ZW0oaXRlbSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgcmVxdWlyZSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGxvYWQoc2V0dGluZ3M6IE1heWJlPFBhcnRpYWw8VHJhZGVTZXR0aW5ncz4+KSB7XG4gICAgaWYgKGlzTmlsKHNldHRpbmdzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLmxvYWQoc2V0dGluZ3MpO1xuXG4gICAgY29uc3VtZUVudHJpZXNQZWRhbnRpYyh0aGlzLnJhY2VzLCBzZXR0aW5ncy5yYWNlcywgKHJhY2UsIGl0ZW0pID0+IHtcbiAgICAgIHJhY2UuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gcmFjZS5lbmFibGVkO1xuICAgICAgcmFjZS5saW1pdGVkID0gaXRlbT8ubGltaXRlZCA/PyByYWNlLmxpbWl0ZWQ7XG4gICAgICByYWNlLnRyaWdnZXIgPSBpdGVtPy50cmlnZ2VyID8/IHJhY2UudHJpZ2dlcjtcbiAgICAgIHJhY2Uuc2Vhc29ucy5hdXR1bW4uZW5hYmxlZCA9IGl0ZW0/LnNlYXNvbnMuYXV0dW1uLmVuYWJsZWQgPz8gcmFjZS5zZWFzb25zLmF1dHVtbi5lbmFibGVkO1xuICAgICAgcmFjZS5zZWFzb25zLnNwcmluZy5lbmFibGVkID0gaXRlbT8uc2Vhc29ucy5zcHJpbmcuZW5hYmxlZCA/PyByYWNlLnNlYXNvbnMuc3ByaW5nLmVuYWJsZWQ7XG4gICAgICByYWNlLnNlYXNvbnMuc3VtbWVyLmVuYWJsZWQgPSBpdGVtPy5zZWFzb25zLnN1bW1lci5lbmFibGVkID8/IHJhY2Uuc2Vhc29ucy5zdW1tZXIuZW5hYmxlZDtcbiAgICAgIHJhY2Uuc2Vhc29ucy53aW50ZXIuZW5hYmxlZCA9IGl0ZW0/LnNlYXNvbnMud2ludGVyLmVuYWJsZWQgPz8gcmFjZS5zZWFzb25zLndpbnRlci5lbmFibGVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZEVtYmFzc2llcy5sb2FkKHNldHRpbmdzLmJ1aWxkRW1iYXNzaWVzKTtcbiAgICB0aGlzLmZlZWRMZXZpYXRoYW5zLmxvYWQoc2V0dGluZ3MuZmVlZExldmlhdGhhbnMpO1xuICAgIHRoaXMudHJhZGVCbGFja2NvaW4ubG9hZChzZXR0aW5ncy50cmFkZUJsYWNrY29pbik7XG4gICAgdGhpcy51bmxvY2tSYWNlcy5sb2FkKHNldHRpbmdzLnVubG9ja1JhY2VzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyB0eXBlIEpvYiwgSm9icywgdHlwZSBUcmFpdCwgVHJhaXRzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nLCBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbGVjdExlYWRlclNldHRpbmdzIGV4dGVuZHMgU2V0dGluZyB7XG4gIHJlYWRvbmx5IGpvYjogU2V0dGluZ09wdGlvbnM8Sm9iPjtcbiAgcmVhZG9ubHkgdHJhaXQ6IFNldHRpbmdPcHRpb25zPFRyYWl0PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbmFibGVkID0gZmFsc2UsXG4gICAgam9iID0gbmV3IFNldHRpbmdPcHRpb25zPEpvYj4oXG4gICAgICBcImFueVwiLFxuICAgICAgSm9icy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBcIlwiLCB2YWx1ZTogaXRlbSB9O1xuICAgICAgfSksXG4gICAgKSxcbiAgICB0cmFpdCA9IG5ldyBTZXR0aW5nT3B0aW9uczxUcmFpdD4oXG4gICAgICBcIm5vbmVcIixcbiAgICAgIFRyYWl0cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsOiBcIlwiLCB2YWx1ZTogaXRlbSB9O1xuICAgICAgfSksXG4gICAgKSxcbiAgKSB7XG4gICAgc3VwZXIoZW5hYmxlZCk7XG4gICAgdGhpcy5qb2IgPSBqb2I7XG4gICAgdGhpcy50cmFpdCA9IHRyYWl0O1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxFbGVjdExlYWRlclNldHRpbmdzPj4pIHtcbiAgICBpZiAoaXNOaWwoc2V0dGluZ3MpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIubG9hZChzZXR0aW5ncyk7XG5cbiAgICB0aGlzLmpvYi5sb2FkKHNldHRpbmdzLmpvYik7XG4gICAgdGhpcy50cmFpdC5sb2FkKHNldHRpbmdzLnRyYWl0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBjb25zdW1lRW50cmllc1BlZGFudGljIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IHR5cGUgSm9iLCBKb2JzIH0gZnJvbSBcIi4uL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBFbGVjdExlYWRlclNldHRpbmdzIH0gZnJvbSBcIi4vRWxlY3RMZWFkZXJTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZywgU2V0dGluZ01heCwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi9TZXR0aW5ncy5qc1wiO1xuXG5leHBvcnQgdHlwZSBWaWxsYWdlSm9iU2V0dGluZ3MgPSBSZWNvcmQ8Sm9iLCBTZXR0aW5nTWF4PjtcblxuZXhwb3J0IGNsYXNzIFZpbGxhZ2VTZXR0aW5ncyBleHRlbmRzIFNldHRpbmcge1xuICBqb2JzOiBWaWxsYWdlSm9iU2V0dGluZ3M7XG5cbiAgaG9sZEZlc3RpdmFsczogU2V0dGluZztcbiAgaHVudDogU2V0dGluZ1RyaWdnZXI7XG4gIHByb21vdGVLaXR0ZW5zOiBTZXR0aW5nVHJpZ2dlcjtcbiAgcHJvbW90ZUxlYWRlcjogU2V0dGluZztcbiAgZWxlY3RMZWFkZXI6IEVsZWN0TGVhZGVyU2V0dGluZ3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5hYmxlZCA9IGZhbHNlLFxuICAgIGhvbGRGZXN0aXZhbHMgPSBuZXcgU2V0dGluZygpLFxuICAgIGh1bnQgPSBuZXcgU2V0dGluZ1RyaWdnZXIoZmFsc2UsIDAuOTgpLFxuICAgIHByb21vdGVLaXR0ZW5zID0gbmV3IFNldHRpbmdUcmlnZ2VyKGZhbHNlLCAxKSxcbiAgICBwcm9tb3RlTGVhZGVyID0gbmV3IFNldHRpbmcoKSxcbiAgICBlbGVjdExlYWRlciA9IG5ldyBFbGVjdExlYWRlclNldHRpbmdzKCksXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZWQpO1xuICAgIHRoaXMuam9icyA9IHRoaXMuaW5pdEpvYnMoKTtcbiAgICB0aGlzLmhvbGRGZXN0aXZhbHMgPSBob2xkRmVzdGl2YWxzO1xuICAgIHRoaXMuaHVudCA9IGh1bnQ7XG4gICAgdGhpcy5wcm9tb3RlS2l0dGVucyA9IHByb21vdGVLaXR0ZW5zO1xuICAgIHRoaXMucHJvbW90ZUxlYWRlciA9IHByb21vdGVMZWFkZXI7XG4gICAgdGhpcy5lbGVjdExlYWRlciA9IGVsZWN0TGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Sm9icygpOiBWaWxsYWdlSm9iU2V0dGluZ3Mge1xuICAgIGNvbnN0IGl0ZW1zID0ge30gYXMgVmlsbGFnZUpvYlNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBKb2JzKSB7XG4gICAgICBpdGVtc1tpdGVtXSA9IG5ldyBTZXR0aW5nTWF4KGZhbHNlLCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgbG9hZChzZXR0aW5nczogTWF5YmU8UGFydGlhbDxWaWxsYWdlU2V0dGluZ3M+Pikge1xuICAgIGlmIChpc05pbChzZXR0aW5ncykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdXBlci5sb2FkKHNldHRpbmdzKTtcblxuICAgIGNvbnN1bWVFbnRyaWVzUGVkYW50aWModGhpcy5qb2JzLCBzZXR0aW5ncy5qb2JzLCAoam9iLCBpdGVtKSA9PiB7XG4gICAgICBqb2IuZW5hYmxlZCA9IGl0ZW0/LmVuYWJsZWQgPz8gam9iLmVuYWJsZWQ7XG4gICAgICBqb2IubWF4ID0gaXRlbT8ubWF4ID8/IGpvYi5tYXg7XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvbGRGZXN0aXZhbHMuZW5hYmxlZCA9IHNldHRpbmdzLmhvbGRGZXN0aXZhbHM/LmVuYWJsZWQgPz8gdGhpcy5ob2xkRmVzdGl2YWxzLmVuYWJsZWQ7XG4gICAgdGhpcy5odW50LmxvYWQoc2V0dGluZ3MuaHVudCk7XG4gICAgdGhpcy5wcm9tb3RlS2l0dGVucy5lbmFibGVkID0gc2V0dGluZ3MucHJvbW90ZUtpdHRlbnM/LmVuYWJsZWQgPz8gdGhpcy5wcm9tb3RlS2l0dGVucy5lbmFibGVkO1xuICAgIHRoaXMucHJvbW90ZUxlYWRlci5lbmFibGVkID0gc2V0dGluZ3MucHJvbW90ZUxlYWRlcj8uZW5hYmxlZCA/PyB0aGlzLnByb21vdGVMZWFkZXIuZW5hYmxlZDtcbiAgICB0aGlzLmVsZWN0TGVhZGVyLmxvYWQoc2V0dGluZ3MuZWxlY3RMZWFkZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCb25maXJlTWFuYWdlciB9IGZyb20gXCIuL0JvbmZpcmVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVuZ2luZSwgRnJhbWVDb250ZXh0IH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlbGlnaW9uTWFuYWdlciB9IGZyb20gXCIuL1JlbGlnaW9uTWFuYWdlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTcGFjZU1hbmFnZXIgfSBmcm9tIFwiLi9TcGFjZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IHR5cGUgQ3ljbGVJbmRpY2VzLCBUaW1lQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVGltZUNvbnRyb2xTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB7IG9iamVjdEVudHJpZXMgfSBmcm9tIFwiLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBuZWdhdGl2ZU9uZVRvSW5maW5pdHkgfSBmcm9tIFwiLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQnVpbGRpbmdNZXRhLFxuICBVbnNhZmVCdWlsZGluZyxcbiAgVW5zYWZlVW5zdGFnZWRCdWlsZGluZ0J1dHRvbk9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzL2J1aWxkaW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZGluZ0J0biwgVW5zYWZlQnVpbGRpbmdCdG5Nb2RlbCB9IGZyb20gXCIuL3R5cGVzL2NvcmUuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2hyb25vRm9yZ2VVcGdyYWRlLFxuICBDeWNsZXMsXG4gIHR5cGUgUHJpY2UsXG4gIFRpbWVJdGVtVmFyaWFudCxcbiAgdHlwZSBWb2lkU3BhY2VVcGdyYWRlLFxufSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTaGF0dGVyVENCdG4sIFNoYXR0ZXJUQ0J0bkNvbnRyb2xsZXIsIFRpbWVUYWIgfSBmcm9tIFwiLi90eXBlcy90aW1lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzaG9wTWFuYWdlciB9IGZyb20gXCIuL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVGltZUNvbnRyb2xNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFRpbWVDb250cm9sU2V0dGluZ3M7XG4gIHJlYWRvbmx5IG1hbmFnZXI6IFRhYk1hbmFnZXI8VGltZVRhYj47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2JvbmZpcmVNYW5hZ2VyOiBCb25maXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVsaWdpb25NYW5hZ2VyOiBSZWxpZ2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NwYWNlTWFuYWdlcjogU3BhY2VNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBLaXR0ZW5TY2llbnRpc3RzLFxuICAgIGJvbmZpcmVNYW5hZ2VyOiBCb25maXJlTWFuYWdlcixcbiAgICByZWxpZ2lvbk1hbmFnZXI6IFJlbGlnaW9uTWFuYWdlcixcbiAgICBzcGFjZU1hbmFnZXI6IFNwYWNlTWFuYWdlcixcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBUaW1lQ29udHJvbFNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIlRpbWVcIik7XG5cbiAgICB0aGlzLl9ib25maXJlTWFuYWdlciA9IGJvbmZpcmVNYW5hZ2VyO1xuICAgIHRoaXMuX3JlbGlnaW9uTWFuYWdlciA9IHJlbGlnaW9uTWFuYWdlcjtcbiAgICB0aGlzLl9zcGFjZU1hbmFnZXIgPSBzcGFjZU1hbmFnZXI7XG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICB9XG5cbiAgYXN5bmMgdGljayhfY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5hY2NlbGVyYXRlVGltZS5lbmFibGVkKSB7XG4gICAgICB0aGlzLmFjY2VsZXJhdGVUaW1lKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMudGltZVNraXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucmVzZXQuZW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvUmVzZXQodGhpcy5faG9zdC5lbmdpbmUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9SZXNldChlbmdpbmU6IEVuZ2luZSkge1xuICAgIC8vIERvbid0IHJlc2V0IGlmIHRoZXJlJ3MgYSBjaGFsbGVuZ2UgcnVubmluZy5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuY3VycmVudENoYWxsZW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrZWRMaXN0OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHJpZ2dlcjogbnVtYmVyOyB2YWw6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IGNoZWNrTGlzdDogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gcXVpY2tseSBjaGVjayBhIGxpc3Qgb2YgaXRlbXMgZm9yIG91clxuICAgIC8vIGFiaWxpdHkgdG8gYnV5IHRoZW0uXG4gICAgLy8gVGhlIGlkZWEgaXMgdGhhdCwgaWYgd2UgZG9uJ3QgaGF2ZSBhIGdpdmVuIGJ1aWxkaW5nIHlldCwgd2UgcHV0XG4gICAgLy8gaXQgb24gdGhlIGBjaGVja0xpc3RgLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhlbiBjaGVjayB0aGUgcHJvdmlkZWRcbiAgICAvLyBidXR0b25zIGFuZCBzZWUgaWYgdGhlIGl0ZW0gYXBwZWFycyBvbiB0aGUgY2hlY2tsaXN0LlxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBnaXZlbiBpdGVtLCBidXQgd2UgKmNvdWxkKiBidXkgaXQsIHRoZW4gd2UgYWN0XG4gICAgLy8gYXMgaWYgd2UgYWxyZWFkeSBoYWQgaXQuXG4gICAgY29uc3QgY2hlY2sgPSA8XG4gICAgICBUIGV4dGVuZHMgQnVpbGRpbmdCdG48VW5zYWZlQnVpbGRpbmdCdG5Nb2RlbDxVbnNhZmVVbnN0YWdlZEJ1aWxkaW5nQnV0dG9uT3B0aW9ucz4+LFxuICAgID4oXG4gICAgICBidXR0b25zOiBBcnJheTxUPixcbiAgICApID0+IHtcbiAgICAgIGlmIChjaGVja0xpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIGJ1dHRvbnMpIHtcbiAgICAgICAgICBpZiAoaXNOaWwoYnV0dG9uLm1vZGVsKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBidXR0b24ubW9kZWwgYXMgeyBtZXRhZGF0YTogeyBuYW1lOiBzdHJpbmcgfTsgcHJpY2VzOiBBcnJheTxQcmljZT4gfTtcblxuICAgICAgICAgIGNvbnN0IG5hbWUgPSBtb2RlbC5tZXRhZGF0YS5uYW1lO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2hlY2tMaXN0LmluZGV4T2YobmFtZSk7XG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY2hlY2tMaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuaGFzUmVzKG11c3RFeGlzdChtb2RlbC5wcmljZXMpKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgLy8gY2hlY2sgYnVpbGRpbmdcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygb2JqZWN0RW50cmllcyh0aGlzLnNldHRpbmdzLnJlc2V0LmJvbmZpcmUuYnVpbGRpbmdzKSkge1xuICAgICAgaWYgKCFlbnRyeS5lbmFibGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgdHJpZ2dlciBmb3IgYW4gaXRlbSBpcyBzZXQgdG8gaW5maW5pdHksIGl0IGJhc2ljYWxseSBkaXNhYmxlcyB0aGUgZW50aXJlIGZlYXR1cmUuXG4gICAgICBpZiAoZW50cnkudHJpZ2dlciA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBPYnZpb3VzIGVycm9yIGhlcmUuIEZvciB1cGdyYWRlZCBidWlsZGluZ3MsIGl0IG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcuXG4gICAgICBsZXQgYmxkOiBCdWlsZGluZ01ldGE8VW5zYWZlQnVpbGRpbmc+IHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgT2J2aW91cyBlcnJvciBoZXJlLiBGb3IgdXBncmFkZWQgYnVpbGRpbmdzLCBpdCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nLlxuICAgICAgICBibGQgPSB0aGlzLl9ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KG5hbWUpO1xuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIGJsZCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNOaWwoYmxkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY2hlY2tlZExpc3QucHVzaCh7XG4gICAgICAgIG5hbWU6IGJsZC5tZXRhLmxhYmVsID8/IG11c3RFeGlzdChibGQubWV0YS5zdGFnZXMpW211c3RFeGlzdChibGQubWV0YS5zdGFnZSldLmxhYmVsLFxuICAgICAgICB0cmlnZ2VyOiBlbnRyeS50cmlnZ2VyLFxuICAgICAgICB2YWw6IGJsZC5tZXRhLnZhbCxcbiAgICAgIH0pO1xuICAgICAgaWYgKDAgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIC8vIElmIHRoZSByZXF1aXJlZCBhbW91bnQgb2YgYnVpbGRpbmdzIGhhc24ndCBiZWVuIGJ1aWx0IHlldCwgYmFpbCBvdXQuXG4gICAgICAgIGlmIChibGQubWV0YS52YWwgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0xpc3QucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1bmljb3JuUGFzdHVyZVxuICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHVuaWNvcm4gcGFzdHVyZS4gQXMgaXQncyBsaXN0ZWQgdW5kZXIgcmVsaWdpb24sIGJ1dCBpc1xuICAgIC8vIGFjdHVhbGx5IGEgYm9uZmlyZSBpdGVtLlxuICAgIGNvbnN0IHVuaWNvcm5QYXN0dXJlID0gdGhpcy5zZXR0aW5ncy5yZXNldC5yZWxpZ2lvbi5idWlsZGluZ3MudW5pY29yblBhc3R1cmU7XG4gICAgaWYgKHVuaWNvcm5QYXN0dXJlLmVuYWJsZWQpIHtcbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmICh1bmljb3JuUGFzdHVyZS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsZCA9IHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoXCJ1bmljb3JuUGFzdHVyZVwiKTtcbiAgICAgIGNoZWNrZWRMaXN0LnB1c2goe1xuICAgICAgICBuYW1lOiBtdXN0RXhpc3QoYmxkLm1ldGEubGFiZWwpLFxuICAgICAgICB0cmlnZ2VyOiB1bmljb3JuUGFzdHVyZS50cmlnZ2VyLFxuICAgICAgICB2YWw6IGJsZC5tZXRhLnZhbCxcbiAgICAgIH0pO1xuICAgICAgaWYgKDAgPCB1bmljb3JuUGFzdHVyZS50cmlnZ2VyKSB7XG4gICAgICAgIGlmIChibGQubWV0YS52YWwgPCB1bmljb3JuUGFzdHVyZS50cmlnZ2VyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGVja0xpc3QucHVzaChcInVuaWNvcm5QYXN0dXJlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRoZSBgY2hlY2soKWAgY2FsbHMgYXJlIHVuc2FmZSBhbmQgbmVlZCB0byBiZSByZXdyaXR0ZW4uXG4gICAgaWYgKGNoZWNrKHRoaXMuX2JvbmZpcmVNYW5hZ2VyLm1hbmFnZXIudGFiLmNoaWxkcmVuKSB8fCBjaGVja0xpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgc3BhY2VcbiAgICAvLyBUaGlzIGlzIGlkZW50aWNhbCB0byByZWd1bGFyIGJ1aWxkaW5ncy5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygb2JqZWN0RW50cmllcyh0aGlzLnNldHRpbmdzLnJlc2V0LnNwYWNlLmJ1aWxkaW5ncykpIHtcbiAgICAgIGlmICghZW50cnkuZW5hYmxlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHRyaWdnZXIgZm9yIGFuIGl0ZW0gaXMgc2V0IHRvIGluZmluaXR5LCBpdCBiYXNpY2FsbHkgZGlzYWJsZXMgdGhlIGVudGlyZSBmZWF0dXJlLlxuICAgICAgaWYgKGVudHJ5LnRyaWdnZXIgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxkID0gdGhpcy5faG9zdC5nYW1lLnNwYWNlLmdldEJ1aWxkaW5nKG5hbWUpO1xuICAgICAgY2hlY2tlZExpc3QucHVzaCh7IG5hbWU6IGJsZC5sYWJlbCwgdHJpZ2dlcjogZW50cnkudHJpZ2dlciwgdmFsOiBibGQudmFsIH0pO1xuICAgICAgaWYgKDAgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIGlmIChibGQudmFsIDwgZW50cnkudHJpZ2dlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tMaXN0LnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHBhbmVscyA9IG11c3RFeGlzdCh0aGlzLl9zcGFjZU1hbmFnZXIubWFuYWdlci50YWIucGxhbmV0UGFuZWxzKTtcbiAgICAgIGZvciAoY29uc3QgcGFuZWwgb2YgcGFuZWxzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFuZWxCdXR0b24gb2YgcGFuZWwuY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IG11c3RFeGlzdChwYW5lbEJ1dHRvbi5tb2RlbCk7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG1vZGVsLm1ldGFkYXRhLm5hbWU7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBjaGVja0xpc3QuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjaGVja0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5oYXNSZXMobXVzdEV4aXN0KG1vZGVsLnByaWNlcykpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hlY2tMaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHJlbGlnaW9uXG4gICAgZm9yIChjb25zdCBbbmFtZSwgZW50cnldIG9mIG9iamVjdEVudHJpZXModGhpcy5zZXR0aW5ncy5yZXNldC5yZWxpZ2lvbi5idWlsZGluZ3MpKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmIChlbnRyeS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsZCA9IG11c3RFeGlzdCh0aGlzLl9yZWxpZ2lvbk1hbmFnZXIuZ2V0QnVpbGQobmFtZSwgZW50cnkudmFyaWFudCkpO1xuICAgICAgY2hlY2tlZExpc3QucHVzaCh7IG5hbWU6IGJsZC5sYWJlbCwgdHJpZ2dlcjogZW50cnkudHJpZ2dlciwgdmFsOiBibGQudmFsIH0pO1xuICAgICAgaWYgKDAgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIGlmIChibGQudmFsIDwgZW50cnkudHJpZ2dlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tMaXN0LnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGUgYGNoZWNrKClgIGNhbGxzIGFyZSB1bnNhZmUgYW5kIG5lZWQgdG8gYmUgcmV3cml0dGVuLlxuICAgICAgY2hlY2sodGhpcy5fcmVsaWdpb25NYW5hZ2VyLm1hbmFnZXIudGFiLnpnVXBncmFkZUJ1dHRvbnMpIHx8XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRoZSBgY2hlY2soKWAgY2FsbHMgYXJlIHVuc2FmZSBhbmQgbmVlZCB0byBiZSByZXdyaXR0ZW4uXG4gICAgICBjaGVjayh0aGlzLl9yZWxpZ2lvbk1hbmFnZXIubWFuYWdlci50YWIuclVwZ3JhZGVCdXR0b25zKSB8fFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUaGUgYGNoZWNrKClgIGNhbGxzIGFyZSB1bnNhZmUgYW5kIG5lZWQgdG8gYmUgcmV3cml0dGVuLlxuICAgICAgY2hlY2sodGhpcy5fcmVsaWdpb25NYW5hZ2VyLm1hbmFnZXIudGFiLmN0UGFuZWwuY2hpbGRyZW5bMF0uY2hpbGRyZW4pIHx8XG4gICAgICBjaGVja0xpc3QubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgdGltZVxuICAgIGZvciAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBvYmplY3RFbnRyaWVzKHRoaXMuc2V0dGluZ3MucmVzZXQudGltZS5idWlsZGluZ3MpKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmIChlbnRyeS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsZCA9IG11c3RFeGlzdCh0aGlzLmdldEJ1aWxkKG5hbWUsIGVudHJ5LnZhcmlhbnQpKTtcbiAgICAgIGNoZWNrZWRMaXN0LnB1c2goeyBuYW1lOiBibGQubGFiZWwsIHRyaWdnZXI6IGVudHJ5LnRyaWdnZXIsIHZhbDogYmxkLnZhbCB9KTtcbiAgICAgIGlmICgwIDwgZW50cnkudHJpZ2dlcikge1xuICAgICAgICBpZiAoYmxkLnZhbCA8IGVudHJ5LnRyaWdnZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrTGlzdC5wdXNoKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGhlIGBjaGVjaygpYCBjYWxscyBhcmUgdW5zYWZlIGFuZCBuZWVkIHRvIGJlIHJld3JpdHRlbi5cbiAgICAgIGNoZWNrKHRoaXMubWFuYWdlci50YWIuY2ZQYW5lbC5jaGlsZHJlblswXS5jaGlsZHJlbikgfHxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGhlIGBjaGVjaygpYCBjYWxscyBhcmUgdW5zYWZlIGFuZCBuZWVkIHRvIGJlIHJld3JpdHRlbi5cbiAgICAgIGNoZWNrKHRoaXMubWFuYWdlci50YWIudnNQYW5lbC5jaGlsZHJlblswXS5jaGlsZHJlbikgfHxcbiAgICAgIGNoZWNrTGlzdC5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayByZXNvdXJjZXNcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2Ygb2JqZWN0RW50cmllcyh0aGlzLnNldHRpbmdzLnJlc2V0LnJlc291cmNlcy5yZXNvdXJjZXMpKSB7XG4gICAgICBpZiAoIWVudHJ5LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0cmlnZ2VyIGZvciBhbiBpdGVtIGlzIHNldCB0byBpbmZpbml0eSwgaXQgYmFzaWNhbGx5IGRpc2FibGVzIHRoZSBlbnRpcmUgZmVhdHVyZS5cbiAgICAgIGlmIChlbnRyeS50cmlnZ2VyIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQobmFtZSkpO1xuICAgICAgY2hlY2tlZExpc3QucHVzaCh7XG4gICAgICAgIG5hbWU6IHRoaXMuX2hvc3QuZW5naW5lLmkxOG4oYCRyZXNvdXJjZXMuJHtlbnRyeS5yZXNvdXJjZX0udGl0bGVgKSxcbiAgICAgICAgdHJpZ2dlcjogZW50cnkudHJpZ2dlcixcbiAgICAgICAgdmFsOiByZXMudmFsdWUsXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXMudmFsdWUgPCBlbnRyeS50cmlnZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBXb3Jrc2hvcCB1cGdyYWRlc1xuICAgIGZvciAoY29uc3QgWywgZW50cnldIG9mIG9iamVjdEVudHJpZXModGhpcy5zZXR0aW5ncy5yZXNldC51cGdyYWRlcy51cGdyYWRlcykpIHtcbiAgICAgIGlmIChlbnRyeS5lbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IHVwZ3JhZGUgPSBtdXN0RXhpc3QoXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLnVwZ3JhZGVzLmZpbmQoc3ViamVjdCA9PiBzdWJqZWN0Lm5hbWUgPT09IGVudHJ5LnVwZ3JhZGUpLFxuICAgICAgICApO1xuICAgICAgICBjaGVja2VkTGlzdC5wdXNoKHsgbmFtZTogdXBncmFkZS5sYWJlbCwgdHJpZ2dlcjogMSwgdmFsOiB1cGdyYWRlLnJlc2VhcmNoZWQgPyAxIDogMCB9KTtcbiAgICAgICAgaWYgKCF1cGdyYWRlLnJlc2VhcmNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIG5vdyBkZXRlcm1pbmVkIHRoYXQgd2UgZWl0aGVyIGhhdmUgYWxsIGl0ZW1zIG9yIGNvdWxkIGJ1eSBhbGwgaXRlbXMuXG5cbiAgICAvLyBzdG9wIVxuICAgIGVuZ2luZS5zdG9wKGZhbHNlKTtcblxuICAgIGNvbnN0IHNsZWVwID0gYXN5bmMgKHRpbWUgPSAxNTAwKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiY2FuY2VsZWQgYnkgcGxheWVyXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCB0aW1lKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBjaGVja2VkIG9mIGNoZWNrZWRMaXN0KSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY2hlY2tcIiwgW1xuICAgICAgICAgIGNoZWNrZWQubmFtZSxcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KGNoZWNrZWQudHJpZ2dlciksXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dChjaGVja2VkLnZhbCksXG4gICAgICAgIF0pO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY2hlY2tlZFwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJyZXNldC50aXBcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uMTBcIik7XG4gICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjlcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uOFwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInJlc2V0LmNvdW50ZG93bi43XCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjZcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uNVwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInJlc2V0LmNvdW50ZG93bi40XCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjNcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJyZXNldC5jb3VudGRvd24uMlwiKTtcbiAgICAgIGF3YWl0IHNsZWVwKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInJlc2V0LmNvdW50ZG93bi4xXCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY291bnRkb3duLjBcIik7XG4gICAgICBhd2FpdCBzbGVlcCgpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwicmVzZXQubGFzdC5tZXNzYWdlXCIpO1xuICAgICAgYXdhaXQgc2xlZXAoKTtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwicmVzZXQuY2FuY2VsLm1lc3NhZ2VcIik7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJyZXNldC5jYW5jZWwuYWN0aXZpdHlcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgZm9yIChcbiAgICAgIGxldCBjaGFsbGVuZ2VJbmRleCA9IDA7XG4gICAgICBjaGFsbGVuZ2VJbmRleCA8IHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmNoYWxsZW5nZXMubGVuZ3RoO1xuICAgICAgY2hhbGxlbmdlSW5kZXgrK1xuICAgICkge1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuY2hhbGxlbmdlc1tjaGFsbGVuZ2VJbmRleF0ucGVuZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9ob3N0LmdhbWUucmVzZXRBdXRvbWF0aWMoKTtcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgfVxuXG4gIGFjY2VsZXJhdGVUaW1lKCkge1xuICAgIGNvbnN0IHRlbXBvcmFsRmx1eEF2YWlsYWJsZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInRlbXBvcmFsRmx1eFwiKTtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gYXZhaWxhYmxlIGZsdXggKHdlIHdlbnQgYmVsb3cgdGhlIGxpbWl0KVxuICAgIGlmICh0ZW1wb3JhbEZsdXhBdmFpbGFibGUgPD0gMCkge1xuICAgICAgaWYgKHRoaXMuX2hvc3QuZ2FtZS50aW1lLmlzQWNjZWxlcmF0ZWQpIHtcbiAgICAgICAgLy8gU3RvcCB0aGUgYWNjZWxlcmF0aW9uXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS50aW1lLmlzQWNjZWxlcmF0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnRpbWUuaXNBY2NlbGVyYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBvcmFsRmx1eCA9IHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcInRlbXBvcmFsRmx1eFwiKTtcblxuICAgIGlmICh0ZW1wb3JhbEZsdXgubWF4VmFsdWUgKiB0aGlzLnNldHRpbmdzLmFjY2VsZXJhdGVUaW1lLnRyaWdnZXIgPD0gdGVtcG9yYWxGbHV4LnZhbHVlKSB7XG4gICAgICB0aGlzLl9ob3N0LmdhbWUudGltZS5pc0FjY2VsZXJhdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5hY2NlbGVyYXRlXCIsIFtdLCBcImtzLWFjY2VsZXJhdGVcIik7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJhY2NlbGVyYXRlXCIsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHRpbWVTa2lwKCkge1xuICAgIGlmICghdGhpcy5faG9zdC5nYW1lLndvcmtzaG9wLmdldChcImNocm9ub2ZvcmdlXCIpLnJlc2VhcmNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCB0aW1lIHNraXAgd2hpbGUgd2UncmUgaW4gYSB0ZW1wb3JhbCBwYXJhZG94LlxuICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZGF5IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbGVzcyB0aW1lIGNyeXN0YWxzIHRoYW4gb3VyIHJlcXVpcmVkIHRyaWdnZXIgdmFsdWUsIGJhaWwgb3V0LlxuICAgIGNvbnN0IHNoYXR0ZXJDb3N0SW5jcmVhc2VDaGFsbGVuZ2UgPSB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwic2hhdHRlckNvc3RJbmNyZWFzZUNoYWxsZW5nZVwiKTtcbiAgICBjb25zdCB0aW1lQ3J5c3RhbHNBdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJ0aW1lQ3J5c3RhbFwiKTtcbiAgICBpZiAoXG4gICAgICB0aW1lQ3J5c3RhbHNBdmFpbGFibGUgPCB0aGlzLnNldHRpbmdzLnRpbWVTa2lwLnRyaWdnZXIgfHxcbiAgICAgIHRpbWVDcnlzdGFsc0F2YWlsYWJsZSA8IDEgKyBzaGF0dGVyQ29zdEluY3JlYXNlQ2hhbGxlbmdlXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhdHRlclZvaWRDb3N0ID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInNoYXR0ZXJWb2lkQ29zdFwiKTtcbiAgICBjb25zdCB2b2lkQXZhaWxhYmxlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwidm9pZFwiKTtcbiAgICBpZiAodm9pZEF2YWlsYWJsZSA8IHNoYXR0ZXJWb2lkQ29zdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHNraXBwaW5nIGR1cmluZyB0aGlzIHNlYXNvbiB3YXMgZGlzYWJsZWQsIGJhaWwgb3V0LlxuICAgIGNvbnN0IHNlYXNvbiA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5zZWFzb247XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLnNlYXNvbnNbdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLnNlYXNvbnNbc2Vhc29uXS5uYW1lXS5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc2tpcHBpbmcgZHVyaW5nIHRoaXMgY3ljbGUgd2FzIGRpc2FibGVkLCBiYWlsIG91dC5cbiAgICBjb25zdCBjdXJyZW50Q3ljbGUgPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGU7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmN5Y2xlc1tDeWNsZXNbY3VycmVudEN5Y2xlXV0uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgdG9vIG11Y2ggc3RvcmVkIGhlYXQsIHdhaXQgZm9yIGl0IHRvIGNvb2wgZG93bi5cbiAgICBjb25zdCBoZWF0TWF4ID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImhlYXRNYXhcIik7XG4gICAgY29uc3QgaGVhdE5vdyA9IHRoaXMuX2hvc3QuZ2FtZS50aW1lLmhlYXQ7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmlnbm9yZU92ZXJoZWF0LmVuYWJsZWQpIHtcbiAgICAgIGlmIChoZWF0TWF4IDw9IGhlYXROb3cpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvciA9IHRoaXMuX2hvc3QuZ2FtZS5jaGFsbGVuZ2VzLmdldENoYWxsZW5nZShcIjEwMDBZZWFyc1wiKS5yZXNlYXJjaGVkID8gNSA6IDEwO1xuICAgIGxldCBtYXhTa2lwc0FjdGl2ZUhlYXRUcmFuc2ZlciA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAvLyBBY3RpdmUgSGVhdCBUcmFuc2ZlclxuICAgIGlmIChcbiAgICAgICF0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmlnbm9yZU92ZXJoZWF0LmVuYWJsZWQgJiZcbiAgICAgIHRoaXMuc2V0dGluZ3MudGltZVNraXAuYWN0aXZlSGVhdFRyYW5zZmVyLmVuYWJsZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGhlYXRQZXJUaWNrID0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImhlYXRQZXJUaWNrXCIpO1xuICAgICAgY29uc3QgdGlja3NQZXJTZWNvbmQgPSB0aGlzLl9ob3N0LmdhbWUudGlja3NQZXJTZWNvbmQ7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy50aW1lU2tpcC5hY3RpdmVIZWF0VHJhbnNmZXIuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzLmVuYWJsZWQpIHtcbiAgICAgICAgLy8gSGVhdCBUcmFuc2ZlciB0byBzcGVjaWZpZWQgdmFsdWVcbiAgICAgICAgaWYgKGhlYXROb3cgPD0gaGVhdE1heCAqIHRoaXMuc2V0dGluZ3MudGltZVNraXAuYWN0aXZlSGVhdFRyYW5zZmVyLnRyaWdnZXIpIHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmFjdGl2ZUhlYXRUcmFuc2Zlci5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX2hvc3QucmVmcmVzaEVudGlyZVVzZXJJbnRlcmZhY2UoKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QudGltZS5hY3RpdmVIZWF0VHJhbnNmZXJFbmRcIiwgW10sIFwia3MtdGltZVNraXBcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2V0IHRlbXBvcmFsRmx1eFxuICAgICAgICAvLyBUT0RPOiBNb3JlIGp1ZGdtZW50KGUuZy4gZGV0ZXJtaW5pbmcgY3J5c3RhbCBjb3N0KT8gT3Igc2hvdWxkIHRoZSBwbGF5ZXJzIGRlY2lkZSBmb3IgdGhlbXNlbHZlcyhBZGQgb3B0aW9ucyk/XG4gICAgICAgIGNvbnN0IHRlbXBvcmFsRmx1eFByb2R1Y3Rpb24gPSB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwidGVtcG9yYWxGbHV4UHJvZHVjdGlvblwiKTtcbiAgICAgICAgY29uc3QgZGF5c1BlclllYXIgPVxuICAgICAgICAgICh0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZGF5c1BlclNlYXNvbiArXG4gICAgICAgICAgICAxMCArXG4gICAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwidGVtcG9yYWxQYXJhZG94RGF5XCIpKSAqXG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLnNlYXNvbnNQZXJZZWFyO1xuICAgICAgICBjb25zdCB0aWNrc1BlckRheSA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci50aWNrc1BlckRheTtcbiAgICAgICAgY29uc3QgZGF5c1BlclRpY2tzID0gKDEgKyB0aGlzLl9ob3N0LmdhbWUudGltZUFjY2VsZXJhdGlvblJhdGlvKCkpIC8gdGlja3NQZXJEYXk7XG4gICAgICAgIGNvbnN0IHRpY2tzUGVyWWVhciA9IGRheXNQZXJZZWFyIC8gZGF5c1BlclRpY2tzO1xuICAgICAgICBjb25zdCB0ZW1wb3JhbEZsdXggPSB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJ0ZW1wb3JhbEZsdXhcIik7XG4gICAgICAgIGNvbnN0IGZsdXhFbmFibGVkID0gdGVtcG9yYWxGbHV4Lm1heFZhbHVlID4gdGlja3NQZXJZZWFyO1xuICAgICAgICBjb25zdCBmbHV4ID0gdGVtcG9yYWxGbHV4LnZhbHVlIDwgdGlja3NQZXJZZWFyO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXNlYXNvbiAmJlxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5kYXkgPCAxMCAmJlxuICAgICAgICAgIHRlbXBvcmFsRmx1eFByb2R1Y3Rpb24gPiBmYWN0b3IgLyBoZWF0UGVyVGljayAmJlxuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYWNjZWxlcmF0ZVRpbWUuZW5hYmxlZCAmJlxuICAgICAgICAgIGZsdXhFbmFibGVkICYmXG4gICAgICAgICAgZmx1eFxuICAgICAgICApIHtcbiAgICAgICAgICBtYXhTa2lwc0FjdGl2ZUhlYXRUcmFuc2ZlciA9IE1hdGguY2VpbChcbiAgICAgICAgICAgICh0aWNrc1BlclllYXIgKyB0aWNrc1BlckRheSAqIDEwIC0gdGVtcG9yYWxGbHV4LnZhbHVlKSAvIHRlbXBvcmFsRmx1eFByb2R1Y3Rpb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QudGltZS5nZXRUZW1wb3JhbEZsdXhcIiwgW10sIFwia3MtdGltZVNraXBcIik7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwidGltZS5nZXRUZW1wb3JhbEZsdXhcIiwgMSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy50aW1lU2tpcC5hY3RpdmVIZWF0VHJhbnNmZXIuY3ljbGVzW0N5Y2xlc1tjdXJyZW50Q3ljbGVdXS5lbmFibGVkKSB7XG4gICAgICAgICAgLy8gSGVhdCBUcmFuc2ZlciBkdXJpbmcgc2VsZWN0ZWQgY3ljbGVzXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1heFNraXBzQWN0aXZlSGVhdFRyYW5zZmVyID1cbiAgICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci55ZWFyc1BlckN5Y2xlIC0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmN5Y2xlWWVhcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoZWF0Tm93ID49IGhlYXRNYXggLSBoZWF0UGVyVGljayAqIHRpY2tzUGVyU2Vjb25kICogMTApIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncy50aW1lU2tpcC5hY3RpdmVIZWF0VHJhbnNmZXIuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9ob3N0LnJlZnJlc2hFbnRpcmVVc2VySW50ZXJmYWNlKCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC50aW1lLmFjdGl2ZUhlYXRUcmFuc2ZlclN0YXJ0XCIsIFtdLCBcImtzLXRpbWVTa2lwXCIpO1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJ0aW1lLmFjdGl2ZUhlYXRUcmFuc2ZlclN0YXJ0XCIsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBtYXhpbXVtIHllYXJzIHRvIHNraXAsIGJhc2VkIG9uIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24uXG4gICAgY29uc3QgbWF4U2tpcHMgPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy50aW1lU2tpcC5tYXgpO1xuXG4gICAgLy8gVGhlIGFtb3VudCBvZiBza2lwcyB3ZSBjYW4gcGVyZm9ybS5cbiAgICBsZXQgY2FuU2tpcCA9IE1hdGguZmxvb3IoXG4gICAgICBNYXRoLm1pbihcbiAgICAgICAgdGhpcy5zZXR0aW5ncy50aW1lU2tpcC5pZ25vcmVPdmVyaGVhdC5lbmFibGVkXG4gICAgICAgICAgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICA6IChoZWF0TWF4IC0gaGVhdE5vdykgLyBmYWN0b3IsXG4gICAgICAgIG1heFNraXBzLFxuICAgICAgICBtYXhTa2lwc0FjdGl2ZUhlYXRUcmFuc2ZlcixcbiAgICAgICAgdGltZUNyeXN0YWxzQXZhaWxhYmxlIC8gKDEgKyBzaGF0dGVyQ29zdEluY3JlYXNlQ2hhbGxlbmdlKSxcbiAgICAgICAgMCA8IHNoYXR0ZXJWb2lkQ29zdCA/IHZvaWRBdmFpbGFibGUgLyBzaGF0dGVyVm9pZENvc3QgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgICApLFxuICAgICk7XG5cbiAgICAvLyBUaGUgYW1vdW50IG9mIHNraXBzIHRvIHBlcmZvcm0uXG4gICAgbGV0IHdpbGxTa2lwID0gMDtcblxuICAgIGNvbnN0IHllYXJzUGVyQ3ljbGUgPSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIueWVhcnNQZXJDeWNsZTtcbiAgICBjb25zdCByZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZSA9IHllYXJzUGVyQ3ljbGUgLSB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuY3ljbGVZZWFyO1xuICAgIGNvbnN0IGN5Y2xlc1BlckVyYSA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jeWNsZXNQZXJFcmE7XG4gICAgLy8gSWYgdGhlIGN5Y2xlIGhhcyBtb3JlIHllYXJzIHJlbWFpbmluZyB0aGFuIHdlIGNhbiBldmVuIHNraXAsIHNraXAgYWxsIG9mIHRoZW0uXG4gICAgLy8gSSBndWVzcyB0aGUgaWRlYSBoZXJlIGlzIHRvIG5vdCBza2lwIHRocm91Z2ggeWVhcnMgb2YgYW5vdGhlciBjeWNsZSwgaWYgdGhhdFxuICAgIC8vIGN5Y2xlIG1heSBub3QgYmUgZW5hYmxlZCBmb3Igc2tpcHBpbmcuXG4gICAgaWYgKGNhblNraXAgPCByZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZSkge1xuICAgICAgd2lsbFNraXAgPSBjYW5Ta2lwO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWxsU2tpcCArPSByZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZTtcbiAgICAgIGNhblNraXAgLT0gcmVtYWluaW5nWWVhcnNDdXJyZW50Q3ljbGU7XG4gICAgICBsZXQgc2tpcEN5Y2xlcyA9IDE7XG4gICAgICB3aGlsZSAoXG4gICAgICAgIHllYXJzUGVyQ3ljbGUgPCBjYW5Ta2lwICYmXG4gICAgICAgIHRoaXMuc2V0dGluZ3MudGltZVNraXAuY3ljbGVzW1xuICAgICAgICAgIEN5Y2xlc1soKGN1cnJlbnRDeWNsZSArIHNraXBDeWNsZXMpICUgY3ljbGVzUGVyRXJhKSBhcyBDeWNsZUluZGljZXNdXG4gICAgICAgIF0uZW5hYmxlZFxuICAgICAgKSB7XG4gICAgICAgIHdpbGxTa2lwICs9IHllYXJzUGVyQ3ljbGU7XG4gICAgICAgIGNhblNraXAgLT0geWVhcnNQZXJDeWNsZTtcbiAgICAgICAgc2tpcEN5Y2xlcyArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnNldHRpbmdzLnRpbWVTa2lwLmN5Y2xlc1tcbiAgICAgICAgICBDeWNsZXNbKChjdXJyZW50Q3ljbGUgKyBza2lwQ3ljbGVzKSAlIGN5Y2xlc1BlckVyYSkgYXMgQ3ljbGVJbmRpY2VzXVxuICAgICAgICBdLmVuYWJsZWQgJiZcbiAgICAgICAgMCA8IGNhblNraXBcbiAgICAgICkge1xuICAgICAgICB3aWxsU2tpcCArPSBjYW5Ta2lwO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB3ZSBmb3VuZCB3ZSBjYW4gc2tpcCBhbnkgeWVhcnMsIGRvIHNvIG5vdy5cbiAgICBpZiAoMCA8IHdpbGxTa2lwKSB7XG4gICAgICBjb25zdCBzaGF0dGVyID0gdGhpcy5faG9zdC5nYW1lLnRpbWVUYWIuY2ZQYW5lbC5jaGlsZHJlblswXS5jaGlsZHJlblswXSBhcyBTaGF0dGVyVENCdG47IC8vIGNoZWNrP1xuICAgICAgaWYgKGlzTmlsKHNoYXR0ZXIubW9kZWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC50aW1lLnNraXBcIiwgW3dpbGxTa2lwXSwgXCJrcy10aW1lU2tpcFwiKTtcbiAgICAgIChzaGF0dGVyLmNvbnRyb2xsZXIgYXMgU2hhdHRlclRDQnRuQ29udHJvbGxlcikuZG9TaGF0dGVyQW10KHNoYXR0ZXIubW9kZWwsIHdpbGxTa2lwKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcInRpbWUuc2tpcFwiLCB3aWxsU2tpcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QnVpbGQobmFtZTogQ2hyb25vRm9yZ2VVcGdyYWRlIHwgVm9pZFNwYWNlVXBncmFkZSwgdmFyaWFudDogVGltZUl0ZW1WYXJpYW50KSB7XG4gICAgaWYgKHZhcmlhbnQgPT09IFRpbWVJdGVtVmFyaWFudC5DaHJvbm9mb3JnZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZ2FtZS50aW1lLmdldENGVShuYW1lIGFzIENocm9ub0ZvcmdlVXBncmFkZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ob3N0LmdhbWUudGltZS5nZXRWU1UobmFtZSBhcyBWb2lkU3BhY2VVcGdyYWRlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIG11c3RFeGlzdCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRnJhbWVDb250ZXh0IH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBCdWxrUHVyY2hhc2VIZWxwZXIgfSBmcm9tIFwiLi9oZWxwZXIvQnVsa1B1cmNoYXNlSGVscGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyB0eXBlIFRpbWVJdGVtLCBUaW1lU2V0dGluZ3MsIHR5cGUgVGltZVNldHRpbmdzSXRlbSB9IGZyb20gXCIuL3NldHRpbmdzL1RpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkaW5nU3RhY2thYmxlQnRuLCBCdXR0b25Nb2Rlcm4gfSBmcm9tIFwiLi90eXBlcy9jb3JlLmpzXCI7XG5pbXBvcnQgeyB0eXBlIENocm9ub0ZvcmdlVXBncmFkZSwgVGltZUl0ZW1WYXJpYW50LCB0eXBlIFZvaWRTcGFjZVVwZ3JhZGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBDaHJvbm9mb3JnZUJ0bkNvbnRyb2xsZXIsXG4gIFRpbWVUYWIsXG4gIFVuc2FmZUNocm9ub0ZvcmdlVXBncmFkZSxcbiAgVW5zYWZlQ2hyb25vZm9yZ2VVcGdyYWRlQnV0dG9uT3B0aW9ucyxcbiAgVW5zYWZlRml4Q3J5b2NoYW1iZXJCdXR0b25PcHRpb25zLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlLFxuICBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlQnV0dG9uT3B0aW9ucyxcbiAgVm9pZFNwYWNlQnRuQ29udHJvbGxlcixcbn0gZnJvbSBcIi4vdHlwZXMvdGltZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi9Xb3Jrc2hvcE1hbmFnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRpbWVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogS2l0dGVuU2NpZW50aXN0cztcbiAgcmVhZG9ubHkgc2V0dGluZ3M6IFRpbWVTZXR0aW5ncztcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxUaW1lVGFiPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVsa01hbmFnZXI6IEJ1bGtQdXJjaGFzZUhlbHBlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaG9zdDogS2l0dGVuU2NpZW50aXN0cyxcbiAgICB3b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcixcbiAgICBzZXR0aW5ncyA9IG5ldyBUaW1lU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiVGltZVwiKTtcbiAgICB0aGlzLl9idWxrTWFuYWdlciA9IG5ldyBCdWxrUHVyY2hhc2VIZWxwZXIodGhpcy5faG9zdCwgd29ya3Nob3BNYW5hZ2VyKTtcbiAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIgPSB3b3Jrc2hvcE1hbmFnZXI7XG4gIH1cblxuICB0aWNrKGNvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIHRoZSB0YWIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1dHRvbnMgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIERPTS5cbiAgICAvLyBUT0RPOiBJcyB0aGlzIHJlYWxseSByZXF1aXJlZD9cbiAgICB0aGlzLm1hbmFnZXIucmVuZGVyKCk7XG5cbiAgICB0aGlzLmF1dG9CdWlsZChjb250ZXh0KTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmZpeENyeW9jaGFtYmVycy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmZpeENyeW9jaGFtYmVycygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gYnVpbGQgYXMgbWFueSBvZiB0aGUgcGFzc2VkIGJ1aWxkaW5ncyBhcyBwb3NzaWJsZS5cbiAgICogVXN1YWxseSwgdGhpcyBpcyBjYWxsZWQgYXQgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGF1dG9tYXRpb24gZW5naW5lIHRvXG4gICAqIGhhbmRsZSB0aGUgYnVpbGRpbmcgb2YgaXRlbXMgb24gdGhlIFRpbWUgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gYnVpbGRzIFRoZSBidWlsZGluZ3MgdG8gYnVpbGQuXG4gICAqL1xuICBhdXRvQnVpbGQoXG4gICAgY29udGV4dDogRnJhbWVDb250ZXh0LFxuICAgIGJ1aWxkczogUGFydGlhbDxSZWNvcmQ8VGltZUl0ZW0sIFRpbWVTZXR0aW5nc0l0ZW0+PiA9IHRoaXMuc2V0dGluZ3MuYnVpbGRpbmdzLFxuICApIHtcbiAgICBjb25zdCBidWxrTWFuYWdlciA9IHRoaXMuX2J1bGtNYW5hZ2VyO1xuICAgIGNvbnN0IHNlY3Rpb25UcmlnZ2VyID0gdGhpcy5zZXR0aW5ncy50cmlnZ2VyO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1ldGFkYXRhIGZvciBhbGwgdGhlIHJlZmVyZW5jZWQgYnVpbGRpbmdzLlxuICAgIGNvbnN0IG1ldGFEYXRhOiBQYXJ0aWFsPFxuICAgICAgUmVjb3JkPFRpbWVJdGVtLCBSZXF1aXJlZDxVbnNhZmVDaHJvbm9Gb3JnZVVwZ3JhZGUgfCBVbnNhZmVWb2lkU3BhY2VVcGdyYWRlPj5cbiAgICA+ID0ge307XG4gICAgZm9yIChjb25zdCBidWlsZCBvZiBPYmplY3QudmFsdWVzKGJ1aWxkcykpIHtcbiAgICAgIGNvbnN0IGJ1aWxkTWV0YSA9IHRoaXMuZ2V0QnVpbGQoYnVpbGQuYnVpbGRpbmcsIGJ1aWxkLnZhcmlhbnQpO1xuICAgICAgbWV0YURhdGFbYnVpbGQuYnVpbGRpbmddID0gbXVzdEV4aXN0KGJ1aWxkTWV0YSk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkQnV0dG9uID1cbiAgICAgICAgYnVpbGQudmFyaWFudCA9PT0gVGltZUl0ZW1WYXJpYW50LkNocm9ub2ZvcmdlXG4gICAgICAgICAgPyB0aGlzLl9nZXRCdWlsZEJ1dHRvbkNGKGJ1aWxkLmJ1aWxkaW5nIGFzIENocm9ub0ZvcmdlVXBncmFkZSlcbiAgICAgICAgICA6IHRoaXMuX2dldEJ1aWxkQnV0dG9uVlMoYnVpbGQuYnVpbGRpbmcgYXMgVm9pZFNwYWNlVXBncmFkZSk7XG4gICAgICBpZiAoaXNOaWwoYnVpbGRCdXR0b24pKSB7XG4gICAgICAgIC8vIE5vdCBhdmFpbGFibGUgaW4gdGhpcyBidWlsZCBvZiBLRy5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2RlbCA9IGJ1aWxkQnV0dG9uLm1vZGVsO1xuICAgICAgY29uc3QgcGFuZWwgPVxuICAgICAgICBidWlsZC52YXJpYW50ID09PSBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2VcbiAgICAgICAgICA/IHRoaXMubWFuYWdlci50YWIuY2ZQYW5lbFxuICAgICAgICAgIDogdGhpcy5tYW5hZ2VyLnRhYi52c1BhbmVsO1xuXG4gICAgICBjb25zdCBidWlsZGluZ01ldGFEYXRhID0gbXVzdEV4aXN0KG1ldGFEYXRhW2J1aWxkLmJ1aWxkaW5nXSk7XG4gICAgICBidWlsZGluZ01ldGFEYXRhLnRIaWRkZW4gPSAhbW9kZWw/LnZpc2libGUgfHwgIW1vZGVsLmVuYWJsZWQgfHwgIXBhbmVsLnZpc2libGU7XG4gICAgfVxuXG4gICAgLy8gTGV0IHRoZSBidWxrbWFuYWdlciBkZXRlcm1pbmUgdGhlIGJ1aWxkcyB3ZSBjYW4gbWFrZS5cbiAgICBjb25zdCBidWlsZExpc3QgPSBidWxrTWFuYWdlci5idWxrKGJ1aWxkcywgbWV0YURhdGEsIHNlY3Rpb25UcmlnZ2VyLCBcIlRpbWVcIik7XG5cbiAgICBmb3IgKGNvbnN0IGJ1aWxkIG9mIGJ1aWxkTGlzdCkge1xuICAgICAgaWYgKGJ1aWxkLmNvdW50ID4gMCkge1xuICAgICAgICB0aGlzLmJ1aWxkKFxuICAgICAgICAgIGJ1aWxkLmlkIGFzIENocm9ub0ZvcmdlVXBncmFkZSB8IFZvaWRTcGFjZVVwZ3JhZGUsXG4gICAgICAgICAgYnVpbGQudmFyaWFudCBhcyBUaW1lSXRlbVZhcmlhbnQsXG4gICAgICAgICAgYnVpbGQuY291bnQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJ1aWxkKFxuICAgIG5hbWU6IENocm9ub0ZvcmdlVXBncmFkZSB8IFZvaWRTcGFjZVVwZ3JhZGUsXG4gICAgdmFyaWFudDogVGltZUl0ZW1WYXJpYW50LFxuICAgIGFtb3VudDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBsZXQgYW1vdW50Q2FsY3VsYXRlZCA9IGFtb3VudDtcbiAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICBjb25zdCBhbW91bnRUZW1wID0gYW1vdW50Q2FsY3VsYXRlZDtcbiAgICBpZiAodmFyaWFudCA9PT0gVGltZUl0ZW1WYXJpYW50LkNocm9ub2ZvcmdlKSB7XG4gICAgICBjb25zdCBpdGVtTWV0YVJhdyA9IGdhbWUuZ2V0VW5sb2NrQnlOYW1lKG5hbWUsIFwiY2hyb25vZm9yZ2VcIik7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IGNsYXNzZXMudWkudGltZS5DaHJvbm9mb3JnZUJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgQ2hyb25vZm9yZ2VCdG5Db250cm9sbGVyO1xuICAgICAgY29uc3QgbW9kZWwgPSBjb250cm9sbGVyLmZldGNoTW9kZWwoeyBjb250cm9sbGVyLCBpZDogaXRlbU1ldGFSYXcubmFtZSB9KTtcbiAgICAgIGFtb3VudENhbGN1bGF0ZWQgPSB0aGlzLl9idWxrTWFuYWdlci5jb25zdHJ1Y3QobW9kZWwsIGNvbnRyb2xsZXIsIGFtb3VudENhbGN1bGF0ZWQpO1xuICAgICAgbGFiZWwgPSBpdGVtTWV0YVJhdy5sYWJlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlbU1ldGFSYXcgPSBnYW1lLmdldFVubG9ja0J5TmFtZShuYW1lLCBcInZvaWRTcGFjZVwiKTtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgY2xhc3Nlcy51aS50aW1lLlZvaWRTcGFjZUJ0bkNvbnRyb2xsZXIoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZSxcbiAgICAgICkgYXMgVm9pZFNwYWNlQnRuQ29udHJvbGxlcjtcbiAgICAgIGNvbnN0IG1vZGVsID0gY29udHJvbGxlci5mZXRjaE1vZGVsKHsgY29udHJvbGxlciwgaWQ6IGl0ZW1NZXRhUmF3Lm5hbWUgfSk7XG4gICAgICBhbW91bnRDYWxjdWxhdGVkID0gdGhpcy5fYnVsa01hbmFnZXIuY29uc3RydWN0KG1vZGVsLCBjb250cm9sbGVyLCBhbW91bnRDYWxjdWxhdGVkKTtcbiAgICAgIGxhYmVsID0gaXRlbU1ldGFSYXcubGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgIT09IGFtb3VudFRlbXApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woYCR7bGFiZWx9IEFtb3VudCBvcmRlcmVkOiAke2Ftb3VudFRlbXB9IEFtb3VudCBDb25zdHJ1Y3RlZDogJHthbW91bnRDYWxjdWxhdGVkfWApLFxuICAgICAgKTtcbiAgICAgIC8vIEJhaWwgb3V0IHRvIG5vdCBmbG9vZCB0aGUgbG9nIHdpdGggZ2FyYmFnZS5cbiAgICAgIGlmIChhbW91bnRDYWxjdWxhdGVkID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KGxhYmVsLCBhbW91bnRDYWxjdWxhdGVkLCBcImJ1aWxkXCIpO1xuXG4gICAgaWYgKGFtb3VudENhbGN1bGF0ZWQgPT09IDEpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5idWlsZFwiLCBbbGFiZWxdLCBcImtzLWJ1aWxkXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICAgIFwiYWN0LmJ1aWxkc1wiLFxuICAgICAgICBbbGFiZWwsIHRoaXMuX2hvc3QucmVuZGVyQWJzb2x1dGUoYW1vdW50Q2FsY3VsYXRlZCldLFxuICAgICAgICBcImtzLWJ1aWxkXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGdldEJ1aWxkKG5hbWU6IENocm9ub0ZvcmdlVXBncmFkZSB8IFZvaWRTcGFjZVVwZ3JhZGUsIHZhcmlhbnQ6IFRpbWVJdGVtVmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50ID09PSBUaW1lSXRlbVZhcmlhbnQuQ2hyb25vZm9yZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9ob3N0LmdhbWUudGltZS5nZXRDRlUobmFtZSBhcyBDaHJvbm9Gb3JnZVVwZ3JhZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLnRpbWUuZ2V0VlNVKG5hbWUgYXMgVm9pZFNwYWNlVXBncmFkZSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCdWlsZEJ1dHRvbkNGKG5hbWU6IENocm9ub0ZvcmdlVXBncmFkZSkge1xuICAgIHJldHVybiAodGhpcy5tYW5hZ2VyLnRhYi5jaGlsZHJlblsyXS5jaGlsZHJlblswXS5jaGlsZHJlbi5maW5kKGJ1dHRvbiA9PiBidXR0b24uaWQgPT09IG5hbWUpID8/XG4gICAgICBudWxsKSBhcyBCdWlsZGluZ1N0YWNrYWJsZUJ0bjxVbnNhZmVDaHJvbm9mb3JnZVVwZ3JhZGVCdXR0b25PcHRpb25zPjtcbiAgfVxuICBwcml2YXRlIF9nZXRCdWlsZEJ1dHRvblZTKG5hbWU6IFZvaWRTcGFjZVVwZ3JhZGUpIHtcbiAgICByZXR1cm4gKHRoaXMubWFuYWdlci50YWIuY2hpbGRyZW5bM10uY2hpbGRyZW5bMF0uY2hpbGRyZW4uZmluZChidXR0b24gPT4gYnV0dG9uLmlkID09PSBuYW1lKSA/P1xuICAgICAgbnVsbCkgYXMgQnVpbGRpbmdTdGFja2FibGVCdG48VW5zYWZlVm9pZFNwYWNlVXBncmFkZUJ1dHRvbk9wdGlvbnM+O1xuICB9XG5cbiAgZml4Q3J5b2NoYW1iZXJzKCkge1xuICAgIGlmICh0aGlzLl9ob3N0LmdhbWUudGltZS5nZXRWU1UoXCJ1c2VkQ3J5b2NoYW1iZXJzXCIpLnZhbCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmljZXMgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnRpbWUuZ2V0VlNVKFwidXNlZENyeW9jaGFtYmVyc1wiKS5maXhQcmljZXMpO1xuICAgIGZvciAoY29uc3QgcHJpY2Ugb2YgcHJpY2VzKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocHJpY2UubmFtZSk7XG4gICAgICBpZiAoYXZhaWxhYmxlIDwgcHJpY2UudmFsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBidG4gPSB0aGlzLm1hbmFnZXIudGFiLnZzUGFuZWwuY2hpbGRyZW5bMF1cbiAgICAgIC5jaGlsZHJlblswXSBhcyBCdXR0b25Nb2Rlcm48VW5zYWZlRml4Q3J5b2NoYW1iZXJCdXR0b25PcHRpb25zPjtcblxuICAgIGxldCBmaXhlZCA9IDA7XG4gICAgbGV0IGZpeEhhcHBlbmVkOiBib29sZWFuO1xuICAgIGRvIHtcbiAgICAgIGZpeEhhcHBlbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBidXlSZXN1bHQgPSBidG4uY29udHJvbGxlci5idXlJdGVtKG11c3RFeGlzdChidG4ubW9kZWwpLCBuZXcgTW91c2VFdmVudChcImNsaWNrXCIpKTtcbiAgICAgIGZpeEhhcHBlbmVkID0gYnV5UmVzdWx0Lml0ZW1Cb3VnaHQ7XG4gICAgICBmaXhlZCArPSBmaXhIYXBwZW5lZCA/IDEgOiAwO1xuICAgIH0gd2hpbGUgKGZpeEhhcHBlbmVkKTtcblxuICAgIGlmICgwIDwgZml4ZWQpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5maXguY3J5XCIsIFt0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKGZpeGVkKV0sIFwia3MtZml4Q3J5XCIpO1xuICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwiZml4LmNyeVwiLCBmaXhlZCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgdHlwZSBNYXliZSwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgdHlwZSBBdXRvbWF0aW9uLCBFbmdpbmUsIHR5cGUgRnJhbWVDb250ZXh0IH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1hdGVyaWFsc0NhY2hlIH0gZnJvbSBcIi4vaGVscGVyL01hdGVyaWFsc0NhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyBUcmFkZVNldHRpbmdzLCB0eXBlIFRyYWRlU2V0dGluZ3NJdGVtIH0gZnJvbSBcIi4vc2V0dGluZ3MvVHJhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGFiTWFuYWdlciB9IGZyb20gXCIuL1RhYk1hbmFnZXIuanNcIjtcbmltcG9ydCB7IG9iamVjdEVudHJpZXMgfSBmcm9tIFwiLi90b29scy9FbnRyaWVzLmpzXCI7XG5pbXBvcnQgeyBuZWdhdGl2ZU9uZVRvSW5maW5pdHksIHVjZmlyc3QgfSBmcm9tIFwiLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IERpcGxvbWFjeSwgVW5zYWZlUmFjZSwgVW5zYWZlVHJhZGVTZWxsT2ZmZXIgfSBmcm9tIFwiLi90eXBlcy9kaXBsb21hY3kuanNcIjtcbmltcG9ydCB0eXBlIHsgUmFjZSwgUmVzb3VyY2UgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVbnNhZmVSZXNvdXJjZSB9IGZyb20gXCIuL3R5cGVzL3Jlc291cmNlcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi9Xb3Jrc2hvcE1hbmFnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRyYWRlTWFuYWdlciBpbXBsZW1lbnRzIEF1dG9tYXRpb24ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICByZWFkb25seSBzZXR0aW5nczogVHJhZGVTZXR0aW5ncztcbiAgcmVhZG9ubHkgbWFuYWdlcjogVGFiTWFuYWdlcjxEaXBsb21hY3k+O1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3Jrc2hvcE1hbmFnZXI6IFdvcmtzaG9wTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBob3N0OiBLaXR0ZW5TY2llbnRpc3RzLFxuICAgIHdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyLFxuICAgIHNldHRpbmdzID0gbmV3IFRyYWRlU2V0dGluZ3MoKSxcbiAgKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMubWFuYWdlciA9IG5ldyBUYWJNYW5hZ2VyKHRoaXMuX2hvc3QsIFwiVHJhZGVcIik7XG4gICAgdGhpcy5fd29ya3Nob3BNYW5hZ2VyID0gd29ya3Nob3BNYW5hZ2VyO1xuICB9XG5cbiAgdGljayhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcblxuICAgIHRoaXMuYXV0b1RyYWRlKCk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy51bmxvY2tSYWNlcy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9VbmxvY2soY29udGV4dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJ1aWxkRW1iYXNzaWVzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b0J1aWxkRW1iYXNzaWVzKGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5mZWVkTGV2aWF0aGFucy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9GZWVkRWxkZXJzKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLnRyYWRlQmxhY2tjb2luLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b1RyYWRlQmxhY2tjb2luKCk7XG4gICAgfVxuICB9XG5cbiAgYXV0b1RyYWRlKGNhY2hlTWFuYWdlcj86IE1hdGVyaWFsc0NhY2hlKSB7XG4gICAgY29uc3QgY2F0cG93ZXIgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJtYW5wb3dlclwiKTtcbiAgICBjb25zdCBnb2xkID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiZ29sZFwiKTtcbiAgICBjb25zdCBzZWN0aW9uVHJpZ2dlciA9IHRoaXMuc2V0dGluZ3MudHJpZ2dlcjtcblxuICAgIC8vIFRoZSByYWNlcyB3ZSBtaWdodCB3YW50IHRvIHRyYWRlIHdpdGggZHVyaW5nIHRoaXMgZnJhbWUuXG4gICAgY29uc3QgdHJhZGVzOiBBcnJheTxSYWNlPiA9IFtdO1xuXG4gICAgY29uc3Qgc2Vhc29uID0gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmdldEN1clNlYXNvbigpLm5hbWU7XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG1hbnkgcmFjZXMgd2Ugd2lsbCB0cmFkZSB3aXRoIHRoaXMgY3ljbGUuXG4gICAgZm9yIChjb25zdCB0cmFkZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuc2V0dGluZ3MucmFjZXMpKSB7XG4gICAgICBjb25zdCByYWNlID0gdGhpcy5nZXRSYWNlKHRyYWRlLnJhY2UpO1xuICAgICAgY29uc3QgdHJpZ2dlciA9IEVuZ2luZS5ldmFsdWF0ZVN1YlNlY3Rpb25UcmlnZ2VyKHNlY3Rpb25UcmlnZ2VyLCB0cmFkZS50cmlnZ2VyKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJhY2UgaXMgZW5hYmxlZCwgaW4gc2Vhc29uLCB1bmxvY2tlZCwgYW5kIHdlIGNhbiBhY3R1YWxseSBhZmZvcmQgaXQuXG4gICAgICBpZiAoXG4gICAgICAgIHRyaWdnZXIgPCAwIHx8XG4gICAgICAgICF0cmFkZS5lbmFibGVkIHx8XG4gICAgICAgICF0cmFkZS5zZWFzb25zW3NlYXNvbl0uZW5hYmxlZCB8fFxuICAgICAgICAhcmFjZS51bmxvY2tlZCB8fFxuICAgICAgICAhdGhpcy5zaW5nbGVUcmFkZVBvc3NpYmxlKHNlY3Rpb25UcmlnZ2VyLCBjYXRwb3dlciwgZ29sZCwgdHJhZGUpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZGl0aW9uYWxseSwgd2Ugbm93IGNoZWNrIGlmIHRoZSB0cmFkZSBidXR0b24gaXMgZW5hYmxlZCwgd2hpY2gga2luZGEgbWFrZXMgYWxsIHByZXZpb3VzXG4gICAgICAvLyBjaGVja3MgbW9vdCwgYnV0IHdoYXRldmVyIDpEXG4gICAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldFRyYWRlQnV0dG9uKHJhY2UubmFtZSk7XG4gICAgICBpZiAoIWJ1dHRvbj8ubW9kZWw/LmVuYWJsZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERldGVybWluZSB3aGljaCByZXNvdXJjZSB0aGUgcmFjZSByZXF1aXJlcyBmb3IgdHJhZGluZywgaWYgYW55LlxuICAgICAgY29uc3QgcmVxdWlyZSA9IHRyYWRlLnJlcXVpcmUgPyB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UodHJhZGUucmVxdWlyZSkgOiBmYWxzZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0cmFkZSB3b3VsZCBiZSBwcm9maXRhYmxlLlxuICAgICAgY29uc3QgcHJvZml0YWJsZSA9IHRoaXMuZ2V0UHJvZml0YWJpbGl0eSh0cmFkZS5yYWNlKTtcbiAgICAgIC8vIElmIHRoZSB0cmFkZSBpcyBzZXQgdG8gYmUgbGltaXRlZCBhbmQgcHJvZml0YWJsZSwgbWFrZSB0aGlzIHRyYWRlLlxuICAgICAgaWYgKHRyYWRlLmxpbWl0ZWQgJiYgcHJvZml0YWJsZSkge1xuICAgICAgICB0cmFkZXMucHVzaCh0cmFkZS5yYWNlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIC8vIElmIHRoaXMgdHJhZGUgaXMgbm90IGxpbWl0ZWQsIGl0IG11c3QgZWl0aGVyIG5vdCByZXF1aXJlIGFueXRoaW5nLCBvclxuICAgICAgICAvLyB0aGUgcmVxdWlyZWQgcmVzb3VyY2UgbXVzdCBiZSBvdmVyIHRoZSB0cmlnZ2VyIHZhbHVlLlxuICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGdvbGQgbXVzdCBhbHNvIGJlIG92ZXIgdGhlIHRyaWdnZXIgdmFsdWUuXG4gICAgICAgICFyZXF1aXJlIHx8XG4gICAgICAgIHRyaWdnZXIgPD0gcmVxdWlyZS52YWx1ZSAvIHJlcXVpcmUubWF4VmFsdWVcbiAgICAgICkge1xuICAgICAgICB0cmFkZXMucHVzaCh0cmFkZS5yYWNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBwb3NzaWJsZSB0cmFkZXMgd2VyZSBmb3VuZCwgYmFpbCBvdXQuXG4gICAgaWYgKHRyYWRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGNhbiBjdXJyZW50bHkgdHJhZGVcbiAgICBsZXQgbWF4VHJhZGVzID0gdGhpcy5nZXRMb3dlc3RUcmFkZUFtb3VudChudWxsLCB0cnVlLCBmYWxzZSk7XG5cbiAgICAvLyBJZiBubyB0cmFkZXMgYXJlIHBvc3NpYmxlLCBiYWlsIG91dC5cbiAgICBpZiAobWF4VHJhZGVzIDwgMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERpc3RyaWJ1dGUgbWF4IHRyYWRlcyB3aXRob3V0IHN0YXJ2aW5nIGFueSByYWNlLlxuXG4gICAgLy8gVGhpcyBhcnJheSBzaG91bGQgaG9sZCB0aGUgYW1vdW50IG9mIHRyYWRlcyBwb3NzaWJsZSB3aXRoIGVhY2ggcmFjZS5cbiAgICAvLyBUaGUgaW5kaWNlcyBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIGB0cmFkZXNgIGFsaWduLlxuICAgIGNvbnN0IG1heEJ5UmFjZTogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgIC8vIEZvciBhbGwgcmFjZXMgd2UgY29uc2lkZXIgdHJhZGluZyB3aXRoLCBwZXJmb3JtIGEgbW9yZSB0aG9yb3VnaCBjaGVja1xuICAgIC8vIGlmIHdlIGFjdHVhbGx5IGNhbiB0cmFkZSB3aXRoIHRoZW0gYW5kIGhvdyBtYW55IHRpbWVzIHdlIGNvdWxkIHRyYWRlXG4gICAgLy8gd2l0aCB0aGVtLlxuICAgIGZvciAobGV0IHRyYWRlSW5kZXggPSAwOyB0cmFkZUluZGV4IDwgdHJhZGVzLmxlbmd0aDsgdHJhZGVJbmRleCsrKSB7XG4gICAgICBjb25zdCByYWNlID0gdHJhZGVzW3RyYWRlSW5kZXhdO1xuICAgICAgY29uc3QgdHJhZGVTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MucmFjZXNbcmFjZV07XG5cbiAgICAgIC8vIERvZXMgdGhpcyB0cmFkZSByZXF1aXJlIGEgY2VydGFpbiByZXNvdXJjZT9cbiAgICAgIGNvbnN0IHJlcXVpcmUgPSAhdHJhZGVTZXR0aW5ncy5yZXF1aXJlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UodHJhZGVTZXR0aW5ncy5yZXF1aXJlKTtcblxuICAgICAgLy8gSGF2ZSB0aGUgdHJpZ2dlciBjb25kaXRpb25zIGZvciB0aGlzIHRyYWRlIGJlZW4gbWV0P1xuICAgICAgY29uc3QgdHJpZ2dlciA9IEVuZ2luZS5ldmFsdWF0ZVN1YlNlY3Rpb25UcmlnZ2VyKHNlY3Rpb25UcmlnZ2VyLCB0cmFkZVNldHRpbmdzLnRyaWdnZXIpO1xuICAgICAgY29uc3QgdHJpZ0NvbmRpdGlvbnMgPVxuICAgICAgICAoIXJlcXVpcmUgfHwgdHJpZ2dlciA8PSByZXF1aXJlLnZhbHVlIC8gcmVxdWlyZS5tYXhWYWx1ZSkgJiZcbiAgICAgICAgdHJpZ2dlciA8PSBnb2xkLnZhbHVlIC8gZ29sZC5tYXhWYWx1ZTtcblxuICAgICAgLy8gSG93IG1hbnkgdHJhZGVzIGNvdWxkIHdlIGRvP1xuICAgICAgY29uc3QgdHJhZGVQb3MgPSB0aGlzLmdldExvd2VzdFRyYWRlQW1vdW50KHJhY2UsIHRyYWRlU2V0dGluZ3MubGltaXRlZCwgdHJpZ0NvbmRpdGlvbnMpO1xuXG4gICAgICAvLyBJZiBubyB0cmFkZXMgYXJlIHBvc3NpYmxlLCByZW1vdmUgdGhlIHJhY2UuXG4gICAgICBpZiAodHJhZGVQb3MgPCAxKSB7XG4gICAgICAgIHRyYWRlcy5zcGxpY2UodHJhZGVJbmRleCwgMSk7XG4gICAgICAgIHRyYWRlSW5kZXgtLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1heEJ5UmFjZS5wdXNoKHRyYWRlUG9zKTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyB0cmFkZXMgYXJlIGxlZnQgb3ZlciBhZnRlciB0aGlzIGNoZWNrLCBiYWlsIG91dC5cbiAgICBpZiAodHJhZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE5vdyBsZXQncyBkbyBzb21lIHRyYWRlcy5cblxuICAgIC8vIFRoaXMga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdHJhZGVzIHdlJ3ZlIGRvbmUgd2l0aCBlYWNoIHJhY2UuXG4gICAgY29uc3QgdHJhZGVzRG9uZTogUGFydGlhbDxSZWNvcmQ8UmFjZSwgbnVtYmVyPj4gPSB7fTtcbiAgICAvLyBXaGlsZSB3ZSBoYXZlIHJhY2VzIGxlZnQgdG8gdHJhZGUgd2l0aCwgYW5kIGVub3VnaCByZXNvdXJjZXMgdG8gdHJhZGUgKHRoaXNcbiAgICAvLyBpcyBpbmRpY2F0ZWQgYnkgYG1heFRyYWRlc2ApLi4uXG4gICAgd2hpbGUgKDAgPCB0cmFkZXMubGVuZ3RoICYmIDEgPD0gbWF4VHJhZGVzKSB7XG4gICAgICAvLyBJZiB3ZSBjYW4gbWFrZSBmZXdlciB0cmFkZXMgdGhhbiB3ZSBoYXZlIHJlc291cmNlcyBhdmFpbGFibGUgZm9yLi4uXG4gICAgICBpZiAobWF4VHJhZGVzIDwgdHJhZGVzLmxlbmd0aCkge1xuICAgICAgICAvLyAuLi5maW5kIGEgcmFuZG9tIHJhY2UgdG8gdHJhZGUgd2l0aFxuICAgICAgICBjb25zdCByYW5kb21SYWNlSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0cmFkZXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdHJhZGVJbmRleCA9IHRyYWRlc1tyYW5kb21SYWNlSW5kZXhdO1xuICAgICAgICAvLyBJbml0IHRoZSBjb3VudGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYgKGlzTmlsKHRyYWRlc0RvbmVbdHJhZGVJbmRleF0pKSB7XG4gICAgICAgICAgdHJhZGVzRG9uZVt0cmFkZUluZGV4XSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdHJhZGVzRG9uZVt0cmFkZUluZGV4XSArPSAxO1xuICAgICAgICBtYXhUcmFkZXMgLT0gMTtcblxuICAgICAgICAvLyBBcyB3ZSBhcmUgY29uc3RyYWluZWQgb24gcmVzb3VyY2VzLCBkb24ndCB0cmFkZSB3aXRoIHRoaXMgcmFjZSBhZ2Fpbi5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBkaXN0cmlidXRlIHRoZSBmZXcgcmVzb3VyY2VzIHdlIGhhdmUgYmV0d2VlbiByYWNlcy5cbiAgICAgICAgdHJhZGVzLnNwbGljZShyYW5kb21SYWNlSW5kZXgsIDEpO1xuICAgICAgICBtYXhCeVJhY2Uuc3BsaWNlKHJhbmRvbVJhY2VJbmRleCwgMSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBub3cgd2FudCB0byBkZXRlcm1pbmUgd2hpY2ggcmFjZSB3ZSBjYW4gdHJhZGUgd2l0aCB0aGUgbGVhc3QgYW1vdW50XG4gICAgICAvLyBvZiB0aW1lcy5cbiAgICAgIC8vIFRoaXMgbGlrZWx5IHRvIGRldGVybWluZSB0aGUgXCJiZXN0XCIgdHJhZGVzIHRvIHBlcmZvcm0uXG4gICAgICAvLyBUaGUgcmVzdWx0IGlzIHRoYXQgd2UgdHJhZGUgZmlyc3Qgd2l0aCB0aGUgcmFjZXMgdGhhdCB3ZSBjYW4gbWFrZSB0aGVcbiAgICAgIC8vIGxlYXN0IGFtb3VudCBvZiB0cmFkZXMgd2l0aCwgdGhlbiBjb250aW51ZSB0byBtYWtlIHRyYWRlcyB3aXRoIHRoZVxuICAgICAgLy8gcmFjZXMgd2UgY2FuIG1ha2UgbW9yZSB0cmFkZXMgd2l0aCAoYWx0aG91Z2ggdGhhdCBhbW91bnQgY291bGQgYmUgcmVkdWNlZFxuICAgICAgLy8gYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIHRoZW0pLlxuICAgICAgbGV0IG1pblRyYWRlcyA9IE1hdGguZmxvb3IobWF4VHJhZGVzIC8gdHJhZGVzLmxlbmd0aCk7XG4gICAgICBsZXQgbWluVHJhZGVJbmRleCA9IDA7XG4gICAgICBjb25zdCB0cmFkZUluZGV4ID0gdHJhZGVzW21pblRyYWRlSW5kZXhdO1xuICAgICAgZm9yIChsZXQgdHJhZGVJbmRleCA9IDA7IHRyYWRlSW5kZXggPCB0cmFkZXMubGVuZ3RoOyArK3RyYWRlSW5kZXgpIHtcbiAgICAgICAgaWYgKG1heEJ5UmFjZVt0cmFkZUluZGV4XSA8IG1pblRyYWRlcykge1xuICAgICAgICAgIG1pblRyYWRlcyA9IG1heEJ5UmFjZVt0cmFkZUluZGV4XTtcbiAgICAgICAgICBtaW5UcmFkZUluZGV4ID0gdHJhZGVJbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGlzIHRyYWRlIGluIHRoZSB0cmFkZXMgd2UndmUgXCJkb25lXCIuXG4gICAgICBpZiAoaXNOaWwodHJhZGVzRG9uZVt0cmFkZUluZGV4XSkpIHtcbiAgICAgICAgdHJhZGVzRG9uZVt0cmFkZUluZGV4XSA9IDA7XG4gICAgICB9XG4gICAgICB0cmFkZXNEb25lW3RyYWRlSW5kZXhdICs9IG1pblRyYWRlcztcbiAgICAgIG1heFRyYWRlcyAtPSBtaW5UcmFkZXM7XG4gICAgICB0cmFkZXMuc3BsaWNlKG1pblRyYWRlSW5kZXgsIDEpO1xuICAgICAgbWF4QnlSYWNlLnNwbGljZShtaW5UcmFkZUluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBmb3VuZCBubyB0cmFkZXMgdG8gZG8sIGJhaWwgb3V0LlxuICAgIGlmIChPYmplY3QudmFsdWVzKHRyYWRlc0RvbmUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBob3cgbXVjaCB3ZSB3aWxsIHNwZW5kIGFuZCBlYXJuIGZyb20gdHJhZGVzLlxuICAgIC8vIFRoaXMgaXMgc3RyYWlnaHQgZm9yd2FyZC5cbiAgICBjb25zdCB0cmFkZU5ldDogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+ID0ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgYW1vdW50XSBvZiBvYmplY3RFbnRyaWVzKHRyYWRlc0RvbmUpKSB7XG4gICAgICBjb25zdCByYWNlID0gdGhpcy5nZXRSYWNlKG5hbWUpO1xuXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcbiAgICAgIGZvciAoY29uc3QgW21hdCwgbWF0QW1vdW50XSBvZiBvYmplY3RFbnRyaWVzKG1hdGVyaWFscykpIHtcbiAgICAgICAgaWYgKCF0cmFkZU5ldFttYXRdKSB7XG4gICAgICAgICAgdHJhZGVOZXRbbWF0XSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdHJhZGVOZXRbbWF0XSAtPSBtYXRBbW91bnQgKiBhbW91bnQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lYW5PdXRwdXQgPSB0aGlzLmdldEF2ZXJhZ2VUcmFkZShyYWNlKTtcbiAgICAgIGZvciAoY29uc3QgW291dCwgb3V0VmFsdWVdIG9mIG9iamVjdEVudHJpZXMobWVhbk91dHB1dCkpIHtcbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKG91dCk7XG4gICAgICAgIGlmICghdHJhZGVOZXRbb3V0XSkge1xuICAgICAgICAgIHRyYWRlTmV0W291dF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRyYWRlTmV0W291dF0gKz1cbiAgICAgICAgICByZXMubWF4VmFsdWUgPiAwXG4gICAgICAgICAgICA/IE1hdGgubWluKFxuICAgICAgICAgICAgICAgIG11c3RFeGlzdChtZWFuT3V0cHV0W291dF0pICogbXVzdEV4aXN0KHRyYWRlc0RvbmVbbmFtZV0pLFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KHJlcy5tYXhWYWx1ZSAtIHJlcy52YWx1ZSwgMCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogb3V0VmFsdWUgKiBtdXN0RXhpc3QodHJhZGVzRG9uZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBjYWNoZSB3aXRoIHRoZSBjaGFuZ2VzIHByb2R1Y2VkIGZyb20gdGhlIHRyYWRlcy5cbiAgICBpZiAoIWlzTmlsKGNhY2hlTWFuYWdlcikpIHtcbiAgICAgIGNhY2hlTWFuYWdlci5wdXNoVG9DYWNoZSh7XG4gICAgICAgIG1hdGVyaWFsczogdHJhZGVOZXQsXG4gICAgICAgIHRpbWVTdGFtcDogdGhpcy5faG9zdC5nYW1lLnRpbWVyLnRpY2tzVG90YWwsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOb3cgYWN0dWFsbHkgcGVyZm9ybSB0aGUgY2FsY3VsYXRlZCB0cmFkZXMuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgY291bnRdIG9mIG9iamVjdEVudHJpZXModHJhZGVzRG9uZSkpIHtcbiAgICAgIC8vIFRPRE86IFRoaXMgY2hlY2sgc2hvdWxkIGJlIHJlZHVuZGFudC4gSWYgbm8gdHJhZGVzIHdlcmUgcG9zc2libGUsXG4gICAgICAvLyAgICAgICB0aGUgZW50cnkgc2hvdWxkbid0IGV2ZW4gZXhpc3QuXG4gICAgICBpZiAoMCA8IGNvdW50KSB7XG4gICAgICAgIHRoaXMudHJhZGUobmFtZSwgY291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9CdWlsZEVtYmFzc2llcyhjb250ZXh0OiBGcmFtZUNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kucmFjZXNbMF0uZW1iYXNzeVByaWNlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyaWVzIHRvIGNhbGN1bGF0ZSBob3cgbWFueSBlbWJhc3NpZXMgZm9yIHdoaWNoIHJhY2VzIGl0IGNhbiBidXksXG4gICAgLy8gdGhlbiBpdCBidXlzIHRoZW0uIENvZGUgc2hvdWxkIGJlIHN0cmFpZ2h0LWZvcndhcmQuXG5cbiAgICBjb25zdCBjdWx0dXJlID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiY3VsdHVyZVwiKTtcbiAgICBsZXQgY3VsdHVyZVZhbCA9IDA7XG4gICAgY29uc3QgdHJpZ2dlciA9IHRoaXMuc2V0dGluZ3MuYnVpbGRFbWJhc3NpZXMudHJpZ2dlcjtcbiAgICBpZiAoY3VsdHVyZS52YWx1ZSAvIGN1bHR1cmUubWF4VmFsdWUgPCBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodHJpZ2dlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYWNlUGFuZWxzID0gdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeVRhYi5yYWNlUGFuZWxzO1xuICAgIGN1bHR1cmVWYWwgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJjdWx0dXJlXCIpO1xuXG4gICAgY29uc3QgZW1iYXNzeUJ1bGs6IFBhcnRpYWw8XG4gICAgICBSZWNvcmQ8XG4gICAgICAgIFJhY2UsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWw6IG51bWJlcjtcbiAgICAgICAgICBtYXg6IG51bWJlcjtcbiAgICAgICAgICBiYXNlUHJpY2U6IG51bWJlcjtcbiAgICAgICAgICBjdXJyZW50RW06IG51bWJlcjtcbiAgICAgICAgICBwcmljZVN1bTogbnVtYmVyO1xuICAgICAgICAgIHJhY2U6IFVuc2FmZVJhY2U7XG4gICAgICAgIH1cbiAgICAgID5cbiAgICA+ID0ge307XG4gICAgY29uc3QgYnVsa1RyYWNrZXI6IEFycmF5PFJhY2U+ID0gW107XG5cbiAgICBmb3IgKGxldCBwYW5lbEluZGV4ID0gMDsgcGFuZWxJbmRleCA8IHJhY2VQYW5lbHMubGVuZ3RoOyBwYW5lbEluZGV4KyspIHtcbiAgICAgIGlmICghcmFjZVBhbmVsc1twYW5lbEluZGV4XS5lbWJhc3N5QnV0dG9uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gcmFjZVBhbmVsc1twYW5lbEluZGV4XS5yYWNlLm5hbWU7XG4gICAgICBjb25zdCByYWNlID0gdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQobmFtZSk7XG4gICAgICBjb25zdCBtYXggPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5idWlsZEVtYmFzc2llcy5yYWNlc1tuYW1lXS5tYXgpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnNldHRpbmdzLmJ1aWxkRW1iYXNzaWVzLnJhY2VzW25hbWVdLmVuYWJsZWQgfHxcbiAgICAgICAgbWF4IDw9IHJhY2UuZW1iYXNzeUxldmVsIHx8XG4gICAgICAgICFyYWNlLnVubG9ja2VkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGVtYmFzc3lCdWxrW25hbWVdID0ge1xuICAgICAgICBiYXNlUHJpY2U6IG11c3RFeGlzdChyYWNlLmVtYmFzc3lQcmljZXM/LlswXSkudmFsLFxuICAgICAgICBjdXJyZW50RW06IHJhY2UuZW1iYXNzeUxldmVsLFxuICAgICAgICBtYXgsXG4gICAgICAgIHByaWNlU3VtOiAwLFxuICAgICAgICByYWNlOiByYWNlLFxuICAgICAgICB2YWw6IDAsXG4gICAgICB9O1xuICAgICAgYnVsa1RyYWNrZXIucHVzaChuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYnVsa1RyYWNrZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKGJ1bGtUcmFja2VyLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IHJhY2VJbmRleCA9IDA7IHJhY2VJbmRleCA8IGJ1bGtUcmFja2VyLmxlbmd0aDsgcmFjZUluZGV4KyspIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGJ1bGtUcmFja2VyW3JhY2VJbmRleF07XG4gICAgICAgIGNvbnN0IGVtQnVsayA9IG11c3RFeGlzdChlbWJhc3N5QnVsa1tuYW1lXSk7XG5cbiAgICAgICAgaWYgKGVtQnVsay5tYXggPD0gZW1CdWxrLmN1cnJlbnRFbSArIGVtQnVsay52YWwpIHtcbiAgICAgICAgICBidWxrVHJhY2tlci5zcGxpY2UocmFjZUluZGV4LCAxKTtcbiAgICAgICAgICAtLXJhY2VJbmRleDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRQcmljZSA9IGVtQnVsay5iYXNlUHJpY2UgKiAxLjE1ICoqIChlbUJ1bGsuY3VycmVudEVtICsgZW1CdWxrLnZhbCk7XG4gICAgICAgIGlmIChuZXh0UHJpY2UgPD0gY3VsdHVyZVZhbCkge1xuICAgICAgICAgIGN1bHR1cmVWYWwgLT0gbmV4dFByaWNlO1xuICAgICAgICAgIGVtQnVsay5wcmljZVN1bSArPSBuZXh0UHJpY2U7XG4gICAgICAgICAgZW1CdWxrLnZhbCArPSAxO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1bGtUcmFja2VyLnNwbGljZShyYWNlSW5kZXgsIDEpO1xuICAgICAgICAgIC0tcmFjZUluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbLCBlbUJ1bGtdIG9mIG9iamVjdEVudHJpZXMoZW1iYXNzeUJ1bGspKSB7XG4gICAgICBpZiAoZW1CdWxrLnZhbCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1bHR1cmVWYWwgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUoXCJjdWx0dXJlXCIpO1xuICAgICAgaWYgKGN1bHR1cmVWYWwgPCBlbUJ1bGsucHJpY2VTdW0pIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLmNsKFwiU29tZXRoaW5nIGhhcyBnb25lIGhvcnJpYmx5IHdyb25nLlwiLCBlbUJ1bGsucHJpY2VTdW0sIGN1bHR1cmVWYWwpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW52b2tlIHRoZSBlbWJhc3N5IGJ1aWxkIGFjdGlvbiBtdWx0aXBsZSB0aW1lcywgYXNcbiAgICAgIC8vIHRoYXQgd291bGQgY2F1c2UgbG90cyBvZiBsb2cgbWVzc2FnZXMuXG4gICAgICAvLyBJbnN0ZWFkLCB3ZSByZXBsaWNhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBnYW1lIGhlcmUgYW5kIHB1cmNoYXNlIGluIGJ1bGsuXG4gICAgICB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2UoXCJjdWx0dXJlXCIpLnZhbHVlIC09IGVtQnVsay5wcmljZVN1bTtcbiAgICAgIGVtQnVsay5yYWNlLmVtYmFzc3lMZXZlbCArPSBlbUJ1bGsudmFsO1xuXG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJlbWJhc3N5XCIsIGVtQnVsay52YWwpO1xuICAgICAgaWYgKGVtQnVsay52YWwgIT09IDEpIHtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYnVpbGQuZW1iYXNzaWVzXCIsIFtlbUJ1bGsudmFsLCBlbUJ1bGsucmFjZS50aXRsZV0sIFwia3MtYnVpbGRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJidWlsZC5lbWJhc3N5XCIsIFtlbUJ1bGsudmFsLCBlbUJ1bGsucmFjZS50aXRsZV0sIFwia3MtYnVpbGRcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b0ZlZWRFbGRlcnMoKSB7XG4gICAgY29uc3QgbGV2aWF0aGFuSW5mbyA9IHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwibGV2aWF0aGFuc1wiKTtcbiAgICBjb25zdCBuZWNyb2Nvcm5zID0gdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibmVjcm9jb3JuXCIpO1xuXG4gICAgaWYgKCFsZXZpYXRoYW5JbmZvLnVubG9ja2VkIHx8IG5lY3JvY29ybnMudmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoMSA8PSBuZWNyb2Nvcm5zLnZhbHVlKSB7XG4gICAgICAvLyBJZiBmZWVkaW5nIHRoZSBlbGRlcnMgd291bGQgaW5jcmVhc2UgdGhlaXIgZW5lcmd5IGxldmVsIHRvd2FyZHMgdGhlXG4gICAgICAvLyBjYXAsIGRvIGl0LlxuICAgICAgaWYgKGxldmlhdGhhbkluZm8uZW5lcmd5IDwgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXRNYXJrZXJDYXAoKSkge1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LmZlZWRFbGRlcnMoKTtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwiYWN0LmZlZWRcIik7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcImZlZWRcIiwgMSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGNhbiByZWFjaCB0aGlzIGJyYW5jaCBpZiB3ZSBoYXZlIHBhcnRpYWwgbmVjcm9jb3JucyBmcm9tIHJlc2V0cy5cbiAgICAgIC8vIFRoZSBwYXJ0aWFsIG5lY3JvY29ybnMgd2lsbCB0aGVuIGJlIGZlZWQgdG8gdGhlIGVsZGVycyB0byBicmluZyB1cyBiYWNrXG4gICAgICAvLyB0byBldmVuIHplcm8uXG4gICAgICBpZiAoMC4yNSAqICgxICsgdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcImNvcnJ1cHRpb25Cb29zdFJhdGlvXCIpKSA8IDEpIHtcbiAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwiZmVlZFwiLCBuZWNyb2Nvcm5zLnZhbHVlKTtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5mZWVkRWxkZXJzKCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImRpc3Bvc2UubmVjcm9jb3JuXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGF1dG9VbmxvY2soY29udGV4dDogRnJhbWVDb250ZXh0KSB7XG4gICAgaWYgKCF0aGlzLl9ob3N0LmdhbWUudGFic1s0XS52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaG93IG1hbnkgcmFjZXMgd2UgY291bGQgcmVhc29uYWJseSB1bmxvY2sgYXQgdGhpcyBwb2ludC5cbiAgICBjb25zdCBtYXhSYWNlcyA9IHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwibGV2aWF0aGFuc1wiKS51bmxvY2tlZCA/IDggOiA3O1xuICAgIC8vIElmIHdlIGhhdmVuJ3QgdW5sb2NrZWQgdGhhdCBtYW55IHJhY2VzIHlldC4uLlxuICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5VGFiLnJhY2VQYW5lbHMubGVuZ3RoIDwgbWF4UmFjZXMpIHtcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBjYXRwb3dlci5cbiAgICAgIGxldCBtYW5wb3dlciA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcIm1hbnBvd2VyXCIpO1xuICAgICAgLy8gVE9ETzogVGhlc2Ugc2hvdWxkIGJlIGNoZWNrZWQgaW4gcmV2ZXJzZSBvcmRlci4gT3RoZXJ3aXNlIHRoZSBjaGVjayBmb3IgbGl6YXJkc1xuICAgICAgLy8gICAgICAgY2FuIGNhdXNlIHRoZSB6ZWJyYXMgdG8gYmUgZGlzY292ZXJlZCBhdCBsYXRlciBzdGFnZXMgaW4gdGhlIGdhbWUuIFRoZW4gaXRcbiAgICAgIC8vICAgICAgIGdldHMgdG8gdGhlIGNoZWNrIGZvciB0aGUgemVicmFzIGFuZCBkb2Vzbid0IGV4cGxvcmUgYWdhaW4sIGFzIHRoZXkncmVcbiAgICAgIC8vICAgICAgIGFscmVhZHkgdW5sb2NrZWQuIFRoZW4gaXQgdGFrZXMgYW5vdGhlciBpdGVyYXRpb24gdG8gdW5sb2NrIHRoZSBvdGhlciByYWNlLlxuICAgICAgLy8gU2VuZCBleHBsb3JlcnMgaWYgd2UgaGF2ZW4ndCBkaXNjb3ZlcmVkIHRoZSBsaXphcmRzIHlldC5cbiAgICAgIGlmICghdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJsaXphcmRzXCIpLnVubG9ja2VkKSB7XG4gICAgICAgIGlmIChtYW5wb3dlciA+PSAxMDAwKSB7XG4gICAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibWFucG93ZXJcIikudmFsdWUgLT0gMTAwMDtcbiAgICAgICAgICBjb25zdCB1bmxvY2tlZFJhY2UgPSBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS51bmxvY2tSYW5kb21SYWNlKCkpO1xuICAgICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcInVwZ3JhZGUucmFjZVwiLCBbdW5sb2NrZWRSYWNlLnRpdGxlXSwgXCJrcy11cGdyYWRlXCIpO1xuICAgICAgICAgIG1hbnBvd2VyIC09IDEwMDA7XG4gICAgICAgICAgY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG8gZXhhY3RseSB0aGUgc2FtZSBmb3IgdGhlIHNoYXJrcy5cbiAgICAgIGlmICghdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJzaGFya3NcIikudW5sb2NrZWQpIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJtYW5wb3dlclwiKS52YWx1ZSAtPSAxMDAwO1xuICAgICAgICAgIGNvbnN0IHVubG9ja2VkUmFjZSA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnVubG9ja1JhbmRvbVJhY2UoKSk7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5yYWNlXCIsIFt1bmxvY2tlZFJhY2UudGl0bGVdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICAgICAgbWFucG93ZXIgLT0gMTAwMDtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEbyBleGFjdGx5IHRoZSBzYW1lIGZvciB0aGUgZ3JpZmZpbnMuXG4gICAgICBpZiAoIXRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwiZ3JpZmZpbnNcIikudW5sb2NrZWQpIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJtYW5wb3dlclwiKS52YWx1ZSAtPSAxMDAwO1xuICAgICAgICAgIGNvbnN0IHVubG9ja2VkUmFjZSA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnVubG9ja1JhbmRvbVJhY2UoKSk7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5yYWNlXCIsIFt1bmxvY2tlZFJhY2UudGl0bGVdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICAgICAgbWFucG93ZXIgLT0gMTAwMDtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3IgbmFnYXMsIHdlIGFkZGl0aW9uYWxseSBuZWVkIGVub3VnaCBjdWx0dXJlLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJuYWdhc1wiKS51bmxvY2tlZCAmJlxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJjdWx0dXJlXCIpLnZhbHVlID49IDE1MDBcbiAgICAgICkge1xuICAgICAgICBpZiAobWFucG93ZXIgPj0gMTAwMCkge1xuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcIm1hbnBvd2VyXCIpLnZhbHVlIC09IDEwMDA7XG4gICAgICAgICAgY29uc3QgdW5sb2NrZWRSYWNlID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kudW5sb2NrUmFuZG9tUmFjZSgpKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnJhY2VcIiwgW3VubG9ja2VkUmFjZS50aXRsZV0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgICAgICBtYW5wb3dlciAtPSAxMDAwO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFplYnJhcyByZXF1aXJlIHVzIHRvIGhhdmUgYSBzaGlwLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJ6ZWJyYXNcIikudW5sb2NrZWQgJiZcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwic2hpcFwiKS52YWx1ZSA+PSAxXG4gICAgICApIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJtYW5wb3dlclwiKS52YWx1ZSAtPSAxMDAwO1xuICAgICAgICAgIGNvbnN0IHVubG9ja2VkUmFjZSA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnVubG9ja1JhbmRvbVJhY2UoKSk7XG4gICAgICAgICAgdGhpcy5faG9zdC5lbmdpbmUuaWFjdGl2aXR5KFwidXBncmFkZS5yYWNlXCIsIFt1bmxvY2tlZFJhY2UudGl0bGVdLCBcImtzLXVwZ3JhZGVcIik7XG4gICAgICAgICAgbWFucG93ZXIgLT0gMTAwMDtcbiAgICAgICAgICBjb250ZXh0LnJlcXVlc3RHYW1lVWlSZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGb3Igc3BpZGVycywgd2UgbmVlZCAxMDAgc2hpcHMgYW5kIDEyNTAwMCBzY2llbmNlLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXQoXCJzcGlkZXJzXCIpLnVubG9ja2VkICYmXG4gICAgICAgIG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJzaGlwXCIpKS52YWx1ZSA+PSAxMDAgJiZcbiAgICAgICAgbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcInNjaWVuY2VcIikpLm1heFZhbHVlID4gMTI1MDAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibWFucG93ZXJcIikpLnZhbHVlIC09IDEwMDA7XG4gICAgICAgICAgY29uc3QgdW5sb2NrZWRSYWNlID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kudW5sb2NrUmFuZG9tUmFjZSgpKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnJhY2VcIiwgW3VubG9ja2VkUmFjZS50aXRsZV0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgICAgICBtYW5wb3dlciAtPSAxMDAwO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERyYWdvbnMgcmVxdWlyZSBudWNsZWFyIGZpc3Npb24gdG8gYmUgcmVzZWFyY2hlZC5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KFwiZHJhZ29uc1wiKS51bmxvY2tlZCAmJlxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUuc2NpZW5jZS5nZXQoXCJudWNsZWFyRmlzc2lvblwiKS5yZXNlYXJjaGVkXG4gICAgICApIHtcbiAgICAgICAgaWYgKG1hbnBvd2VyID49IDEwMDApIHtcbiAgICAgICAgICBtdXN0RXhpc3QodGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwibWFucG93ZXJcIikpLnZhbHVlIC09IDEwMDA7XG4gICAgICAgICAgY29uc3QgdW5sb2NrZWRSYWNlID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kudW5sb2NrUmFuZG9tUmFjZSgpKTtcbiAgICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJ1cGdyYWRlLnJhY2VcIiwgW3VubG9ja2VkUmFjZS50aXRsZV0sIFwia3MtdXBncmFkZVwiKTtcbiAgICAgICAgICBtYW5wb3dlciAtPSAxMDAwO1xuICAgICAgICAgIGNvbnRleHQucmVxdWVzdEdhbWVVaVJlZnJlc2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b1RyYWRlQmxhY2tjb2luKCkge1xuICAgIGNvbnN0IGNvaW5QcmljZSA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5jcnlwdG9QcmljZTtcbiAgICBjb25zdCByZWxpY3NJbml0aWFsID0gdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwicmVsaWNcIikudmFsdWU7XG4gICAgY29uc3QgY29pbnNJbml0aWFsID0gdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwiYmxhY2tjb2luXCIpLnZhbHVlO1xuICAgIGxldCBjb2luc0V4Y2hhbmdlZCA9IDAuMDtcbiAgICBsZXQgcmVsaWNzRXhjaGFuZ2VkID0gMC4wO1xuXG4gICAgLy8gQWxsIG9mIHRoaXMgY29kZSBpcyBzdHJhaWdodC1mb3J3YXJkLiBCdXkgbG93LCBzZWxsIGhpZ2guXG5cbiAgICAvLyBFeGNoYW5nZXMgdXAgdG8gYSBjZXJ0YWluIHRocmVzaG9sZCwgaW4gb3JkZXIgdG8ga2VlcCBhIGdvb2QgZXhjaGFuZ2UgcmF0ZSwgdGhlbiB3YWl0c1xuICAgIC8vIGZvciBhIGhpZ2hlciB0aHJlc2hvbGQgYmVmb3JlIGV4Y2hhbmdpbmcgZm9yIHJlbGljcy5cbiAgICBpZiAoXG4gICAgICBjb2luUHJpY2UgPCB0aGlzLnNldHRpbmdzLnRyYWRlQmxhY2tjb2luLmJ1eSAmJlxuICAgICAgdGhpcy5zZXR0aW5ncy50cmFkZUJsYWNrY29pbi50cmlnZ2VyIDwgcmVsaWNzSW5pdGlhbFxuICAgICkge1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5idXlCY29pbigpO1xuXG4gICAgICBjb25zdCBjdXJyZW50Q29pbiA9IHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcImJsYWNrY29pblwiKS52YWx1ZTtcbiAgICAgIGNvaW5zRXhjaGFuZ2VkID0gTWF0aC5yb3VuZChjdXJyZW50Q29pbiAtIGNvaW5zSW5pdGlhbCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuYmxhY2tjb2luLmJ1eVwiLCBbdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShjb2luc0V4Y2hhbmdlZCldKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29pblByaWNlID4gdGhpcy5zZXR0aW5ncy50cmFkZUJsYWNrY29pbi5zZWxsICYmXG4gICAgICAwIDwgdGhpcy5faG9zdC5nYW1lLnJlc1Bvb2wuZ2V0KFwiYmxhY2tjb2luXCIpLnZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LnNlbGxCY29pbigpO1xuXG4gICAgICBjb25zdCByZWxpY3NDdXJyZW50ID0gbXVzdEV4aXN0KHRoaXMuX2hvc3QuZ2FtZS5yZXNQb29sLmdldChcInJlbGljXCIpKS52YWx1ZTtcbiAgICAgIHJlbGljc0V4Y2hhbmdlZCA9IE1hdGgucm91bmQocmVsaWNzQ3VycmVudCAtIHJlbGljc0luaXRpYWwpO1xuXG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuYmxhY2tjb2luLnNlbGxcIiwgW1xuICAgICAgICB0aGlzLl9ob3N0LnJlbmRlckFic29sdXRlKHJlbGljc0V4Y2hhbmdlZCksXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhZGUgd2l0aCB0aGUgZ2l2ZW4gcmFjZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHBhcmFtIGFtb3VudCBIb3cgb2Z0ZW4gdG8gdHJhZGUgd2l0aCB0aGUgcmFjZS5cbiAgICovXG4gIHRyYWRlKG5hbWU6IFJhY2UsIGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcmFjZSA9IHRoaXMuZ2V0UmFjZShuYW1lKTtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmdldFRyYWRlQnV0dG9uKHJhY2UubmFtZSk7XG5cbiAgICBpZiAoIWJ1dHRvbj8ubW9kZWw/LmVuYWJsZWQgfHwgIXRoaXMuc2V0dGluZ3MucmFjZXNbbmFtZV0uZW5hYmxlZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAuLi5jbChcbiAgICAgICAgICBcIktTIHRyYWRlIGNoZWNrcyBhcmUgbm90IGZ1bmN0aW9uaW5nIHByb3Blcmx5LCBwbGVhc2UgY3JlYXRlIGFuIGlzc3VlIG9uIHRoZSBnaXRodWIgcGFnZS5cIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS50cmFkZU11bHRpcGxlKHJhY2UsIGFtb3VudCk7XG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KHJhY2UudGl0bGUsIGFtb3VudCwgXCJ0cmFkZVwiKTtcbiAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXG4gICAgICBcImFjdC50cmFkZVwiLFxuICAgICAgW3RoaXMuX2hvc3QucmVuZGVyQWJzb2x1dGUoYW1vdW50KSwgdWNmaXJzdChyYWNlLnRpdGxlKV0sXG4gICAgICBcImtzLXRyYWRlXCIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYSB0cmFkZSB3aXRoIHRoZSBnaXZlbiByYWNlIHdvdWxkIGJlIGNvbnNpZGVyZWQgcHJvZml0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0cmFkZSBpcyBwcm9maXRhYmxlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldFByb2ZpdGFiaWxpdHkobmFtZTogUmFjZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJhY2UgPSB0aGlzLmdldFJhY2UobmFtZSk7XG5cbiAgICAvLyBUaGlzIHdpbGwga2VlcCB0cmFjayBvZiBob3cgbXVjaCB3ZSBoYXZlIHRvIHNwZW5kIG9uIGEgZ2l2ZW4gdHJhZGUuXG4gICAgLy8gSGlnaGVyIHZhbHVlcyBhcmUgd29yc2UuXG4gICAgbGV0IGNvc3QgPSAwO1xuICAgIC8vIEdldCBtYXRlcmlhbHMgcmVxdWlyZWQgdG8gdHJhZGUgd2l0aCB0aGUgcmFjZS5cbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcbiAgICAvLyBGb3IgZWFjaCBtYXRlcmlhbCByZXF1aXJlZCB0byB0cmFkZSB3aXRoIHRoZSByYWNlLi4uXG4gICAgZm9yIChjb25zdCBbbWF0LCBhbW91bnRdIG9mIG9iamVjdEVudHJpZXMobWF0ZXJpYWxzKSkge1xuICAgICAgLy8gLi4uZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSByZXNvdXJjZSBpcyBwcm9kdWNlZCBlYWNoIHRpY2suXG4gICAgICBjb25zdCB0aWNrID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFRpY2tWYWwodGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKG1hdCkpO1xuICAgICAgLy8gSWYgd2UncmUgbm90IHByb2R1Y2luZyBhbnkgb2YgdGhpcyByZXNvdXJjZSwgaXQncyBzcGljZSwgb3IgYmx1ZXByaW50cyxcbiAgICAgIC8vIGRvbid0IGNvbnNpZGVyIGl0IGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgICAgIGlmICh0aWNrID09PSBcImlnbm9yZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gSWYgd2UncmUgY29uc3VtaW5nIHRoaXMgcmVzb3VyY2UgaW5zdGVhZCBvZiBwcm9kdWNpbmcgaXQsXG4gICAgICAvLyBpbnN0YW50bHkgY29uc2lkZXIgdGhpcyB0cmFkZSBub3QgcHJvZml0YWJsZS5cbiAgICAgIGlmICh0aWNrIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdG8gdGhlIGNvc3QuXG4gICAgICAvLyBXZSBjb25zaWRlciBhbGwgcmVzb3VyY2VzIHRvIGJlIGVxdWFsIGluIHRoZSBwcm9maXRhYmlsaXR5IGNhbGN1bGF0aW9uLlxuICAgICAgLy8gV2UganVzdCBhZGQgdGhlIGNvc3Qgb2YgdGhlIHJlc291cmNlLCBkaXZpZGVkIGJ5IGhvdyBtdWNoIG9mIGl0IHdlJ3JlXG4gICAgICAvLyBwcm9kdWNpbmcuIFNvIHJlc291cmNlcyB0aGF0IHdlIHByb2R1Y2UgYSBsb3Qgb2YsIGRvbid0IFwiY29zdFwiIGFzIG11Y2guXG4gICAgICBjb3N0ICs9IGFtb3VudCAvIHRpY2s7XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIGtlZXAgdHJhY2sgb2YgaG93IG11Y2ggd2UgcmVjZWl2ZSBmcm9tIGEgZ2l2ZW4gdHJhZGUuXG4gICAgbGV0IHByb2ZpdCA9IDA7XG4gICAgLy8gR2V0IHJlc291cmNlcyByZXR1cm5lZCBmcm9tIHRyYWRlLlxuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuZ2V0QXZlcmFnZVRyYWRlKHJhY2UpO1xuICAgIC8vIEZvciBlYWNoIG1hdGVyaWFsIHJlc3VsdGluZyBmcm9tIGEgdHJhZGUgd2l0aCB0aGUgcmFjZS4uLlxuICAgIGZvciAoY29uc3QgW3Byb2QsIGFtb3VudF0gb2Ygb2JqZWN0RW50cmllcyhvdXRwdXQpKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShwcm9kKTtcbiAgICAgIC8vIC4uLmRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgcmVzb3VyY2UgaXMgcHJvZHVjZWQgZWFjaCB0aWNrLlxuICAgICAgY29uc3QgdGljayA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRUaWNrVmFsKHJlc291cmNlKTtcbiAgICAgIC8vIElmIHdlJ3JlIG5vdCBwcm9kdWNpbmcgYW55IG9mIHRoaXMgcmVzb3VyY2UsIGl0J3Mgc3BpY2UsIG9yIGJsdWVwcmludHMsXG4gICAgICAvLyBkb24ndCBjb25zaWRlciBpdCBpbiB0aGUgY2FsY3VsYXRpb24uXG4gICAgICBpZiAodGljayA9PT0gXCJpZ25vcmVcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlJ3JlIGNvbnN1bWluZyB0aGlzIHJlc291cmNlIGluc3RlYWQgb2YgcHJvZHVjaW5nIGl0LFxuICAgICAgLy8gaW5zdGFudGx5IGNvbnNpZGVyIHRoaXMgdHJhZGUgcHJvZml0YWJsZS5cbiAgICAgIGlmICh0aWNrIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHByb2ZpdCArPVxuICAgICAgICAvLyBGb3IgY2FwcGVkIHJlc291cmNlcy4uLlxuICAgICAgICAwIDwgcmVzb3VyY2UubWF4VmFsdWVcbiAgICAgICAgICA/IC8vIC4uLiBvbmx5IGFkZCBhcyBtdWNoIHRvIHRoZSBwcm9maXQgYXMgd2UgY2FuIHN0b3JlLlxuICAgICAgICAgICAgTWF0aC5taW4oYW1vdW50LCBNYXRoLm1heChyZXNvdXJjZS5tYXhWYWx1ZSAtIHJlc291cmNlLnZhbHVlLCAwKSkgLyB0aWNrXG4gICAgICAgICAgOiAvLyBGb3IgdW5jYXBwZWQgcmVzb3VyY2VzLCBhZGQgYWxsIG9mIGl0LlxuICAgICAgICAgICAgYW1vdW50IC8gdGljaztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcHJvZml0IGlzIGhpZ2hlciB0aGFuIHRoZSBjb3N0LCBjb25zaWRlciB0aGlzIHByb2ZpdGFibGUuXG4gICAgcmV0dXJuIGNvc3QgPD0gcHJvZml0O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGljaCByZXNvdXJjZXMgYW5kIGhvdyBtdWNoIG9mIHRoZW0gYSB0cmFkZSB3aXRoIHRoZSBnaXZlbiByYWNlIHJlc3VsdHMgaW4uXG4gICAqXG4gICAqIEBwYXJhbSByYWNlIFRoZSByYWNlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzb3VyY2VzIHJldHVybmVkIGZyb20gYW4gYXZlcmFnZSB0cmFkZSBhbmQgdGhlaXIgYW1vdW50LlxuICAgKi9cbiAgZ2V0QXZlcmFnZVRyYWRlKHJhY2U6IFVuc2FmZVJhY2UpOiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj4ge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgYSBsb3Qgb2YgbWFnaWMuIEl0J3MgcG9zc2libGUgc29tZSBvZiBpdCB3YXMgY29waWVkIGRpcmVjdGx5IGZyb20gdGhlIGdhbWUuXG4gICAgY29uc3Qgc3RhbmRpbmdSYXRpbyA9XG4gICAgICB0aGlzLl9ob3N0LmdhbWUuZ2V0RWZmZWN0KFwic3RhbmRpbmdSYXRpb1wiKSArXG4gICAgICB0aGlzLl9ob3N0LmdhbWUuZGlwbG9tYWN5LmNhbGN1bGF0ZVN0YW5kaW5nRnJvbVBvbGljaWVzKHJhY2UubmFtZSwgdGhpcy5faG9zdC5nYW1lKTtcblxuICAgIGNvbnN0IHJhY2VSYXRpbyA9IDEgKyByYWNlLmVuZXJneSAqIDAuMDI7XG5cbiAgICBjb25zdCB0cmFkZVJhdGlvID1cbiAgICAgIDEgK1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5nZXRUcmFkZVJhdGlvKCkgK1xuICAgICAgdGhpcy5faG9zdC5nYW1lLmRpcGxvbWFjeS5jYWxjdWxhdGVUcmFkZUJvbnVzRnJvbVBvbGljaWVzKHJhY2UubmFtZSwgdGhpcy5faG9zdC5nYW1lKTtcblxuICAgIGNvbnN0IGZhaWxlZFJhdGlvID0gcmFjZS5zdGFuZGluZyA8IDAgPyByYWNlLnN0YW5kaW5nICsgc3RhbmRpbmdSYXRpbyA6IDA7XG4gICAgY29uc3Qgc3VjY2Vzc1JhdGlvID0gMCA8IGZhaWxlZFJhdGlvID8gMSArIGZhaWxlZFJhdGlvIDogMTtcbiAgICBjb25zdCBib251c1JhdGlvID0gMCA8IHJhY2Uuc3RhbmRpbmcgPyBNYXRoLm1pbihyYWNlLnN0YW5kaW5nICsgc3RhbmRpbmdSYXRpbyAvIDIsIDEpIDogMDtcblxuICAgIGNvbnN0IG91dHB1dDogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+ID0ge307XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHJhY2Uuc2VsbHMpIHtcbiAgICAgIGlmICghdGhpcy5faXNWYWxpZFRyYWRlKGl0ZW0sIHJhY2UpKSB7XG4gICAgICAgIC8vIFN0aWxsIHB1dCBpbnZhbGlkIHRyYWRlcyBpbnRvIHRoZSByZXN1bHQgdG8gbm90IGNhdXNlIG1pc3Npbmcga2V5cy5cbiAgICAgICAgb3V0cHV0W2l0ZW0ubmFtZV0gPSAwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1lYW4gPSAwO1xuICAgICAgY29uc3QgdHJhZGVDaGFuY2UgPSByYWNlLmVtYmFzc3lQcmljZXNcbiAgICAgICAgPyBpdGVtLmNoYW5jZSAqICgxICsgdGhpcy5faG9zdC5nYW1lLmdldExpbWl0ZWREUigwLjAxICogcmFjZS5lbWJhc3N5TGV2ZWwsIDAuNzUpKVxuICAgICAgICA6IGl0ZW0uY2hhbmNlO1xuICAgICAgaWYgKHJhY2UubmFtZSA9PT0gXCJ6ZWJyYXNcIiAmJiBpdGVtLm5hbWUgPT09IFwidGl0YW5pdW1cIikge1xuICAgICAgICBjb25zdCBzaGlwQ291bnQgPSB0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoXCJzaGlwXCIpLnZhbHVlO1xuICAgICAgICBjb25zdCB0aXRhbml1bVByb2JhYmlsaXR5ID0gTWF0aC5taW4oMC4xNSArIHNoaXBDb3VudCAqIDAuMDAzNSwgMSk7XG4gICAgICAgIGNvbnN0IHRpdGFuaXVtUmF0aW8gPSAxICsgc2hpcENvdW50IC8gNTA7XG4gICAgICAgIG1lYW4gPSAxLjUgKiB0aXRhbml1bVJhdGlvICogKHN1Y2Nlc3NSYXRpbyAqIHRpdGFuaXVtUHJvYmFiaWxpdHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2Vhc2lvblJhdGlvID0gIWl0ZW0uc2Vhc29uc1xuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMSArIGl0ZW0uc2Vhc29uc1t0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZ2V0Q3VyU2Vhc29uKCkubmFtZV07XG4gICAgICAgIGNvbnN0IG5vcm1Cb3VnaHQgPSAoc3VjY2Vzc1JhdGlvIC0gYm9udXNSYXRpbykgKiBNYXRoLm1pbih0cmFkZUNoYW5jZSAvIDEwMCwgMSk7XG4gICAgICAgIGNvbnN0IG5vcm1Cb251cyA9IGJvbnVzUmF0aW8gKiBNYXRoLm1pbih0cmFkZUNoYW5jZSAvIDEwMCwgMSk7XG4gICAgICAgIG1lYW4gPSAobm9ybUJvdWdodCArIDEuMjUgKiBub3JtQm9udXMpICogaXRlbS52YWx1ZSAqIHJhY2VSYXRpbyAqIHNlYXNpb25SYXRpbyAqIHRyYWRlUmF0aW87XG4gICAgICB9XG4gICAgICBvdXRwdXRbaXRlbS5uYW1lXSA9IG1lYW47XG4gICAgfVxuXG4gICAgY29uc3Qgc3BpY2VDaGFuY2UgPSByYWNlLmVtYmFzc3lQcmljZXMgPyAwLjM1ICogKDEgKyAwLjAxICogcmFjZS5lbWJhc3N5TGV2ZWwpIDogMC4zNTtcbiAgICBjb25zdCBzcGljZVRyYWRlQW1vdW50ID0gc3VjY2Vzc1JhdGlvICogTWF0aC5taW4oc3BpY2VDaGFuY2UsIDEpO1xuICAgIG91dHB1dC5zcGljZSA9IDI1ICogc3BpY2VUcmFkZUFtb3VudCArICg1MCAqIHNwaWNlVHJhZGVBbW91bnQgKiB0cmFkZVJhdGlvKSAvIDI7XG4gICAgb3V0cHV0LmJsdWVwcmludCA9IDAuMSAqIHN1Y2Nlc3NSYXRpbztcblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoaXMgdHJhZGUgaXMgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtIFRoZSB0cmFkZWFibGUgaXRlbS5cbiAgICogQHBhcmFtIHJhY2UgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0cmFkZSBpcyB2YWxpZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIF9pc1ZhbGlkVHJhZGUoaXRlbTogVW5zYWZlVHJhZGVTZWxsT2ZmZXIsIHJhY2U6IFVuc2FmZVJhY2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgLy8gRG8gd2UgaGF2ZSBlbm91Z2ggZW1iYXNzaWVzIHRvIHJlY2VpdmUgdGhlIGl0ZW0/XG4gICAgICAhKGl0ZW0ubWluTGV2ZWwgJiYgcmFjZS5lbWJhc3N5TGV2ZWwgPCBpdGVtLm1pbkxldmVsKSAmJlxuICAgICAgLy8gVE9ETzogVGhlc2Ugc2VlbSBhIGJpdCB0b28gbWFnaWNhbC5cbiAgICAgICh0aGlzLl9ob3N0LmdhbWUucmVzUG9vbC5nZXQoaXRlbS5uYW1lKS51bmxvY2tlZCB8fFxuICAgICAgICBpdGVtLm5hbWUgPT09IFwidGl0YW5pdW1cIiB8fFxuICAgICAgICBpdGVtLm5hbWUgPT09IFwidXJhbml1bVwiIHx8XG4gICAgICAgIHJhY2UubmFtZSA9PT0gXCJsZXZpYXRoYW5zXCIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaG93IG1hbnkgdHJhZGVzIGFyZSBhdCBsZWFzdCBwb3NzaWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHJhY2UgdG8gdHJhZGUgd2l0aC5cbiAgICogQHBhcmFtIF9saW1pdGVkIElzIHRoZSByYWNlIHNldCB0byBiZSBsaW1pdGVkLlxuICAgKiBAcGFyYW0gX3RyaWdDb25kaXRpb25zIElnbm9yZWRcbiAgICogQHJldHVybnMgVGhlIGxvd2VzdCBudW1iZXIgb2YgdHJhZGVzIHBvc3NpYmxlIHdpdGggdGhpcyByYWNlLlxuICAgKi9cbiAgZ2V0TG93ZXN0VHJhZGVBbW91bnQobmFtZTogUmFjZSB8IG51bGwsIF9saW1pdGVkOiBib29sZWFuLCBfdHJpZ0NvbmRpdGlvbnM6IHVua25vd24pOiBudW1iZXIge1xuICAgIGxldCBhbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyhuYW1lKTtcblxuICAgIGxldCB0b3RhbDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3Jlc291cmNlLCByZXF1aXJlZF0gb2Ygb2JqZWN0RW50cmllcyhtYXRlcmlhbHMpKSB7XG4gICAgICBpZiAocmVzb3VyY2UgPT09IFwibWFucG93ZXJcIikge1xuICAgICAgICBsZXQgbWFucG93ZXJDb3N0ID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5pc0FjdGl2ZShcInBvc3RBcG9jYWx5cHNlXCIpKSB7XG4gICAgICAgICAgbWFucG93ZXJDb3N0ID0gcmVxdWlyZWQgKiAoMSArIHRoaXMuX2hvc3QuZ2FtZS5ibGQuZ2V0UG9sbHV0aW9uTGV2ZWwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdG90YWwgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0VmFsdWVBdmFpbGFibGUocmVzb3VyY2UpIC8gbWFucG93ZXJDb3N0O1xuICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSA9PT0gXCJnb2xkXCIpIHtcbiAgICAgICAgbGV0IGdvbGRDb3N0ID0gcmVxdWlyZWQ7XG4gICAgICAgIGlmICh0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5pc0FjdGl2ZShcInBvc3RBcG9jYWx5cHNlXCIpKSB7XG4gICAgICAgICAgZ29sZENvc3QgPSByZXF1aXJlZCAqICgxICsgdGhpcy5faG9zdC5nYW1lLmJsZC5nZXRQb2xsdXRpb25MZXZlbCgpKTtcbiAgICAgICAgfVxuICAgICAgICB0b3RhbCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShyZXNvdXJjZSkgLyBnb2xkQ29zdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdGFsID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKHJlc291cmNlKSAvIHJlcXVpcmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIGFtb3VudCB0byB0aGUgbG93ZXN0IGFtb3VudCBvZiBwb3NzaWJsZSB0cmFkZXMgc2VlbiB5ZXQuXG4gICAgICBhbW91bnQgPSBhbW91bnQgPT09IHVuZGVmaW5lZCB8fCB0b3RhbCA8IGFtb3VudCA/IHRvdGFsIDogYW1vdW50O1xuICAgIH1cblxuICAgIC8vIFJvdW5kIHRoZSBhbW91bnQgZG93biBhbmQgbm9ybWFsaXplIHRvIDAuXG4gICAgYW1vdW50ID0gTWF0aC5mbG9vcihhbW91bnQgPz8gMCk7XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IGFtb3VudCBpcyAwLCByZXR1cm4gMC5cbiAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBJZiBubyByYWNlIHdhcyBzcGVjaWZpZWQsIG9yIHRoaXMgaXMgdHJhZGluZyB3aXRoIGxldmlhdGhhbnMsIHJldHVybiB0aGVcbiAgICAvLyBjdXJyZW50bHkga25vd24sIGxvd2VzdCBhbW91bnQuXG4gICAgLy8gVGhlIHNwZWNpYWwgY2FzZSBmb3IgbGV2aWF0aGFucyBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgaXMgYnVnZ3kgb3JcbiAgICAvLyBwcm9ibGVtYXRpYywgYXMgbGV2aWF0aGFucyBhcmUgdGhlIGxhc3QgcmFjZS5cbiAgICBpZiAobmFtZSA9PT0gbnVsbCB8fCBuYW1lID09PSBcImxldmlhdGhhbnNcIikge1xuICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICB9XG5cbiAgICBjb25zdCByYWNlID0gdGhpcy5nZXRSYWNlKG5hbWUpO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBpdGVtcyBvYnRhaW5lZCBieSB0aGUgcmFjZSwgYW5kIGRldGVybWluZVxuICAgIC8vIHdoaWNoIHJlc291cmNlIGhhcyB0aGUgbW9zdCBzcGFjZSBsZWZ0LiBPbmNlIHdlJ3ZlIGRldGVybWluZWQgdGhpcyxcbiAgICAvLyByZWR1Y2UgdGhlIGFtb3VudCBieSB0aGlzIGNhcGFjaXR5LiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBjb250aW51ZSB0byB0cmFkZVxuICAgIC8vIGFzIGxvbmcgYXMgYXQgbGVhc3Qgb25lIHJlc291cmNlIGhhcyBjYXBhY2l0eSwgYW5kIHdlIG5ldmVyIG92ZXItdHJhZGUuXG5cbiAgICBsZXQgaGlnaGVzdENhcGFjaXR5ID0gMDtcbiAgICBjb25zdCB0cmFkZU91dHB1dCA9IHRoaXMuZ2V0QXZlcmFnZVRyYWRlKHJhY2UpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiByYWNlLnNlbGxzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShpdGVtLm5hbWUpO1xuICAgICAgbGV0IG1heCA9IDA7XG5cbiAgICAgIC8vIE5vIG5lZWQgdG8gcHJvY2VzcyByZXNvdXJjZXMgdGhhdCBkb24ndCBjYXBcbiAgICAgIGlmICghcmVzb3VyY2UubWF4VmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG1heCA9IG11c3RFeGlzdCh0cmFkZU91dHB1dFtpdGVtLm5hbWVdKTtcblxuICAgICAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLm1heCgocmVzb3VyY2UubWF4VmFsdWUgLSByZXNvdXJjZS52YWx1ZSkgLyBtYXgsIDApO1xuXG4gICAgICBoaWdoZXN0Q2FwYWNpdHkgPSBjYXBhY2l0eSA8IGhpZ2hlc3RDYXBhY2l0eSA/IGhpZ2hlc3RDYXBhY2l0eSA6IGNhcGFjaXR5O1xuICAgIH1cblxuICAgIC8vIFdlIG11c3QgdGFrZSB0aGUgY2VpbGluZyBvZiBjYXBhY2l0eSBzbyB0aGF0IHdlIHdpbGwgdHJhZGUgYXMgbG9uZ1xuICAgIC8vIGFzIHRoZXJlIGlzIGFueSByb29tLCBldmVuIGlmIGl0IGRvZXNuJ3QgaGF2ZSBleGFjdCBzcGFjZS4gT3RoZXJ3aXNlXG4gICAgLy8gd2Ugc2VlbSB0byBzdGFydmUgdHJhZGluZyBhbHRvZ2V0aGVyLlxuICAgIGhpZ2hlc3RDYXBhY2l0eSA9IE1hdGguY2VpbChoaWdoZXN0Q2FwYWNpdHkpO1xuXG4gICAgLy8gSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgcmVzdWx0aW5nIGZyb20gYSB0cmFkZSBhcmUgYWxyZWFkeSBjYXBwZWQsIHdlXG4gICAgLy8gZG9uJ3Qgd2FudCB0byB0cmFkZSB3aXRoIHRoaXMgcmFjZS5cbiAgICBpZiAoaGlnaGVzdENhcGFjaXR5ID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoZSBtb3N0IHdlICpzaG91bGQqIHRyYWRlIGZvciwgY2hlY2sgdG8gZW5zdXJlIHRoYXRcbiAgICAvLyB3ZSB0cmFkZSBmb3Igb3VyIG1heCBjb3N0LCBvciBvdXIgbWF4IGNhcGFjaXR5LCB3aGljaGV2ZXIgaXMgbG93ZXIuXG4gICAgLy8gVGhpcyBoZWxwcyB1cyBwcmV2ZW50IHRyYWRpbmcgZm9yIHJlc291cmNlcyB3ZSBjYW4ndCBzdG9yZS4gTm90ZSB0aGF0IHdlXG4gICAgLy8gZXNzZW50aWFsbHkgaWdub3JlIGJsdWVwcmludHMgaGVyZS5cblxuICAgIGFtb3VudCA9IGhpZ2hlc3RDYXBhY2l0eSA8IGFtb3VudCA/IE1hdGgubWF4KGhpZ2hlc3RDYXBhY2l0eSAtIDEsIDEpIDogYW1vdW50O1xuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdGhlIHJlc291cmNlcyByZXF1aXJlZCB0byB0cmFkZSB3aXRoIHRoZSBnaXZlbiByYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmFjZSBUaGUgcmFjZSB0byBjaGVjay4gSWYgbm90IHNwZWNpZmllZCB0aGUgcmVzb3VyY2VzIGZvciBhbnlcbiAgICogdHJhZGUgd2lsbCBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMgVGhlIHJlc291cmNlcyBuZWVkIHRvIHRyYWRlIHdpdGggdGhlIHJhY2UuXG4gICAqL1xuICBnZXRNYXRlcmlhbHMocmFjZTogTWF5YmU8UmFjZT4gPSBudWxsKTogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+IHtcbiAgICBjb25zdCBtYXRlcmlhbHM6IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlLCBudW1iZXI+PiA9IHtcbiAgICAgIGdvbGQ6IDE1IC0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInRyYWRlR29sZERpc2NvdW50XCIpLFxuICAgICAgbWFucG93ZXI6IDUwIC0gdGhpcy5faG9zdC5nYW1lLmdldEVmZmVjdChcInRyYWRlQ2F0cG93ZXJEaXNjb3VudFwiKSxcbiAgICB9O1xuXG4gICAgaWYgKGlzTmlsKHJhY2UpKSB7XG4gICAgICByZXR1cm4gbWF0ZXJpYWxzO1xuICAgIH1cblxuICAgIGNvbnN0IHByaWNlcyA9IHRoaXMuZ2V0UmFjZShyYWNlKS5idXlzO1xuXG4gICAgZm9yIChjb25zdCBwcmljZSBvZiBwcmljZXMpIHtcbiAgICAgIG1hdGVyaWFsc1twcmljZS5uYW1lXSA9IHByaWNlLnZhbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0ZXJpYWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnaXZlbiByYWNlIGZyb20gdGhlIGdhbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSByYWNlIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gb2JqZWN0IGZvci5cbiAgICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIG9iamVjdCBmb3IgdGhlIGdpdmVuIHJhY2UuXG4gICAqL1xuICBnZXRSYWNlKG5hbWU6IFJhY2UpOiBVbnNhZmVSYWNlIHtcbiAgICBjb25zdCByYWNlSW5mbyA9IHRoaXMuX2hvc3QuZ2FtZS5kaXBsb21hY3kuZ2V0KG5hbWUpO1xuICAgIGlmIChpc05pbChyYWNlSW5mbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJldHJpZXZlIHJhY2UgJyR7bmFtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiByYWNlSW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byB0aGUgdHJhZGUgYnV0dG9uIGZvciB0aGUgZ2l2ZW4gcmFjZSBmcm9tIHRoZSBnYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcmFjZSBUaGUgcmFjZSB0byBnZXQgdGhlIGJ1dHRvbiByZWZlcmVuY2UgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlIHRvIHRoZSB0cmFkZSBidXR0b24uXG4gICAqL1xuICBnZXRUcmFkZUJ1dHRvbihyYWNlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYW5lbCA9IHRoaXMubWFuYWdlci50YWIucmFjZVBhbmVscy5maW5kKHN1YmplY3QgPT4gc3ViamVjdC5yYWNlLm5hbWUgPT09IHJhY2UpO1xuICAgIHJldHVybiBwYW5lbD8udHJhZGVCdG4gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYXQgbGVhc3QgYSBzaW5nbGUgdHJhZGUgY2FuIGJlIG1hZGUuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFkZSAtIFRoZSB0cmFkZSBvcHRpb24gdG8gY2hlY2suIElmIG5vdCBzcGVjaWZpZWQsIGFsbCByYWNlcyBhcmUgY2hlY2tlZC5cbiAgICogQHJldHVybnMgSWYgdGhlIHJlcXVlc3RlZCB0cmFkZSBpcyBwb3NzaWJsZS5cbiAgICovXG4gIHNpbmdsZVRyYWRlUG9zc2libGUoXG4gICAgc2VjdGlvblRyaWdnZXI6IG51bWJlcixcbiAgICBjYXRwb3dlcjogUmVxdWlyZWQ8VW5zYWZlUmVzb3VyY2U+LFxuICAgIGdvbGQ6IFJlcXVpcmVkPFVuc2FmZVJlc291cmNlPixcbiAgICB0cmFkZT86IFRyYWRlU2V0dGluZ3NJdGVtLFxuICApOiBib29sZWFuIHtcbiAgICBjb25zdCB0cmlnZ2VyID0gdHJhZGVcbiAgICAgID8gRW5naW5lLmV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoc2VjdGlvblRyaWdnZXIsIHRyYWRlLnRyaWdnZXIpXG4gICAgICA6IHNlY3Rpb25UcmlnZ2VyO1xuXG4gICAgaWYgKHRyaWdnZXIgPCAwICYmIHRyYWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdlIHdpbGwgaGF2ZSB0byBjaGVjayBhbGwgcG90ZW50aWFsIHRyYWRlcyBpbmRpdmlkdWFsbHkuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlciA8IDAgJiYgdHJhZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyB3aWxsIG5ldmVyIHRyaWdnZXIuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gV2Ugc2hvdWxkIG9ubHkgdHJhZGUgaWYgY2F0cG93ZXIgYW5kIGdvbGQgaGl0IHRoZSB0cmlnZ2VyIHZhbHVlLlxuICAgIC8vIFRyYWRlcyBjYW4gYWRkaXRpb25hbGx5IHJlcXVpcmUgc3BlY2lmaWMgcmVzb3VyY2VzLiBXZSB3aWxsIGNoZWNrIGZvciB0aG9zZSBsYXRlci5cbiAgICBpZiAoY2F0cG93ZXIudmFsdWUgLyBjYXRwb3dlci5tYXhWYWx1ZSA8IHRyaWdnZXIgfHwgZ29sZC52YWx1ZSAvIGdvbGQubWF4VmFsdWUgPCB0cmlnZ2VyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBtYXRlcmlhbHMgcmVxdWlyZWQgdG8gdHJhZGUgd2l0aCB0aGUgcmFjZS5cbiAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLmdldE1hdGVyaWFscyh0cmFkZT8ucmFjZSk7XG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2UsIGFtb3VudF0gb2Ygb2JqZWN0RW50cmllczxSZXNvdXJjZSwgbnVtYmVyPihtYXRlcmlhbHMpKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgc3VmZmljaWVudCBhbW91bnQgb2YgdGhhdCByZXNvdXJjZSBpbiBzdG9yYWdlLlxuICAgICAgaWYgKHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShyZXNvdXJjZSkgPCBhbW91bnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IG9iamVjdEVudHJpZXMgfSBmcm9tIFwiLi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuXG4vKipcbiAqIFRoZSBgQ2FjaGVNYW5hZ2VyYCBhcHBhcmVudGx5IHN0b3JlcyBhIHN0YXRlIG9mIHJlc291cmNlcyBpbiBzdG9jay5cbiAqIENvbXBvbmVudHMgY2FuIHB1c2ggaW5kaXZpZHVhbCByZXNvdXJjZSBzZXRzIGludG8gdGhlIGNhY2hlIHRvIHVwZGF0ZVxuICogdGhlIG92ZXJhbGwgc3RvY2sgY2FjaGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXRlcmlhbHNDYWNoZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FjaGUgPSBuZXcgQXJyYXk8e1xuICAgIG1hdGVyaWFsczogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+O1xuICAgIHRpbWVTdGFtcDogbnVtYmVyO1xuICB9PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jYWNoZVN1bTogUGFydGlhbDxSZWNvcmQ8UmVzb3VyY2UsIG51bWJlcj4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaG9zdDogS2l0dGVuU2NpZW50aXN0cykge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIGEgc2V0IG9mIG1hdGVyaWFscyBpbiB0aGUgY2FjaGUuXG4gICAqIFRoaXMgaXMgdXN1YWxseSBkb25lICphZnRlciogaHVudGluZyBhbmQgdHJhZGluZy5cbiAgICogVE9ETzogVGhpcyBpcyBpbmRpY2F0aXZlIG9mIHRoZSBkZXNpcmUgdG8ga25vdyB0aGUgcmVzb3VyY2Ugc3RhdGUgYXQgdGhlIGJlZ2lubmluZyBvZlxuICAgKiAgICAgICBhIGZyYW1lLiBUaGlzIGlzIGxpa2VseSByZXF1aXJlZCB0byBtYWtlIGRpZmZlcmVudCBhdXRvbWF0aW9ucyBwbGF5IG5pY2UgdG9nZXRoZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBtYXRlcmlhbHMgdG8gc3RvcmUgaW4gdGhlIGNhY2hlLlxuICAgKiBAcGFyYW0gZGF0YS5tYXRlcmlhbHMgVGhlIG1hdGVyaWFscyB0aGVtc2VsdmVzLlxuICAgKiBAcGFyYW0gZGF0YS50aW1lU3RhbXAgVGhlIGN1cnJlbnQgdGltZS5cbiAgICovXG4gIHB1c2hUb0NhY2hlKGRhdGE6IHsgbWF0ZXJpYWxzOiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj47IHRpbWVTdGFtcDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAvLyBTdG9yZSB0aGlzIGVudHJ5IGluIHRoZSBjYWNoZS5cbiAgICB0aGlzLl9jYWNoZS5wdXNoKGRhdGEpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjYWNoZWQgc3VtcyBmb3IgdGhlIHBhc3NlZCBtYXRlcmlhbHMuXG4gICAgZm9yIChjb25zdCBbbWF0LCBhbW91bnRdIG9mIG9iamVjdEVudHJpZXMoZGF0YS5tYXRlcmlhbHMpKSB7XG4gICAgICBpZiAoIXRoaXMuX2NhY2hlU3VtW21hdF0pIHtcbiAgICAgICAgdGhpcy5fY2FjaGVTdW1bbWF0XSA9IDA7XG4gICAgICB9XG4gICAgICB0aGlzLl9jYWNoZVN1bVttYXRdICs9IGFtb3VudDtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMgaW4gdGhlIGNhY2hlLlxuICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gYmUgY29tcGxldGVseSBwb2ludGxlc3MsIGFzIHRoZSBjYWNoZSBpcyBuZXZlciBhY2Nlc3NlZC5cbiAgICAvLyAgICAgICBCZXlvbmQgdGhhdCwgaXQgc2VlbXMgdG8gYmUgYSBjbGVhbnVwIHByb2NlZHVyZSB0aGF0IGlzIHZlcnkgcG9vcmx5XG4gICAgLy8gICAgICAgaW1wbGVtZW50ZWQuXG4gICAgZm9yIChsZXQgY2FjaGVJbmRleCA9IDA7IGNhY2hlSW5kZXggPCB0aGlzLl9jYWNoZS5sZW5ndGg7ICsrY2FjaGVJbmRleCkge1xuICAgICAgY29uc3Qgb2xkRGF0YSA9IHRoaXMuX2NhY2hlW2NhY2hlSW5kZXhdO1xuICAgICAgaWYgKHRoaXMuX2NhY2hlLmxlbmd0aCA+IDEwMDAwKSB7XG4gICAgICAgIGNvbnN0IG9sZE1hdGVyaWFscyA9IG9sZERhdGEubWF0ZXJpYWxzO1xuICAgICAgICBmb3IgKGNvbnN0IFttYXQsIGFtb3VudF0gb2Ygb2JqZWN0RW50cmllcyhvbGRNYXRlcmlhbHMpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jYWNoZVN1bVttYXRdKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZVN1bVttYXRdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fY2FjaGVTdW1bbWF0XSAtPSBhbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FjaGUuc2hpZnQoKTtcbiAgICAgICAgY2FjaGVJbmRleC0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcmVzb3VyY2UgYW1vdW50IHRoYXQgaXMgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlIFRoZSByZXNvdXJjZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCByZXNvdXJjZSBhbW91bnQsIGRpdmlkZWQgYnkgaG93IGxvbmcgaXQgaGFzIGJlZW4gY2FjaGVkLlxuICAgKi9cbiAgZ2V0UmVzVmFsdWUocmVzb3VyY2U6IFJlc291cmNlKTogbnVtYmVyIHtcbiAgICAvLyBJZiB0aGUgY2FjaGUgaXMgZW1wdHksIG9yIG5vIHN1bSB3YXMgc3RvcmVkIHlldCwgcmV0dXJuIDAuXG4gICAgaWYgKHRoaXMuX2NhY2hlLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5fY2FjaGVTdW1bcmVzb3VyY2VdKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VGljayA9IHRoaXMuX2hvc3QuZ2FtZS50aW1lci50aWNrc1RvdGFsO1xuICAgIGNvbnN0IHN0YXJ0aW5nVGljayA9IHRoaXMuX2NhY2hlWzBdLnRpbWVTdGFtcDtcblxuICAgIC8vIEFkanVzdCB0aGUgY2FjaGVkIHZhbHVlIGJ5IHRoZSBhbW91bnQgb2YgdGlja3MgdGhhdCBoYXZlIHBhc3NlZFxuICAgIC8vIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGNhY2hlIHdhcyB1cGRhdGVkLlxuICAgIC8vIFRPRE86IFdoeT8gVGhpcyBzZWVtcyBhcmJpdHJhcnksIGp1c3QgbGlrZSB0aGlzIGVudGlyZSBjYWNoZSBtYW5hZ2VyLlxuICAgIHJldHVybiB0aGlzLl9jYWNoZVN1bVtyZXNvdXJjZV0gLyAoY3VycmVudFRpY2sgLSBzdGFydGluZ1RpY2spO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCwgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRvbWF0aW9uLCBGcmFtZUNvbnRleHQgfSBmcm9tIFwiLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IE1hdGVyaWFsc0NhY2hlIH0gZnJvbSBcIi4vaGVscGVyL01hdGVyaWFsc0NhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyBWaWxsYWdlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9WaWxsYWdlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRhYk1hbmFnZXIgfSBmcm9tIFwiLi9UYWJNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBvYmplY3RFbnRyaWVzIH0gZnJvbSBcIi4vdG9vbHMvRW50cmllcy5qc1wiO1xuaW1wb3J0IHsgbmVnYXRpdmVPbmVUb0luZmluaXR5IH0gZnJvbSBcIi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlIH0gZnJvbSBcIi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgVW5zYWZlSm9iLCBWaWxsYWdlIH0gZnJvbSBcIi4vdHlwZXMvdmlsbGFnZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc2hvcE1hbmFnZXIgfSBmcm9tIFwiLi9Xb3Jrc2hvcE1hbmFnZXIuanNcIjtcblxuZXhwb3J0IGNsYXNzIFZpbGxhZ2VNYW5hZ2VyIGltcGxlbWVudHMgQXV0b21hdGlvbiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG4gIHJlYWRvbmx5IHNldHRpbmdzOiBWaWxsYWdlU2V0dGluZ3M7XG4gIHJlYWRvbmx5IG1hbmFnZXI6IFRhYk1hbmFnZXI8VmlsbGFnZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlTWFuYWdlcjogTWF0ZXJpYWxzQ2FjaGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3dvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGhvc3Q6IEtpdHRlblNjaWVudGlzdHMsXG4gICAgd29ya3Nob3BNYW5hZ2VyOiBXb3Jrc2hvcE1hbmFnZXIsXG4gICAgc2V0dGluZ3MgPSBuZXcgVmlsbGFnZVNldHRpbmdzKCksXG4gICkge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLm1hbmFnZXIgPSBuZXcgVGFiTWFuYWdlcih0aGlzLl9ob3N0LCBcIlZpbGxhZ2VcIik7XG4gICAgdGhpcy5fY2FjaGVNYW5hZ2VyID0gbmV3IE1hdGVyaWFsc0NhY2hlKHRoaXMuX2hvc3QpO1xuICAgIHRoaXMuX3dvcmtzaG9wTWFuYWdlciA9IHdvcmtzaG9wTWFuYWdlcjtcbiAgfVxuXG4gIHRpY2soX2NvbnRleHQ6IEZyYW1lQ29udGV4dCkge1xuICAgIGlmICghdGhpcy5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvRGlzdHJpYnV0ZUtpdHRlbnMoKTtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmh1bnQuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvSHVudCh0aGlzLl9jYWNoZU1hbmFnZXIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmhvbGRGZXN0aXZhbHMuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvRmVzdGl2YWwodGhpcy5fY2FjaGVNYW5hZ2VyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5lbGVjdExlYWRlci5lbmFibGVkKSB7XG4gICAgICB0aGlzLmF1dG9FbGVjdCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnByb21vdGVMZWFkZXIuZW5hYmxlZCkge1xuICAgICAgdGhpcy5hdXRvUHJvbW90ZUxlYWRlcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnByb21vdGVLaXR0ZW5zLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYXV0b1Byb21vdGVLaXR0ZW5zKCk7XG4gICAgfVxuICB9XG5cbiAgYXV0b0Rpc3RyaWJ1dGVLaXR0ZW5zKCkge1xuICAgIGNvbnN0IGZyZWVLaXR0ZW5zID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0RnJlZUtpdHRlbnMoKTtcbiAgICBpZiAoIWZyZWVLaXR0ZW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXNzaWduZWRLaXR0ZW4gPSAwOyBhc3NpZ25lZEtpdHRlbiA8IGZyZWVLaXR0ZW5zOyArK2Fzc2lnbmVkS2l0dGVuKSB7XG4gICAgICAvLyBGaW5kIGFsbCBqb2JzIHdoZXJlIHdlIGhhdmVuJ3QgYXNzaWduZWQgdGhlIG1heGltdW0gZGVzaXJlZCBraXR0ZW5zIHlldC5cbiAgICAgIGNvbnN0IGpvYnNOb3RDYXBwZWQgPSBuZXcgQXJyYXk8eyBqb2I6IFVuc2FmZUpvYjsgY291bnQ6IG51bWJlcjsgdG9DYXA6IG51bWJlciB9PigpO1xuICAgICAgZm9yIChjb25zdCBqb2Igb2YgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2Uuam9icykge1xuICAgICAgICAvLyBTa2lwIGRpc2FibGVkIGpvYnMgYW5kIHRob3NlIHRoYXQgaGF2ZW4ndCBiZWVuIHVubG9ja2VkO1xuICAgICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5zZXR0aW5ncy5qb2JzW2pvYi5uYW1lXS5lbmFibGVkO1xuICAgICAgICBjb25zdCB1bmxvY2tlZCA9IGpvYi51bmxvY2tlZDtcbiAgICAgICAgaWYgKCFlbmFibGVkIHx8ICF1bmxvY2tlZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4S2l0dGVuc0luSm9iID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0Sm9iTGltaXQoam9iLm5hbWUpO1xuICAgICAgICBjb25zdCBtYXhLaXR0ZW5zVG9Bc3NpZ24gPSBuZWdhdGl2ZU9uZVRvSW5maW5pdHkodGhpcy5zZXR0aW5ncy5qb2JzW2pvYi5uYW1lXS5tYXgpO1xuICAgICAgICBjb25zdCBraXR0ZW5zSW5Kb2IgPSBqb2IudmFsdWU7XG4gICAgICAgIGlmIChraXR0ZW5zSW5Kb2IgPCBtYXhLaXR0ZW5zSW5Kb2IgJiYga2l0dGVuc0luSm9iIDwgbWF4S2l0dGVuc1RvQXNzaWduKSB7XG4gICAgICAgICAgam9ic05vdENhcHBlZC5wdXNoKHsgY291bnQ6IGtpdHRlbnNJbkpvYiwgam9iLCB0b0NhcDogbWF4S2l0dGVuc0luSm9iIC0ga2l0dGVuc0luSm9iIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgham9ic05vdENhcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBfY291bGRfIGFzc2lnbiBmYXJtZXJzIF9hbmRfIGN1cnJlbnRseSBkb24ndCBoYXZlIGFueSBhc3NpZ25lZC5cbiAgICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMsIGRvbid0IGFzc2lnbiBhbnkga2l0dGVucyBpbnRvIGpvYnMgd2l0aG91dCBoYXZpbmcgZmlsbGVkXG4gICAgICAvLyB0aGF0IHNpbmdsZSBvcGVuIGZhcm1lciBwb3NpdGlvbiBmaXJzdC4gVGhpcyBtaWdodCBwcmV2ZW50IGtpdHRlbiBkZWF0aCBpblxuICAgICAgLy8gY2VydGFpbiBzY2VuYXJpb3MuXG4gICAgICBjb25zdCBub0Zhcm1lcnNBc3NpZ25lZCA9ICFpc05pbChcbiAgICAgICAgam9ic05vdENhcHBlZC5maW5kKGpvYiA9PiBqb2Iuam9iLm5hbWUgPT09IFwiZmFybWVyXCIgJiYgam9iLmNvdW50ID09PSAwKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGpvYiB3aXRoIHRoZSBsZWFzdCBraXR0ZW5zIGFzc2lnbmVkIGFuZCBhc3NpZ24gYSBraXR0ZW4gdG8gdGhhdCBqb2IuXG4gICAgICBqb2JzTm90Q2FwcGVkLnNvcnQoKGEsIGIpID0+IGEuY291bnQgLSBiLmNvdW50KTtcbiAgICAgIGNvbnN0IGpvYk5hbWUgPSBub0Zhcm1lcnNBc3NpZ25lZCA/IFwiZmFybWVyXCIgOiBqb2JzTm90Q2FwcGVkWzBdLmpvYi5uYW1lO1xuXG4gICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5hc3NpZ25Kb2IodGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UuZ2V0Sm9iKGpvYk5hbWUpLCAxKTtcbiAgICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcbiAgICAgICAgXCJhY3QuZGlzdHJpYnV0ZVwiLFxuICAgICAgICBbdGhpcy5faG9zdC5lbmdpbmUuaTE4bihgJHZpbGxhZ2Uuam9iLiR7am9iTmFtZX1gIGFzIGNvbnN0KV0sXG4gICAgICAgIFwia3MtZGlzdHJpYnV0ZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5faG9zdC5lbmdpbmUuc3RvcmVGb3JTdW1tYXJ5KFwiZGlzdHJpYnV0ZVwiLCBmcmVlS2l0dGVucyk7XG4gIH1cblxuICBhdXRvRWxlY3QoKTogdm9pZCB7XG4gICAgLy8gV2UgY2FuJ3QgYXNzaWduIGEgbGVhZGVyIGluIHRoZSBBbmFyY2h5IGNoYWxsZW5nZS5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLmNoYWxsZW5nZXMuaXNBY3RpdmUoXCJhbmFyY2h5XCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2l0dGVucyA9IHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zO1xuICAgIGNvbnN0IGxlYWRlciA9IHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmxlYWRlcjtcbiAgICBjb25zdCBqb2IgPSB0aGlzLnNldHRpbmdzLmVsZWN0TGVhZGVyLmpvYi5zZWxlY3RlZDtcbiAgICBjb25zdCB0cmFpdCA9IHRoaXMuc2V0dGluZ3MuZWxlY3RMZWFkZXIudHJhaXQuc2VsZWN0ZWQ7XG5cbiAgICBjb25zdCBsZWFkZXJDYW5kaWRhdGVzID0ga2l0dGVucy5maWx0ZXIoXG4gICAgICBraXR0ZW4gPT4gKGtpdHRlbi5qb2IgPT09IGpvYiB8fCBqb2IgPT09IFwiYW55XCIpICYmIGtpdHRlbi50cmFpdC5uYW1lID09PSB0cmFpdCxcbiAgICApO1xuXG4gICAgaWYgKGxlYWRlckNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGVhZGVyQ2FuZGlkYXRlcy5zb3J0KChhLCBiKSA9PiBiLnJhbmsgLSBhLnJhbmspO1xuICAgIGNvbnN0IGJlc3RMZWFkZXIgPSBsZWFkZXJDYW5kaWRhdGVzWzBdO1xuICAgIGlmICghaXNOaWwobGVhZGVyKSkge1xuICAgICAgaWYgKFxuICAgICAgICBsZWFkZXIudHJhaXQubmFtZSA9PT0gdHJhaXQgJiZcbiAgICAgICAgKGxlYWRlci5qb2IgPT09IGpvYiB8fCBqb2IgPT09IFwiYW55XCIpICYmXG4gICAgICAgIGJlc3RMZWFkZXIucmFuayA8PSBsZWFkZXIucmFua1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5tYWtlTGVhZGVyKGJlc3RMZWFkZXIpO1xuICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5lbGVjdFwiKTtcbiAgfVxuXG4gIGF1dG9Qcm9tb3RlS2l0dGVucygpOiB2b2lkIHtcbiAgICBjb25zdCBnb2xkID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldFJlc291cmNlKFwiZ29sZFwiKTtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5wcm9tb3RlS2l0dGVucy50cmlnZ2VyIDwgZ29sZC52YWx1ZSAvIGdvbGQubWF4VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgbGV0IGtpdHRlbkluZGV4ID0gMDtcbiAgICAgIGtpdHRlbkluZGV4IDwgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2Uuc2ltLmtpdHRlbnMubGVuZ3RoO1xuICAgICAga2l0dGVuSW5kZXgrK1xuICAgICkge1xuICAgICAgbGV0IHRpZXIgPSAtMTtcbiAgICAgIGNvbnN0IGVuZ2luZWVyU3BlY2lhbGl0eSA9XG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5raXR0ZW5zW2tpdHRlbkluZGV4XS5lbmdpbmVlclNwZWNpYWxpdHk7XG4gICAgICAvLyBJZiB0aGlzIGtpdHRlbiBoYXMgbm8gZW5naW5lZXIgc3BlY2lhbHR5LCBza2lwIGl0LlxuICAgICAgaWYgKGlzTmlsKGVuZ2luZWVyU3BlY2lhbGl0eSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHdoaWNoIHJhbmsgd291bGQgYmUgaWRlYWwgZm9yIHRoZWlyIGNyYWZ0LlxuICAgICAgdGllciA9IG11c3RFeGlzdCh0aGlzLl9ob3N0LmdhbWUud29ya3Nob3AuZ2V0Q3JhZnQoZW5naW5lZXJTcGVjaWFsaXR5KSkudGllcjtcbiAgICAgIC8vIElmIHRoZSByYW5rIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCwgY2hlY2sgbmV4dCBraXR0ZW4uXG4gICAgICBpZiAodGllciA8PSB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5zaW0ua2l0dGVuc1traXR0ZW5JbmRleF0ucmFuaykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhbiBlbmdpbmVlciB0aGF0IGlzbid0IGF0IHRoZWlyIGlkZWFsIHJhbmsuXG4gICAgICAvLyBObyBuZWVkIHRvIGxvb2sgZnVydGhlci5cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnByb21vdGVLaXR0ZW5zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgYXV0b1Byb21vdGVMZWFkZXIoKTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBDaXZpbCBTZXJ2aWNlIHVubG9ja2VkIGFuZCBhIGxlYWRlciBlbGVjdGVkLlxuICAgIGlmIChcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS5zY2llbmNlLmdldChcImNpdmlsXCIpLnJlc2VhcmNoZWQgJiZcbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmxlYWRlciAhPT0gbnVsbFxuICAgICkge1xuICAgICAgY29uc3QgbGVhZGVyID0gdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2UubGVhZGVyO1xuICAgICAgY29uc3QgcmFuayA9IGxlYWRlci5yYW5rO1xuICAgICAgY29uc3QgZ29sZCA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcImdvbGRcIik7XG4gICAgICBjb25zdCBnb2xkU3RvY2sgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0U3RvY2soXCJnb2xkXCIpO1xuXG4gICAgICAvLyB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5zaW0uZ29sZFRvUHJvbW90ZSB3aWxsIGNoZWNrIGdvbGRcbiAgICAgIC8vIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5wcm9tb3RlIGNoZWNrIGJvdGggZ29sZCBhbmQgZXhwXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLnNpbS5nb2xkVG9Qcm9tb3RlKHJhbmssIHJhbmsgKyAxLCBnb2xkLnZhbHVlIC0gZ29sZFN0b2NrKVswXSAmJlxuICAgICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZS5zaW0ucHJvbW90ZShsZWFkZXIsIHJhbmsgKyAxKSA9PT0gMVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmlhY3Rpdml0eShcImFjdC5wcm9tb3RlXCIsIFtyYW5rICsgMV0sIFwia3MtcHJvbW90ZVwiKTtcbiAgICAgICAgdGhpcy5faG9zdC5nYW1lLnZpbGxhZ2VUYWIuY2Vuc3VzUGFuZWw/LmNlbnN1cy5yZW5kZXJHb3Zlcm5tZW50KFxuICAgICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlVGFiLmNlbnN1c1BhbmVsLmNlbnN1cy5jb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlVGFiLmNlbnN1c1BhbmVsPy5jZW5zdXMudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnN0b3JlRm9yU3VtbWFyeShcInByb21vdGVcIiwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXV0b0h1bnQoY2FjaGVNYW5hZ2VyPzogTWF0ZXJpYWxzQ2FjaGUpIHtcbiAgICBjb25zdCBtYW5wb3dlciA9IHRoaXMuX3dvcmtzaG9wTWFuYWdlci5nZXRSZXNvdXJjZShcIm1hbnBvd2VyXCIpO1xuICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLmh1bnQudHJpZ2dlcjtcblxuICAgIGlmIChtYW5wb3dlci52YWx1ZSA8IDEwMCB8fCB0aGlzLl9ob3N0LmdhbWUuY2hhbGxlbmdlcy5pc0FjdGl2ZShcInBhY2lmaXNtXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXIgPD0gbWFucG93ZXIudmFsdWUgLyBtYW5wb3dlci5tYXhWYWx1ZSAmJiAxMDAgPD0gbWFucG93ZXIudmFsdWUpIHtcbiAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBodW50cyBhcmUgYmVpbmcgcGVyZm9ybWVkLlxuICAgICAgY29uc3QgaHVudENvdW50ID0gTWF0aC5mbG9vcihtYW5wb3dlci52YWx1ZSAvIDEwMCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJodW50XCIsIGh1bnRDb3VudCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJhY3QuaHVudFwiLCBbdGhpcy5faG9zdC5yZW5kZXJBYnNvbHV0ZShodW50Q291bnQpXSwgXCJrcy1odW50XCIpO1xuXG4gICAgICBjb25zdCBhdmVyYWdlT3V0cHV0ID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyLmdldEF2ZXJhZ2VIdW50KCk7XG4gICAgICBjb25zdCB0cnVlT3V0cHV0OiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZSwgbnVtYmVyPj4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBbb3V0LCBvdXRWYWx1ZV0gb2Ygb2JqZWN0RW50cmllcyhhdmVyYWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLl93b3Jrc2hvcE1hbmFnZXIuZ2V0UmVzb3VyY2Uob3V0KTtcbiAgICAgICAgdHJ1ZU91dHB1dFtvdXRdID1cbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY2FwcGVkIHJlc291cmNlLi4uXG4gICAgICAgICAgMCA8IHJlcy5tYXhWYWx1ZVxuICAgICAgICAgICAgPyAvLyBtdWx0aXBseSB0aGUgYW1vdW50IG9mIHRpbWVzIHdlIGh1bnRlZCB3aXRoIHRoZSByZXN1bHQgb2YgYW4gYXZlcmFnZSBodW50LlxuICAgICAgICAgICAgICAvLyBDYXBwaW5nIGF0IHRoZSBtYXggdmFsdWUgYW5kIDAgYm91bmRzLlxuICAgICAgICAgICAgICBNYXRoLm1pbihvdXRWYWx1ZSAqIGh1bnRDb3VudCwgTWF0aC5tYXgocmVzLm1heFZhbHVlIC0gcmVzLnZhbHVlLCAwKSlcbiAgICAgICAgICAgIDogLy8gT3RoZXJ3aXNlLCBqdXN0IG11bHRpcGx5IHVuYm91bmRlZFxuICAgICAgICAgICAgICBvdXRWYWx1ZSAqIGh1bnRDb3VudDtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGhlIGh1bnRlZCByZXNvdXJjZXMgaW4gdGhlIGNhY2hlLiBXaHk/IE5vIGlkZWEuXG4gICAgICBpZiAoIWlzTmlsKGNhY2hlTWFuYWdlcikpIHtcbiAgICAgICAgY2FjaGVNYW5hZ2VyLnB1c2hUb0NhY2hlKHtcbiAgICAgICAgICBtYXRlcmlhbHM6IHRydWVPdXRwdXQsXG4gICAgICAgICAgdGltZVN0YW1wOiB0aGlzLl9ob3N0LmdhbWUudGltZXIudGlja3NUb3RhbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdyBhY3R1YWxseSBwZXJmb3JtIHRoZSBodW50cy5cbiAgICAgIHRoaXMuX2hvc3QuZ2FtZS52aWxsYWdlLmh1bnRBbGwoKTtcbiAgICB9XG4gIH1cblxuICBhdXRvRmVzdGl2YWwoY2FjaGVNYW5hZ2VyPzogTWF0ZXJpYWxzQ2FjaGUpIHtcbiAgICAvLyBJZiB3ZSBoYXZlbid0IHJlc2VhcmNoZWQgZmVzdGl2YWxzIHlldCwgb3Igc3RpbGwgaGF2ZSBtb3JlIHRoYW4gNDAwIGRheXMgbGVmdCBvbiBvbmUsXG4gICAgLy8gZG9uJ3QgaG9sZCAoYW5vdGhlcikgb25lLlxuICAgIGlmIChcbiAgICAgICF0aGlzLl9ob3N0LmdhbWUuc2NpZW5jZS5nZXQoXCJkcmFtYVwiKS5yZXNlYXJjaGVkIHx8XG4gICAgICA0MDAgPCB0aGlzLl9ob3N0LmdhbWUuY2FsZW5kYXIuZmVzdGl2YWxEYXlzXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBzdGFja2VkIGZlc3RpdmFscyByZXNlYXJjaGVkIHlldCwgYW5kIHdlIHN0aWxsIGhhdmUgZGF5cyBsZWZ0IG9uIG9uZSxcbiAgICAvLyBkb24ndCBob2xkIG9uZS5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5faG9zdC5nYW1lLnByZXN0aWdlLmdldFBlcmsoXCJjYXJuaXZhbHNcIikucmVzZWFyY2hlZCAmJlxuICAgICAgMCA8IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5mZXN0aXZhbERheXNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBjYW4gYWZmb3JkIGEgZmVzdGl2YWwuXG4gICAgY29uc3QgY3JhZnRNYW5hZ2VyID0gdGhpcy5fd29ya3Nob3BNYW5hZ2VyO1xuICAgIGlmIChcbiAgICAgIGNyYWZ0TWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcIm1hbnBvd2VyXCIpIDwgMTUwMCB8fFxuICAgICAgY3JhZnRNYW5hZ2VyLmdldFZhbHVlQXZhaWxhYmxlKFwiY3VsdHVyZVwiKSA8IDUwMDAgfHxcbiAgICAgIGNyYWZ0TWFuYWdlci5nZXRWYWx1ZUF2YWlsYWJsZShcInBhcmNobWVudFwiKSA8IDI1MDBcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmVzdGl2YWwgd291bGQgZXZlbiBiZSBwcm9maXRhYmxlIGZvciBhbnkgcmVzb3VyY2UgcHJvZHVjdGlvbi5cbiAgICBjb25zdCBjYXRwb3dQcm9maXRhYmxlID1cbiAgICAgIDQwMDAgKlxuICAgICAgICAoY3JhZnRNYW5hZ2VyLmdldFRpY2tWYWwoXG4gICAgICAgICAgY3JhZnRNYW5hZ2VyLmdldFJlc291cmNlKFwibWFucG93ZXJcIiksXG4gICAgICAgICAgY2FjaGVNYW5hZ2VyLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICkgYXMgbnVtYmVyKSA+XG4gICAgICAxNTAwO1xuICAgIGNvbnN0IGN1bHR1cmVQcm9maXRhYmxlID1cbiAgICAgIDQwMDAgKlxuICAgICAgICAoY3JhZnRNYW5hZ2VyLmdldFRpY2tWYWwoXG4gICAgICAgICAgY3JhZnRNYW5hZ2VyLmdldFJlc291cmNlKFwiY3VsdHVyZVwiKSxcbiAgICAgICAgICBjYWNoZU1hbmFnZXIsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKSBhcyBudW1iZXIpID5cbiAgICAgIDUwMDA7XG4gICAgY29uc3QgcGFyY2hQcm9maXRhYmxlID1cbiAgICAgIDQwMDAgKlxuICAgICAgICAoY3JhZnRNYW5hZ2VyLmdldFRpY2tWYWwoXG4gICAgICAgICAgY3JhZnRNYW5hZ2VyLmdldFJlc291cmNlKFwicGFyY2htZW50XCIpLFxuICAgICAgICAgIGNhY2hlTWFuYWdlcixcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApIGFzIG51bWJlcikgPlxuICAgICAgMjUwMDtcblxuICAgIGlmICghY2F0cG93UHJvZml0YWJsZSAmJiAhY3VsdHVyZVByb2ZpdGFibGUgJiYgIXBhcmNoUHJvZml0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB0aGUgdGFiIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidXR0b25zIGFjdHVhbGx5IGV4aXN0IGluIHRoZSBET00uIE90aGVyd2lzZSB3ZSBjYW4ndCBjbGljayB0aGVtLlxuICAgIHRoaXMubWFuYWdlci5yZW5kZXIoKTtcblxuICAgIC8vIE5vdyB3ZSBob2xkIHRoZSBmZXN0aXZhbC5cbiAgICBpZiAodGhpcy5faG9zdC5nYW1lLnZpbGxhZ2VUYWIuZmVzdGl2YWxCdG4ubW9kZWwuZW5hYmxlZCkge1xuICAgICAgY29uc3QgYmVmb3JlRGF5cyA9IHRoaXMuX2hvc3QuZ2FtZS5jYWxlbmRhci5mZXN0aXZhbERheXM7XG4gICAgICB0aGlzLl9ob3N0LmdhbWUudmlsbGFnZVRhYi5mZXN0aXZhbEJ0bi5vbkNsaWNrKCk7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5zdG9yZUZvclN1bW1hcnkoXCJmZXN0aXZhbFwiKTtcbiAgICAgIGlmIChiZWZvcmVEYXlzID4gMCkge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJmZXN0aXZhbC5leHRlbmRcIiwgW10sIFwia3MtZmVzdGl2YWxcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pYWN0aXZpdHkoXCJmZXN0aXZhbC5ob2xkXCIsIFtdLCBcImtzLWZlc3RpdmFsXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwsIHR5cGUgTWF5YmUsIG11c3RFeGlzdCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHVua25vd25Ub0Vycm9yIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvZXJyb3Itc2VyaWFsaXplci5qc1wiO1xuaW1wb3J0IHsgbWVhc3VyZSwgbWVhc3VyZUFzeW5jIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9tZWFzdXJlbWVudC9wZXJmb3JtYW5jZS5qc1wiO1xuaW1wb3J0IHsgQm9uZmlyZU1hbmFnZXIgfSBmcm9tIFwiLi9Cb25maXJlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBY3Rpdml0eUNsYXNzLFxuICBBY3Rpdml0eVN1bW1hcnksXG4gIHR5cGUgQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbixcbiAgdHlwZSBBY3Rpdml0eVR5cGVDbGFzcyxcbn0gZnJvbSBcIi4vaGVscGVyL0FjdGl2aXR5U3VtbWFyeS5qc1wiO1xuaW1wb3J0IGVuVVMgZnJvbSBcIi4vaTE4bi9lbi1VUy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgZGVERSBmcm9tIFwiLi9pMThuL3RyYW5zbGF0aW9ucy9kZS1ERS5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgaGVJTCBmcm9tIFwiLi9pMThuL3RyYW5zbGF0aW9ucy9oZS1JTC5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgemhDTiBmcm9tIFwiLi9pMThuL3RyYW5zbGF0aW9ucy96aC1DTi5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgeyB0eXBlIEtpdHRlblNjaWVudGlzdHMsIGtzVmVyc2lvbiB9IGZyb20gXCIuL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uTWFuYWdlciB9IGZyb20gXCIuL1JlbGlnaW9uTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgU2NpZW5jZU1hbmFnZXIgfSBmcm9tIFwiLi9TY2llbmNlTWFuYWdlci5qc1wiO1xuaW1wb3J0IHsgU3BhY2VNYW5hZ2VyIH0gZnJvbSBcIi4vU3BhY2VNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBCb25maXJlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IEVuZ2luZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvRW5naW5lU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9SZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBTY2llbmNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TY2llbmNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNwYWNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUaW1lQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVGltZUNvbnRyb2xTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGltZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVGltZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUcmFkZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVHJhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVmlsbGFnZVNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvVmlsbGFnZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBXb3Jrc2hvcFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvV29ya3Nob3BTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVGltZUNvbnRyb2xNYW5hZ2VyIH0gZnJvbSBcIi4vVGltZUNvbnRyb2xNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBUaW1lTWFuYWdlciB9IGZyb20gXCIuL1RpbWVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBUcmFkZU1hbmFnZXIgfSBmcm9tIFwiLi9UcmFkZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyB0eXBlIEN5Y2xlLCBDeWNsZXMsIHR5cGUgTG9jYWxlLCB0eXBlIFBsYW5ldCB9IGZyb20gXCIuL3R5cGVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBGYWxsYmFja0xvY2FsZSwgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IFZpbGxhZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vVmlsbGFnZU1hbmFnZXIuanNcIjtcbmltcG9ydCB7IFdvcmtzaG9wTWFuYWdlciB9IGZyb20gXCIuL1dvcmtzaG9wTWFuYWdlci5qc1wiO1xuXG5jb25zdCBpMThuRGF0YSA9IHsgXCJkZS1ERVwiOiBkZURFLCBcImVuLVVTXCI6IGVuVVMsIFwiaGUtSUxcIjogaGVJTCwgXCJ6aC1DTlwiOiB6aENOIH07XG5cbmV4cG9ydCB0eXBlIEZyYW1lQ29udGV4dCA9IHtcbiAgcmVxdWVzdEdhbWVVaVJlZnJlc2g6IGJvb2xlYW47XG5cbiAgZW50cnk6IG51bWJlcjtcbiAgZXhpdDogbnVtYmVyO1xuICBtZWFzdXJlbWVudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHVuZGVmaW5lZD47XG59O1xuZXhwb3J0IHR5cGUgQXV0b21hdGlvbiA9IHtcbiAgdGljayhjb250ZXh0OiBGcmFtZUNvbnRleHQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn07XG5leHBvcnQgdHlwZSBFbmdpbmVTdGF0ZSA9IHtcbiAgdjogc3RyaW5nO1xuICBlbmdpbmU6IEVuZ2luZVNldHRpbmdzO1xuICBib25maXJlOiBCb25maXJlU2V0dGluZ3M7XG4gIHJlbGlnaW9uOiBSZWxpZ2lvblNldHRpbmdzO1xuICBzY2llbmNlOiBTY2llbmNlU2V0dGluZ3M7XG4gIHNwYWNlOiBTcGFjZVNldHRpbmdzO1xuICB0aW1lQ29udHJvbDogVGltZUNvbnRyb2xTZXR0aW5ncztcbiAgdGltZTogVGltZVNldHRpbmdzO1xuICB0cmFkZTogVHJhZGVTZXR0aW5ncztcbiAgdmlsbGFnZTogVmlsbGFnZVNldHRpbmdzO1xuICB3b3Jrc2hvcDogV29ya3Nob3BTZXR0aW5ncztcbn07XG5cbmV4cG9ydCB0eXBlIFN1cHBvcnRlZExvY2FsZSA9IFwiZGUtREVcIiB8IFwiZW4tVVNcIiB8IFwiaGUtSUxcIiB8IFwiemgtQ05cIjtcblxuZXhwb3J0IHR5cGUgVHJhbnNsYXRlZFN0cmluZzxUS2l0dGVuR2FtZUxpdGVyYWwgZXh0ZW5kcyBgJCR7c3RyaW5nfWA+ID1cbiAgfCBrZXlvZiAodHlwZW9mIGkxOG5EYXRhKVtcImVuLVVTXCJdXG4gIHwgVEtpdHRlbkdhbWVMaXRlcmFsO1xuXG5leHBvcnQgY2xhc3MgRW5naW5lIHtcbiAgLyoqXG4gICAqIEFsbCBpMThuIGxpdGVyYWxzIG9mIHRoZSB1c2Vyc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaTE4bkRhdGE6IHR5cGVvZiBpMThuRGF0YTtcblxuICAvKipcbiAgICogV2FzIGFueSBzdGF0ZSBsb2FkZWQgaW50byB0aGlzIGVuZ2luZSBhdCBhbnkgcG9pbnQgaW4gdGltZT9cbiAgICovXG4gIHByaXZhdGUgX2lzTG9hZGVkID0gZmFsc2U7XG5cbiAgZ2V0IGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0xvYWRlZDtcbiAgfVxuXG4gIHJlYWRvbmx5IF9ob3N0OiBLaXR0ZW5TY2llbnRpc3RzO1xuICByZWFkb25seSBzZXR0aW5nczogRW5naW5lU2V0dGluZ3M7XG4gIHJlYWRvbmx5IGJvbmZpcmVNYW5hZ2VyOiBCb25maXJlTWFuYWdlcjtcbiAgcmVhZG9ubHkgcmVsaWdpb25NYW5hZ2VyOiBSZWxpZ2lvbk1hbmFnZXI7XG4gIHJlYWRvbmx5IHNjaWVuY2VNYW5hZ2VyOiBTY2llbmNlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc3BhY2VNYW5hZ2VyOiBTcGFjZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHRpbWVDb250cm9sTWFuYWdlcjogVGltZUNvbnRyb2xNYW5hZ2VyO1xuICByZWFkb25seSB0aW1lTWFuYWdlcjogVGltZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHRyYWRlTWFuYWdlcjogVHJhZGVNYW5hZ2VyO1xuICByZWFkb25seSB2aWxsYWdlTWFuYWdlcjogVmlsbGFnZU1hbmFnZXI7XG4gIHJlYWRvbmx5IHdvcmtzaG9wTWFuYWdlcjogV29ya3Nob3BNYW5hZ2VyO1xuXG4gIHByaXZhdGUgX2FjdGl2aXR5U3VtbWFyeTogQWN0aXZpdHlTdW1tYXJ5O1xuICBwcml2YXRlIF90aW1lb3V0TWFpbkxvb3A6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBLaXR0ZW5TY2llbnRpc3RzLCBnYW1lTGFuZ3VhZ2U6IExvY2FsZSkge1xuICAgIHRoaXMuc2V0dGluZ3MgPSBuZXcgRW5naW5lU2V0dGluZ3MoKTtcblxuICAgIHRoaXMuX2kxOG5EYXRhID0gaTE4bkRhdGE7XG4gICAgdGhpcy5zZXRMYW5ndWFnZShnYW1lTGFuZ3VhZ2UsIGZhbHNlKTtcblxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuX2FjdGl2aXR5U3VtbWFyeSA9IG5ldyBBY3Rpdml0eVN1bW1hcnkodGhpcy5faG9zdCk7XG5cbiAgICB0aGlzLndvcmtzaG9wTWFuYWdlciA9IG5ldyBXb3Jrc2hvcE1hbmFnZXIodGhpcy5faG9zdCk7XG5cbiAgICB0aGlzLmJvbmZpcmVNYW5hZ2VyID0gbmV3IEJvbmZpcmVNYW5hZ2VyKHRoaXMuX2hvc3QsIHRoaXMud29ya3Nob3BNYW5hZ2VyKTtcbiAgICB0aGlzLnJlbGlnaW9uTWFuYWdlciA9IG5ldyBSZWxpZ2lvbk1hbmFnZXIoXG4gICAgICB0aGlzLl9ob3N0LFxuICAgICAgdGhpcy5ib25maXJlTWFuYWdlcixcbiAgICAgIHRoaXMud29ya3Nob3BNYW5hZ2VyLFxuICAgICk7XG4gICAgdGhpcy5zY2llbmNlTWFuYWdlciA9IG5ldyBTY2llbmNlTWFuYWdlcih0aGlzLl9ob3N0LCB0aGlzLndvcmtzaG9wTWFuYWdlcik7XG4gICAgdGhpcy5zcGFjZU1hbmFnZXIgPSBuZXcgU3BhY2VNYW5hZ2VyKHRoaXMuX2hvc3QsIHRoaXMud29ya3Nob3BNYW5hZ2VyKTtcbiAgICB0aGlzLnRpbWVDb250cm9sTWFuYWdlciA9IG5ldyBUaW1lQ29udHJvbE1hbmFnZXIoXG4gICAgICB0aGlzLl9ob3N0LFxuICAgICAgdGhpcy5ib25maXJlTWFuYWdlcixcbiAgICAgIHRoaXMucmVsaWdpb25NYW5hZ2VyLFxuICAgICAgdGhpcy5zcGFjZU1hbmFnZXIsXG4gICAgICB0aGlzLndvcmtzaG9wTWFuYWdlcixcbiAgICApO1xuICAgIHRoaXMudGltZU1hbmFnZXIgPSBuZXcgVGltZU1hbmFnZXIodGhpcy5faG9zdCwgdGhpcy53b3Jrc2hvcE1hbmFnZXIpO1xuICAgIHRoaXMudHJhZGVNYW5hZ2VyID0gbmV3IFRyYWRlTWFuYWdlcih0aGlzLl9ob3N0LCB0aGlzLndvcmtzaG9wTWFuYWdlcik7XG4gICAgdGhpcy52aWxsYWdlTWFuYWdlciA9IG5ldyBWaWxsYWdlTWFuYWdlcih0aGlzLl9ob3N0LCB0aGlzLndvcmtzaG9wTWFuYWdlcik7XG4gIH1cblxuICBpc0xhbmd1YWdlU3VwcG9ydGVkKGxhbmd1YWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5faTE4bkRhdGEpLnNvbWUobG9jYWxlID0+IGxvY2FsZS5zdGFydHNXaXRoKGAke2xhbmd1YWdlfS1gKSk7XG4gIH1cblxuICBpc0xvY2FsZVN1cHBvcnRlZChsb2NhbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsb2NhbGUgaW4gdGhpcy5faTE4bkRhdGE7XG4gIH1cblxuICBsb2NhbGVTdXBwb3J0c0ZpcnN0TGV0dGVyU3BsaXRzKGxvY2FsZSA9IHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxvY2FsZSAhPT0gXCJ6aC1DTlwiO1xuICB9XG5cbiAgbG9jYWxlRm9yTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IFN1cHBvcnRlZExvY2FsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIChPYmplY3Qua2V5cyh0aGlzLl9pMThuRGF0YSkgYXMgUmVhZG9ubHlBcnJheTxTdXBwb3J0ZWRMb2NhbGU+KS5maW5kKGxvY2FsZSA9PlxuICAgICAgbG9jYWxlLnN0YXJ0c1dpdGgoYCR7bGFuZ3VhZ2V9LWApLFxuICAgICk7XG4gIH1cblxuICBzZXRMYW5ndWFnZShsYW5ndWFnZTogTG9jYWxlLCByZWJ1aWxkVUkgPSB0cnVlKSB7XG4gICAgY29uc3QgcHJldmlvdXNMb2NhbGUgPSB0aGlzLnNldHRpbmdzLmxvY2FsZS5zZWxlY3RlZDtcbiAgICBpZiAoIXRoaXMuaXNMYW5ndWFnZVN1cHBvcnRlZChsYW5ndWFnZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgYFJlcXVlc3RlZCBsYW5ndWFnZSAnJHtsYW5ndWFnZX0nIGlzIG5vdCBhdmFpbGFibGUuIEZhbGxpbmcgYmFjayB0byAnJHtGYWxsYmFja0xvY2FsZX0nLmAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQgPSBGYWxsYmFja0xvY2FsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbG9jYWxlID0gbXVzdEV4aXN0KHRoaXMubG9jYWxlRm9yTGFuZ3VhZ2UobGFuZ3VhZ2UpKTtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChgU2VsZWN0aW5nIGxhbmd1YWdlICcke2xvY2FsZX0nLmApKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkID0gbG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0xvY2FsZSAhPT0gdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQgJiYgcmVidWlsZFVJKSB7XG4gICAgICB0aGlzLl9ob3N0LnJlYnVpbGRVaSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvY2FsZShsb2NhbGU6IFN1cHBvcnRlZExvY2FsZSwgcmVidWlsZFVJID0gdHJ1ZSkge1xuICAgIGNvbnN0IHByZXZpb3VzTG9jYWxlID0gdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQ7XG4gICAgaWYgKCF0aGlzLmlzTG9jYWxlU3VwcG9ydGVkKGxvY2FsZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgYFJlcXVlc3RlZCBsYW5ndWFnZSAnJHtsb2NhbGV9JyBpcyBub3QgYXZhaWxhYmxlLiBGYWxsaW5nIGJhY2sgdG8gJyR7RmFsbGJhY2tMb2NhbGV9Jy5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkID0gRmFsbGJhY2tMb2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChgU2VsZWN0aW5nIGxhbmd1YWdlICcke2xvY2FsZX0nLmApKTtcbiAgICAgIHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkID0gbG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0xvY2FsZSAhPT0gdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQgJiYgcmVidWlsZFVJKSB7XG4gICAgICB0aGlzLl9ob3N0LnJlYnVpbGRVaSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIG5ldyBzdGF0ZSBpbnRvIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgZW5naW5lIHN0YXRlIHRvIGxvYWQuXG4gICAqIEBwYXJhbSByZXRhaW5NZXRhQmVoYXZpb3IgV2hlbiBzZXQgdG8gYHRydWVgLCB0aGUgZW5naW5lIHdpbGwgbm90IGJlIHN0b3BwZWQgb3Igc3RhcnRlZCwgaWYgdGhlIGVuZ2luZVxuICAgKiBzdGF0ZSB3b3VsZCByZXF1aXJlIHRoYXQuIFRoZSBzZXR0aW5ncyBmb3Igc3RhdGUgbWFuYWdlbWVudCBhcmUgYWxzbyBub3QgbG9hZGVkIGZyb20gdGhlIGVuZ2luZSBzdGF0ZS5cbiAgICogVGhpcyBpcyBpbnRlbmRlZCB0byBtYWtlIGxvYWRpbmcgb2YgcHJldmlvdXMgc2V0dGluZ3Mgc25hcHNob3RzIG1vcmUgaW50dWl0aXZlLlxuICAgKi9cbiAgc3RhdGVMb2FkKHNldHRpbmdzOiBFbmdpbmVTdGF0ZSwgcmV0YWluTWV0YUJlaGF2aW9yID0gZmFsc2UpIHtcbiAgICB0aGlzLl9pc0xvYWRlZCA9IHRydWU7XG5cbiAgICB0aGlzLnN0b3AoZmFsc2UpO1xuXG4gICAgLy8gRm9yIG5vdywgd2Ugb25seSBsb2cgYSB3YXJuaW5nIG9uIG1pc21hdGNoaW5nIHRhZ3MuXG4gICAgLy8gSWRlYWxseSwgd2Ugd291bGQgcGVyZm9ybSBzZW12ZXIgY29tcGFyaXNvbiwgYnV0IHRoYXQgaXNcbiAgICAvLyBleGNlc3NpdmUgYXQgdGhpcyBwb2ludCBpbiB0aW1lLiBUaGUgZ29hbCBzaG91bGQgYmUgYSBzdGFibGVcbiAgICAvLyBzdGF0ZSBpbXBvcnQgb2YgbW9zdCB2ZXJzaW9ucyBhbnl3YXkuXG4gICAgY29uc3QgdmVyc2lvbiA9IGtzVmVyc2lvbigpO1xuICAgIGlmIChzZXR0aW5ncy52ICE9PSB2ZXJzaW9uKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIC4uLmNsKFxuICAgICAgICAgIGBBdHRlbXB0aW5nIHRvIGxvYWQgZW5naW5lIHN0YXRlIHdpdGggdmVyc2lvbiB0YWcgJyR7c2V0dGluZ3Mudn0nIHdoZW4gZW5naW5lIGlzIGF0IHZlcnNpb24gJyR7dmVyc2lvbn0nIWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gdGhlIGxvYWQgb2YgZWFjaCBzdWIgc2V0dGluZ3Mgc2VjdGlvbiBpbiBhIHRyeS1jYXRjaCB0b1xuICAgIC8vIGFsbG93IHVzIHRvIHN0aWxsIGxvYWQgdGhlIG90aGVyIHNlY3Rpb25zIGlmIHRoZXJlIHdlcmUgc2NoZW1hXG4gICAgLy8gY2hhbmdlcy5cbiAgICBjb25zdCBhdHRlbXB0TG9hZCA9IChsb2FkZXI6ICgpID0+IHVua25vd24sIGVycm9yTWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2FkZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woYEZhaWxlZCBsb2FkIG9mICR7ZXJyb3JNZXNzYWdlfSBzZXR0aW5ncy5gLCBlcnJvcikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBhdHRlbXB0TG9hZCgoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzLmxvYWQoc2V0dGluZ3MuZW5naW5lLCByZXRhaW5NZXRhQmVoYXZpb3IpO1xuICAgIH0sIFwiZW5naW5lXCIpO1xuICAgIGF0dGVtcHRMb2FkKCgpID0+IHtcbiAgICAgIHRoaXMuYm9uZmlyZU1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy5ib25maXJlKTtcbiAgICB9LCBcImJvbmZpcmVcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWxpZ2lvbk1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy5yZWxpZ2lvbik7XG4gICAgfSwgXCJyZWxpZ2lvblwiKTtcbiAgICBhdHRlbXB0TG9hZCgoKSA9PiB7XG4gICAgICB0aGlzLnNjaWVuY2VNYW5hZ2VyLnNldHRpbmdzLmxvYWQoc2V0dGluZ3Muc2NpZW5jZSk7XG4gICAgfSwgXCJzY2llbmNlXCIpO1xuICAgIGF0dGVtcHRMb2FkKCgpID0+IHtcbiAgICAgIHRoaXMuc3BhY2VNYW5hZ2VyLnNldHRpbmdzLmxvYWQoc2V0dGluZ3Muc3BhY2UpO1xuICAgIH0sIFwic3BhY2VcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lQ29udHJvbE1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy50aW1lQ29udHJvbCk7XG4gICAgfSwgXCJ0aW1lIGNvbnRyb2xcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lTWFuYWdlci5zZXR0aW5ncy5sb2FkKHNldHRpbmdzLnRpbWUpO1xuICAgIH0sIFwidGltZVwiKTtcbiAgICBhdHRlbXB0TG9hZCgoKSA9PiB7XG4gICAgICB0aGlzLnRyYWRlTWFuYWdlci5zZXR0aW5ncy5sb2FkKHNldHRpbmdzLnRyYWRlKTtcbiAgICB9LCBcInRyYWRlXCIpO1xuICAgIGF0dGVtcHRMb2FkKCgpID0+IHtcbiAgICAgIHRoaXMudmlsbGFnZU1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy52aWxsYWdlKTtcbiAgICB9LCBcInZpbGxhZ2VcIik7XG4gICAgYXR0ZW1wdExvYWQoKCkgPT4ge1xuICAgICAgdGhpcy53b3Jrc2hvcE1hbmFnZXIuc2V0dGluZ3MubG9hZChzZXR0aW5ncy53b3Jrc2hvcCk7XG4gICAgfSwgXCJ3b3Jrc2hvcFwiKTtcblxuICAgIHRoaXMuc2V0TG9jYWxlKHRoaXMuc2V0dGluZ3MubG9jYWxlLnNlbGVjdGVkKTtcblxuICAgIC8vIEVuc3VyZSB0aGUgbWFpbiBlbmdpbmUgc2V0dGluZyBpcyByZXNwZWN0ZWQuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGFydChmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBERUZBVUxUX1NUQVRFKCkge1xuICAgIHJldHVybiB7XG4gICAgICBib25maXJlOiBuZXcgQm9uZmlyZVNldHRpbmdzKCksXG4gICAgICBlbmdpbmU6IG5ldyBFbmdpbmVTZXR0aW5ncygpLFxuICAgICAgcmVsaWdpb246IG5ldyBSZWxpZ2lvblNldHRpbmdzKCksXG4gICAgICBzY2llbmNlOiBuZXcgU2NpZW5jZVNldHRpbmdzKCksXG4gICAgICBzcGFjZTogbmV3IFNwYWNlU2V0dGluZ3MoKSxcbiAgICAgIHRpbWU6IG5ldyBUaW1lU2V0dGluZ3MoKSxcbiAgICAgIHRpbWVDb250cm9sOiBuZXcgVGltZUNvbnRyb2xTZXR0aW5ncygpLFxuICAgICAgdHJhZGU6IG5ldyBUcmFkZVNldHRpbmdzKCksXG4gICAgICB2OiBrc1ZlcnNpb24oKSxcbiAgICAgIHZpbGxhZ2U6IG5ldyBWaWxsYWdlU2V0dGluZ3MoKSxcbiAgICAgIHdvcmtzaG9wOiBuZXcgV29ya3Nob3BTZXR0aW5ncygpLFxuICAgIH07XG4gIH1cblxuICBzdGF0ZVJlc2V0KCkge1xuICAgIHRoaXMuc3RhdGVMb2FkKEVuZ2luZS5ERUZBVUxUX1NUQVRFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFsbCBzZXR0aW5ncyBpbiB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGVuZ2luZSBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHN0YXRlU2VyaWFsaXplKCk6IEVuZ2luZVN0YXRlIHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9uZmlyZTogdGhpcy5ib25maXJlTWFuYWdlci5zZXR0aW5ncyxcbiAgICAgIGVuZ2luZTogdGhpcy5zZXR0aW5ncyxcbiAgICAgIHJlbGlnaW9uOiB0aGlzLnJlbGlnaW9uTWFuYWdlci5zZXR0aW5ncyxcbiAgICAgIHNjaWVuY2U6IHRoaXMuc2NpZW5jZU1hbmFnZXIuc2V0dGluZ3MsXG4gICAgICBzcGFjZTogdGhpcy5zcGFjZU1hbmFnZXIuc2V0dGluZ3MsXG4gICAgICB0aW1lOiB0aGlzLnRpbWVNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgdGltZUNvbnRyb2w6IHRoaXMudGltZUNvbnRyb2xNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgdHJhZGU6IHRoaXMudHJhZGVNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgdjoga3NWZXJzaW9uKCksXG4gICAgICB2aWxsYWdlOiB0aGlzLnZpbGxhZ2VNYW5hZ2VyLnNldHRpbmdzLFxuICAgICAgd29ya3Nob3A6IHRoaXMud29ya3Nob3BNYW5hZ2VyLnNldHRpbmdzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyBTaG91bGQgd2UgcHJpbnQgdG8gdGhlIGxvZyB0aGF0IHRoZSBlbmdpbmUgd2FzIHN0YXJ0ZWQ/XG4gICAqL1xuICBzdGFydChtc2cgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3RpbWVvdXRNYWluTG9vcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0OiBGcmFtZUNvbnRleHQgPSB7XG4gICAgICAgIGVudHJ5OiBEYXRlLm5vdygpLFxuICAgICAgICBleGl0OiAwLFxuICAgICAgICBtZWFzdXJlbWVudHM6IHt9LFxuICAgICAgICByZXF1ZXN0R2FtZVVpUmVmcmVzaDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9pdGVyYXRlKGNvbnRleHQpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb250ZXh0LmV4aXQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHRpbWVUYWtlbiA9IGNvbnRleHQuZXhpdCAtIGNvbnRleHQuZW50cnk7XG5cbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHR5cGVvZiBjb250ZXh0PihcImtzLnJlcG9ydEZyYW1lXCIsIHsgZGV0YWlsOiBjb250ZXh0IH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbWFpbiBsb29wIHdhcyB0ZXJtaW5hdGVkIGR1cmluZ1xuICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbi5cbiAgICAgICAgICBpZiAodGhpcy5fdGltZW91dE1haW5Mb29wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl90aW1lb3V0TWFpbkxvb3AgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgbG9vcCxcbiAgICAgICAgICAgIE1hdGgubWF4KDEwLCB0aGlzLl9ob3N0LmVuZ2luZS5zZXR0aW5ncy5pbnRlcnZhbCAtIHRpbWVUYWtlbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybiguLi5jbCh1bmtub3duVG9FcnJvcihlcnJvcikpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLl90aW1lb3V0TWFpbkxvb3AgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgbG9vcCxcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLnNldHRpbmdzLmludGVydmFsLFxuICAgICk7XG5cbiAgICBpZiAobXNnKSB7XG4gICAgICB0aGlzLl9ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5rcy5lbmFibGVcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyBTaG91bGQgd2UgcHJpbnQgdG8gdGhlIGxvZyB0aGF0IHRoZSBlbmdpbmUgd2FzIHN0b3BwZWQ/XG4gICAqL1xuICBzdG9wKG1zZyA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RpbWVvdXRNYWluTG9vcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0TWFpbkxvb3ApO1xuICAgIHRoaXMuX3RpbWVvdXRNYWluTG9vcCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChtc2cpIHtcbiAgICAgIHRoaXMuX2hvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmtzLmRpc2FibGVcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIGxvb3Agb2YgdGhlIGF1dG9tYXRpb24gc2NyaXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfaXRlcmF0ZShjb250ZXh0OiBGcmFtZUNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgbG9naWMgaGVyZSBpcyBpbnZlcnRlZCwgYmVjYXVzZSBfZGlzYWJsZWRfIGl0ZW1zIGFyZSBoaWRkZW4gZnJvbSB0aGUgbG9nLlxuICAgIGlmICghdGhpcy5zZXR0aW5ncy5maWx0ZXJzLmRpc2FibGVLR0xvZy5lbmFibGVkKSB7XG4gICAgICB0aGlzLl9tYWludGFpbktHTG9nRmlsdGVycygpO1xuICAgIH1cblxuICAgIC8vIFRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQgaXMgcHJvYmFibHlcbiAgICAvLyBzZW1pLWludGVudGlvbmFsIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIG9yIGltcHJvdmVkLlxuICAgIGxldCBbLCBkdXJhdGlvbl0gPSBhd2FpdCBtZWFzdXJlQXN5bmMoKCkgPT4gdGhpcy5zY2llbmNlTWFuYWdlci50aWNrKGNvbnRleHQpKTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy5zY2llbmNlTWFuYWdlciA9IGR1cmF0aW9uO1xuXG4gICAgWywgZHVyYXRpb25dID0gbWVhc3VyZSgoKSA9PiB7XG4gICAgICB0aGlzLmJvbmZpcmVNYW5hZ2VyLnRpY2soY29udGV4dCk7XG4gICAgfSk7XG4gICAgY29udGV4dC5tZWFzdXJlbWVudHMuYm9uZmlyZU1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4ge1xuICAgICAgdGhpcy5zcGFjZU1hbmFnZXIudGljayhjb250ZXh0KTtcbiAgICB9KTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy5zcGFjZU1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IGF3YWl0IG1lYXN1cmVBc3luYygoKSA9PiB0aGlzLndvcmtzaG9wTWFuYWdlci50aWNrKGNvbnRleHQpKTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy53b3Jrc2hvcE1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4ge1xuICAgICAgdGhpcy50cmFkZU1hbmFnZXIudGljayhjb250ZXh0KTtcbiAgICB9KTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy50cmFkZU1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IGF3YWl0IG1lYXN1cmVBc3luYygoKSA9PiB0aGlzLnJlbGlnaW9uTWFuYWdlci50aWNrKGNvbnRleHQpKTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy5yZWxpZ2lvbk1hbmFnZXIgPSBkdXJhdGlvbjtcblxuICAgIFssIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4ge1xuICAgICAgdGhpcy50aW1lTWFuYWdlci50aWNrKGNvbnRleHQpO1xuICAgIH0pO1xuICAgIGNvbnRleHQubWVhc3VyZW1lbnRzLnRpbWVNYW5hZ2VyID0gZHVyYXRpb247XG5cbiAgICBbLCBkdXJhdGlvbl0gPSBtZWFzdXJlKCgpID0+IHtcbiAgICAgIHRoaXMudmlsbGFnZU1hbmFnZXIudGljayhjb250ZXh0KTtcbiAgICB9KTtcbiAgICBjb250ZXh0Lm1lYXN1cmVtZW50cy52aWxsYWdlTWFuYWdlciA9IGR1cmF0aW9uO1xuXG4gICAgWywgZHVyYXRpb25dID0gYXdhaXQgbWVhc3VyZUFzeW5jKCgpID0+IHRoaXMudGltZUNvbnRyb2xNYW5hZ2VyLnRpY2soY29udGV4dCkpO1xuICAgIGNvbnRleHQubWVhc3VyZW1lbnRzLnRpbWVDb250cm9sTWFuYWdlciA9IGR1cmF0aW9uO1xuXG4gICAgWywgZHVyYXRpb25dID0gbWVhc3VyZSgoKSA9PiB7XG4gICAgICBpZiAoY29udGV4dC5yZXF1ZXN0R2FtZVVpUmVmcmVzaCkge1xuICAgICAgICB0aGlzLl9ob3N0LmdhbWUudWkucmVuZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29udGV4dC5tZWFzdXJlbWVudHMuZ2FtZVVpUmVmcmVzaCA9IGR1cmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgYWxsIGxvZyBmaWx0ZXJzIGluIEtHIGFyZSB1bmNoZWNrZWQuIFRoaXMgbWVhbnMgdGhlIGV2ZW50cyB3aWxsIG5vdCBiZSBsb2dnZWQuXG4gICAqL1xuICBwcml2YXRlIF9tYWludGFpbktHTG9nRmlsdGVycygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2hvc3QuZ2FtZS5jb25zb2xlLmZpbHRlcnMpKSB7XG4gICAgICBmaWx0ZXIuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlckNoZWNrYm94ZXMgPSBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkXj1maWx0ZXItXVwiKTtcbiAgICBmb3IgKGNvbnN0IGNoZWNrYm94IG9mIGZpbHRlckNoZWNrYm94ZXMpIHtcbiAgICAgIChjaGVja2JveCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3ltYm9sRm9yQ3ljbGUoY3ljbGU6IEN5Y2xlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faG9zdC5nYW1lLmNhbGVuZGFyLmN5Y2xlcy5maW5kKGVudHJ5ID0+IGVudHJ5Lm5hbWUgPT09IGN5Y2xlKT8udWdseXBoID8/IFwiXCI7XG4gIH1cblxuICBsYWJlbEZvckN5Y2xlKGN5Y2xlOiBDeWNsZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3ltYm9sID0gdGhpcy5zeW1ib2xGb3JDeWNsZShjeWNsZSk7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKFxuICAgICAgYCRzcGFjZS5wbGFuZXQuJHtjeWNsZSA9PT0gXCJyZWRtb29uXCIgPyBcIm1vb25cIiA6IGN5Y2xlfS5sYWJlbGAsXG4gICAgKTtcbiAgICByZXR1cm4gYCR7c3ltYm9sfSAke2xhYmVsfWA7XG4gIH1cblxuICBsYWJlbEZvclBsYW5ldChwbGFuZXQ6IFBsYW5ldCk6IHN0cmluZyB7XG4gICAgY29uc3QgY3ljbGVDYW5kaWRhdGU6IHN0cmluZyA9IHBsYW5ldCA9PT0gXCJtb29uXCIgPyAoXCJyZWRtb29uXCIgYXMgQ3ljbGUpIDogcGxhbmV0O1xuICAgIGNvbnN0IGN5Y2xlOiBDeWNsZSB8IHVuZGVmaW5lZCA9IEN5Y2xlcy5pbmNsdWRlcyhjeWNsZUNhbmRpZGF0ZSBhcyBDeWNsZSlcbiAgICAgID8gKGN5Y2xlQ2FuZGlkYXRlIGFzIEN5Y2xlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9ob3N0LmVuZ2luZS5pMThuKGAkc3BhY2UucGxhbmV0LiR7cGxhbmV0fS5sYWJlbGApO1xuICAgIHJldHVybiBjeWNsZSA9PT0gdW5kZWZpbmVkID8gbGFiZWwgOiBgJHt0aGlzLnN5bWJvbEZvckN5Y2xlKGN5Y2xlKX0gJHtsYWJlbH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGFuIGludGVybmF0aW9uYWxpemVkIHN0cmluZyBsaXRlcmFsLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gcmV0cmlldmUgZnJvbSB0aGUgdHJhbnNsYXRpb24gdGFibGUuXG4gICAqIEBwYXJhbSBhcmdzIFZhcmlhYmxlIGFyZ3VtZW50cyB0byByZW5kZXIgaW50byB0aGUgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNsYXRlZCBzdHJpbmcuXG4gICAqL1xuICBpMThuPFRLaXR0ZW5HYW1lTGl0ZXJhbCBleHRlbmRzIGAkJHtzdHJpbmd9YD4oXG4gICAga2V5OiBUcmFuc2xhdGVkU3RyaW5nPFRLaXR0ZW5HYW1lTGl0ZXJhbD4sXG4gICAgYXJnczogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPiA9IFtdLFxuICApOiBzdHJpbmcge1xuICAgIGxldCB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gS2V5IGlzIHRvIGJlIHRyYW5zbGF0ZWQgdGhyb3VnaCBLRyBlbmdpbmUuXG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiJFwiKSkge1xuICAgICAgdmFsdWUgPSB0aGlzLl9ob3N0LmkxOG5FbmdpbmUoa2V5LnNsaWNlKDEpKTtcbiAgICB9XG5cbiAgICB2YWx1ZSA9XG4gICAgICB2YWx1ZSA/P1xuICAgICAgdGhpcy5faTE4bkRhdGFbdGhpcy5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWRdW1xuICAgICAgICBrZXkgYXMga2V5b2YgKHR5cGVvZiBpMThuRGF0YSlbU3VwcG9ydGVkTG9jYWxlXVxuICAgICAgXTtcblxuICAgIGNvbnN0IGNoZWNrOiBNYXliZTxzdHJpbmc+ID0gdmFsdWU7XG5cbiAgICBpZiAoaXNOaWwoY2hlY2spKSB7XG4gICAgICB2YWx1ZSA9IGkxOG5EYXRhW0ZhbGxiYWNrTG9jYWxlXVtrZXkgYXMga2V5b2YgKHR5cGVvZiBpMThuRGF0YSlbU3VwcG9ydGVkTG9jYWxlXV07XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybiguLi5jbChgaTE4biBrZXkgJyR7a2V5fScgbm90IGZvdW5kIGluIGRlZmF1bHQgbGFuZ3VhZ2UuYCkpO1xuICAgICAgICByZXR1cm4gYCQke2tleX1gO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKC4uLmNsKGBpMThuIGtleSAnJHtrZXl9JyBub3QgZm91bmQgaW4gc2VsZWN0ZWQgbGFuZ3VhZ2UuYCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBhcmdJbmRleCA9IDA7IGFyZ0luZGV4IDwgYXJncy5sZW5ndGg7ICsrYXJnSW5kZXgpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShgeyR7YXJnSW5kZXh9fWAsIGAke2FyZ3NbYXJnSW5kZXhdfWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpYWN0aXZpdHkoXG4gICAgaTE4bkxpdGVyYWw6IGtleW9mICh0eXBlb2YgaTE4bkRhdGEpW1wiZW4tVVNcIl0sXG4gICAgaTE4bkFyZ3M6IEFycmF5PG51bWJlciB8IHN0cmluZz4gPSBbXSxcbiAgICBsb2dTdHlsZT86IEFjdGl2aXR5Q2xhc3MsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmkxOG4oaTE4bkxpdGVyYWwsIGkxOG5BcmdzKTtcbiAgICBpZiAobG9nU3R5bGUpIHtcbiAgICAgIGNvbnN0IGFjdGl2aXR5Q2xhc3M6IEFjdGl2aXR5VHlwZUNsYXNzID0gYHR5cGVfJHtsb2dTdHlsZX1gIGFzIGNvbnN0O1xuICAgICAgdGhpcy5fcHJpbnRPdXRwdXQoYGtzLWFjdGl2aXR5ICR7YWN0aXZpdHlDbGFzc31gIGFzIGNvbnN0LCBcIiNlNjVDMDBcIiwgdGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ByaW50T3V0cHV0KFwia3MtYWN0aXZpdHlcIiwgXCIjZTY1QzAwXCIsIHRleHQpO1xuICAgIH1cbiAgfVxuXG4gIGltZXNzYWdlKFxuICAgIGkxOG5MaXRlcmFsOiBrZXlvZiAodHlwZW9mIGkxOG5EYXRhKVtcImVuLVVTXCJdLFxuICAgIGkxOG5BcmdzOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+ID0gW10sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX3ByaW50T3V0cHV0KFwia3MtZGVmYXVsdFwiLCBcIiNhYTUwZmVcIiwgdGhpcy5pMThuKGkxOG5MaXRlcmFsLCBpMThuQXJncykpO1xuICB9XG5cbiAgc3RvcmVGb3JTdW1tYXJ5KG5hbWU6IHN0cmluZywgYW1vdW50ID0gMSwgc2VjdGlvbjogQWN0aXZpdHlTdW1tYXJ5U2VjdGlvbiA9IFwib3RoZXJcIik6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2aXR5U3VtbWFyeS5zdG9yZUFjdGl2aXR5KG5hbWUsIGFtb3VudCwgc2VjdGlvbik7XG4gIH1cblxuICBnZXRTdW1tYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpdml0eVN1bW1hcnkucmVuZGVyU3VtbWFyeSgpO1xuICB9XG5cbiAgZGlzcGxheUFjdGl2aXR5U3VtbWFyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5nZXRTdW1tYXJ5KCk7XG4gICAgZm9yIChjb25zdCBzdW1tYXJ5TGluZSBvZiBzdW1tYXJ5KSB7XG4gICAgICB0aGlzLl9wcmludE91dHB1dChcImtzLXN1bW1hcnlcIiwgXCIjMDA5OTMzXCIsIHN1bW1hcnlMaW5lKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciBvdXQgdGhlIG9sZCBhY3Rpdml0eVxuICAgIHRoaXMucmVzZXRBY3Rpdml0eVN1bW1hcnkoKTtcbiAgfVxuXG4gIHJlc2V0QWN0aXZpdHlTdW1tYXJ5KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2aXR5U3VtbWFyeS5yZXNldEFjdGl2aXR5KCk7XG4gIH1cblxuICBwcml2YXRlIF9wcmludE91dHB1dChcbiAgICBjc3NDbGFzc2VzOiBcImtzLWFjdGl2aXR5XCIgfCBga3MtYWN0aXZpdHkgJHtBY3Rpdml0eVR5cGVDbGFzc31gIHwgXCJrcy1kZWZhdWx0XCIgfCBcImtzLXN1bW1hcnlcIixcbiAgICBjb2xvcjogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZmlsdGVycy5lbmFibGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbHRlckl0ZW0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNldHRpbmdzLmZpbHRlcnMuZmlsdGVycykpIHtcbiAgICAgICAgaWYgKGZpbHRlckl0ZW0udmFyaWFudCA9PT0gY3NzQ2xhc3NlcyAmJiAhZmlsdGVySXRlbS5lbmFibGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRoZSBjb2xvciBvZiB0aGUgbWVzc2FnZSBpbW1lZGlhdGVseSBhZnRlciBhZGRpbmdcbiAgICBjb25zdCBtc2cgPSB0aGlzLl9ob3N0LmdhbWUubXNnKG1lc3NhZ2UsIGNzc0NsYXNzZXMpO1xuICAgICQobXNnLnNwYW4pLmNzcyhcImNvbG9yXCIsIGNvbG9yKTtcblxuICAgIGNvbnNvbGUuZGVidWcoLi4uY2wobWVzc2FnZSkpO1xuICB9XG5cbiAgc3RhdGljIGV2YWx1YXRlU3ViU2VjdGlvblRyaWdnZXIoc2VjdGlvblRyaWdnZXI6IG51bWJlciwgc3ViU2VjdGlvblRyaWdnZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNlY3Rpb25UcmlnZ2VyIDwgMFxuICAgICAgPyBzdWJTZWN0aW9uVHJpZ2dlclxuICAgICAgOiBzdWJTZWN0aW9uVHJpZ2dlciA8IDBcbiAgICAgICAgPyBzZWN0aW9uVHJpZ2dlclxuICAgICAgICA6IHN1YlNlY3Rpb25UcmlnZ2VyO1xuICB9XG59XG4iLCIvKipcbiAqIFRoaXMgY29kZSB3YXMgZGVyaXZlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcGFyc2UtbXMvdHJlZS9hMTg2MzZiYjYwOTc5MzMyNmExYmQ4ZDU0MWFhZDQ5ZjcxNWYwYTQwXG4gKiBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9wcmV0dHktbXMvdHJlZS83NjNmZTA3NWQ4YTYyYWE4ZDllZTYwM2JmYWQyZjMxMDdjM2E5ZjAyLlxuICogSXQgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuY29uc3QgdG9aZXJvSWZJbmZpbml0eSA9ICh2YWx1ZSkgPT4gKE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IDApO1xuY29uc3QgcGFyc2VOdW1iZXIgPSAobWlsbGlzZWNvbmRzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF5czogTWF0aC50cnVuYyhtaWxsaXNlY29uZHMgLyA4Nl80MDBfMDAwKSxcbiAgICAgICAgaG91cnM6IE1hdGgudHJ1bmMoKG1pbGxpc2Vjb25kcyAvIDNfNjAwXzAwMCkgJSAyNCksXG4gICAgICAgIG1pbnV0ZXM6IE1hdGgudHJ1bmMoKG1pbGxpc2Vjb25kcyAvIDYwXzAwMCkgJSA2MCksXG4gICAgICAgIHNlY29uZHM6IE1hdGgudHJ1bmMoKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjApLFxuICAgICAgICBtaWxsaXNlY29uZHM6IE1hdGgudHJ1bmMobWlsbGlzZWNvbmRzICUgMTAwMCksXG4gICAgICAgIG1pY3Jvc2Vjb25kczogTWF0aC50cnVuYyh0b1plcm9JZkluZmluaXR5KG1pbGxpc2Vjb25kcyAqIDEwMDApICUgMTAwMCksXG4gICAgICAgIG5hbm9zZWNvbmRzOiBNYXRoLnRydW5jKHRvWmVyb0lmSW5maW5pdHkobWlsbGlzZWNvbmRzICogMWU2KSAlIDEwMDApLFxuICAgIH07XG59O1xuY29uc3QgcGFyc2VCaWdpbnQgPSAobWlsbGlzZWNvbmRzKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF5czogbWlsbGlzZWNvbmRzIC8gODY0MDAwMDBuLFxuICAgICAgICBob3VyczogKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDBuKSAlIDI0bixcbiAgICAgICAgbWludXRlczogKG1pbGxpc2Vjb25kcyAvIDYwMDAwbikgJSA2MG4sXG4gICAgICAgIHNlY29uZHM6IChtaWxsaXNlY29uZHMgLyAxMDAwbikgJSA2MG4sXG4gICAgICAgIG1pbGxpc2Vjb25kczogbWlsbGlzZWNvbmRzICUgMTAwMG4sXG4gICAgICAgIG1pY3Jvc2Vjb25kczogMG4sXG4gICAgICAgIG5hbm9zZWNvbmRzOiAwbixcbiAgICB9O1xufTtcbmNvbnN0IHBhcnNlTWlsbGlzZWNvbmRzID0gKG1pbGxpc2Vjb25kcykgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIG1pbGxpc2Vjb25kcykge1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobWlsbGlzZWNvbmRzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZU51bWJlcihtaWxsaXNlY29uZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOiB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VCaWdpbnQobWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkZWZhdWx0XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50XCIpO1xufTtcbmNvbnN0IGlzWmVybyA9ICh2YWx1ZSkgPT4gdmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IDBuO1xuY29uc3QgcGx1cmFsaXplID0gKHdvcmQsIGNvdW50KSA9PiBjb3VudCA9PT0gMSB8fCBjb3VudCA9PT0gMW4gPyB3b3JkIDogYCR7d29yZH1zYDtcbmNvbnN0IFNFQ09ORF9ST1VORElOR19FUFNJTE9OID0gMC4wMDBfMDAwXzE7XG5jb25zdCBPTkVfREFZX0lOX01JTExJU0VDT05EUyA9IDI0biAqIDYwbiAqIDYwbiAqIDEwMDBuO1xuLyoqXG4gKiBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZzogYDEzMzcwMDAwMDBgIOKGkiBgMTVkIDExaCAyM20gMjBzYC5cbiAqIEBwYXJhbSBtaWxsaXNlY29uZHMgLSBNaWxsaXNlY29uZHMgdG8gaHVtYW5pemUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGh1bWFuaXppbmcgdGhlIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIFRoZSBodW1hbml6ZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogaW1wb3J0IGZvcm1hdE1pbGxpc2Vjb25kcyBmcm9tICdAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZm9ybWF0L21pbGxpc2Vjb25kcy5qcyc7XG4gKlxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDEzMzcwMDAwMDApO1xuICogLy89PiAnMTVkIDExaCAyM20gMjBzJ1xuICpcbiAqIGZvcm1hdE1pbGxpc2Vjb25kcygxMzM3KTtcbiAqIC8vPT4gJzEuM3MnXG4gKlxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDEzMyk7XG4gKiAvLz0+ICcxMzNtcydcbiAqXG4gKiAvLyBgY29tcGFjdGAgb3B0aW9uXG4gKiBmb3JtYXRNaWxsaXNlY29uZHMoMTMzNywge2NvbXBhY3Q6IHRydWV9KTtcbiAqIC8vPT4gJzFzJ1xuICpcbiAqIC8vIGB2ZXJib3NlYCBvcHRpb25cbiAqIGZvcm1hdE1pbGxpc2Vjb25kcygxMzM1NjY5MDAwLCB7dmVyYm9zZTogdHJ1ZX0pO1xuICogLy89PiAnMTUgZGF5cyAxMSBob3VycyAxIG1pbnV0ZSA5IHNlY29uZHMnXG4gKlxuICogLy8gYGNvbG9uTm90YXRpb25gIG9wdGlvblxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDk1NTAwLCB7Y29sb25Ob3RhdGlvbjogdHJ1ZX0pO1xuICogLy89PiAnMTozNS41J1xuICpcbiAqIC8vIGBmb3JtYXRTdWJNaWxsaXNlY29uZHNgIG9wdGlvblxuICogZm9ybWF0TWlsbGlzZWNvbmRzKDEwMC40MDAwODAsIHtmb3JtYXRTdWJNaWxsaXNlY29uZHM6IHRydWV9KVxuICogLy89PiAnMTAwbXMgNDAwwrVzIDgwbnMnXG4gKlxuICogLy8gQ2FuIGJlIHVzZWZ1bCBmb3IgdGltZSBkdXJhdGlvbnNcbiAqIGZvcm1hdE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCAwLCAxLCAxMCwgNDApIC0gbmV3IERhdGUoMjAxNCwgMCwgMSwgMTAsIDUpKVxuICogLy89PiAnMzVtJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRNaWxsaXNlY29uZHMgPSAobWlsbGlzZWNvbmRzLCBvcHRpb25zID0ge1xuICAgIGNvbG9uTm90YXRpb246IGZhbHNlLFxuICAgIGNvbXBhY3Q6IGZhbHNlLFxuICAgIGZvcm1hdFN1Yk1pbGxpc2Vjb25kczogZmFsc2UsXG4gICAga2VlcERlY2ltYWxzT25XaG9sZVNlY29uZHM6IGZhbHNlLFxuICAgIG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHM6IDAsXG4gICAgc2Vjb25kc0RlY2ltYWxEaWdpdHM6IDEsXG4gICAgc2VwYXJhdGVNaWxsaXNlY29uZHM6IGZhbHNlLFxuICAgIHVuaXRDb3VudDogSW5maW5pdHksXG4gICAgdmVyYm9zZTogZmFsc2UsXG59KSA9PiB7XG4gICAgY29uc3QgaXNCaWdJbnQgPSB0eXBlb2YgbWlsbGlzZWNvbmRzID09PSBcImJpZ2ludFwiO1xuICAgIGlmICghaXNCaWdJbnQgJiYgIU51bWJlci5pc0Zpbml0ZShtaWxsaXNlY29uZHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBhIGZpbml0ZSBudW1iZXIgb3IgYmlnaW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zQWRqdXN0ZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICBpZiAob3B0aW9uc0FkanVzdGVkLmNvbG9uTm90YXRpb24pIHtcbiAgICAgICAgb3B0aW9uc0FkanVzdGVkLmNvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgb3B0aW9uc0FkanVzdGVkLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcyA9IGZhbHNlO1xuICAgICAgICBvcHRpb25zQWRqdXN0ZWQuc2VwYXJhdGVNaWxsaXNlY29uZHMgPSBmYWxzZTtcbiAgICAgICAgb3B0aW9uc0FkanVzdGVkLnZlcmJvc2UgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnNBZGp1c3RlZC5jb21wYWN0KSB7XG4gICAgICAgIG9wdGlvbnNBZGp1c3RlZC51bml0Q291bnQgPSAxO1xuICAgICAgICBvcHRpb25zQWRqdXN0ZWQuc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSAwO1xuICAgICAgICBvcHRpb25zQWRqdXN0ZWQubWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyA9IDA7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBmbG9vckRlY2ltYWxzID0gKHZhbHVlLCBkZWNpbWFsRGlnaXRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGZsb29yZWRJbnRlcmltVmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlICogMTAgKiogZGVjaW1hbERpZ2l0cyArIFNFQ09ORF9ST1VORElOR19FUFNJTE9OKTtcbiAgICAgICAgY29uc3QgZmxvb3JlZFZhbHVlID0gTWF0aC5yb3VuZChmbG9vcmVkSW50ZXJpbVZhbHVlKSAvIDEwICoqIGRlY2ltYWxEaWdpdHM7XG4gICAgICAgIHJldHVybiBmbG9vcmVkVmFsdWUudG9GaXhlZChkZWNpbWFsRGlnaXRzKTtcbiAgICB9O1xuICAgIGNvbnN0IGFkZCA9ICh2YWx1ZSwgbG9uZywgc2hvcnQsIHZhbHVlU3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgocmVzdWx0Lmxlbmd0aCA9PT0gMCB8fCAhb3B0aW9uc0FkanVzdGVkLmNvbG9uTm90YXRpb24pICYmXG4gICAgICAgICAgICBpc1plcm8odmFsdWUpICYmXG4gICAgICAgICAgICAhKG9wdGlvbnNBZGp1c3RlZC5jb2xvbk5vdGF0aW9uICYmIHNob3J0ID09PSBcIm1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZVN0cmluZyA/Pz0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgaWYgKG9wdGlvbnNBZGp1c3RlZC5jb2xvbk5vdGF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCB3aG9sZURpZ2l0cyA9IHZhbHVlU3RyaW5nLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgICAgID8gdmFsdWVTdHJpbmcuc3BsaXQoXCIuXCIpWzBdLmxlbmd0aFxuICAgICAgICAgICAgICAgIDogdmFsdWVTdHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gcmVzdWx0Lmxlbmd0aCA+IDAgPyAyIDogMTtcbiAgICAgICAgICAgIHZhbHVlU3RyaW5nID0gXCIwXCIucmVwZWF0KE1hdGgubWF4KDAsIG1pbkxlbmd0aCAtIHdob2xlRGlnaXRzKSkgKyB2YWx1ZVN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlU3RyaW5nICs9IG9wdGlvbnNBZGp1c3RlZC52ZXJib3NlID8gXCIgXCIgKyBwbHVyYWxpemUobG9uZywgdmFsdWUpIDogc2hvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWVTdHJpbmcpO1xuICAgIH07XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzKTtcbiAgICBjb25zdCBkYXlzID0gQmlnSW50KHBhcnNlZC5kYXlzKTtcbiAgICBhZGQoZGF5cyAvIDM2NW4sIFwieWVhclwiLCBcInlcIik7XG4gICAgYWRkKGRheXMgJSAzNjVuLCBcImRheVwiLCBcImRcIik7XG4gICAgYWRkKE51bWJlcihwYXJzZWQuaG91cnMpLCBcImhvdXJcIiwgXCJoXCIpO1xuICAgIGFkZChOdW1iZXIocGFyc2VkLm1pbnV0ZXMpLCBcIm1pbnV0ZVwiLCBcIm1cIik7XG4gICAgaWYgKG9wdGlvbnNBZGp1c3RlZC5zZXBhcmF0ZU1pbGxpc2Vjb25kcyB8fFxuICAgICAgICBvcHRpb25zQWRqdXN0ZWQuZm9ybWF0U3ViTWlsbGlzZWNvbmRzIHx8XG4gICAgICAgICghb3B0aW9uc0FkanVzdGVkLmNvbG9uTm90YXRpb24gJiYgbWlsbGlzZWNvbmRzIDwgMTAwMCkpIHtcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcihwYXJzZWQuc2Vjb25kcyk7XG4gICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29uc3QgbWljcm9zZWNvbmRzID0gTnVtYmVyKHBhcnNlZC5taWNyb3NlY29uZHMpO1xuICAgICAgICBjb25zdCBuYW5vc2Vjb25kcyA9IE51bWJlcihwYXJzZWQubmFub3NlY29uZHMpO1xuICAgICAgICBhZGQoc2Vjb25kcywgXCJzZWNvbmRcIiwgXCJzXCIpO1xuICAgICAgICBpZiAob3B0aW9uc0FkanVzdGVkLmZvcm1hdFN1Yk1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgYWRkKG1pbGxpc2Vjb25kcywgXCJtaWxsaXNlY29uZFwiLCBcIm1zXCIpO1xuICAgICAgICAgICAgYWRkKG1pY3Jvc2Vjb25kcywgXCJtaWNyb3NlY29uZFwiLCBcIsK1c1wiKTtcbiAgICAgICAgICAgIGFkZChuYW5vc2Vjb25kcywgXCJuYW5vc2Vjb25kXCIsIFwibnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtaWxsaXNlY29uZHNBbmRCZWxvdyA9IG1pbGxpc2Vjb25kcyArIG1pY3Jvc2Vjb25kcyAvIDEwMDAgKyBuYW5vc2Vjb25kcyAvIDFlNjtcbiAgICAgICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9uc0FkanVzdGVkLm1pbGxpc2Vjb25kc0RlY2ltYWxEaWdpdHMgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnNBZGp1c3RlZC5taWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgY29uc3Qgcm91bmRlZE1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kc0FuZEJlbG93ID49IDFcbiAgICAgICAgICAgICAgICA/IE1hdGgucm91bmQobWlsbGlzZWNvbmRzQW5kQmVsb3cpXG4gICAgICAgICAgICAgICAgOiBNYXRoLmNlaWwobWlsbGlzZWNvbmRzQW5kQmVsb3cpO1xuICAgICAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzU3RyaW5nID0gbWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0c1xuICAgICAgICAgICAgICAgID8gbWlsbGlzZWNvbmRzQW5kQmVsb3cudG9GaXhlZChtaWxsaXNlY29uZHNEZWNpbWFsRGlnaXRzKVxuICAgICAgICAgICAgICAgIDogcm91bmRlZE1pbGxpc2Vjb25kcy50b1N0cmluZygpO1xuICAgICAgICAgICAgYWRkKE51bWJlci5wYXJzZUZsb2F0KG1pbGxpc2Vjb25kc1N0cmluZyksIFwibWlsbGlzZWNvbmRcIiwgXCJtc1wiLCBtaWxsaXNlY29uZHNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZWNvbmRzID0gKChpc0JpZ0ludCA/IE51bWJlcihtaWxsaXNlY29uZHMgJSBPTkVfREFZX0lOX01JTExJU0VDT05EUykgOiBtaWxsaXNlY29uZHMpIC8gMTAwMCkgJSA2MDtcbiAgICAgICAgY29uc3Qgc2Vjb25kc0RlY2ltYWxEaWdpdHMgPSB0eXBlb2Ygb3B0aW9uc0FkanVzdGVkLnNlY29uZHNEZWNpbWFsRGlnaXRzID09PSBcIm51bWJlclwiXG4gICAgICAgICAgICA/IG9wdGlvbnNBZGp1c3RlZC5zZWNvbmRzRGVjaW1hbERpZ2l0c1xuICAgICAgICAgICAgOiAxO1xuICAgICAgICBjb25zdCBzZWNvbmRzRml4ZWQgPSBmbG9vckRlY2ltYWxzKHNlY29uZHMsIHNlY29uZHNEZWNpbWFsRGlnaXRzKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kc1N0cmluZyA9IG9wdGlvbnNBZGp1c3RlZC5rZWVwRGVjaW1hbHNPbldob2xlU2Vjb25kc1xuICAgICAgICAgICAgPyBzZWNvbmRzRml4ZWRcbiAgICAgICAgICAgIDogc2Vjb25kc0ZpeGVkLnJlcGxhY2UoL1xcLjArJC8sIFwiXCIpO1xuICAgICAgICBhZGQoTnVtYmVyLnBhcnNlRmxvYXQoc2Vjb25kc1N0cmluZyksIFwic2Vjb25kXCIsIFwic1wiLCBzZWNvbmRzU3RyaW5nKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFwiMFwiICsgKG9wdGlvbnNBZGp1c3RlZC52ZXJib3NlID8gXCIgbWlsbGlzZWNvbmRzXCIgOiBcIm1zXCIpO1xuICAgIH1cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBvcHRpb25zQWRqdXN0ZWQuY29sb25Ob3RhdGlvbiA/IFwiOlwiIDogXCIgXCI7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zQWRqdXN0ZWQudW5pdENvdW50ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBNYXRoLm1heChvcHRpb25zQWRqdXN0ZWQudW5pdENvdW50LCAxKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuam9pbihzZXBhcmF0b3IpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1pbGxpc2Vjb25kcy5qcy5tYXAiLCJleHBvcnQgY29uc3QgSWNvbnMgPSB7XG4gIC8qKlxuICAgKiBjYW1waW5nXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBCb25maXJlOlxuICAgIFwiTTgwLTgwdi0xODNsMzYzLTQ5MS02Ny05MCA0OS0zNSA1NSA3NSA1Ni03NSA0OCAzNS02NiA5MCAzNjIgNDkxdjE4M0g4MFptNDAwLTYyM0wxNDAtMjQzdjEwM2gxNDVsMTk1LTI3MyAxOTUgMjczaDE0NXYtMTAzTDQ4MC03MDNaTTM1OS0xNDBoMjQyTDQ4MC0zMTAgMzU5LTE0MFptMTIxLTI3MyAxOTUgMjczLTE5NS0yNzMtMTk1IDI3MyAxOTUtMjczWlwiLFxuXG4gIC8qKlxuICAgKiBjaGVja19ib3hfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIENoZWNrYm94Q2hlY2s6XG4gICAgXCJtNDE5LTMyMSAyODktMjg5LTQzLTQzLTI0NiAyNDYtMTE5LTExOS00MyA0MyAxNjIgMTYyWk0xMjAtMTIwdi03MjBoNzIwdjcyMEgxMjBabTYwLTYwaDYwMHYtNjAwSDE4MHY2MDBabTAgMHYtNjAwIDYwMFpcIixcblxuICAvKipcbiAgICogY2hlY2tfYm94X291dGxpbmVfYmxhbmtfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIENoZWNrYm94VW5DaGVjazogXCJNMTIwLTEyMHYtNzIwaDcyMHY3MjBIMTIwWm02MC02MGg2MDB2LTYwMEgxODB2NjAwWlwiLFxuXG4gIC8qKlxuICAgKiBjb250ZW50X2NvcHlfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIENvcHk6IFwiTTI0MC0yMDB2LTY4MGg1NjB2NjgwSDI0MFptNjAtNjBoNDQwdi01NjBIMzAwdjU2MFpNMTIwLTgwdi02ODBoNjB2NjIwaDUwMHY2MEgxMjBabTE4MC0xODB2LTU2MCA1NjBaXCIsXG5cbiAgLyoqXG4gICAqIGV2ZW50X3JlcGVhdF80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgQ3ljbGVzOlxuICAgIFwiTTEyMC04MHYtNzQwaDEyNXYtNjBoNjV2NjBoMzQwdi02MGg2NXY2MGgxMjV2MzYwaC02MHYtMTEwSDE4MHY0MzBoMzI0djYwSDEyMFpNNzYwIDBxLTczIDAtMTI3LjUtNDUuNVQ1NjQtMTYwaDYycTEzIDQ0IDQ5LjUgNzJUNzYwLTYwcTU4IDAgOTktNDF0NDEtOTlxMC01OC00MS05OXQtOTktNDFxLTI5IDAtNTQgMTAuNVQ2NjItMzAwaDU4djYwSDU2MHYtMTYwaDYwdjU3cTI3LTI2IDYzLTQxLjV0NzctMTUuNXE4MyAwIDE0MS41IDU4LjVUOTYwLTIwMHEwIDgzLTU4LjUgMTQxLjVUNzYwIDBaTTE4MC02MzBoNjAwdi0xMzBIMTgwdjEzMFptMCAwdi0xMzAgMTMwWlwiLFxuXG4gIC8qKlxuICAgKiBkYXRhX3VzYWdlXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBEYXRhVXNhZ2U6XG4gICAgXCJNNDgwLTgwcS04MiAwLTE1NS0zMS41VDE5Ny41LTE5N3EtNTQuNS01NC04Ni0xMjdUODAtNDc5cTAtMTU4IDEwNi41LTI3MlQ0NTEtODc3djEwMnEtMTE1IDExLTE5MiA5NS41VDE4Mi00NzlxMCAxMjQgODcgMjEwLjVUNDgwLTE4MnE3MiAwIDEzNi0zMi41VDcyNS0zMDZsODggNTFxLTU4IDgzLTE0NS41IDEyOVQ0ODAtODBabTM2Mi0yMjktODgtNDlxMTItMzEgMTgtNjEuNXQ2LTYwLjVxMC0xMTYtNzYuNS0yMDFUNTExLTc3NnYtMTAycTE1NyAxMSAyNjMgMTI0LjVUODgwLTQ4NHEwIDQ1LTkuNSA4OC41VDg0Mi0zMDlaXCIsXG5cbiAgLyoqXG4gICAqIGRlbGV0ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgRGVsZXRlOlxuICAgIFwiTTIwMS0xMjB2LTYzMGgtNDF2LTYwaDE4OHYtMzBoMjY0djMwaDE4OHY2MGgtNDF2NjMwSDIwMVptNjAtNjBoNDM4di01NzBIMjYxdjU3MFptMTA2LTg2aDYwdi0zOTloLTYwdjM5OVptMTY2IDBoNjB2LTM5OWgtNjB2Mzk5Wk0yNjEtNzUwdjU3MC01NzBaXCIsXG5cbiAgLyoqXG4gICAqIGRyYWZ0XzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBEcmFmdDpcbiAgICBcIk0xNjAtODB2LTgwMGg0MjFsMjE5IDIxOXY1ODFIMTYwWm0zOTEtNTU0di0xODZIMjIwdjY4MGg1MjB2LTQ5NEg1NTFaTTIyMC04MjB2MTg2LTE4NiA2ODAtNjgwWlwiLFxuXG4gIC8qKlxuICAgKiBlY29fNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIEVjbzogXCJNMjEzLTE3NXEtNDMuNTktNDUtNjguMy0xMDRRMTIwLTMzOCAxMjAtNDAwcTAtNzMgMjUuNS0xMzMuNVQyMjItNjQ1cTM1LTM1IDg3LTU5dDEyMi41LTM3LjVRNTAyLTc1NSA1OTEtNzU4LjV0MTk4IDMuNXE4IDEwOCA1LjUgMTk3LjV0LTE2IDE2MC43NXEtMTMuNSA3MS4yNS0zOCAxMjQuNTZRNzE2LTIxOC44NyA2ODAtMTgzcS01MSA1MS0xMTAgNzdUNDQ0LTgwcS02OSAwLTEyNi41LTIzLjVUMjEzLTE3NVptMTAzIDBxMjUgMTcgNTggMjZ0NjkuOTIgOVE0OTctMTQwIDU0Ny0xNjJ0OTEtNjRxMjctMjcgNDYtNzAuNXQzMS0xMDNRNzI3LTQ1OSA3MzEtNTM0dDAtMTY1cS05NC0yLTE2OC41IDIuNVQ0MzEtNjgwcS01NyAxMi05OCAzMC41VDI2Ni02MDRxLTQyIDQzLTY0IDkxdC0yMiA5OHEwIDQ4IDIwLjUgMTAwLjVUMjUxLTIzMHE1My05OCAxMjctMTc2dDE1Ny0xMjNxLTg3IDc1LTE0MSAxNjIuNVQzMTYtMTc1Wm0wIDBabTAgMFpcIixcblxuICAvKipcbiAgICogZWRpdF80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgRWRpdDogXCJNMTgwLTE4MGg0NGw0NzItNDcxLTQ0LTQ0LTQ3MiA0NzF2NDRabS02MCA2MHYtMTI4bDYxNy02MTYgMTI4IDEyOC02MTcgNjE2SDEyMFptNjU5LTYxNy00MS00MSA0MSA0MVptLTEwNSA2NC0yMi0yMiA0NCA0NC0yMi0yMlpcIixcblxuICAvKipcbiAgICogZXhwYW5kX2NpcmNsZV9kb3duXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBFeHBhbmRDaXJjbGVEb3duOlxuICAgIFwibTQ4MC0zNTEgMTczLTE3My00My00Mi0xMzAgMTMwLTEzMC0xMzAtNDMgNDIgMTczIDE3M1ptMCAyNzFxLTgyIDAtMTU1LTMxLjV0LTEyNy41LTg2UTE0My0yNTIgMTExLjUtMzI1VDgwLTQ4MHEwLTgzIDMxLjUtMTU2dDg2LTEyN1EyNTItODE3IDMyNS04NDguNVQ0ODAtODgwcTgzIDAgMTU2IDMxLjVUNzYzLTc2M3E1NCA1NCA4NS41IDEyN1Q4ODAtNDgwcTAgODItMzEuNSAxNTVUNzYzLTE5Ny41cS01NCA1NC41LTEyNyA4NlQ0ODAtODBabTAtNjBxMTQyIDAgMjQxLTk5LjVUODIwLTQ4MHEwLTE0Mi05OS0yNDF0LTI0MS05OXEtMTQxIDAtMjQwLjUgOTlUMTQwLTQ4MHEwIDE0MSA5OS41IDI0MC41VDQ4MC0xNDBabTAtMzQwWlwiLFxuXG4gIC8qKlxuICAgKiBleHBhbmRfY2lyY2xlX3VwXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBFeHBhbmRDaXJjbGVVcDpcbiAgICBcIm0zNTAtMzk0IDEzMC0xMzAgMTMwIDEzMCA0My00Mi0xNzMtMTczLTE3MyAxNzMgNDMgNDJaTTQ4MC04MHEtODMgMC0xNTYtMzEuNVQxOTctMTk3cS01NC01NC04NS41LTEyN1Q4MC00ODBxMC04MyAzMS41LTE1NS41dDg1LjUtMTI3cTU0LTU0LjUgMTI3LTg2VDQ4MC04ODBxODMgMCAxNTUuNSAzMS41dDEyNyA4NnE1NC41IDU0LjUgODYgMTI3VDg4MC00ODBxMCA4My0zMS41IDE1NnQtODYgMTI3cS01NC41IDU0LTEyNyA4NS41VDQ4MC04MFptMC02MHExNDEgMCAyNDAuNS05OVQ4MjAtNDgwcTAtMTQxLTk5LjUtMjQwLjVUNDgwLTgyMHEtMTQyIDAtMjQxIDk5LjVUMTQwLTQ4MHEwIDE0MiA5OSAyNDF0MjQxIDk5Wm0wLTM0MFpcIixcblxuICAvKipcbiAgICogcHVibGlzaF80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgSW1wb3J0OlxuICAgIFwiTTQ1MC0xNjB2LTM3MUwzMzAtNDExbC00My00MyAxOTMtMTkzIDE5MyAxOTMtNDMgNDMtMTIwLTEyMHYzNzFoLTYwWk0xNjAtNTk3di0yMDNoNjQwdjIwM2gtNjB2LTE0M0gyMjB2MTQzaC02MFpcIixcblxuICAvKipcbiAgICogaW52ZW50b3J5XzJfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIEludmVudG9yeTI6XG4gICAgXCJNMTIwLTgwdi01NDBIODB2LTI2MGg4MDB2MjYwaC00MHY1NDBIMTIwWm02MC02MGg2MDB2LTQ4MEgxODB2NDgwWm0tNDAtNTQwaDY4MHYtMTQwSDE0MHYxNDBabTIyMCAyNjBoMjQwdi02MEgzNjB2NjBabTEyMCA0MFpcIixcblxuICAvKipcbiAgICogY29udGVudF9wYXN0ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgUGFzdGU6XG4gICAgXCJNMTIwLTEyMHYtNzIwaDI2MnE3LTM1IDM0LjUtNTcuNVQ0ODAtOTIwcTM2IDAgNjMuNSAyMi41VDU3OC04NDBoMjYydjcyMEgxMjBabTYwLTYwaDYwMHYtNjAwaC02MHY5MEgyNDB2LTkwaC02MHY2MDBabTMwMC02MDBxMTcgMCAyOC41LTExLjVUNTIwLTgyMHEwLTE3LTExLjUtMjguNVQ0ODAtODYwcS0xNyAwLTI4LjUgMTEuNVQ0NDAtODIwcTAgMTcgMTEuNSAyOC41VDQ4MC03ODBaXCIsXG5cbiAgLyoqXG4gICAqIHN5bmFnb2d1ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgUmVsaWdpb246XG4gICAgXCJNNDAtMTIwdi01NjBxMC00NS44MyAzMi4xMi03Ny45MiAzMi4xMi0zMi4wOCA3OC0zMi4wOFQyMjgtNzU3LjkycTMyIDMyLjA5IDMyIDc3LjkydjMxbDIyMC0xOTEgMjIwIDE5MXYtMzFxMC00NS44MyAzMi4xMi03Ny45MiAzMi4xMi0zMi4wOCA3OC0zMi4wOFQ4ODgtNzU3LjkycTMyIDMyLjA5IDMyIDc3LjkydjU2MEg1MzB2LTI1MEg0MzB2MjUwSDQwWm03MjAtNTEwaDEwMHYtNDkuODJxMC0yMS4xOC0xNC4zMi0zNS42OC0xNC4zMy0xNC41LTM1LjUtMTQuNS0yMS4xOCAwLTM1LjY4IDE0LjM3UTc2MC03MDEuMjUgNzYwLTY4MHY1MFptLTY2MCAwaDEwMHYtNDkuODJxMC0yMS4xOC0xNC4zMi0zNS42OC0xNC4zMy0xNC41LTM1LjUtMTQuNS0yMS4xOCAwLTM1LjY4IDE0LjM3UTEwMC03MDEuMjUgMTAwLTY4MHY1MFptMCA0NTBoMTAwdi0zOTBIMTAwdjM5MFptMTYwIDBoMTEwdi0yNTBoMjIwdjI1MGgxMTB2LTM5MEw0ODAtNzYxIDI2MC01NzB2MzkwWm01MDAgMGgxMDB2LTM5MEg3NjB2MzkwWk00NzkuOTQtNTA1UTQ1Ny01MDUgNDQxLTUyMS4wNnEtMTYtMTYuMDYtMTYtMzlUNDQxLjA2LTU5OXExNi4wNi0xNiAzOS0xNlQ1MTktNTk4Ljk0cTE2IDE2LjA2IDE2IDM5VDUxOC45NC01MjFxLTE2LjA2IDE2LTM5IDE2WlwiLFxuXG4gIC8qKlxuICAgKiByZWZyZXNoXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBSZXNldDpcbiAgICBcIk00ODAtMTYwcS0xMzMgMC0yMjYuNS05My41VDE2MC00ODBxMC0xMzMgOTMuNS0yMjYuNVQ0ODAtODAwcTg1IDAgMTQ5IDM0LjVUNzQwLTY3MXYtMTI5aDYwdjI1NEg1NDZ2LTYwaDE2OHEtMzgtNjAtOTctOTd0LTEzNy0zN3EtMTA5IDAtMTg0LjUgNzUuNVQyMjAtNDgwcTAgMTA5IDc1LjUgMTg0LjVUNDgwLTIyMHE4MyAwIDE1Mi00Ny41VDcyOC0zOTNoNjJxLTI5IDEwNS0xMTUgMTY5dC0xOTUgNjRaXCIsXG5cbiAgLyoqXG4gICAqIHNoZWx2ZXNfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIFJlc291cmNlczpcbiAgICBcIk0xMjAtNDB2LTg4MGg2MHY4MGg2MDB2LTgwaDYwdjg4MGgtNjB2LTgwSDE4MHY4MGgtNjBabTYwLTQ2OWgxMTB2LTE2MGgyMjB2MTYwaDI3MHYtMjcxSDE4MHYyNzFabTAgMzI5aDI3MHYtMTYwaDIyMHYxNjBoMTEwdi0yNjlIMTgwdjI2OVptMTcwLTMyOWgxMDB2LTEwMEgzNTB2MTAwWm0xNjAgMzI5aDEwMHYtMTAwSDUxMHYxMDBaTTM1MC01MDloMTAwLTEwMFptMTYwIDMyOWgxMDAtMTAwWlwiLFxuXG4gIC8qKlxuICAgKiBzYXZlXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTYXZlOiBcIk04NDAtNjgzdjU2M0gxMjB2LTcyMGg1NjNsMTU3IDE1N1ptLTYwIDI3TDY1Ni03ODBIMTgwdjYwMGg2MDB2LTQ3NlpNNDc5Ljc2LTI0NXE0My4yNCAwIDczLjc0LTMwLjI2IDMwLjUtMzAuMjcgMzAuNS03My41IDAtNDMuMjQtMzAuMjYtNzMuNzQtMzAuMjctMzAuNS03My41LTMwLjUtNDMuMjQgMC03My43NCAzMC4yNi0zMC41IDMwLjI3LTMwLjUgNzMuNSAwIDQzLjI0IDMwLjI2IDczLjc0IDMwLjI3IDMwLjUgNzMuNSAzMC41Wk0yMzMtNTg0aDM1OHYtMTQzSDIzM3YxNDNabS01My03MnY0NzYtNjAwIDEyNFpcIixcblxuICAvKipcbiAgICogc2F2ZV9hc180OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU2F2ZUFzOlxuICAgIFwiTTEyMC0xMjB2LTcyMGg1NjNsMTU3IDE1N3YxMTdsLTYwIDYwdi0xNTBMNjU2LTc4MEgxODB2NjAwaDI4MHY2MEgxMjBabTYwLTY2MHY2MDAtNjAwWk01MjAtNDB2LTEyM2wyNjMtMjYyIDEyMiAxMjJMNjQzLTQwSDUyMFptMzAwLTI2My0zNy0zNyAzNyAzN1pNNTgwLTEwMGgzOGwxMjEtMTIyLTE4LTE5LTE5LTE4LTEyMiAxMjF2MzhabTE0MS0xNDEtMTktMTggMzcgMzctMTgtMTlaTTIzMy01ODRoMzU4di0xNDNIMjMzdjE0M1ptMjQ3IDMzOXExNCAwIDI3LTN0MjQtMTBsMzktNDBxNy0xMSAxMC41LTI0dDMuNS0yN3EwLTQzLjMzLTMwLjI2LTczLjY3UTUyMy40Ny00NTMgNDgwLjI0LTQ1M3EtNDMuMjQgMC03My43NCAzMC4yNi0zMC41IDMwLjI3LTMwLjUgNzMuNSAwIDQzLjI0IDMwLjMzIDczLjc0UTQzNi42Ny0yNDUgNDgwLTI0NVpcIixcblxuICAvKipcbiAgICogZGF0ZV9yYW5nZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU2Vhc29uczpcbiAgICBcIk0zMDYtMzk0cS0xNyAwLTI4LjUtMTEuNVQyNjYtNDM0cTAtMTcgMTEuNS0yOC41VDMwNi00NzRxMTcgMCAyOC41IDExLjVUMzQ2LTQzNHEwIDE3LTExLjUgMjguNVQzMDYtMzk0Wm0xNzcgMHEtMTcgMC0yOC41LTExLjVUNDQzLTQzNHEwLTE3IDExLjUtMjguNVQ0ODMtNDc0cTE3IDAgMjguNSAxMS41VDUyMy00MzRxMCAxNy0xMS41IDI4LjVUNDgzLTM5NFptMTcwIDBxLTE3IDAtMjguNS0xMS41VDYxMy00MzRxMC0xNyAxMS41LTI4LjVUNjUzLTQ3NHExNyAwIDI4LjUgMTEuNVQ2OTMtNDM0cTAgMTctMTEuNSAyOC41VDY1My0zOTRaTTEyMC04MHYtNzQwaDEyNXYtNjBoNjV2NjBoMzQwdi02MGg2NXY2MGgxMjV2NzQwSDEyMFptNjAtNjBoNjAwdi00MzBIMTgwdjQzMFptMC00OTBoNjAwdi0xMzBIMTgwdjEzMFptMCAwdi0xMzAgMTMwWlwiLFxuXG4gIC8qKlxuICAgKiBzZXR0aW5nc180OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU2V0dGluZ3M6XG4gICAgXCJtMzg4LTgwLTIwLTEyNnEtMTktNy00MC0xOXQtMzctMjVsLTExOCA1NC05My0xNjQgMTA4LTc5cS0yLTktMi41LTIwLjVUMTg1LTQ4MHEwLTkgLjUtMjAuNVQxODgtNTIxTDgwLTYwMGw5My0xNjQgMTE4IDU0cTE2LTEzIDM3LTI1dDQwLTE4bDIwLTEyN2gxODRsMjAgMTI2cTE5IDcgNDAuNSAxOC41VDY2OS03MTBsMTE4LTU0IDkzIDE2NC0xMDggNzdxMiAxMCAyLjUgMjEuNXQuNSAyMS41cTAgMTAtLjUgMjF0LTIuNSAyMWwxMDggNzgtOTMgMTY0LTExOC01NHEtMTYgMTMtMzYuNSAyNS41VDU5Mi0yMDZMNTcyLTgwSDM4OFptNDgtNjBoODhsMTQtMTEycTMzLTggNjIuNS0yNXQ1My41LTQxbDEwNiA0NiA0MC03Mi05NC02OXE0LTE3IDYuNS0zMy41VDcxNS00ODBxMC0xNy0yLTMzLjV0LTctMzMuNWw5NC02OS00MC03Mi0xMDYgNDZxLTIzLTI2LTUyLTQzLjVUNTM4LTcwOGwtMTQtMTEyaC04OGwtMTQgMTEycS0zNCA3LTYzLjUgMjRUMzA2LTY0MmwtMTA2LTQ2LTQwIDcyIDk0IDY5cS00IDE3LTYuNSAzMy41VDI0NS00ODBxMCAxNyAyLjUgMzMuNVQyNTQtNDEzbC05NCA2OSA0MCA3MiAxMDYtNDZxMjQgMjQgNTMuNSA0MXQ2Mi41IDI1bDE0IDExMlptNDQtMjEwcTU0IDAgOTItMzh0MzgtOTJxMC01NC0zOC05MnQtOTItMzhxLTU0IDAtOTIgMzh0LTM4IDkycTAgNTQgMzggOTJ0OTIgMzhabTAtMTMwWlwiLFxuXG4gIC8qKlxuICAgKiByb2NrZXRfbGF1bmNoXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTcGFjZTpcbiAgICBcIm0xODctNTUxIDEwNiA0NXExOC0zNiAzOC41LTcxdDQzLjUtNjdsLTc5LTE2LTEwOSAxMDlabTE1NCA4MSAxMzMgMTMzcTU3LTI2IDEwNy01OXQ4MS02NHE4MS04MSAxMTktMTY2dDQxLTE5MnEtMTA3IDMtMTkyIDQxVDQ2NC02NThxLTMxIDMxLTY0IDgxdC01OSAxMDdabTIyOS05NnEtMjAtMjAtMjAtNDkuNXQyMC00OS41cTIwLTIwIDQ5LjUtMjB0NDkuNSAyMHEyMCAyMCAyMCA0OS41VDY2OS01NjZxLTIwIDIwLTQ5LjUgMjBUNTcwLTU2NlptLTE1IDM4MyAxMDktMTA5LTE2LTc5cS0zMiAyMy02NyA0My41VDUxMC0yODlsNDUgMTA2Wm0zMjYtNjk0cTkgMTM2LTM0IDI0OFQ3MDUtNDE4bC0yIDItMiAyIDIyIDExMHEzIDE1LTEuNSAyOVQ3MDYtMjUwTDUzNS03OGwtODUtMTk4LTE3MC0xNzAtMTk4LTg1IDE3Mi0xNzFxMTEtMTEgMjUtMTUuNXQyOS0xLjVsMTEwIDIycTEtMSAyLTEuNXQyLTEuNXE5OS05OSAyMTEtMTQyLjVUODgxLTg3N1pNMTQ5LTMyNXEzNS0zNSA4NS41LTM1LjVUMzIwLTMyNnEzNSAzNSAzNC41IDg1LjVUMzE5LTE1NXEtMjYgMjYtODAuNSA0M1Q3NS04MHExNS0xMDkgMzEuNS0xNjR0NDIuNS04MVptNDIgNDNxLTE0IDE1LTI1IDQ3dC0xOSA4MnE1MC04IDgyLTE5dDQ3LTI1cTE5LTE3IDE5LjUtNDIuNVQyNzgtMjg0cS0xOS0xOC00NC41LTE3LjVUMTkxLTI4MlpcIixcblxuICAvKipcbiAgICoga2V5Ym9hcmRfdGFiXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTdGF0ZTogXCJNODIwLTI0MHYtNDgwaDYwdjQ4MGgtNjBabS0zNDAgMS00My00MiAxNjktMTY5SDgwdi02MGg1MjZMNDM4LTY3OWw0Mi00MiAyNDEgMjQxLTI0MSAyNDFaXCIsXG5cbiAgLyoqXG4gICAqIHN1bW1hcml6ZV80OGRwX19GSUxMMF93Z2h0NDAwX0dSQUQwX29wc3o0OFxuICAgKi9cbiAgU3VtbWFyeTpcbiAgICBcIk0yNzktNjIxaDYwdi02MGgtNjB2NjBabTAgMTcxaDYwdi02MGgtNjB2NjBabTAgMTcxaDYwdi02MGgtNjB2NjBaTTEyMC0xMjB2LTcyMGg1MjJsMTk4IDE5OHY1MjJIMTIwWm02MC02MGg2MDB2LTQyOUg2MDl2LTE3MUgxODB2NjAwWm0wLTYwMHYxNzEuNDNWLTc4MHY2MDAtNjAwWlwiLFxuXG4gIC8qKlxuICAgKiBzeW5jXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBTeW5jOiBcIk0xNjctMTYwdi02MGgxMzBsLTE1LTEycS02NC01MS05My0xMTF0LTI5LTEzNHEwLTEwNiA2Mi41LTE5MC41VDM4Ny03ODR2NjJxLTc1IDI5LTEyMSA5Ni41VDIyMC00NzdxMCA2MyAyMy41IDEwOS41VDMwNy0yODdsMzAgMjF2LTEyNGg2MHYyMzBIMTY3Wm00MDctMTV2LTYzcTc2LTI5IDEyMS05Ni41VDc0MC00ODNxMC00OC0yMy41LTk3LjVUNjU1LTY2OGwtMjktMjZ2MTI0aC02MHYtMjMwaDIzMHY2MEg2NjVsMTUgMTRxNjAgNTYgOTAgMTIwdDMwIDEyM3EwIDEwNi02MiAxOTFUNTc0LTE3NVpcIixcblxuICAvKipcbiAgICogc2NoZWR1bGVfNDhkcF9fRklMTDBfd2dodDQwMF9HUkFEMF9vcHN6NDhcbiAgICovXG4gIFRpbWU6IFwibTYyNy0yODcgNDUtNDUtMTU5LTE2MHYtMjAxaC02MHYyMjVsMTc0IDE4MVpNNDgwLTgwcS04MiAwLTE1NS0zMS41dC0xMjcuNS04NlExNDMtMjUyIDExMS41LTMyNVQ4MC00ODBxMC04MiAzMS41LTE1NXQ4Ni0xMjcuNVEyNTItODE3IDMyNS04NDguNVQ0ODAtODgwcTgyIDAgMTU1IDMxLjV0MTI3LjUgODZRODE3LTcwOCA4NDguNS02MzVUODgwLTQ4MHEwIDgyLTMxLjUgMTU1dC04NiAxMjcuNVE3MDgtMTQzIDYzNS0xMTEuNVQ0ODAtODBabTAtNDAwWm0wIDM0MHExNDAgMCAyNDAtMTAwdDEwMC0yNDBxMC0xNDAtMTAwLTI0MFQ0ODAtODIwcS0xNDAgMC0yNDAgMTAwVDE0MC00ODBxMCAxNDAgMTAwIDI0MHQyNDAgMTAwWlwiLFxuXG4gIC8qKlxuICAgKiBib2x0XzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBUcmlnZ2VyOlxuICAgIFwibTM5My0xNjUgMjc5LTMzNUg0OTJsMzYtMjg2LTI1MyAzNjZoMTU0bC0zNiAyNTVabS03MyA4NSA0MC0yODBIMTYwbDM2MC01MjBoODBsLTQwIDMyMGgyNDBMNDAwLTgwaC04MFptMTU0LTM5NlpcIixcblxuICAvKipcbiAgICogY29uc3RydWN0aW9uXzQ4ZHBfX0ZJTEwwX3dnaHQ0MDBfR1JBRDBfb3BzejQ4XG4gICAqL1xuICBXb3Jrc2hvcDpcbiAgICBcIk03NjgtMTIwIDUxNy0zNzFsNTctNTcgMjUxIDI1MS01NyA1N1ptLTU4MSAwLTU3LTU3IDI5MC0yOTAtMTA3LTEwNy0yMyAyMy00NC00NHY4NWwtMjQgMjQtMTIyLTEyMiAyNC0yNGg4NmwtNDgtNDggMTMxLTEzMXExNy0xNyAzNy0yM3Q0NC02cTI0IDAgNDQgOC41dDM3IDI1LjVMMzQ4LTY5OWw0OCA0OC0yNCAyNCAxMDQgMTA0IDEyMi0xMjJxLTgtMTMtMTIuNS0zMHQtNC41LTM2cTAtNTMgMzguNS05MS41VDcxMS04NDFxMTUgMCAyNS41IDN0MTcuNSA4bC04NSA4NSA3NSA3NSA4NS04NXE1IDggOC41IDE5LjVUODQxLTcwOXEwIDUzLTM4LjUgOTEuNVQ3MTEtNTc5cS0xOCAwLTMxLTIuNXQtMjQtNy41TDE4Ny0xMjBaXCIsXG59O1xuIiwiaW1wb3J0IHsgbXVzdEV4aXN0IH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLaXR0ZW5TY2llbnRpc3RzIH0gZnJvbSBcIi4uLy4uL0tpdHRlblNjaWVudGlzdHMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL0xvZy5qc1wiO1xuXG5leHBvcnQgdHlwZSBVaUNvbXBvbmVudEludGVyZmFjZSA9IHtcbiAgcmVhZG9ubHkgY2hpbGRyZW46IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPjtcbiAgcGFyZW50OiBVaUNvbXBvbmVudEludGVyZmFjZSB8IG51bGw7XG4gIGdldCBlbGVtZW50KCk6IEpRdWVyeTxIVE1MRWxlbWVudD47XG4gIHJlcXVlc3RSZWZyZXNoKHdpdGhDaGlsZHJlbj86IGJvb2xlYW4sIGRlcHRoPzogbnVtYmVyLCB0cmFjZT86IGJvb2xlYW4pOiB2b2lkO1xuICByZWZyZXNoKGZvcmNlPzogYm9vbGVhbiwgZGVwdGg/OiBudW1iZXIpOiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgVWlDb21wb25lbnRPcHRpb25zID0ge1xuICBsZW5ndGg/OiBuZXZlcjtcbiAgcmVhZG9ubHkgb25SZWZyZXNoPzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25SZWZyZXNoUmVxdWVzdD86ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVWlDb21wb25lbnQ8VEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PlxuICBpbXBsZW1lbnRzIFVpQ29tcG9uZW50SW50ZXJmYWNlXG57XG4gIHByaXZhdGUgc3RhdGljIG5leHRDb21wb25lbnRJZCA9IDA7XG4gIHJlYWRvbmx5IGNvbXBvbmVudElkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0IGl0c2VsZi5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IEtpdHRlblNjaWVudGlzdHM7XG4gIHBhcmVudDogVWlDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsO1xuXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFVpQ29tcG9uZW50T3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1haW4gRE9NIGVsZW1lbnQgZm9yIHRoaXMgY29tcG9uZW50LCBpbiBhIEpRdWVyeSB3cmFwcGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9lbGVtZW50OiBKUXVlcnk8VEVsZW1lbnQ+IHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBzZXQgZWxlbWVudCh2YWx1ZTogSlF1ZXJ5PFRFbGVtZW50Pikge1xuICAgIHRoaXMuX2VsZW1lbnQgPSB2YWx1ZTtcbiAgICB0aGlzLl9lbGVtZW50WzBdLmlkID0gYEtTJHtPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cbiAgZ2V0IGVsZW1lbnQoKTogSlF1ZXJ5PFRFbGVtZW50PiB7XG4gICAgcmV0dXJuIG11c3RFeGlzdCh0aGlzLl9lbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFOiBJdCBpcyBpbnRlbnRpb25hbCB0aGF0IGFsbCBjaGlsZHJlbiBhcmUgb2YgdGhlIG1vc3QgZnVuZGFtZW50YWwgYmFzZSB0eXBlLlxuICAgKiBJZiBhIG1vcmUgc3BlY2lmaWNhbGx5IHR5cGVkIHJlZmVyZW5jZSBmb3IgYSBjaGlsZCBpcyByZXF1aXJlZCwgaXQgc2hvdWxkIGJlIHN0b3JlZFxuICAgKiBvbiBjb25zdHJ1Y3Rpb24uXG4gICAqIFRoZSAnY2hpbGRyZW4nIHNldCBpcyBpbnRlbmRlZCBvbmx5IGZvciBpbnRlci1jb21wb25lbnQgb3JjaGVzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkcmVuID0gbmV3IFNldDxVaUNvbXBvbmVudEludGVyZmFjZT4oKTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgYmFzZSBgVWlDb21wb25lbnRgLlxuICAgKiBTdWJjbGFzc2VzIE1VU1QgYWRkIGNoaWxkcmVuIGZyb20gb3B0aW9ucyB3aGVuIGB0aGlzLmVsZW1lbnRgIGlzIGNvbnN0cnVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCB8IHsgaG9zdDogS2l0dGVuU2NpZW50aXN0cyB9LCBvcHRpb25zPzogVWlDb21wb25lbnRPcHRpb25zKSB7XG4gICAgdGhpcy5jb21wb25lbnRJZCA9IFVpQ29tcG9uZW50Lm5leHRDb21wb25lbnRJZCsrO1xuXG4gICAgdGhpcy5ob3N0ID0gcGFyZW50Lmhvc3Q7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudCBpbnN0YW5jZW9mIFVpQ29tcG9uZW50ID8gcGFyZW50IDogbnVsbDtcbiAgICB0aGlzLl9uZWVkc1JlZnJlc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGFic3RyYWN0IHRvU3RyaW5nKCk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX25lZWRzUmVmcmVzaDtcbiAgcmVxdWVzdFJlZnJlc2god2l0aENoaWxkcmVuID0gZmFsc2UsIGRlcHRoID0gMCwgdHJhY2UgPSBmYWxzZSkge1xuICAgIGlmICh0cmFjZSkge1xuICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgLi4uY2woXG4gICAgICAgICAgZGVwdGggPCAwID8gXCLipJJcIi5yZXBlYXQoZGVwdGggKiAtMSkgOiBcIiBcIi5yZXBlYXQoZGVwdGgpLFxuICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSxcbiAgICAgICAgICBcInJlcXVlc3RSZWZyZXNoKClcIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zPy5vblJlZnJlc2hSZXF1ZXN0Py5jYWxsKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSB0aGlzICYmICF3aXRoQ2hpbGRyZW4pIHtcbiAgICAgIHRoaXMucGFyZW50Py5yZXF1ZXN0UmVmcmVzaChmYWxzZSwgZGVwdGggLSAxLCB0cmFjZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX25lZWRzUmVmcmVzaCkge1xuICAgICAgaWYgKHRyYWNlKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICBkZXB0aCA8IDAgPyBcIuKkklwiLnJlcGVhdChkZXB0aCAqIC0xKSA6IFwiIFwiLnJlcGVhdChkZXB0aCksXG4gICAgICAgICAgICB0aGlzLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBcInJlcXVlc3RSZWZyZXNoKCkgPGFscmVhZHkgcGVuZGluZz5cIixcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX25lZWRzUmVmcmVzaCA9IHRydWU7XG5cbiAgICBpZiAod2l0aENoaWxkcmVuKSB7XG4gICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAuLi5jbChcbiAgICAgICAgICAgIGRlcHRoIDwgMCA/IFwi4qSSXCIucmVwZWF0KGRlcHRoICogLTEpIDogXCIgXCIucmVwZWF0KGRlcHRoKSxcbiAgICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFwicmVxdWVzdFJlZnJlc2goKVwiLFxuICAgICAgICAgICAgYCsgJHt0aGlzLmNoaWxkcmVuLnNpemV9IGNoaWxkcmVuYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgIGNoaWxkLnJlcXVlc3RSZWZyZXNoKHRydWUsIGRlcHRoICsgMSwgdHJhY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAuLi5jbChcbiAgICAgICAgICAgIGRlcHRoIDwgMCA/IFwi4qSSXCIucmVwZWF0KGRlcHRoICogLTEpIDogXCIgXCIucmVwZWF0KGRlcHRoKSxcbiAgICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIFwicmVxdWVzdFJlZnJlc2goKVwiLFxuICAgICAgICAgICAgXCI8cXVldWVkPlwiLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaChmb3JjZSA9IGZhbHNlLCBkZXB0aCA9IDApIHtcbiAgICBpZiAoIWZvcmNlICYmICF0aGlzLl9uZWVkc1JlZnJlc2gpIHtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKC4uLmNsKHRoaXMudG9TdHJpbmcoKSwgXCJyZWZyZXNoKCkgcmVjZWl2ZWQgYW5kIGlnbm9yZWQuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXQVJOSU5HOiBFbmFibGUgdGhpcyBzZWN0aW9uIG9ubHkgZHVyaW5nIHJlZnJlc2ggbG9naWMgZGVidWdnaW5nIVxuICAgIC8vICAgICAgICAgIFdoZW4gdGhpcyB3YXMgaW1wbGVtZW50ZWQsIGEgZnVsbCByZWZyZXNoIGxvZ2dlZCAxNksgbWVzc2FnZXMuXG4gICAgLy8gICAgICAgICAgRXZlbiB3aGVuIHRoZXNlIGFyZSBmaWx0ZXJlZCBmcm9tIHRoZSBKUyBjb25zb2xlLCB0aGVyZSBhcmVcbiAgICAvLyAgICAgICAgICBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gRE8gTk9UIEVOQUJMRSBUSElTIFVOTEVTUyBZT1UgTkVFRCBUTy5cbiAgICAvKlxuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIC4uLmNsKFxuICAgICAgICAgIGRlcHRoIDwgMCA/IFwi4qSSXCIucmVwZWF0KGRlcHRoICogLTEpIDogXCIgXCIucmVwZWF0KGRlcHRoKSxcbiAgICAgICAgICB0aGlzLnRvU3RyaW5nKCksXG4gICAgICAgICAgXCJyZWZyZXNoXCIsXG4gICAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucz8ub25SZWZyZXNoICE9PSBcInVuZGVmaW5lZFwiID8gXCJ3aXRoIG9uUmVmcmVzaCgpXCIgOiBcIlwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgKi9cblxuICAgIHRoaXMub3B0aW9ucz8ub25SZWZyZXNoPy5jYWxsKHRoaXMpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgY2hpbGQucmVmcmVzaChmb3JjZSwgZGVwdGggKyAxKTtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkc1JlZnJlc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGFkZENoaWxkKGNoaWxkOiBVaUNvbXBvbmVudEludGVyZmFjZSk6IHRoaXMge1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmQoY2hpbGQuZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYWRkQ2hpbGRyZW4oY2hpbGRyZW4/OiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZENoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZW1vdmVDaGlsZChjaGlsZDogVWlDb21wb25lbnRJbnRlcmZhY2UpIHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4uaGFzKGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNoaWxkLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgdGhpcy5jaGlsZHJlbi5kZWxldGUoY2hpbGQpO1xuICB9XG4gIHJlbW92ZUNoaWxkcmVuKGNoaWxkcmVuOiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIENvbnRhaW5lck9wdGlvbnMgPSBUaGlzVHlwZTxDb250YWluZXI+ICZcbiAgVWlDb21wb25lbnRPcHRpb25zICYge1xuICAgIHJlYWRvbmx5IGNsYXNzZXM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IENvbnRhaW5lck9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzaW1wbGUgY29udGFpbmVyIGVsZW1lbnQgd2l0aG91dCBhbnkgc3BlY2lhbCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIG9wdGlvbnM/OiBDb250YWluZXJPcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpO1xuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0NvbnRhaW5lci5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCBzdHlsZXNEZWxpbWl0ZXIgZnJvbSBcIi4vRGVsaW1pdGVyLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIExpc3RJdGVtT3B0aW9ucyA9IFRoaXNUeXBlPExpc3RJdGVtPiAmXG4gIFVpQ29tcG9uZW50T3B0aW9ucyAmIHtcbiAgICAvKipcbiAgICAgKiBTaG91bGQgdGhlcmUgYmUgYWRkaXRpb25hbCBwYWRkaW5nIGJlbG93IHRoaXMgZWxlbWVudD9cbiAgICAgKi9cbiAgICByZWFkb25seSBkZWxpbWl0ZXI/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGNsYXNzZXM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgTGlzdEl0ZW0gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogTGlzdEl0ZW1PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2ltcGxlIGxpc3QgaXRlbSB3aXRoIG9ubHkgYSBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIHVzZXJzY3JpcHQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBsaXN0IGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGxpLz5cIik7XG5cbiAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBvZiBvcHRpb25zPy5jbGFzc2VzID8/IFtdKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZGVsaW1pdGVyID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzRGVsaW1pdGVyLmRlbGltaXRlcik7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0xpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgTGlzdEl0ZW0sIHR5cGUgTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMaXN0SXRlbSBmcm9tIFwiLi9MaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50LCBVaUNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIExhYmVsTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8TGFiZWxMaXN0SXRlbT4gJlxuICBMaXN0SXRlbU9wdGlvbnMgJiB7XG4gICAgLyoqXG4gICAgICogV2hlbiBzZXQgdG8gYW4gU1ZHIHBhdGgsIHdpbGwgYmUgdXNlZCBhcyBhbiBpY29uIG9uIHRoZSBsYWJlbC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGFuIGluZGljYXRvciBiZSByZW5kZXJlZCBpbiBmcm9udCBvZiB0aGUgZWxlbWVudCxcbiAgICAgKiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYW4gdXBncmFkZSBvZiBhIHByaW9yIHNldHRpbmc/XG4gICAgICovXG4gICAgcmVhZG9ubHkgdXBncmFkZUluZGljYXRvcj86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBMYWJlbExpc3RJdGVtIGV4dGVuZHMgTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IExhYmVsTGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBoZWFkOiBDb250YWluZXI7XG4gIHJlYWRvbmx5IGVsZW1lbnRMYWJlbDogSlF1ZXJ5O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgbGFiZWwgbGlzdCBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgdXNlcnNjcmlwdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgc2V0dGluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IExhYmVsTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCBvcHRpb25zKTtcblxuICAgIHRoaXMuaGVhZCA9IG5ldyBDb250YWluZXIocGFyZW50KTtcbiAgICB0aGlzLmhlYWQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMaXN0SXRlbS5oZWFkKTtcbiAgICB0aGlzLmFkZENoaWxkKHRoaXMuaGVhZCk7XG5cbiAgICB0aGlzLmVsZW1lbnRMYWJlbCA9ICQoXCI8bGFiZWwvPlwiLCB7XG4gICAgICB0ZXh0OiBgJHtvcHRpb25zPy51cGdyYWRlSW5kaWNhdG9yID09PSB0cnVlID8gXCLirqQgXCIgOiBcIlwifSR7bGFiZWx9YCxcbiAgICB9KVxuICAgICAgLmFkZENsYXNzKHN0eWxlcy5sYWJlbClcbiAgICAgIC5hZGRDbGFzcyhzdHlsZXNMaXN0SXRlbS5sYWJlbCk7XG4gICAgdGhpcy5oZWFkLmVsZW1lbnQuYXBwZW5kKHRoaXMuZWxlbWVudExhYmVsKTtcblxuICAgIGlmIChvcHRpb25zPy5pY29uKSB7XG4gICAgICBjb25zdCBpY29uRWxlbWVudCA9ICQoXCI8ZGl2Lz5cIiwge1xuICAgICAgICBodG1sOiBgPHN2ZyBzdHlsZT1cIndpZHRoOiAxNXB4OyBoZWlnaHQ6IDE1cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCIke29wdGlvbnMuaWNvbn1cIi8+PC9zdmc+YCxcbiAgICAgIH0pLmFkZENsYXNzKHN0eWxlcy5pY29uTGFiZWwpO1xuICAgICAgdGhpcy5lbGVtZW50TGFiZWwucHJlcGVuZChpY29uRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0xhYmVsTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxuXG4gIGFkZENoaWxkSGVhZChjaGlsZDogVWlDb21wb25lbnRJbnRlcmZhY2UpOiB0aGlzIHtcbiAgICB0aGlzLmhlYWQuYWRkQ2hpbGQoY2hpbGQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFkZENoaWxkcmVuSGVhZChjaGlsZHJlbj86IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIHRoaXMuaGVhZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBMYWJlbExpc3RJdGVtLCB0eXBlIExhYmVsTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBzdHlsZXMsIGRlZmF1bHQgYXMgc3R5bGVzU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8U2V0dGluZ0xpc3RJdGVtPiAmXG4gIExhYmVsTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGNoZWNrcyB0aGUgY2hlY2tib3guXG4gICAgICovXG4gICAgcmVhZG9ubHkgb25DaGVjaz86IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogV2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHVzZXIgdW5jaGVja3MgdGhlIGNoZWNrYm94LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9uVW5DaGVjaz86IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIHRoZSB1c2VyIGJlIHByZXZlbnRlZCBmcm9tIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQ/XG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpc3RJdGVtPFRTZXR0aW5nIGV4dGVuZHMgU2V0dGluZyA9IFNldHRpbmc+IGV4dGVuZHMgTGFiZWxMaXN0SXRlbSB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ0xpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogVFNldHRpbmc7XG4gIHJlYWRvbmx5IGNoZWNrYm94PzogSlF1ZXJ5O1xuXG4gIHJlYWRPbmx5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSBuZXcgc2V0dGluZyBlbGVtZW50LlxuICAgKiBUaGlzIGlzIGEgc2ltcGxlIGNoZWNrYm94IHdpdGggYSBsYWJlbC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIHVzZXJzY3JpcHQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb24gdGhlIHNldHRpbmcgZWxlbWVudC5cbiAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgdGhpcyBlbGVtZW50IGlzIGxpbmtlZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhpcyBsaXN0IGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFNldHRpbmdMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5lbmFibGVkKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5jaGVja2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzLmNoZWNrZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnJlYWRvbmx5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnJlYWRvbmx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNOaWwodGhpcy5jaGVja2JveCkpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIsIHRoaXMuc2V0dGluZy5lbmFibGVkKTtcbiAgICAgICAgICB0aGlzLmNoZWNrYm94LnByb3AoXCJkaXNhYmxlZFwiLCB0aGlzLnJlYWRPbmx5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5zZXR0aW5nKTtcblxuICAgIGNvbnN0IGlkID0gYGtzLXNldHRpbmcke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgICBjb25zdCBjaGVja2JveCA9ICQoXCI8aW5wdXQvPlwiLCB7XG4gICAgICBpZCxcbiAgICAgIHR5cGU6IFwiY2hlY2tib3hcIixcbiAgICB9KS5hZGRDbGFzcyhzdHlsZXMuY2hlY2tib3gpO1xuXG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnM/LnJlYWRPbmx5ID8/IGZhbHNlO1xuICAgIGNoZWNrYm94LnByb3AoXCJkaXNhYmxlZFwiLCB0aGlzLnJlYWRPbmx5KTtcblxuICAgIGNoZWNrYm94Lm9uKFwiY2hhbmdlXCIsIChfZXZlbnQ6IEpRdWVyeS5DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGNoZWNrYm94LmlzKFwiOmNoZWNrZWRcIikgJiYgIXNldHRpbmcuZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmNoZWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgICAgfSBlbHNlIGlmICghY2hlY2tib3guaXMoXCI6Y2hlY2tlZFwiKSAmJiBzZXR0aW5nLmVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy51bmNoZWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50TGFiZWwuYmVmb3JlKGNoZWNrYm94KTtcbiAgICB0aGlzLmVsZW1lbnRMYWJlbC5wcm9wKFwiZm9yXCIsIGlkKTtcblxuICAgIHRoaXMuY2hlY2tib3ggPSBjaGVja2JveDtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1NldHRpbmdMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XTogJyR7dGhpcy5lbGVtZW50TGFiZWwudGV4dCgpfSdgO1xuICB9XG5cbiAgYXN5bmMgY2hlY2soaXNCYXRjaFByb2Nlc3MgPSBmYWxzZSkge1xuICAgIHRoaXMuc2V0dGluZy5lbmFibGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnM/Lm9uQ2hlY2s/LmNhbGwoaXNCYXRjaFByb2Nlc3MpO1xuICAgIHRoaXMucmVxdWVzdFJlZnJlc2goKTtcbiAgfVxuXG4gIGFzeW5jIHVuY2hlY2soaXNCYXRjaFByb2Nlc3MgPSBmYWxzZSkge1xuICAgIHRoaXMuc2V0dGluZy5lbmFibGVkID0gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLm9uVW5DaGVjaz8uY2FsbChpc0JhdGNoUHJvY2Vzcyk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyByZWRpcmVjdEVycm9yc1RvQ29uc29sZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEljb25CdXR0b25PcHRpb25zID0gVGhpc1R5cGU8SWNvbkJ1dHRvbj4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgcmVhZE9ubHk/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGluYWN0aXZlPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBvbkNsaWNrOiAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfTtcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGlzIHZpc3VhbGx5IHJlcHJlc2VudGVkIHRocm91Z2ggYW4gU1ZHIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJY29uQnV0dG9uIGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEljb25CdXR0b25PcHRpb25zO1xuICByZWFkT25seTogYm9vbGVhbjtcbiAgaW5hY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYW4gYEljb25CdXR0b25gLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHBhdGhEYXRhIFRoZSBTVkcgcGF0aCBkYXRhIG9mIHRoZSBpY29uLlxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIGB0aXRsZWAgb2YgdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBpY29uIGJ1dHRvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIHBhdGhEYXRhOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIG9wdGlvbnM/OiBJY29uQnV0dG9uT3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJChcIjxkaXYvPlwiLCB7XG4gICAgICBodG1sOiBgPHN2ZyBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCIke3BhdGhEYXRhfVwiLz48L3N2Zz5gLFxuICAgICAgdGl0bGUsXG4gICAgfSkuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmljb25CdXR0b24pO1xuXG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnM/LnJlYWRPbmx5ID8/IGZhbHNlO1xuICAgIHRoaXMuaW5hY3RpdmUgPSBvcHRpb25zPy5pbmFjdGl2ZSA/PyBmYWxzZTtcblxuICAgIHRoaXMuZWxlbWVudC5vbihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGljaygpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtJY29uQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrKCkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zPy5vbkNsaWNrPy5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpcywgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi8uLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gXCIuL0ljb25CdXR0b24uanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9TZXR0aW5nc0xpc3QubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ3NMaXN0T3B0aW9ucyA9IFRoaXNUeXBlPFNldHRpbmdzTGlzdD4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgaGFzRW5hYmxlQWxsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBoYXNEaXNhYmxlQWxsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBvbkVuYWJsZUFsbD86ICgpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgb25EaXNhYmxlQWxsPzogKCkgPT4gdm9pZDtcbiAgICByZWFkb25seSBvblJlc2V0PzogKCkgPT4gdm9pZDtcbiAgfTtcblxuLyoqXG4gKiBUaGUgYFNldHRpbmdzTGlzdGAgaXMgYSBgPHVsPmAgZGVzaWduZWQgdG8gaG9zdCBgU2V0dGluZ0xpc3RJdGVtYCBpbnN0YW5jZXMuXG4gKlxuICogSXQgaGFzIGVuYWJsZS9kaXNhYmxlIGJ1dHRvbnMgdG8gY2hlY2svdW5jaGVjayBhbGwgc2V0dGluZ3MgY29udGFpbmVkIGluIGl0LlxuICogTW9zdCBjb21tb25seSwgaXQgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBgU2V0dGluZ3NQYW5lbGAuXG4gKlxuICogVGhpcyBjb25zdHJ1Y3QgaXMgYWxzbyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgYW4gXCJpdGVtcyBsaXN0XCIgZm9yIGhpc3RvcmljIHJlYXNvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0xpc3QgZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ3NMaXN0T3B0aW9ucztcbiAgcmVhZG9ubHkgbGlzdDogSlF1ZXJ5O1xuXG4gIHJlYWRvbmx5IGRpc2FibGVBbGxCdXR0b246IEljb25CdXR0b24gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGVuYWJsZUFsbEJ1dHRvbjogSWNvbkJ1dHRvbiB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgcmVzZXRCdXR0b246IEljb25CdXR0b24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgU2V0dGluZ3NMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBvcHRpb25zIFdoaWNoIHRvb2xzIHNob3VsZCBiZSBhdmFpbGFibGUgb24gdGhlIGxpc3Q/XG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogU2V0dGluZ3NMaXN0T3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgY29uc3QgdG9vbE9wdGlvbnMgPSB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiB0cnVlLFxuICAgICAgaGFzRW5hYmxlQWxsOiB0cnVlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICAgIGNvbnN0IGhhc1Rvb2xzID1cbiAgICAgIHRvb2xPcHRpb25zLmhhc0Rpc2FibGVBbGwgfHwgdG9vbE9wdGlvbnMuaGFzRW5hYmxlQWxsIHx8ICFpc05pbCh0b29sT3B0aW9ucy5vblJlc2V0KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3Moc3R5bGVzLmxpc3RDb250YWluZXIpO1xuXG4gICAgdGhpcy5saXN0ID0gJChcIjx1bC8+XCIpLmFkZENsYXNzKHN0eWxlcy5saXN0KS5hZGRDbGFzcyhzdHlsZXMuaXRlbXNMaXN0KTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmQodGhpcy5saXN0KTtcblxuICAgIGlmIChoYXNUb29scykge1xuICAgICAgY29uc3QgdG9vbHMgPSBuZXcgQ29udGFpbmVyKHRoaXMsIHsgY2xhc3NlczogW3N0eWxlcy5saXN0VG9vbHNdIH0pO1xuXG4gICAgICBpZiAodG9vbE9wdGlvbnMuaGFzRW5hYmxlQWxsKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlQWxsQnV0dG9uID0gbmV3IEljb25CdXR0b24oXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIEljb25zLkNoZWNrYm94Q2hlY2ssXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5lbmFibGUuYWxsXCIpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoXCJlbmFibGVBbGxcIiwgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGNoaWxkLCBTZXR0aW5nTGlzdEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBjaGlsZC5jaGVjayh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBvcHRpb25zPy5vbkVuYWJsZUFsbD8uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdG9vbHMuYWRkQ2hpbGQodGhpcy5lbmFibGVBbGxCdXR0b24pO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9vbE9wdGlvbnMuaGFzRGlzYWJsZUFsbCkge1xuICAgICAgICB0aGlzLmRpc2FibGVBbGxCdXR0b24gPSBuZXcgSWNvbkJ1dHRvbihcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgSWNvbnMuQ2hlY2tib3hVbkNoZWNrLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuZGlzYWJsZS5hbGxcIiksXG4gICAgICAgICAge1xuICAgICAgICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudChcImRpc2FibGVBbGxcIiwgeyBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzKGNoaWxkLCBTZXR0aW5nTGlzdEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBjaGlsZC51bmNoZWNrKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9wdGlvbnM/Lm9uRGlzYWJsZUFsbD8uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdG9vbHMuYWRkQ2hpbGQodGhpcy5kaXNhYmxlQWxsQnV0dG9uKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25SZXNldCA9IHRvb2xPcHRpb25zLm9uUmVzZXQ7XG4gICAgICBpZiAoIWlzTmlsKG9uUmVzZXQpKSB7XG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBuZXcgSWNvbkJ1dHRvbihcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgSWNvbnMuUmVzZXQsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5yZXNldFwiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIG9uUmVzZXQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdG9vbHMuYWRkQ2hpbGQodGhpcy5yZXNldEJ1dHRvbik7XG4gICAgICB9XG5cbiAgICAgIHN1cGVyLmFkZENoaWxkKHRvb2xzKTtcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ3NMaXN0Lm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFkZENoaWxkKGNoaWxkOiBVaUNvbXBvbmVudCk6IHRoaXMge1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpO1xuICAgIHRoaXMubGlzdC5hcHBlbmQoY2hpbGQuZWxlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBJY29uQnV0dG9uT3B0aW9ucyB9IGZyb20gXCIuLi9JY29uQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9FeHBhbmRvQnV0dG9uLm1vZHVsZS5jc3NcIjtcblxuZXhwb3J0IHR5cGUgRXhwYW5kb0J1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxFeHBhbmRvQnV0dG9uPiAmIEljb25CdXR0b25PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgRXhwYW5kb0J1dHRvbiBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBFeHBhbmRvQnV0dG9uT3B0aW9ucztcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG4gIGluYWN0aXZlOiBib29sZWFuO1xuICBpbmVmZmVjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBleHBhbmRvIGVsZW1lbnQgdGhhdCBpcyBjb21tb25seSB1c2VkIHRvIGV4cGFuZCBhbmRcbiAgICogY29sbGFwc2VzIGEgc2VjdGlvbiBvZiB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGlzIGV4cGFuZG8uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogRXhwYW5kb0J1dHRvbk9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5lZmZlY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzQnV0dG9uLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zPy5vblJlZnJlc2g/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIiwge1xuICAgICAgaHRtbDogYFxuICAgICAgPHN2ZyBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwiJHtzdHlsZXMuZG93bn1cIj48cGF0aCBkPVwiJHtJY29ucy5FeHBhbmRDaXJjbGVEb3dufVwiLz48L3N2Zz5cbiAgICAgIDxzdmcgc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4O1wiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cIiR7c3R5bGVzLnVwfVwiPjxwYXRoIGQ9XCIke0ljb25zLkV4cGFuZENpcmNsZVVwfVwiLz48L3N2Zz5cbiAgICAgIGAsXG4gICAgICB0aXRsZTogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pdGVtc1Nob3dcIiksXG4gICAgfSlcbiAgICAgIC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uaWNvbkJ1dHRvbilcbiAgICAgIC5hZGRDbGFzcyhzdHlsZXMuZXhwYW5kb0J1dHRvbik7XG5cbiAgICB0aGlzLmVsZW1lbnQub24oXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2xpY2soKS5jYXRjaChyZWRpcmVjdEVycm9yc1RvQ29uc29sZShjb25zb2xlKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlYWRPbmx5ID0gb3B0aW9ucz8ucmVhZE9ubHkgPz8gZmFsc2U7XG4gICAgdGhpcy5pbmFjdGl2ZSA9IG9wdGlvbnM/LmluYWN0aXZlID8/IGZhbHNlO1xuICAgIHRoaXMuaW5lZmZlY3RpdmUgPSBmYWxzZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtFeHBhbmRvQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIHNldENvbGxhcHNlZCgpIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzLmV4cGFuZGVkKTtcbiAgICB0aGlzLmVsZW1lbnQucHJvcChcInRpdGxlXCIsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLml0ZW1zU2hvd1wiKSk7XG4gIH1cbiAgc2V0RXhwYW5kZWQoKSB7XG4gICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5leHBhbmRlZCk7XG4gICAgdGhpcy5lbGVtZW50LnByb3AoXCJ0aXRsZVwiLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pdGVtc0hpZGVcIikpO1xuICB9XG5cbiAgYXN5bmMgY2xpY2soKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wdGlvbnM/Lm9uQ2xpY2s/LmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHsgRXhwYW5kb0J1dHRvbiB9IGZyb20gXCIuL2J1dHRvbnMvRXhwYW5kb0J1dHRvbi5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExhYmVsTGlzdEl0ZW0gfSBmcm9tIFwiLi9MYWJlbExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgc3R5bGVzU2V0dGluZ0xpc3RJdGVtIGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCwgdHlwZSBVaUNvbXBvbmVudEludGVyZmFjZSwgdHlwZSBVaUNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb2xsYXBzaWJsZVBhbmVsT3B0aW9ucyA9IFRoaXNUeXBlPENvbGxhcHNpYmxlUGFuZWw+ICZcbiAgVWlDb21wb25lbnRPcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFNob3VsZCB0aGUgbWFpbiBjaGlsZCBiZSBleHBhbmRlZCByaWdodCBhd2F5P1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGluaXRpYWxseUV4cGFuZGVkPzogYm9vbGVhbjtcbiAgfTtcblxuLyoqXG4gKiBBIGBQYW5lbGAgaXMgYSBzZWN0aW9uIG9mIHRoZSBVSSB0aGF0IGNhbiBiZSBleHBhbmRlZCBhbmQgY29sbGFwc2VkXG4gKiB0aHJvdWdoIGFuIGV4cGFuZG8gYnV0dG9uLlxuICogVGhlIHBhbmVsIGFsc28gaGFzIGEgaGVhZCBlbGVtZW50LCB3aGljaCBpcyBleHRlbmRlZCB0byBjcmVhdGUgdGhlIHBhbmVsXG4gKiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbGxhcHNpYmxlUGFuZWw8VEhlYWQgZXh0ZW5kcyBMYWJlbExpc3RJdGVtID0gTGFiZWxMaXN0SXRlbT4gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQ29sbGFwc2libGVQYW5lbE9wdGlvbnM7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb250YWluZXI6IFVpQ29tcG9uZW50O1xuICByZWFkb25seSBleHBhbmRvOiBFeHBhbmRvQnV0dG9uO1xuICByZWFkb25seSBoZWFkOiBUSGVhZDtcbiAgcHJvdGVjdGVkIF9tYWluQ2hpbGRWaXNpYmxlOiBib29sZWFuO1xuXG4gIGdldCBpc0V4cGFuZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9tYWluQ2hpbGRWaXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzZXR0aW5ncyBwYW5lbCB0aGF0IGlzIHVzZWQgdG8gY29udGFpbiBhIHNpbmdsZSBjaGlsZCBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIGhlYWQgQW5vdGhlciBjb21wb25lbnQgdG8gaG9zdCBpbiB0aGUgaGVhZCBvZiB0aGUgcGFuZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoaXMgcGFuZWwuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBoZWFkOiBUSGVhZCwgb3B0aW9ucz86IENvbGxhcHNpYmxlUGFuZWxPcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCBvcHRpb25zKTtcblxuICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHRoaXMpO1xuICAgIHRoaXMuY29udGFpbmVyLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnBhbmVsQ29udGVudCk7XG5cbiAgICAvLyBUaGUgZXhwYW5kbyBidXR0b24gZm9yIHRoaXMgcGFuZWwuXG4gICAgY29uc3QgZXhwYW5kbyA9IG5ldyBFeHBhbmRvQnV0dG9uKHBhcmVudCwge1xuICAgICAgb25DbGljazogKCkgPT4gdGhpcy50b2dnbGUoKSxcbiAgICB9KTtcbiAgICBoZWFkLmhlYWQuYWRkQ2hpbGQoZXhwYW5kbyk7XG5cbiAgICBoZWFkLmVsZW1lbnQuYXBwZW5kKHRoaXMuY29udGFpbmVyLmVsZW1lbnQpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmluaXRpYWxseUV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5lbGVtZW50LnJlbW92ZUNsYXNzKHN0eWxlc1NldHRpbmdMaXN0SXRlbS5oaWRkZW4pO1xuICAgICAgZXhwYW5kby5zZXRFeHBhbmRlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5lbGVtZW50LmFkZENsYXNzKHN0eWxlc1NldHRpbmdMaXN0SXRlbS5oaWRkZW4pO1xuICAgIH1cblxuICAgIHRoaXMuX21haW5DaGlsZFZpc2libGUgPSBvcHRpb25zPy5pbml0aWFsbHlFeHBhbmRlZCA/PyBmYWxzZTtcbiAgICB0aGlzLmVsZW1lbnQgPSBoZWFkLmVsZW1lbnQ7XG4gICAgdGhpcy5leHBhbmRvID0gZXhwYW5kbztcblxuICAgIHRoaXMuYWRkQ2hpbGRyZW4oW3RoaXMuaGVhZCwgdGhpcy5jb250YWluZXJdKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtDb2xsYXBzaWJsZVBhbmVsLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIGFkZENoaWxkSGVhZChjaGlsZDogVWlDb21wb25lbnRJbnRlcmZhY2UpOiB0aGlzIHtcbiAgICB0aGlzLmhlYWQuYWRkQ2hpbGQoY2hpbGQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFkZENoaWxkcmVuSGVhZChjaGlsZHJlbj86IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIHRoaXMuaGVhZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQ2hpbGRDb250ZW50KGNoaWxkOiBVaUNvbXBvbmVudCk6IHRoaXMge1xuICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNoaWxkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBhZGRDaGlsZHJlbkNvbnRlbnQoY2hpbGRyZW4/OiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuID8/IFtdKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHBhbmVsJ3MgY29udGVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBleHBhbmQgU2hvdWxkIHRoZSBwYW5lbCBiZSBleHBhbmRlZD8gSWYgbm90IHNldCwgdGhlIHBhbmVsIGlzIHRvZ2dsZWQuXG4gICAqIEBwYXJhbSB0b2dnbGVOZXN0ZWQgQWxzbyB0b2dnbGUgYWxsIHBhbmVscyBpbnNpZGUgdGhpcyBwYW5lbD9cbiAgICovXG4gIHRvZ2dsZShleHBhbmQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsIHRvZ2dsZU5lc3RlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgdmlzaWJsZSA9IGV4cGFuZCAhPT0gdW5kZWZpbmVkID8gZXhwYW5kIDogIXRoaXMuX21haW5DaGlsZFZpc2libGU7XG4gICAgaWYgKHZpc2libGUgIT09IHRoaXMuX21haW5DaGlsZFZpc2libGUpIHtcbiAgICAgIHRoaXMuX21haW5DaGlsZFZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgaWYgKHRoaXMuX21haW5DaGlsZFZpc2libGUpIHtcbiAgICAgICAgLy8gUmVmcmVzaCBwYW5lbCBVSSBvbiBleHBhbmQuXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlcXVlc3RSZWZyZXNoKHRydWUpO1xuICAgICAgICAvLyBTaG93IHRoZSBET00gZWxlbWVudC5cbiAgICAgICAgdGhpcy5jb250YWluZXIuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uaGlkZGVuKTtcbiAgICAgICAgLy8gUmVmbGVjdCBleHBhbmRlZCBzdGF0ZSBvbiBleHBhbmRvLlxuICAgICAgICB0aGlzLmV4cGFuZG8uc2V0RXhwYW5kZWQoKTtcbiAgICAgICAgLy8gUmVmbGVjdCBleHBhbmRlZCBzdGF0ZSBmb3IgQ1NTLlxuICAgICAgICB0aGlzLmhlYWQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uZXhwYW5kZWQpO1xuICAgICAgICAvLyBUaGlzIGlzIE5PVCBhIERPTSBldmVudCEgSXQgY2FuIG9ubHkgYmUgY2F1Z2h0IGJ5IGxpc3RlbmluZyBvbiB0aGlzIHBhbmVsIGRpcmVjdGx5LlxuICAgICAgICB0aGlzLmVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJwYW5lbFNob3duXCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmhpZGRlbik7XG4gICAgICAgIHRoaXMuZXhwYW5kby5zZXRDb2xsYXBzZWQoKTtcbiAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmV4cGFuZGVkKTtcbiAgICAgICAgdGhpcy5lbGVtZW50WzBdLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwicGFuZWxIaWRkZW5cIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0b2dnbGVOZXN0ZWQpIHtcbiAgICAgIGNvbnN0IHRvZ2dsZUNoaWxkcmVuID0gKGNoaWxkcmVuOiBJdGVyYWJsZTxVaUNvbXBvbmVudEludGVyZmFjZT4pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGlmIChpczxDb2xsYXBzaWJsZVBhbmVsPihjaGlsZCwgQ29sbGFwc2libGVQYW5lbCkpIHtcbiAgICAgICAgICAgIGNoaWxkLnRvZ2dsZShleHBhbmQsIHRvZ2dsZU5lc3RlZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvZ2dsZUNoaWxkcmVuKGNoaWxkLmNoaWxkcmVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRvZ2dsZUNoaWxkcmVuKHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTZXR0aW5nIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBDb2xsYXBzaWJsZVBhbmVsLCB0eXBlIENvbGxhcHNpYmxlUGFuZWxPcHRpb25zIH0gZnJvbSBcIi4vQ29sbGFwc2libGVQYW5lbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBMYWJlbExpc3RJdGVtIH0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nc1BhbmVsT3B0aW9uczxUTGlzdEl0ZW0gZXh0ZW5kcyBMYWJlbExpc3RJdGVtID0gTGFiZWxMaXN0SXRlbT4gPVxuICBUaGlzVHlwZTxTZXR0aW5nc1BhbmVsPiAmXG4gICAgQ29sbGFwc2libGVQYW5lbE9wdGlvbnMgJiB7XG4gICAgICByZWFkb25seSBzZXR0aW5nSXRlbT86IFRMaXN0SXRlbTtcbiAgICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbDxcbiAgICBUU2V0dGluZyBleHRlbmRzIFNldHRpbmcgPSBTZXR0aW5nLFxuICAgIFRMaXN0SXRlbSBleHRlbmRzIExhYmVsTGlzdEl0ZW0gPSBMYWJlbExpc3RJdGVtLFxuICA+XG4gIGV4dGVuZHMgQ29sbGFwc2libGVQYW5lbFxuICBpbXBsZW1lbnRzIFNldHRpbmdMaXN0SXRlbVxue1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFNldHRpbmdzUGFuZWxPcHRpb25zPFRMaXN0SXRlbT47XG4gIHJlYWRvbmx5IHNldHRpbmc6IFRTZXR0aW5nO1xuICByZWFkb25seSBzZXR0aW5nSXRlbTogVExpc3RJdGVtO1xuXG4gIGdldCBpc0V4cGFuZGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9tYWluQ2hpbGRWaXNpYmxlO1xuICB9XG5cbiAgLy8gU2V0dGluZ0xpc3RJdGVtIGludGVyZmFjZVxuICBnZXQgZWxlbWVudExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuZWxlbWVudDtcbiAgfVxuXG4gIGdldCByZWFkT25seSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXQgcmVhZE9ubHkoX3ZhbHVlOiBib29sZWFuKSB7XG4gICAgLyogbm9vcCAqL1xuICB9XG5cbiAgYXN5bmMgY2hlY2soKSB7XG4gICAgdGhpcy5zZXR0aW5nLmVuYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMucmVxdWVzdFJlZnJlc2goKTtcbiAgfVxuXG4gIGFzeW5jIHVuY2hlY2soKSB7XG4gICAgdGhpcy5zZXR0aW5nLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNldHRpbmdzIHBhbmVsIHRoYXQgaXMgdXNlZCB0byBjb250YWluIGEgbWFqb3Igc2VjdGlvbiBvZiB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IC0gQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBzZXR0aW5nSXRlbSAtIFRoZSBVSSBlbGVtZW50IHRvIGJlIHBsYWNlZCBpbiB0aGUgaGVhZCBvZiB0aGUgcGFuZWwuXG4gICAqIEBwYXJhbSBzZXR0aW5nIC0gQW4gc2V0dGluZyBmb3Igd2hpY2ggdGhpcyBpcyB0aGUgc2V0dGluZ3MgcGFuZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhpcyBwYW5lbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogVFNldHRpbmcsXG4gICAgc2V0dGluZ0l0ZW06IFRMaXN0SXRlbSxcbiAgICBvcHRpb25zPzogU2V0dGluZ3NQYW5lbE9wdGlvbnM8VExpc3RJdGVtPixcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBzZXR0aW5nSXRlbSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBzZXR0aW5nSXRlbS5lbGVtZW50O1xuICAgIHRoaXMuc2V0dGluZ0l0ZW0gPSBzZXR0aW5nSXRlbTtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1NldHRpbmdzUGFuZWwubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuc2V0dGluZ0l0ZW0uZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJvbmZpcmVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9Cb25maXJlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8QnVpbGRpbmdVcGdyYWRlU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3MsXG4gICAgX2xvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogQm9uZmlyZVNldHRpbmdzLFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS5idWlsZGluZ3NcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAhT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoYnVpbGRpbmcgPT4gYnVpbGRpbmcuZW5hYmxlZCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2V0dGluZyBvZiBPYmplY3QudmFsdWVzKHRoaXMuc2V0dGluZy5idWlsZGluZ3MpKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihgJGJ1aWxkaW5ncy4ke3NldHRpbmcudXBncmFkZX0ubGFiZWxgKTtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgc2V0dGluZywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpdGVtcy5wdXNoKHsgYnV0dG9uOiBidXR0b24sIGxhYmVsOiBsYWJlbCB9KTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIGJ1dHRvbnMgYXJlIGFkZGVkIGludG8gVUkgd2l0aCB0aGVpciBsYWJlbHMgYWxwaGFiZXRpemVkLlxuICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XG4gICAgY29uc3QgaXRlbXNMaXN0ID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKTtcbiAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiBpdGVtcykge1xuICAgICAgaXRlbXNMaXN0LmFkZENoaWxkKGJ1dHRvbi5idXR0b24pO1xuICAgIH1cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChpdGVtc0xpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyByZWRpcmVjdEVycm9yc1RvQ29uc29sZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanNcIjtcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgSWNvbkJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi9JY29uQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxCdXR0b24+ICZcbiAgSWNvbkJ1dHRvbk9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgYm9yZGVyPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBhbGlnbm1lbnQ/OiBcImxlZnRcIiB8IFwicmlnaHRcIjtcbiAgICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbiAgICByZWFkb25seSBjbGFzc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgfTtcblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGhhcyBhIGxhYmVsIGFuZCBjYW4gb3B0aW9uYWxseSBoYXZlIGFuIFNWRyBpY29uLlxuICovXG5leHBvcnQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEJ1dHRvbk9wdGlvbnM7XG4gIHByb3RlY3RlZCByZWFkb25seSBfaWNvbkVsZW1lbnQ6IEpRdWVyeSB8IHVuZGVmaW5lZDtcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG4gIGluYWN0aXZlOiBib29sZWFuO1xuICBpbmVmZmVjdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGBCdXR0b25gLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgLSBUaGUgdGV4dCB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24uXG4gICAqIEBwYXJhbSBwYXRoRGF0YSAtIFRoZSBTVkcgcGF0aCBkYXRhIG9mIHRoZSBpY29uLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBpY29uIGJ1dHRvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBwYXRoRGF0YTogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgb3B0aW9ucz86IEJ1dHRvbk9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXMucmVhZG9ubHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXMucmVhZG9ubHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLmluYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzLmluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmluZWZmZWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5pbmVmZmVjdGl2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHN0eWxlcy5pbmVmZmVjdGl2ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zPy5vblJlZnJlc2g/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIiwgeyB0aXRsZTogb3B0aW9ucz8udGl0bGUgfSkuYWRkQ2xhc3Moc3R5bGVzLmJ1dHRvbikudGV4dChsYWJlbCk7XG5cbiAgICBpZiAob3B0aW9ucz8uYm9yZGVyICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy5ib3JkZXJlZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmFsaWdubWVudCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLmFsaWduUmlnaHQpO1xuICAgIH1cblxuICAgIGlmIChwYXRoRGF0YSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5faWNvbkVsZW1lbnQgPSAkKFxuICAgICAgICBgPHN2ZyBjbGFzcz1cIiR7c3R5bGVzLmJ1dHRvbkljb259XCIgc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4O1wiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48cGF0aCBkPVwiJHtwYXRoRGF0YX1cIi8+PC9zdmc+YCxcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9ucz8uYWxpZ25tZW50ID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQucHJlcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWFkT25seSA9IG9wdGlvbnM/LnJlYWRPbmx5ID8/IGZhbHNlO1xuICAgIHRoaXMuaW5hY3RpdmUgPSBvcHRpb25zPy5pbmFjdGl2ZSA/PyBmYWxzZTtcbiAgICB0aGlzLmluZWZmZWN0aXZlID0gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7QnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxuXG4gIHVwZGF0ZUxhYmVsKGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVsZW1lbnQudGV4dChsYWJlbCk7XG4gICAgaWYgKHRoaXMuX2ljb25FbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxpZ25tZW50ID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQucHJlcGVuZCh0aGlzLl9pY29uRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVwZGF0ZVRpdGxlKHRpdGxlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVsZW1lbnQucHJvcChcInRpdGxlXCIsIHRpdGxlKTtcbiAgfVxuXG4gIGFzeW5jIGNsaWNrKCkge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zPy5vbkNsaWNrPy5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG59XG4iLCJpbXBvcnQgc3R5bGVzIGZyb20gXCIuL0RlbGltaXRlci5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZWxpbWl0ZXIgZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYERlbGltaXRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9uIHRoZSBmaWVsZHNldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGZpZWxkc2V0LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCkge1xuICAgIHN1cGVyKHBhcmVudCwge30pO1xuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3Moc3R5bGVzLmRlbGltaXRlcik7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7RGVsaW1pdGVyLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9IZWFkZXJMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RJdGVtLCBMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9MaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBIZWFkZXJMaXN0SXRlbU9wdGlvbnMgPSBUaGlzVHlwZTxIZWFkZXJMaXN0SXRlbT4gJiBMaXN0SXRlbU9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBIZWFkZXJMaXN0SXRlbSBleHRlbmRzIFVpQ29tcG9uZW50IGltcGxlbWVudHMgTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IExpc3RJdGVtT3B0aW9ucztcblxuICBnZXQgZWxlbWVudExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGFuIGluZm9ybWF0aW9uYWwgdGV4dCBpdGVtLlxuICAgKiBUaGlzIGlzIHB1cmVseSBmb3IgY29zbWV0aWMvaW5mb3JtYXRpb25hbCB2YWx1ZSBpbiB0aGUgVUkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBhcHBlYXIgb24gdGhlIGhlYWRlciBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgaGVhZGVyLlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgdGV4dDogc3RyaW5nLCBvcHRpb25zPzogTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGxpLz5cIiwgeyB0ZXh0IH0pLmFkZENsYXNzKHN0eWxlcy5oZWFkZXIpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0hlYWRlckxpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dOiAnJHt0aGlzLmVsZW1lbnRMYWJlbC50ZXh0KCl9J2A7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIElucHV0T3B0aW9ucyA9IFRoaXNUeXBlPElucHV0PiAmXG4gIFVpQ29tcG9uZW50T3B0aW9ucyAmIHtcbiAgICByZWFkb25seSBvbkNoYW5nZT86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHJlYWRvbmx5IG9uRW50ZXI/OiAoY3VycmVudFZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgb25Fc2NhcGU/OiAoY3VycmVudFZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgc2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNsYXNzZXM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgSW5wdXQgZXh0ZW5kcyBVaUNvbXBvbmVudDxIVE1MSW5wdXRFbGVtZW50PiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogSW5wdXRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGFuIGlucHV0IGZpZWxkLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgLSBUaGUgbGFiZWwgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIFVJIGVsZW1lbnQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogSW5wdXRPcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkPEhUTUxJbnB1dEVsZW1lbnQ+KCc8aW5wdXQgdHlwZT1cInRleHRcIi8+JykuYWRkQ2xhc3MoXCJrcy1pbnB1dFwiKTtcblxuICAgIGZvciAoY29uc3QgY2xhc3NOYW1lIG9mIG9wdGlvbnM/LmNsYXNzZXMgPz8gW10pIHtcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5vbkNoYW5nZSkge1xuICAgICAgdGhpcy5lbGVtZW50Lm9uKFwiY2hhbmdlXCIsICgpID0+IG9wdGlvbnMub25DaGFuZ2U/Lih0aGlzLmVsZW1lbnRbMF0udmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8udmFsdWUpIHtcbiAgICAgIHRoaXMuZWxlbWVudFswXS52YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRbMF0uc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgICAgdGhpcy5lbGVtZW50WzBdLnNlbGVjdGlvbkVuZCA9IC0xO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC5vbihcImtleXVwXCIsIChldmVudDogSlF1ZXJ5LktleVVwRXZlbnQpID0+IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG9wdGlvbnM/Lm9uRW50ZXI/Lih0aGlzLmVsZW1lbnRbMF0udmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgb3B0aW9ucz8ub25Fc2NhcGU/Lih0aGlzLmVsZW1lbnRbMF0udmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0lucHV0Lm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGFyYWdyYXBoT3B0aW9ucyA9IFRoaXNUeXBlPFBhcmFncmFwaD4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgY2xhc3Nlcz86IEFycmF5PHN0cmluZz47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBQYXJhZ3JhcGggZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogUGFyYWdyYXBoT3B0aW9ucztcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHBhcmFncmFwaC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCBpbnNpZGUgdGhlIHBhcmFncmFwaC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgVUkgZWxlbWVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIHRleHQ6IHN0cmluZywgb3B0aW9ucz86IFBhcmFncmFwaE9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIHsgLi4ub3B0aW9ucyB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQ8SFRNTFBhcmFncmFwaEVsZW1lbnQ+KFwiPHAvPlwiKS50ZXh0KHRleHQpO1xuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1BhcmFncmFwaC5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvYWxlc2NlQXJyYXkgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi9CdXR0b24uanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGVsaW1pdGVyIH0gZnJvbSBcIi4vRGVsaW1pdGVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL0RpYWxvZy5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgc3R5bGVzRXhwbGFpbmVyIGZyb20gXCIuL0V4cGxhaW5lckxpdGVJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IElucHV0IH0gZnJvbSBcIi4vSW5wdXQuanNcIjtcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gXCIuL1BhcmFncmFwaC5qc1wiO1xuaW1wb3J0IHN0eWxlc1Rvb2xiYXJMaXN0SXRlbSBmcm9tIFwiLi9Ub29sYmFyTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRJbnRlcmZhY2UsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgRGlhbG9nT3B0aW9ucyA9IFRoaXNUeXBlPERpYWxvZz4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgaGFzQ2FuY2VsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBoYXNDbG9zZT86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgb25DYW5jZWw/OiAoKSA9PiB2b2lkO1xuICAgIHJlYWRvbmx5IG9uQ29uZmlybT86IChyZXN1bHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICByZWFkb25seSBwcm9tcHQ/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHByb21wdFZhbHVlPzogc3RyaW5nO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nIGV4dGVuZHMgVWlDb21wb25lbnQ8SFRNTERpYWxvZ0VsZW1lbnQ+IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBEaWFsb2dPcHRpb25zO1xuICByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcjtcbiAgcmVhZG9ubHkgaGVhZDogQ29udGFpbmVyO1xuICByZXR1cm5WYWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgZGlhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCAtIEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBkaWFsb2cuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBvcHRpb25zPzogRGlhbG9nT3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJDxIVE1MRGlhbG9nRWxlbWVudD4oXCI8ZGlhbG9nLz5cIilcbiAgICAgIC5hZGRDbGFzcyhcImRpYWxvZ1wiKVxuICAgICAgLmFkZENsYXNzKFwiaGVscFwiKVxuICAgICAgLmFkZENsYXNzKHN0eWxlcy5kaWFsb2cpO1xuXG4gICAgaWYgKG9wdGlvbnM/Lmhhc0Nsb3NlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5hZGRDaGlsZChcbiAgICAgICAgbmV3IEJ1dHRvbihwYXJlbnQsIFwiY2xvc2VcIiwgbnVsbCwge1xuICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXMuY2xvc2VdLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uQ2FuY2VsPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXR1cm5WYWx1ZSA9IG9wdGlvbnM/LnByb21wdFZhbHVlID8/IFwiXCI7XG5cbiAgICB0aGlzLmhlYWQgPSBuZXcgQ29udGFpbmVyKHBhcmVudCk7XG4gICAgdGhpcy5jb250YWluZXIgPSBuZXcgQ29udGFpbmVyKHBhcmVudCk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuKFxuICAgICAgY29hbGVzY2VBcnJheShbXG4gICAgICAgIHRoaXMuaGVhZCxcbiAgICAgICAgb3B0aW9ucz8ucHJvbXB0XG4gICAgICAgICAgPyBuZXcgSW5wdXQocGFyZW50LCB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb25FbnRlcjogKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJldHVyblZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25Db25maXJtPy4odGhpcy5yZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9uRXNjYXBlOiAoX3ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNhbmNlbD8uKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5wcm9tcHRWYWx1ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG4gICAgICAgIG5ldyBDb250YWluZXIocGFyZW50LCB7XG4gICAgICAgICAgY2xhc3NlczogW3N0eWxlc1Rvb2xiYXJMaXN0SXRlbS50b29sYmFyXSxcbiAgICAgICAgfSkuYWRkQ2hpbGRyZW4oXG4gICAgICAgICAgY29hbGVzY2VBcnJheShbXG4gICAgICAgICAgICBuZXcgQnV0dG9uKHBhcmVudCwgXCJPS1wiLCBudWxsLCB7XG4gICAgICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXNCdXR0b24ubGFyZ2VdLFxuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnM/Lm9uQ29uZmlybT8uKHRoaXMucmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvcHRpb25zPy5oYXNDYW5jZWxcbiAgICAgICAgICAgICAgPyBuZXcgQnV0dG9uKHBhcmVudCwgXCJDYW5jZWxcIiwgbnVsbCwge1xuICAgICAgICAgICAgICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5sYXJnZV0sXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNhbmNlbD8uKCk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtEaWFsb2cubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG5cbiAgYWRkQ2hpbGRIZWFkKGNoaWxkOiBVaUNvbXBvbmVudEludGVyZmFjZSk6IHRoaXMge1xuICAgIHRoaXMuaGVhZC5hZGRDaGlsZChjaGlsZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgYWRkQ2hpbGRyZW5IZWFkKGNoaWxkcmVuPzogSXRlcmFibGU8VWlDb21wb25lbnRJbnRlcmZhY2U+KTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbiA/PyBbXSkge1xuICAgICAgdGhpcy5oZWFkLmFkZENoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRDaGlsZENvbnRlbnQoY2hpbGQ6IFVpQ29tcG9uZW50KTogdGhpcyB7XG4gICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoY2hpbGQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGFkZENoaWxkcmVuQ29udGVudChjaGlsZHJlbj86IEl0ZXJhYmxlPFVpQ29tcG9uZW50SW50ZXJmYWNlPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFkZENoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaG93KCkge1xuICAgICQoXCIjZ2FtZVBhZ2VDb250YWluZXJcIikuYXBwZW5kKHRoaXMuZWxlbWVudCk7XG4gICAgdGhpcy5lbGVtZW50WzBdLnNob3coKTtcbiAgfVxuICBzaG93TW9kYWwoKSB7XG4gICAgJChcIiNnYW1lUGFnZUNvbnRhaW5lclwiKS5hcHBlbmQodGhpcy5lbGVtZW50KTtcbiAgICB0aGlzLmVsZW1lbnRbMF0uc2hvd01vZGFsKCk7XG4gIH1cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5lbGVtZW50WzBdLmNsb3NlKCk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHByb21wdChcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICBpbml0aWFsVmFsdWU/OiBzdHJpbmcsXG4gICAgZXhwbGFpbmVyPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIG5ldyBEaWFsb2cocGFyZW50LCB7XG4gICAgICAgIGhhc0NhbmNlbDogdHJ1ZSxcbiAgICAgICAgaGFzQ2xvc2U6IGZhbHNlLFxuICAgICAgICBvbkNhbmNlbDogKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Db25maXJtOiAocmVzdWx0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHByb21wdDogdHJ1ZSxcbiAgICAgICAgcHJvbXB0VmFsdWU6IGluaXRpYWxWYWx1ZSxcbiAgICAgIH0pXG4gICAgICAgIC5hZGRDaGlsZHJlbkhlYWQoXG4gICAgICAgICAgY29hbGVzY2VBcnJheShbXG4gICAgICAgICAgICB0aXRsZSA/IG5ldyBIZWFkZXJMaXN0SXRlbShwYXJlbnQsIHRpdGxlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5ldyBQYXJhZ3JhcGgocGFyZW50LCB0ZXh0KSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKVxuICAgICAgICAuYWRkQ2hpbGRyZW5Db250ZW50KFxuICAgICAgICAgIGV4cGxhaW5lclxuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHtcbiAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXNFeHBsYWluZXIuZXhwbGFpbmVyXSxcbiAgICAgICAgICAgICAgICB9KS5hZGRDaGlsZHJlbihbbmV3IFBhcmFncmFwaChwYXJlbnQsIGV4cGxhaW5lcildKSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuc2hvd01vZGFsKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZ01heCB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQnV0dG9uLCB0eXBlIEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vQnV0dG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4uL1VpQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL01heEJ1dHRvbi5tb2R1bGUuY3NzXCI7XG5cbmV4cG9ydCB0eXBlIE1heEJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxNYXhCdXR0b24+ICYgQnV0dG9uT3B0aW9ucztcblxuZXhwb3J0IGNsYXNzIE1heEJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogTWF4QnV0dG9uT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZ01heDtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBzZXR0aW5nOiBTZXR0aW5nTWF4LCBvcHRpb25zOiBNYXhCdXR0b25PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCBcIlwiLCBudWxsLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2xhc3NlczogW3N0eWxlcy5tYXhCdXR0b24sIC4uLihvcHRpb25zPy5jbGFzc2VzID8/IFtdKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske01heEJ1dHRvbi5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIFNldHRpbmdPcHRpb25zLFxuICB0eXBlIFNldHRpbmdUaHJlc2hvbGQsXG4gIFNldHRpbmdUcmlnZ2VyLFxufSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IEJ1dHRvbiwgdHlwZSBCdXR0b25PcHRpb25zIH0gZnJvbSBcIi4uL0J1dHRvbi5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgVHJpZ2dlckJ1dHRvbkJlaGF2aW9yID0gXCJpbnRlZ2VyXCIgfCBcInBlcmNlbnRhZ2VcIjtcblxuZXhwb3J0IHR5cGUgVHJpZ2dlckJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxUcmlnZ2VyQnV0dG9uPiAmXG4gIEJ1dHRvbk9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgcmVuZGVyTGFiZWw/OiBib29sZWFuO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgVHJpZ2dlckJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogVHJpZ2dlckJ1dHRvbk9wdGlvbnM7XG4gIHJlYWRvbmx5IGJlaGF2aW9yOiBUcmlnZ2VyQnV0dG9uQmVoYXZpb3I7XG4gIHJlYWRvbmx5IHNldHRpbmc6IFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZCxcbiAgICBfbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIG9wdGlvbnM6IFRyaWdnZXJCdXR0b25PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIFwiXCIsIEljb25zLlRyaWdnZXIsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgY29uc3QgdHJpZ2dlclZhbHVlID1cbiAgICAgICAgICB0aGlzLmJlaGF2aW9yID09PSBcImludGVnZXJcIlxuICAgICAgICAgICAgPyB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLnRyaWdnZXIsIFwiaW52YXJpYW50XCIpXG4gICAgICAgICAgICA6IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZy50cmlnZ2VyLCBcImludmFyaWFudFwiLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXJcIiwgW3RyaWdnZXJWYWx1ZV0pKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucz8ucmVuZGVyTGFiZWwgPz8gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWwodHJpZ2dlclZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pbmFjdGl2ZSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24uaW5hY3RpdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uaW5hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYmVoYXZpb3IgPSBzZXR0aW5nIGluc3RhbmNlb2YgU2V0dGluZ1RyaWdnZXIgPyBcInBlcmNlbnRhZ2VcIiA6IFwiaW50ZWdlclwiO1xuXG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtUcmlnZ2VyQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlck1heCB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgTWF4QnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9NYXhCdXR0b24uanNcIjtcbmltcG9ydCB7IFRyaWdnZXJCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL1RyaWdnZXJCdXR0b24uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0sIHR5cGUgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ01heExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8U2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbT4gJlxuICBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ01heExpc3RJdGVtT3B0aW9ucyAmXG4gIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IHJlbmRlckxhYmVsVHJpZ2dlcj86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtPFNldHRpbmdUcmlnZ2VyTWF4PiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnM7XG4gIHJlYWRvbmx5IG1heEJ1dHRvbjogTWF4QnV0dG9uO1xuICByZWFkb25seSB0cmlnZ2VyQnV0dG9uOiBUcmlnZ2VyQnV0dG9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogU2V0dGluZ1RyaWdnZXJNYXgsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5tYXhCdXR0b24gPSBuZXcgTWF4QnV0dG9uKHBhcmVudCwgc2V0dGluZywge1xuICAgICAgYWxpZ25tZW50OiBcInJpZ2h0XCIsXG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5oZWFkQWN0aW9uXSxcbiAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldE1heC5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogb3B0aW9ucz8ub25SZWZyZXNoTWF4ID8gKCkgPT4gb3B0aW9ucy5vblJlZnJlc2hNYXg/LmNhbGwodGhpcykgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uID0gbmV3IFRyaWdnZXJCdXR0b24ocGFyZW50LCBzZXR0aW5nLCBsb2NhbGUsIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBjbGFzc2VzOiBbc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uXSxcbiAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldFRyaWdnZXIuY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6IG9wdGlvbnM/Lm9uUmVmcmVzaFRyaWdnZXIgPyAoKSA9PiBvcHRpb25zLm9uUmVmcmVzaFRyaWdnZXI/LmNhbGwodGhpcykgOiB1bmRlZmluZWQsXG4gICAgICByZW5kZXJMYWJlbDogb3B0aW9ucz8ucmVuZGVyTGFiZWxUcmlnZ2VyID8/IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbXG4gICAgICBuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pLFxuICAgICAgdGhpcy5tYXhCdXR0b24sXG4gICAgICB0aGlzLnRyaWdnZXJCdXR0b24sXG4gICAgXSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XTogJyR7dGhpcy5lbGVtZW50TGFiZWwudGV4dCgpfSdgO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMsIFNldHRpbmdUcmlnZ2VyLCBTZXR0aW5nVHJpZ2dlck1heCB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7XG4gIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0sXG4gIHR5cGUgU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnMsXG59IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IGNvbnN0IEJ1aWxkU2VjdGlvblRvb2xzID0ge1xuICBnZXRCdWlsZE9wdGlvbjogKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBTZXR0aW5nVHJpZ2dlck1heCxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFNldHRpbmdUcmlnZ2VyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgc2VjdGlvbkxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8U2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbU9wdGlvbnM+LFxuICApID0+IHtcbiAgICBjb25zdCBvblNldE1heCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICAgICAgXSksXG4gICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgpLFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBvcHRpb24ubWF4ID0gLTE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICBvcHRpb24uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvcHRpb24ubWF4ID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gb3B0aW9uLm1heDtcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXI6IG9wdGlvbnM/LmRlbGltaXRlcixcbiAgICAgIG9uQ2hlY2s6IGFzeW5jIChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIGlmIChvcHRpb24ubWF4ID09PSAwICYmICFpc0JhdGNoUHJvY2Vzcykge1xuICAgICAgICAgIGF3YWl0IG9uU2V0TWF4KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgb3B0aW9ucz8ub25DaGVjaz8uKGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2hNYXg6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24udXBkYXRlTGFiZWwocGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCkpO1xuICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID1cbiAgICAgICAgICBvcHRpb24ubWF4IDwgMFxuICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC50aXRsZUluZmluaXRlXCIsIFtsYWJlbF0pXG4gICAgICAgICAgICA6IG9wdGlvbi5tYXggPT09IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC50aXRsZVplcm9cIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgOiBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC50aXRsZVwiLCBbXG4gICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLm1heCA9PT0gLTE7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmIG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5tYXggPT09IDA7XG5cbiAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgJiZcbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy50cmlnZ2VyID09PSAtMSAmJlxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyXCIsIFtcbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA8IDBcbiAgICAgICAgICAgID8gc2VjdGlvblNldHRpbmcudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQuYmxvY2tlZFwiLCBbc2VjdGlvbkxhYmVsXSlcbiAgICAgICAgICAgICAgOiBgJHtwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3BhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5idWlsZC5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgb25TZXRNYXgsXG4gICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgOiBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQuaW5oZXJpdGVkXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnM/Lm9uU2V0VHJpZ2dlcj8uY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblVuQ2hlY2s6IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICBvcHRpb25zPy5vblVuQ2hlY2s/Lihpc0JhdGNoUHJvY2Vzcyk7XG4gICAgICB9LFxuICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBvcHRpb25zPy5yZW5kZXJMYWJlbFRyaWdnZXIsXG4gICAgICB1cGdyYWRlSW5kaWNhdG9yOiBvcHRpb25zPy51cGdyYWRlSW5kaWNhdG9yLFxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9LFxufTtcbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucywgU2V0dGluZ1RocmVzaG9sZCwgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFRyaWdnZXJCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL1RyaWdnZXJCdXR0b24uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0sIHR5cGUgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8U2V0dGluZ1RyaWdnZXJMaXN0SXRlbT4gJlxuICBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IG9uUmVmcmVzaFRyaWdnZXI/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICByZWFkb25seSBvblNldFRyaWdnZXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJlYWRvbmx5IHJlbmRlckxhYmVsVHJpZ2dlcj86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPFxuICBUU2V0dGluZyBleHRlbmRzIFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZCA9IFNldHRpbmdUcmlnZ2VyIHwgU2V0dGluZ1RocmVzaG9sZCxcbj4gZXh0ZW5kcyBTZXR0aW5nTGlzdEl0ZW08VFNldHRpbmc+IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgdHJpZ2dlckJ1dHRvbjogVHJpZ2dlckJ1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHNldHRpbmcsIGxhYmVsLCBvcHRpb25zKTtcblxuICAgIHRoaXMudHJpZ2dlckJ1dHRvbiA9IG5ldyBUcmlnZ2VyQnV0dG9uKHBhcmVudCwgc2V0dGluZywgbG9jYWxlLCB7XG4gICAgICBhbGlnbm1lbnQ6IFwicmlnaHRcIixcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMub25TZXRUcmlnZ2VyLmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoOiBvcHRpb25zPy5vblJlZnJlc2hUcmlnZ2VyID8gKCkgPT4gb3B0aW9ucy5vblJlZnJlc2hUcmlnZ2VyPy5jYWxsKHRoaXMpIDogdW5kZWZpbmVkLFxuICAgICAgcmVuZGVyTGFiZWw6IG9wdGlvbnM/LnJlbmRlckxhYmVsVHJpZ2dlciA/PyB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkQ2hpbGRyZW5IZWFkKFtcbiAgICAgIG5ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSksXG4gICAgICB0aGlzLnRyaWdnZXJCdXR0b24sXG4gICAgXSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XTogJyR7dGhpcy5lbGVtZW50TGFiZWwudGV4dCgpfSdgO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2FsZXNjZUFycmF5LCBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgQm9uZmlyZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL0JvbmZpcmVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkaW5nLCBTdGFnZWRCdWlsZGluZyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQnVpbGRpbmdVcGdyYWRlU2V0dGluZ3NVaSB9IGZyb20gXCIuL0J1aWxkaW5nVXBncmFkZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IEJ1aWxkU2VjdGlvblRvb2xzIH0gZnJvbSBcIi4vQnVpbGRTZWN0aW9uVG9vbHMuanNcIjtcbmltcG9ydCB7IERlbGltaXRlciB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGVsaW1pdGVyLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBCb25maXJlU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8Qm9uZmlyZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IEJvbmZpcmVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYENvbnN0cnVjdGluZyAke0JvbmZpcmVTZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmJ1aWxkXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcbiAgICAgICAgICAgIFwidWkudHJpZ2dlci5zZWN0aW9uXCIsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmFjdGl2ZVwiKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPCAwO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCA8IF8ubWF4ICYmIF8udHJpZ2dlciA8IDApO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoc2V0dGluZ3MuYnVpbGRpbmdzKS5zb21lKFxuICAgICAgICAgICAgICBfID0+IF8uZW5hYmxlZCAmJiAoMCA9PT0gXy5tYXggfHwgKF8udHJpZ2dlciA8IDAgJiYgc2V0dGluZ3MudHJpZ2dlciA8IDApKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQb3N0LXN1cGVyKCkgY2hpbGQgaW5zZXJ0aW9uLCBzbyB3ZSBjYW4gdXNlIHRoaXMuX2dldEJ1aWxkT3B0aW9ucygpLlxuICAgIC8vIFdlIHdhbnQgdGhlIGFiaWxpdHkgdG8gdXNlIGB0aGlzYCBpbiBvdXIgY2FsbGJhY2tzLCB0byBjb25zdHJ1Y3QgbW9yZSBjb21wbGV4XG4gICAgLy8gdXNhZ2Ugc2NlbmFyaW9zIHdoZXJlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBlbnRpcmUgVUkgc2VjdGlvbi5cbiAgICB0aGlzLmFkZENoaWxkcmVuQ29udGVudChbXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgb25SZXNldDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZy5sb2FkKHsgYnVpbGRpbmdzOiBuZXcgQm9uZmlyZVNldHRpbmdzKCkuYnVpbGRpbmdzIH0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oXG4gICAgICAgIGNvYWxlc2NlQXJyYXkoXG4gICAgICAgICAgdGhpcy5ob3N0LmdhbWUuYmxkLmJ1aWxkaW5nR3JvdXBzLmZsYXRNYXAoYnVpbGRpbmdHcm91cCA9PiBbXG4gICAgICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgYnVpbGRpbmdHcm91cC50aXRsZSksXG4gICAgICAgICAgICAuLi5idWlsZGluZ0dyb3VwLmJ1aWxkaW5ncy5mbGF0TWFwKGJ1aWxkaW5nID0+XG4gICAgICAgICAgICAgIHRoaXMuX2dldEJ1aWxkT3B0aW9ucyh0aGlzLCBzZXR0aW5ncywgbG9jYWxlLCBsYWJlbCwgYnVpbGRpbmcpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGJ1aWxkaW5nR3JvdXAgIT09XG4gICAgICAgICAgICB0aGlzLmhvc3QuZ2FtZS5ibGQuYnVpbGRpbmdHcm91cHNbdGhpcy5ob3N0LmdhbWUuYmxkLmJ1aWxkaW5nR3JvdXBzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgID8gbmV3IERlbGltaXRlcih0aGlzKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgICB9KS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5hZGRpdGlvbmFsXCIpKSxcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCBzZXR0aW5ncy5nYXRoZXJDYXRuaXAsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5jYXRuaXBcIiksIHtcbiAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW1xuICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uY2F0bmlwXCIpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uY2F0bmlwXCIpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBzZXR0aW5ncy50dXJuT25TdGVhbXdvcmtzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5zdGVhbXdvcmtzXCIpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uc3RlYW13b3Jrc1wiKSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5zdGVhbXdvcmtzXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHNldHRpbmdzLnR1cm5Pbk1hZ25ldG9zLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5tYWduZXRvc1wiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLm1hZ25ldG9zXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLm1hZ25ldG9zXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHNldHRpbmdzLnR1cm5PblJlYWN0b3JzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5yZWFjdG9yc1wiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnJlYWN0b3JzXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnJlYWN0b3JzXCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IEJ1aWxkaW5nVXBncmFkZVNldHRpbmdzVWkodGhpcywgc2V0dGluZ3MudXBncmFkZUJ1aWxkaW5ncywgbG9jYWxlLCBzZXR0aW5ncyksXG4gICAgICBdKSxcbiAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ1aWxkT3B0aW9ucyhcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBCb25maXJlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25MYWJlbDogc3RyaW5nLFxuICAgIGJ1aWxkaW5nOiBCdWlsZGluZyxcbiAgKSB7XG4gICAgaWYgKGJ1aWxkaW5nID09PSBcInVuaWNvcm5QYXN0dXJlXCIgfHwgaXNOaWwoc2V0dGluZ3MuYnVpbGRpbmdzW2J1aWxkaW5nXSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gcGFyZW50Lmhvc3QuZ2FtZS5ibGQuZ2V0QnVpbGRpbmdFeHQoYnVpbGRpbmcpLm1ldGE7XG4gICAgaWYgKCFpc05pbChtZXRhLnN0YWdlcykpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuZmluZChpdGVtID0+IGl0ZW0uYmFzZUJ1aWxkaW5nID09PSBidWlsZGluZylcbiAgICAgICAgPy5idWlsZGluZyBhcyBTdGFnZWRCdWlsZGluZztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIEJ1aWxkU2VjdGlvblRvb2xzLmdldEJ1aWxkT3B0aW9uKFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBzZXR0aW5ncy5idWlsZGluZ3NbYnVpbGRpbmddLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICBtZXRhLnN0YWdlc1swXS5sYWJlbCxcbiAgICAgICAgICBzZWN0aW9uTGFiZWwsXG4gICAgICAgICAgeyByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlIH0sXG4gICAgICAgICksXG4gICAgICAgIEJ1aWxkU2VjdGlvblRvb2xzLmdldEJ1aWxkT3B0aW9uKFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBzZXR0aW5ncy5idWlsZGluZ3NbbmFtZV0sXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgIG1ldGEuc3RhZ2VzWzFdLmxhYmVsLFxuICAgICAgICAgIHNlY3Rpb25MYWJlbCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgICAgICAgdXBncmFkZUluZGljYXRvcjogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKCFpc05pbChtZXRhLmxhYmVsKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHNldHRpbmdzLmJ1aWxkaW5nc1tidWlsZGluZ10sXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgIG1ldGEubGFiZWwsXG4gICAgICAgICAgc2VjdGlvbkxhYmVsLFxuICAgICAgICAgIHsgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSB9LFxuICAgICAgICApLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRW5naW5lU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvRW5naW5lU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IHVjZmlyc3QgfSBmcm9tIFwiLi4vdG9vbHMvRm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBFeHBhbmRvQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9idXR0b25zL0V4cGFuZG9CdXR0b24uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmVTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtIHtcbiAgcmVhZG9ubHkgZXhwYW5kbzogRXhwYW5kb0J1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBzZXR0aW5nczogRW5naW5lU2V0dGluZ3MpIHtcbiAgICBjb25zdCBsYWJlbCA9IHVjZmlyc3QocGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5lbmdpbmVcIikpO1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5zdGFydCh0cnVlKTtcbiAgICAgIH0sXG4gICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLnN0b3AodHJ1ZSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5leHBhbmRvID0gbmV3IEV4cGFuZG9CdXR0b24odGhpcyk7XG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgIHRoaXMuZXhwYW5kbyxcbiAgICBdKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTGlzdEl0ZW0sIHR5cGUgTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMaXN0SXRlbSBmcm9tIFwiLi9MaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IFRleHRCdXR0b24gfSBmcm9tIFwiLi9UZXh0QnV0dG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgQnV0dG9uTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8QnV0dG9uTGlzdEl0ZW0+ICYgTGlzdEl0ZW1PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uTGlzdEl0ZW0gZXh0ZW5kcyBMaXN0SXRlbSB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQnV0dG9uTGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBidXR0b246IFRleHRCdXR0b247XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgYnV0dG9uOiBUZXh0QnV0dG9uLCBvcHRpb25zPzogQnV0dG9uTGlzdEl0ZW1PcHRpb25zKSB7XG4gICAgc3VwZXIocGFyZW50LCB7IC4uLm9wdGlvbnMgfSk7XG5cbiAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbjtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMaXN0SXRlbS5oZWFkKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKGJ1dHRvbi5lbGVtZW50KTtcbiAgfVxufVxuIiwiaW1wb3J0IHN0eWxlc0RlbGltaXRlciBmcm9tIFwiLi9EZWxpbWl0ZXIubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9GaWVsZHNldC5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWwgZnJvbSBcIi4vTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCwgdHlwZSBVaUNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBGaWVsZHNldE9wdGlvbnMgPSBUaGlzVHlwZTxGaWVsZHNldD4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgZGVsaW1pdGVyPzogYm9vbGVhbjtcbiAgfTtcblxuZXhwb3J0IGNsYXNzIEZpZWxkc2V0IGV4dGVuZHMgVWlDb21wb25lbnQge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEZpZWxkc2V0T3B0aW9ucztcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGBGaWVsZHNldGAuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9uIHRoZSBmaWVsZHNldC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGZpZWxkc2V0LlxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IEZpZWxkc2V0T3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJChcIjxmaWVsZHNldC8+XCIpLmFkZENsYXNzKHN0eWxlcy5maWVsZHNldCk7XG4gICAgaWYgKG9wdGlvbnM/LmRlbGltaXRlcikge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0RlbGltaXRlci5kZWxpbWl0ZXIpO1xuICAgIH1cbiAgICBjb25zdCBsZWdlbmQgPSAkKFwiPGxlZ2VuZC8+XCIpLnRleHQobGFiZWwpLmFkZENsYXNzKHN0eWxlc0xhYmVsLmxhYmVsKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKGxlZ2VuZCk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7RmllbGRzZXQubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNEZWxpbWl0ZXIgZnJvbSBcIi4vRGVsaW1pdGVyLm1vZHVsZS5jc3NcIjtcbmltcG9ydCBzdHlsZXNMYWJlbCBmcm9tIFwiLi9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFJhZGlvSXRlbU9wdGlvbnMgPSBUaGlzVHlwZTxSYWRpb0l0ZW0+ICZcbiAgVWlDb21wb25lbnRPcHRpb25zICYge1xuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhpcyByYWRpbyBpdGVtLlxuICAgICAqL1xuICAgIG9uQ2hlY2s/OiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIHRoZXJlIGJlIGFkZGl0aW9uYWwgcGFkZGluZyBiZWxvdyB0aGlzIGVsZW1lbnQ/XG4gICAgICovXG4gICAgZGVsaW1pdGVyPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNob3VsZCBhbiBpbmRpY2F0b3IgYmUgcmVuZGVyZWQgaW4gZnJvbnQgb2YgdGhlIGVsZW1lbnQsXG4gICAgICogdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGFuIHVwZ3JhZGUgb2YgYSBwcmlvciBzZXR0aW5nP1xuICAgICAqL1xuICAgIHVwZ3JhZGVJbmRpY2F0b3I/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIHRoZSB1c2VyIGJlIHByZXZlbnRlZCBmcm9tIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQ/XG4gICAgICovXG4gICAgcmVhZE9ubHk/OiBib29sZWFuO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgUmFkaW9JdGVtPFRTZXR0aW5nIGV4dGVuZHMgU2V0dGluZ09wdGlvbnMgPSBTZXR0aW5nT3B0aW9ucz4gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogUmFkaW9JdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogVFNldHRpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbjogVFNldHRpbmdbXCJvcHRpb25zXCJdWzBdO1xuICByZWFkb25seSBlbGVtZW50TGFiZWw6IEpRdWVyeTxIVE1MTGFiZWxFbGVtZW50PjtcbiAgcmVhZG9ubHkgaW5wdXQ6IEpRdWVyeTtcblxuICByZWFkT25seTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0IGEgbmV3IHJhZGlvIHNldHRpbmcgZWxlbWVudC5cbiAgICogVGhpcyBpcyBhIHJhZGlvIGlucHV0IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaG9zdGVkIGluIGEgYEZpZWxkc2V0YC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIHVzZXJzY3JpcHQgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBzZXR0aW5nIFRoZSBzZXR0aW5nIHRoaXMgZWxlbWVudCBpcyBsaW5rZWQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb24gVGhlIHNwZWNpZmljIG9wdGlvbiBvdXQgb2YgdGhlIHNldHRpbmcgdGhhdCB0aGlzIHJhZGlvIGl0ZW0gcmVwcmVzZW50cy5cbiAgICogQHBhcmFtIGdyb3VwS2V5IEEgdW5pcXVlIG5hbWUgZm9yIHRoZSBncm91cCBvZiByYWRpbyBpdGVtcyB0aGlzIG9uZSBiZWxvbmdzIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGlzIHJhZGlvIGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIG9wdGlvbjogVFNldHRpbmdbXCJvcHRpb25zXCJdWzBdLFxuICAgIGdyb3VwS2V5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFJhZGlvSXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICB0aGlzLmlucHV0LnByb3AoXCJkaXNhYmxlZFwiLCB0aGlzLnJlYWRPbmx5KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGRpdi8+XCIpO1xuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uc2V0dGluZyk7XG5cbiAgICBpZiAob3B0aW9ucz8uZGVsaW1pdGVyID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzRGVsaW1pdGVyLmRlbGltaXRlcik7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50TGFiZWwgPSAkPEhUTUxMYWJlbEVsZW1lbnQ+KFwiPGxhYmVsLz5cIiwge1xuICAgICAgdGV4dDogYCR7b3B0aW9ucz8udXBncmFkZUluZGljYXRvciA/IFwi4q6kIFwiIDogXCJcIn0ke29wdGlvbi5sYWJlbH1gLFxuICAgIH0pLmFkZENsYXNzKHN0eWxlc0xhYmVsLmxhYmVsKTtcblxuICAgIGNvbnN0IGlucHV0ID0gJChcIjxpbnB1dC8+XCIsIHtcbiAgICAgIG5hbWU6IGdyb3VwS2V5LFxuICAgICAgdHlwZTogXCJyYWRpb1wiLFxuICAgIH0pLmFkZENsYXNzKFwia3MtcmFkaW9cIik7XG5cbiAgICB0aGlzLnJlYWRPbmx5ID0gb3B0aW9ucz8ucmVhZE9ubHkgPz8gZmFsc2U7XG5cbiAgICBpbnB1dC5vbihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmcuc2VsZWN0ZWQgPSBvcHRpb24udmFsdWU7XG4gICAgICBpZiAoIWlzTmlsKG9wdGlvbnM/Lm9uQ2hlY2spKSB7XG4gICAgICAgIG9wdGlvbnMub25DaGVjaygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50TGFiZWwucHJlcGVuZChpbnB1dCk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLmVsZW1lbnRMYWJlbCk7XG5cbiAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtSYWRpb0l0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgRmllbGRzZXQgfSBmcm9tIFwiLi9GaWVsZHNldC5qc1wiO1xuaW1wb3J0IHsgUmFkaW9JdGVtIH0gZnJvbSBcIi4vUmFkaW9JdGVtLmpzXCI7XG5pbXBvcnQgeyBVaUNvbXBvbmVudCwgdHlwZSBVaUNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBPcHRpb25zTGlzdEl0ZW1PcHRpb25zID0gVGhpc1R5cGU8T3B0aW9uc0xpc3RJdGVtPiAmXG4gIFVpQ29tcG9uZW50T3B0aW9ucyAmIHtcbiAgICByZWFkb25seSBvbkNoZWNrPzogKGlzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICByZWFkb25seSByZWFkT25seT86IGJvb2xlYW47XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBPcHRpb25zTGlzdEl0ZW08VFNldHRpbmcgZXh0ZW5kcyBTZXR0aW5nT3B0aW9ucyA9IFNldHRpbmdPcHRpb25zPiBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBPcHRpb25zTGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBmaWVsZHNldDogRmllbGRzZXQ7XG4gIHJlYWRvbmx5IHNldHRpbmc6IFRTZXR0aW5nO1xuICByZWFkb25seSBfaXRlbXM6IEFycmF5PFJhZGlvSXRlbT47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIG5ldyBvcHRpb25zIHNldHRpbmcgZWxlbWVudC5cbiAgICogVGhpcyBpcyBhIGxpc3Qgb2Ygb3B0aW9ucywgd2hlcmUgdGhlIHNlbGVjdGVkIG9wdGlvbiB3aWxsIGJlIHB1dCBpbnRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgdXNlcnNjcmlwdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgc2V0dGluZyBlbGVtZW50LlxuICAgKiBAcGFyYW0gc2V0dGluZyBUaGUgc2V0dGluZyB0aGlzIGVsZW1lbnQgaXMgbGlua2VkIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHNldHRpbmc6IFRTZXR0aW5nLFxuICAgIG9wdGlvbnM/OiBPcHRpb25zTGlzdEl0ZW1PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5faXRlbXMpIHtcbiAgICAgICAgICBpZiAob3B0aW9uLm9wdGlvbi52YWx1ZSA9PT0gdGhpcy5zZXR0aW5nLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBvcHRpb24uaW5wdXQucHJvcChcImNoZWNrZWRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSAkKFwiPGxpLz5cIik7XG5cbiAgICB0aGlzLmZpZWxkc2V0ID0gbmV3IEZpZWxkc2V0KHBhcmVudCwgbGFiZWwpO1xuICAgIHRoaXMuYWRkQ2hpbGQodGhpcy5maWVsZHNldCk7XG5cbiAgICB0aGlzLl9pdGVtcyA9IG5ldyBBcnJheTxSYWRpb0l0ZW0+KCk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2V0dGluZy5vcHRpb25zKSB7XG4gICAgICB0aGlzLl9pdGVtcy5wdXNoKFxuICAgICAgICBuZXcgUmFkaW9JdGVtKHBhcmVudCwgc2V0dGluZywgb3B0aW9uLCBsYWJlbCwge1xuICAgICAgICAgIG9uQ2hlY2s6IG9wdGlvbnM/Lm9uQ2hlY2ssXG4gICAgICAgICAgcmVhZE9ubHk6IG9wdGlvbnM/LnJlYWRPbmx5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZmllbGRzZXQuYWRkQ2hpbGRyZW4odGhpcy5faXRlbXMpO1xuXG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtPcHRpb25zTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9UZXh0QnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50LCB0eXBlIFVpQ29tcG9uZW50T3B0aW9ucyB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRleHRCdXR0b25PcHRpb25zID0gVGhpc1R5cGU8VGV4dEJ1dHRvbj4gJlxuICBVaUNvbXBvbmVudE9wdGlvbnMgJiB7XG4gICAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgb25DbGljaz86IChldmVudD86IE1vdXNlRXZlbnQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgVGV4dEJ1dHRvbiBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBUZXh0QnV0dG9uT3B0aW9ucztcbiAgcmVhZE9ubHk6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgbGFiZWw/OiBzdHJpbmcsIG9wdGlvbnM/OiBUZXh0QnV0dG9uT3B0aW9ucykge1xuICAgIHN1cGVyKHBhcmVudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24ucmVhZG9ubHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy5jYWxsKHRoaXMpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3Moc3R5bGVzLnRleHRCdXR0b24pO1xuICAgIGlmIChsYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVsZW1lbnQudGV4dChsYWJlbCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSBvcHRpb25zPy50aXRsZTtcbiAgICBpZiAoIWlzTmlsKHRpdGxlKSkge1xuICAgICAgdGhpcy5lbGVtZW50LnByb3AoXCJ0aXRsZVwiLCB0aXRsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWFkT25seSA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbGVtZW50Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsaWNrKCkuY2F0Y2gocmVkaXJlY3RFcnJvcnNUb0NvbnNvbGUoY29uc29sZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1RleHRCdXR0b24ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG5cbiAgYXN5bmMgY2xpY2soKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wdGlvbnM/Lm9uQ2xpY2s/LmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgeyBrc1ZlcnNpb24gfSBmcm9tIFwiLi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9FbmdpbmVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBCdXR0b25MaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBEZWxpbWl0ZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RlbGltaXRlci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IExhYmVsTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBPcHRpb25zTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL09wdGlvbnNMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL1RleHRCdXR0b24uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbHNVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8RW5naW5lU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogRW5naW5lU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtJbnRlcm5hbHNVaS5uYW1lfWApKTtcblxuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgTGFiZWxMaXN0SXRlbShwYXJlbnQsIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW50ZXJuYWxzXCIpLCB7XG4gICAgICAgIGNsYXNzZXM6IFtzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uY2hlY2tlZCwgc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnNldHRpbmddLFxuICAgICAgICBpY29uOiBJY29ucy5TZXR0aW5ncyxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuQ29udGVudChbXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHBhcmVudCwge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgbmV3IEJ1dHRvbkxpc3RJdGVtKFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBuZXcgVGV4dEJ1dHRvbihcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW50ZXJuYWxzLmludGVydmFsXCIsIFtzZXR0aW5ncy5pbnRlcnZhbF0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbnRlcm5hbHMuaW50ZXJ2YWwucHJvbXB0XCIpLFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbnRlcm5hbHMuaW50ZXJ2YWwucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5ncy5pbnRlcnZhbCwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZ3MuaW50ZXJ2YWwpLFxuICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbnRlcm5hbHMuaW50ZXJ2YWwucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5pbnRlcnZhbCA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmdzLmludGVydmFsO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblJlZnJlc2goKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRleHQoXG4gICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmludGVybmFscy5pbnRlcnZhbFwiLCBbc2V0dGluZ3MuaW50ZXJ2YWxdKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG5cbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLmtzQ29sdW1uLCBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmtzQ29sdW1uXCIpLCB7XG4gICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVidWlsZFVpKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlYnVpbGRVaSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG5cbiAgICAgICAgbmV3IE9wdGlvbnNMaXN0SXRlbShwYXJlbnQsIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubGFuZ3VhZ2VcIiksIHNldHRpbmdzLmxvY2FsZSwge1xuICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlYnVpbGRVaSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHBhcmVudCksXG5cbiAgICAgICAgbmV3IExhYmVsTGlzdEl0ZW0ocGFyZW50LCBgS2l0dGVuIFNjaWVudGlzdHMgJHtrc1ZlcnNpb24oXCJ2XCIpfWApLFxuICAgICAgXSksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgVHJhbnNsYXRlZFN0cmluZyB9IGZyb20gXCIuLi8uLi9FbmdpbmUuanNcIjtcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vRXhwbGFpbmVyTGl0ZUl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgVWlDb21wb25lbnQsIHR5cGUgVWlDb21wb25lbnRPcHRpb25zIH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgRXhwbGFpbmVyTGlzdEl0ZW1PcHRpb25zPFRLaXR0ZW5HYW1lTGl0ZXJhbCBleHRlbmRzIGAkJHtzdHJpbmd9YD4gPSBVaUNvbXBvbmVudE9wdGlvbnMgJlxuICBUaGlzVHlwZTxFeHBsYWluZXJMaXN0SXRlbTxUS2l0dGVuR2FtZUxpdGVyYWw+PjtcblxuZXhwb3J0IGNsYXNzIEV4cGxhaW5lckxpc3RJdGVtPFRLaXR0ZW5HYW1lTGl0ZXJhbCBleHRlbmRzIGAkJHtzdHJpbmd9YD4gZXh0ZW5kcyBVaUNvbXBvbmVudCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogRXhwbGFpbmVyTGlzdEl0ZW1PcHRpb25zPFRLaXR0ZW5HYW1lTGl0ZXJhbD47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBlbGVtZW50IHRvIGV4cGxhaW4gYW4gYXJlYSBvZiB0aGUgVUkuXG4gICAqIFRoaXMgaXMgcHVyZWx5IGZvciBjb3NtZXRpYy9pbmZvcm1hdGlvbmFsIHZhbHVlIGluIHRoZSBVSS5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgLSBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBpMThuIGtleSBmb3IgdGhlIHRleHQgdG8gYXBwZWFyIG9uIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoaXMgZXhwbGFpbmVyLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBrZXk6IFRyYW5zbGF0ZWRTdHJpbmc8VEtpdHRlbkdhbWVMaXRlcmFsPixcbiAgICBvcHRpb25zPzogRXhwbGFpbmVyTGlzdEl0ZW1PcHRpb25zPFRLaXR0ZW5HYW1lTGl0ZXJhbD4sXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgeyAuLi5vcHRpb25zIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gJChcIjxsaS8+XCIsIHsgdGV4dDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oa2V5KSB9KS5hZGRDbGFzcyhzdHlsZXMuZXhwbGFpbmVyKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtFeHBsYWluZXJMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZpbHRlckl0ZW1zLCB0eXBlIExvZ0ZpbHRlclNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL0xvZ0ZpbHRlclNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBFeHBsYWluZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvRXhwbGFpbmVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBMb2dGaWx0ZXJzU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8TG9nRmlsdGVyU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgc2V0dGluZ3M6IExvZ0ZpbHRlclNldHRpbmdzKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgQ29uc3RydWN0aW5nICR7TG9nRmlsdGVyc1NldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuZmlsdGVyXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCBzZXR0aW5ncy5kaXNhYmxlS0dMb2csIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImZpbHRlci5hbGxLR1wiKSksXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgY29uc3QgbGlzdEZpbHRlcnMgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMpLmFkZENoaWxkcmVuKFxuICAgICAgRmlsdGVySXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyBsYWJlbDogdGhpcy5ob3N0LmVuZ2luZS5pMThuKGBmaWx0ZXIuJHtpdGVtfWApLCBuYW1lOiBpdGVtIH07XG4gICAgICB9KVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIGl0ZW0gPT5cbiAgICAgICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nLmZpbHRlcnNbaXRlbS5uYW1lXSwgaXRlbS5sYWJlbCwge1xuICAgICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcImZpbHRlci5lbmFibGVcIiwgW2l0ZW0ubGFiZWxdKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcImZpbHRlci5kaXNhYmxlXCIsIFtpdGVtLmxhYmVsXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3RGaWx0ZXJzKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KG5ldyBFeHBsYWluZXJMaXN0SXRlbSh0aGlzLCBcImZpbHRlci5leHBsYWluZXJcIikpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgUmVsaWdpb25TZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB7IFJlbGlnaW9uT3B0aW9ucywgVW5pY29ybkl0ZW1zLCB0eXBlIFppZ2d1cmF0VXBncmFkZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgQnVpbGRTZWN0aW9uVG9vbHMgfSBmcm9tIFwiLi9CdWlsZFNlY3Rpb25Ub29scy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBEZWxpbWl0ZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RlbGltaXRlci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgc3R5bGVzVGltZVNraXBIZWF0U2V0dGluZ3MgZnJvbSBcIi4vVGltZVNraXBIZWF0U2V0dGluZ3NVaS5tb2R1bGUuY3NzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWxpZ2lvblNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFJlbGlnaW9uU2V0dGluZ3MsIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdW5pY29ybkJ1aWxkaW5nczogTWFwPFxuICAgIFppZ2d1cmF0VXBncmFkZSB8IFwidW5pY29yblBhc3R1cmVcIixcbiAgICBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtXG4gID47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Jlc3RVbmljb3JuQnVpbGRpbmc6IFNldHRpbmdMaXN0SXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZWxpZ2lvblNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgQ29uc3RydWN0aW5nICR7UmVsaWdpb25TZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmZhaXRoXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyKCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb25cIiwgW1xuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmFjdGl2ZVwiKVxuICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW5maW5pdHlcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xID8gcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgW2J1aWxkaW5nTmFtZSwgYnVpbGRpbmddIG9mIHRoaXMuX3VuaWNvcm5CdWlsZGluZ3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICBidWlsZGluZy5lbGVtZW50TGFiZWwuYXR0cihcImRhdGEta3MtYWN0aXZlLWZyb21cIiwgXCLinYpcIik7XG4gICAgICAgICAgICBidWlsZGluZy5lbGVtZW50TGFiZWwuYXR0cihcImRhdGEta3MtYWN0aXZlLXRvXCIsIFwi4pyuXCIpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5iZXN0VW5pY29ybkJ1aWxkaW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJlc3RVbmljb3JuQnVpbGRpbmdDdXJyZW50ID09PSBidWlsZGluZ05hbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBidWlsZGluZy5lbGVtZW50TGFiZWwuYWRkQ2xhc3Moc3R5bGVzVGltZVNraXBIZWF0U2V0dGluZ3MuYWN0aXZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJ1aWxkaW5nLmVsZW1lbnRMYWJlbC5yZW1vdmVDbGFzcyhzdHlsZXNUaW1lU2tpcEhlYXRTZXR0aW5ncy5hY3RpdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCA8IF8ubWF4ICYmIF8udHJpZ2dlciA8IDApO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoc2V0dGluZ3MuYnVpbGRpbmdzKS5zb21lKFxuICAgICAgICAgICAgICBfID0+IF8uZW5hYmxlZCAmJiAoMCA9PT0gXy5tYXggfHwgKF8udHJpZ2dlciA8IDAgJiYgc2V0dGluZ3MudHJpZ2dlciA8IDApKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBidWlsZGluZ10gb2YgdGhpcy5fdW5pY29ybkJ1aWxkaW5ncy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGJ1aWxkaW5nLnJlYWRPbmx5ID0gdGhpcy5fYmVzdFVuaWNvcm5CdWlsZGluZy5zZXR0aW5nLmVuYWJsZWQ7XG4gICAgICAgICAgICBidWlsZGluZy5tYXhCdXR0b24ucmVhZE9ubHkgPSB0aGlzLl9iZXN0VW5pY29ybkJ1aWxkaW5nLnNldHRpbmcuZW5hYmxlZDtcbiAgICAgICAgICAgIGJ1aWxkaW5nLnRyaWdnZXJCdXR0b24ucmVhZE9ubHkgPSB0aGlzLl9iZXN0VW5pY29ybkJ1aWxkaW5nLnNldHRpbmcuZW5hYmxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB1bmljb3Juc0FycmF5OiBBcnJheTxaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCI+ID0gWy4uLlVuaWNvcm5JdGVtc107XG5cbiAgICB0aGlzLl91bmljb3JuQnVpbGRpbmdzID0gbmV3IE1hcChbXG4gICAgICBbXG4gICAgICAgIFwidW5pY29yblBhc3R1cmVcIixcbiAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJGJ1aWxkaW5ncy51bmljb3JuUGFzdHVyZS5sYWJlbFwiKSxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB7IHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UgfSxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi56aWdndXJhdFVwZ3JhZGVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgaXRlbSA9PiB1bmljb3Juc0FycmF5LmluY2x1ZGVzKGl0ZW0ubmFtZSkgJiYgIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSksXG4gICAgICAgIClcbiAgICAgICAgLm1hcChcbiAgICAgICAgICB6aWdndXJhdFVwZ3JhZGUgPT5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgemlnZ3VyYXRVcGdyYWRlLm5hbWUsXG4gICAgICAgICAgICAgIEJ1aWxkU2VjdGlvblRvb2xzLmdldEJ1aWxkT3B0aW9uKFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t6aWdndXJhdFVwZ3JhZGUubmFtZV0sXG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgICB6aWdndXJhdFVwZ3JhZGUubGFiZWwsXG4gICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgeyByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICBdIGFzIFtaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCIsIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW1dLFxuICAgICAgICApLFxuICAgIF0pO1xuXG4gICAgdGhpcy5fYmVzdFVuaWNvcm5CdWlsZGluZyA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLmJlc3RVbmljb3JuQnVpbGRpbmcsXG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZmFpdGguYmVzdC51bmljb3JuXCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5mYWl0aC5iZXN0LnVuaWNvcm5cIiksXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgZm9yIChjb25zdCBidWlsZGluZyBvZiB0aGlzLl91bmljb3JuQnVpbGRpbmdzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBidWlsZGluZy5zZXR0aW5nLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnVpbGRpbmcuc2V0dGluZy5tYXggPSAtMTtcbiAgICAgICAgICAgIGJ1aWxkaW5nLnNldHRpbmcudHJpZ2dlciA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZmFpdGguYmVzdC51bmljb3JuXCIpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICB1cGdyYWRlSW5kaWNhdG9yOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICAgIG9uUmVzZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0cyA9IG5ldyBSZWxpZ2lvblNldHRpbmdzKCk7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmxvYWQoe1xuICAgICAgICAgICAgYmVzdFVuaWNvcm5CdWlsZGluZzogZGVmYXVsdHMuYmVzdFVuaWNvcm5CdWlsZGluZyxcbiAgICAgICAgICAgIGJ1aWxkaW5nczogZGVmYXVsdHMuYnVpbGRpbmdzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oW1xuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnBhbmVsLnppZ2d1cmF0LmxhYmVsXCIpKSxcbiAgICAgICAgLi4udGhpcy5fdW5pY29ybkJ1aWxkaW5ncy52YWx1ZXMoKSxcbiAgICAgICAgdGhpcy5fYmVzdFVuaWNvcm5CdWlsZGluZyxcbiAgICAgICAgbmV3IERlbGltaXRlcih0aGlzKSxcblxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi56aWdndXJhdFVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIGl0ZW0gPT4gIXVuaWNvcm5zQXJyYXkuaW5jbHVkZXMoaXRlbS5uYW1lKSAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICBCdWlsZFNlY3Rpb25Ub29scy5nZXRCdWlsZE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgdXBncmFkZS5sYWJlbCxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHsgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSB9LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHRoaXMpLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkcmVsaWdpb24ucGFuZWwub3JkZXJPZlRoZVN1bi5sYWJlbFwiKSksXG4gICAgICAgIC4uLnRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnJlbGlnaW9uVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICBCdWlsZFNlY3Rpb25Ub29scy5nZXRCdWlsZE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgdXBncmFkZS5sYWJlbCxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IHVwZ3JhZGUubmFtZSA9PT0gdGhpcy5ob3N0LmdhbWUucmVsaWdpb24ucmVsaWdpb25VcGdyYWRlcy5hdCgtMSk/Lm5hbWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcblxuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnBhbmVsLmNyeXB0b3RoZW9sb2d5LmxhYmVsXCIpKSxcbiAgICAgICAgLi4udGhpcy5ob3N0LmdhbWUucmVsaWdpb24udHJhbnNjZW5kZW5jZVVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+ICFpc05pbCh0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2l0ZW0ubmFtZV0pKVxuICAgICAgICAgIC5tYXAodXBncmFkZSA9PlxuICAgICAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbdXBncmFkZS5uYW1lXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgICAgIHVwZ3JhZGUubGFiZWwsXG4gICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICB7IHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgIF0pLFxuXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgICB9KS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5hZGRpdGlvbmFsXCIpKSxcbiAgICAgICAgLi4uUmVsaWdpb25PcHRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihgb3B0aW9uLmZhaXRoLiR7aXRlbX1gKTtcbiAgICAgICAgICBpZiAoaXRlbSA9PT0gXCJ0cmFuc2NlbmRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nW2l0ZW1dLCBsYWJlbCwge1xuICAgICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHRoaXMsIHRoaXMuc2V0dGluZ1tpdGVtXSwgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbl0sXG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID1cbiAgICAgICAgICAgICAgICAhdGhpcy5zZXR0aW5nW2l0ZW1dLmVuYWJsZWQgfHwgdGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgID8gXCJ1aS50cmlnZ2VyLnNldGludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgICA6IFwidWkudHJpZ2dlci5zZXRwZXJjZW50YWdlXCIsXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5idWlsZC5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKHRoaXMuc2V0dGluZ1tpdGVtXS50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2UodGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmJlaGF2aW9yID09PSBcImludGVnZXJcIlxuICAgICAgICAgICAgICAgICAgPyB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIpXG4gICAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZ1tpdGVtXS50cmlnZ2VyKSxcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICAgID8gXCJ1aS50cmlnZ2VyLnNldGludGVnZXIucHJvbXB0RXhwbGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInVpLnRyaWdnZXIuc2V0cGVyY2VudGFnZS5wcm9tcHRFeHBsYWluZXJcIixcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXIgPVxuICAgICAgICAgICAgICAgIChlbGVtZW50LnRyaWdnZXJCdXR0b24uYmVoYXZpb3IgPT09IFwiaW50ZWdlclwiXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5wYXJzZUFic29sdXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKSkgPz8gdGhpcy5zZXR0aW5nW2l0ZW1dLnRyaWdnZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbik7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlc1NldHRpbmdzSXRlbSB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9SZXNvdXJjZXNTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQnV0dG9uLCB0eXBlIEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vQnV0dG9uLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuLi9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4uL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb25zdW1lQnV0dG9uT3B0aW9ucyA9IFRoaXNUeXBlPENvbnN1bWVCdXR0b24+ICYgQnV0dG9uT3B0aW9ucztcblxuZXhwb3J0IGNsYXNzIENvbnN1bWVCdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IENvbnN1bWVCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBSZXNvdXJjZXNTZXR0aW5nc0l0ZW07XG4gIHJlYWRvbmx5IHJlc291cmNlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogUmVzb3VyY2VzU2V0dGluZ3NJdGVtLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICByZXNvdXJjZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPbWl0PENvbnN1bWVCdXR0b25PcHRpb25zLCBcIm9uQ2xpY2tcIj4sXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgXCJcIiwgSWNvbnMuRGF0YVVzYWdlLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLmNvbnN1bWUucHJvbXB0XCIpLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLmNvbnN1bWUucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgcmVzb3VyY2VOYW1lLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5nLmNvbnN1bWUsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5nLmNvbnN1bWUpLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLmNvbnN1bWUucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGluZy5jb25zdW1lID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY29uc3VtZVZhbHVlID0gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2UoXG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbnN1bWUsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5zZXR0aW5ncy5sb2NhbGUuc2VsZWN0ZWQsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPVxuICAgICAgICAgIHRoaXMuc2V0dGluZy5jb25zdW1lID09PSAwXG4gICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInJlc291cmNlcy5jb25zdW1lLnRpdGxlWmVyb1wiLCBbdGhpcy5yZXNvdXJjZU5hbWVdKVxuICAgICAgICAgICAgOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuY29uc3VtZS50aXRsZVwiLCBbY29uc3VtZVZhbHVlLCB0aGlzLnJlc291cmNlTmFtZV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKHRpdGxlKTtcblxuICAgICAgICBvcHRpb25zPy5vblJlZnJlc2g/LigpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uY29uc3VtZUJ1dHRvbik7XG5cbiAgICB0aGlzLnJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZTtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0NvbnN1bWVCdXR0b24ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi8uLi8uLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VzU2V0dGluZ3NJdGVtIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1Jlc291cmNlc1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24sIHR5cGUgQnV0dG9uT3B0aW9ucyB9IGZyb20gXCIuLi9CdXR0b24uanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4uL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi4vRGlhbG9nLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4uL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFN0b2NrQnV0dG9uT3B0aW9ucyA9IFRoaXNUeXBlPFN0b2NrQnV0dG9uPiAmIEJ1dHRvbk9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBTdG9ja0J1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU3RvY2tCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBSZXNvdXJjZXNTZXR0aW5nc0l0ZW07XG4gIHJlYWRvbmx5IHJlc291cmNlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZzogUmVzb3VyY2VzU2V0dGluZ3NJdGVtLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICByZXNvdXJjZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPbWl0PFN0b2NrQnV0dG9uT3B0aW9ucywgXCJvbkNsaWNrXCI+LFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIFwiXCIsIG51bGwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sucHJvbXB0XCIpLFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLnN0b2NrLnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmcuc3RvY2ssIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZy5zdG9jayksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNldHRpbmcuc3RvY2sgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IFwiMFwiKSB7XG4gICAgICAgICAgc2V0dGluZy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nLnN0b2NrID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gc2V0dGluZy5zdG9jaztcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvY2tWYWx1ZSA9IHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuc3RvY2spO1xuICAgICAgICBjb25zdCB0aXRsZSA9XG4gICAgICAgICAgdGhpcy5zZXR0aW5nLnN0b2NrIDwgMFxuICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sudGl0bGVJbmZpbml0ZVwiLCBbdGhpcy5yZXNvdXJjZU5hbWVdKVxuICAgICAgICAgICAgOiB0aGlzLnNldHRpbmcuc3RvY2sgPT09IDBcbiAgICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJyZXNvdXJjZXMuc3RvY2sudGl0bGVaZXJvXCIsIFt0aGlzLnJlc291cmNlTmFtZV0pXG4gICAgICAgICAgICAgIDogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwicmVzb3VyY2VzLnN0b2NrLnRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuc3RvY2spLFxuICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgIHRoaXMudXBkYXRlVGl0bGUodGl0bGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsKHN0b2NrVmFsdWUpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24uc3RvY2tCdXR0b24pO1xuXG4gICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7XG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTdG9ja0J1dHRvbi5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VzU2V0dGluZ3MsIFJlc291cmNlc1NldHRpbmdzSXRlbSB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNvdXJjZXNTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgdWNmaXJzdCB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb25zdW1lQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9idXR0b25zL0NvbnN1bWVCdXR0b24uanNcIjtcbmltcG9ydCB7IFN0b2NrQnV0dG9uIH0gZnJvbSBcIi4vY29tcG9uZW50cy9idXR0b25zL1N0b2NrQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgTGFiZWxMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgc3R5bGVzU2V0dGluZ0xpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VzU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8UmVzb3VyY2VzU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogUmVzb3VyY2VzU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtSZXNvdXJjZXNTZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnJlc291cmNlc1wiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IExhYmVsTGlzdEl0ZW0ocGFyZW50LCBsYWJlbCwge1xuICAgICAgICBjbGFzc2VzOiBbc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmNoZWNrZWQsIHN0eWxlc1NldHRpbmdMaXN0SXRlbS5zZXR0aW5nXSxcbiAgICAgICAgaWNvbjogSWNvbnMuUmVzb3VyY2VzLFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGlnbm9yZWRSZXNvdXJjZXM6IEFycmF5PFJlc291cmNlPiA9IFtcbiAgICAgIFwiYmxhY2tjb2luXCIsXG4gICAgICBcImJ1cm5lZFBhcmFnb25cIixcbiAgICAgIFwiZWxkZXJCb3hcIixcbiAgICAgIFwiZ2Zsb3BzXCIsXG4gICAgICBcImhhc2hyYXRlc1wiLFxuICAgICAgXCJraXR0ZW5zXCIsXG4gICAgICBcInBhcmFnb25cIixcbiAgICAgIFwidGVtcG9yYWxGbHV4XCIsXG4gICAgICBcIndyYXBwaW5nUGFwZXJcIixcbiAgICAgIFwiemVicmFzXCIsXG4gICAgXTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgICAgdGhpcy5ob3N0LmdhbWUucmVzUG9vbC5yZXNvdXJjZXNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICAgICAhaWdub3JlZFJlc291cmNlcy5pbmNsdWRlcyhpdGVtLm5hbWUpICYmICFpc05pbCh0aGlzLnNldHRpbmcucmVzb3VyY2VzW2l0ZW0ubmFtZV0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS50aXRsZS5sb2NhbGVDb21wYXJlKGIudGl0bGUsIGxvY2FsZS5zZWxlY3RlZCkpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIHJlc291cmNlID0+IFt0aGlzLnNldHRpbmcucmVzb3VyY2VzW3Jlc291cmNlLm5hbWVdLCB1Y2ZpcnN0KHJlc291cmNlLnRpdGxlKV0gYXMgY29uc3QsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKFtzZXR0aW5nLCB0aXRsZV0pID0+IHRoaXMuX21ha2VSZXNvdXJjZVNldHRpbmcodGhpcywgc2V0dGluZywgbG9jYWxlLCB0aXRsZSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBVSSBlbGVtZW50IHRoYXQgcmVmbGVjdHMgc3RvY2sgYW5kIGNvbnN1bWUgdmFsdWVzIGZvciBhIGdpdmVuIHJlc291cmNlLlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIHRoZSBjcmFmdCBzZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIHRpdGxlIHRvIGFwcGx5IHRvIHRoZSBvcHRpb24uXG4gICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiB0aGF0IGlzIGJlaW5nIGNvbnRyb2xsZWQuXG4gICAqIEByZXR1cm5zIEEgbmV3IG9wdGlvbiB3aXRoIHN0b2NrIGFuZCBjb25zdW1lIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX21ha2VSZXNvdXJjZVNldHRpbmcoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBvcHRpb246IFJlc291cmNlc1NldHRpbmdzSXRlbSxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNvdXJjZS5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNvdXJjZS5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKTtcblxuICAgIC8vIEhvdyBtYW55IGl0ZW1zIHRvIHN0b2NrLlxuICAgIGNvbnN0IHN0b2NrRWxlbWVudCA9IG5ldyBTdG9ja0J1dHRvbihwYXJlbnQsIG9wdGlvbiwgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgYWxpZ25tZW50OiBcInJpZ2h0XCIsXG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgY2xhc3NlczogW3N0eWxlc0J1dHRvbi5oZWFkQWN0aW9uXSxcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgc3RvY2tFbGVtZW50LmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi5zdG9jayA9PT0gMDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZWxlbWVudC5oZWFkLmFkZENoaWxkKHN0b2NrRWxlbWVudCk7XG5cbiAgICAvLyBUaGUgY29uc3VtZSByYXRlIGZvciB0aGUgcmVzb3VyY2UuXG4gICAgY29uc3QgY29uc3VtZUVsZW1lbnQgPSBuZXcgQ29uc3VtZUJ1dHRvbihwYXJlbnQsIG9wdGlvbiwgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgYm9yZGVyOiBmYWxzZSxcbiAgICAgIGNsYXNzZXM6IFtzdHlsZXNCdXR0b24ubGFzdEhlYWRBY3Rpb25dLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBjb25zdW1lRWxlbWVudC5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCBvcHRpb24uY29uc3VtZSAhPT0gMTAwO1xuICAgICAgICBjb25zdW1lRWxlbWVudC5pbmVmZmVjdGl2ZSA9IG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5jb25zdW1lID09PSAwO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBlbGVtZW50LmhlYWQuYWRkQ2hpbGQoY29uc3VtZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvbGljeVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1BvbGljeVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNjaWVuY2VTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TY2llbmNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUG9saWN5U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8UG9saWN5U2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogUG9saWN5U2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBTY2llbmNlU2V0dGluZ3MsXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlLnBvbGljaWVzXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnBvbGljaWVzKS5zb21lKHBvbGljeSA9PiBwb2xpY3kuZW5hYmxlZCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBwb2xpY2llcyA9IHRoaXMuaG9zdC5nYW1lLnNjaWVuY2UucG9saWNpZXMuZmlsdGVyKFxuICAgICAgcG9saWN5ID0+ICFpc05pbCh0aGlzLnNldHRpbmcucG9saWNpZXNbcG9saWN5Lm5hbWVdKSxcbiAgICApO1xuXG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBsZXQgbGFzdExhYmVsID0gcG9saWNpZXNbMF0ubGFiZWw7XG4gICAgZm9yIChjb25zdCBwb2xpY3kgb2YgcG9saWNpZXMuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwsIGxvY2FsZS5zZWxlY3RlZCkpKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLnNldHRpbmcucG9saWNpZXNbcG9saWN5Lm5hbWVdO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCBvcHRpb24sIHBvbGljeS5sYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtwb2xpY3kubGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbcG9saWN5LmxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuaG9zdC5lbmdpbmUubG9jYWxlU3VwcG9ydHNGaXJzdExldHRlclNwbGl0cyhsb2NhbGUuc2VsZWN0ZWQpKSB7XG4gICAgICAgIGlmIChsYXN0TGFiZWxbMF0gIT09IHBvbGljeS5sYWJlbFswXSkge1xuICAgICAgICAgIGVsZW1lbnQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMYWJlbExpc3RJdGVtLnNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpdGVtcy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICBsYXN0TGFiZWwgPSBwb2xpY3kubGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihpdGVtcykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTY2llbmNlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2NpZW5jZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRlY2hTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UZWNoU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vY29tcG9uZW50cy9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IGNsYXNzIFRlY2hTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ3NQYW5lbDxUZWNoU2V0dGluZ3MsIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogVGVjaFNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogU2NpZW5jZVNldHRpbmdzLFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS50ZWNoc1wiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcigpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID09PSAtMSAmJlxuICAgICAgICAgICAgIU9iamVjdC52YWx1ZXMoc2V0dGluZ3MudGVjaHMpLnNvbWUodGVjaCA9PiB0ZWNoLmVuYWJsZWQgJiYgMCA8PSB0ZWNoLnRyaWdnZXIpO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnRlY2hzKS5zb21lKHRlY2ggPT4gdGVjaC5lbmFibGVkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHRlY2hzID0gdGhpcy5ob3N0LmdhbWUuc2NpZW5jZS50ZWNocy5maWx0ZXIoXG4gICAgICB0ZWNoID0+ICFpc05pbCh0aGlzLnNldHRpbmcudGVjaHNbdGVjaC5uYW1lXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IGxhc3RMYWJlbCA9IHRlY2hzWzBdLmxhYmVsO1xuICAgIGZvciAoY29uc3QgdGVjaCBvZiB0ZWNocy5zb3J0KChhLCBiKSA9PiBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbCwgbG9jYWxlLnNlbGVjdGVkKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuc2V0dGluZy50ZWNoc1t0ZWNoLm5hbWVdO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0odGhpcywgb3B0aW9uLCBsb2NhbGUsIHRlY2gubGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbdGVjaC5sYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBvcHRpb24uZW5hYmxlZCAmJlxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA9PT0gLTEgJiZcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBvcHRpb24udHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmJsb2NrZWRcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3RoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFt0ZWNoLmxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmhvc3QuZW5naW5lLmxvY2FsZVN1cHBvcnRzRmlyc3RMZXR0ZXJTcGxpdHMobG9jYWxlLnNlbGVjdGVkKSkge1xuICAgICAgICBpZiAobGFzdExhYmVsWzBdICE9PSB0ZWNoLmxhYmVsWzBdKSB7XG4gICAgICAgICAgZWxlbWVudC5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0xhYmVsTGlzdEl0ZW0uc3BsaXR0ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goZWxlbWVudCk7XG5cbiAgICAgIGxhc3RMYWJlbCA9IHRlY2gubGFiZWw7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihpdGVtcykpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2NpZW5jZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NjaWVuY2VTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFBvbGljeVNldHRpbmdzVWkgfSBmcm9tIFwiLi9Qb2xpY3lTZXR0aW5nc1VpLmpzXCI7XG5pbXBvcnQgeyBUZWNoU2V0dGluZ3NVaSB9IGZyb20gXCIuL1RlY2hTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTY2llbmNlU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8U2NpZW5jZVNldHRpbmdzPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BvbGljaWVzVWk6IFBvbGljeVNldHRpbmdzVWk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RlY2hzVWk6IFRlY2hTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlU3RhcnM6IFNldHRpbmdMaXN0SXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBTY2llbmNlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtTY2llbmNlU2V0dGluZ3NVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcub2JzZXJ2ZS5lbmFibGVkKSB7XG4gICAgICAgICAgICAkKFwiI29ic2VydmVCdXR0b25cIikuaGlkZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKFwiI29ic2VydmVCdXR0b25cIikuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAoKHRoaXMuc2V0dGluZy5wb2xpY2llcy5lbmFibGVkICYmIHRoaXMuX3BvbGljaWVzVWkuZXhwYW5kby5pbmVmZmVjdGl2ZSkgfHxcbiAgICAgICAgICAgICAgKHRoaXMuc2V0dGluZy50ZWNocy5lbmFibGVkICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuX3RlY2hzVWkuZXhwYW5kby5pbmVmZmVjdGl2ZSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5fdGVjaHNVaS5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlKSkpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5fcG9saWNpZXNVaSA9IG5ldyBQb2xpY3lTZXR0aW5nc1VpKHRoaXMsIHNldHRpbmdzLnBvbGljaWVzLCBsb2NhbGUsIHNldHRpbmdzKTtcbiAgICB0aGlzLl90ZWNoc1VpID0gbmV3IFRlY2hTZXR0aW5nc1VpKHRoaXMsIHNldHRpbmdzLnRlY2hzLCBsb2NhbGUsIHNldHRpbmdzKTtcblxuICAgIHRoaXMuX29ic2VydmVTdGFycyA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLm9ic2VydmUsXG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ub2JzZXJ2ZVwiKSxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLm9ic2VydmVcIildKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ub2JzZXJ2ZVwiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1zTGlzdCA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgIH0pO1xuICAgIGl0ZW1zTGlzdC5hZGRDaGlsZHJlbihbdGhpcy5fdGVjaHNVaSwgdGhpcy5fcG9saWNpZXNVaSwgdGhpcy5fb2JzZXJ2ZVN0YXJzXSk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQoaXRlbXNMaXN0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgTWlzc2lvblNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL01pc3Npb25TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTcGFjZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NwYWNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgTWlzc2lvblNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPE1pc3Npb25TZXR0aW5ncz4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9taXNzaW9uczogQXJyYXk8U2V0dGluZ0xpc3RJdGVtPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBNaXNzaW9uU2V0dGluZ3MsXG4gICAgX2xvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogU3BhY2VTZXR0aW5ncyxcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnVwZ3JhZGUubWlzc2lvbnNcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAhT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5taXNzaW9ucykuc29tZShtaXNzaW9uID0+IG1pc3Npb24uZW5hYmxlZCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgKTtcblxuICAgIC8vIE1pc3Npb25zIHNob3VsZCBiZSBzb3J0ZWQgYnkgS0cuIEZvciBleGFtcGxlLCB3aGVuIGdvaW5nIHRvIHRoZSBzdW4ganVzdCBjaG9vc2UgdGhlIHRvcCBmaXZlIENoZWNrYm94IGluc3RlYWQgb2YgbG9va2luZyB0aHJvdWdoIHRoZSBsaXN0XG4gICAgdGhpcy5fbWlzc2lvbnMgPSB0aGlzLmhvc3QuZ2FtZS5zcGFjZS5wcm9ncmFtc1xuICAgICAgLmZpbHRlcihpdGVtID0+ICFpc05pbCh0aGlzLnNldHRpbmcubWlzc2lvbnNbaXRlbS5uYW1lXSkpXG4gICAgICAubWFwKFxuICAgICAgICBtaXNzaW9uID0+XG4gICAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbSh0aGlzLCB0aGlzLnNldHRpbmcubWlzc2lvbnNbbWlzc2lvbi5uYW1lXSwgbWlzc2lvbi5sYWJlbCwge1xuICAgICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW21pc3Npb24ubGFiZWxdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbWlzc2lvbi5sYWJlbF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBpdGVtc0xpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMpLmFkZENoaWxkcmVuKHRoaXMuX21pc3Npb25zKTtcbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChpdGVtc0xpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgU3BhY2VTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBjbCB9IGZyb20gXCIuLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB7IEJ1aWxkU2VjdGlvblRvb2xzIH0gZnJvbSBcIi4vQnVpbGRTZWN0aW9uVG9vbHMuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBIZWFkZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgTWlzc2lvblNldHRpbmdzVWkgfSBmcm9tIFwiLi9NaXNzaW9uU2V0dGluZ3NVaS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU3BhY2VTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ3NQYW5lbDxTcGFjZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21pc3Npb25zVWk6IE1pc3Npb25TZXR0aW5nc1VpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFNwYWNlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtTcGFjZVNldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuc3BhY2VcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXIoKSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvblwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCA8IF8ubWF4ICYmIF8udHJpZ2dlciA8IDApO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIChPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShcbiAgICAgICAgICAgICAgXyA9PiBfLmVuYWJsZWQgJiYgKDAgPT09IF8ubWF4IHx8IChfLnRyaWdnZXIgPCAwICYmIHNldHRpbmdzLnRyaWdnZXIgPCAwKSksXG4gICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICghT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQpICYmXG4gICAgICAgICAgICAgICAgIXNldHRpbmdzLnVubG9ja01pc3Npb25zLmVuYWJsZWQpIHx8XG4gICAgICAgICAgICAgIHRoaXMuX21pc3Npb25zVWkuZXhwYW5kby5pbmVmZmVjdGl2ZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBvblJlc2V0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmxvYWQoeyBidWlsZGluZ3M6IG5ldyBTcGFjZVNldHRpbmdzKCkuYnVpbGRpbmdzIH0pO1xuICAgICAgICB9LFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oXG4gICAgICAgIHRoaXMuaG9zdC5nYW1lLnNwYWNlLnBsYW5ldHNcbiAgICAgICAgICAuZmlsdGVyKHBsYW5ldCA9PiAwIDwgcGxhbmV0LmJ1aWxkaW5ncy5sZW5ndGgpXG4gICAgICAgICAgLmZsYXRNYXAoKHBsYW5ldCwgaW5kZXhQbGFuZXQsIGFycmF5UGxhbnQpID0+IFtcbiAgICAgICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmxhYmVsRm9yUGxhbmV0KHBsYW5ldC5uYW1lKSksXG4gICAgICAgICAgICAuLi5wbGFuZXQuYnVpbGRpbmdzXG4gICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSlcbiAgICAgICAgICAgICAgLm1hcCgoYnVpbGRpbmcsIGluZGV4QnVpbGRpbmcsIGFycmF5QnVpbGRpbmcpID0+XG4gICAgICAgICAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZy5uYW1lXSxcbiAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZyxcbiAgICAgICAgICAgICAgICAgIGJ1aWxkaW5nLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjpcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleFBsYW5ldCA8IGFycmF5UGxhbnQubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGluZGV4QnVpbGRpbmcgPT09IGFycmF5QnVpbGRpbmcubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3RBZGRpdGlvbiA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgIH0pO1xuICAgIGxpc3RBZGRpdGlvbi5hZGRDaGlsZChuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkuYWRkaXRpb25hbFwiKSkpO1xuXG4gICAgdGhpcy5fbWlzc2lvbnNVaSA9IG5ldyBNaXNzaW9uU2V0dGluZ3NVaShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNldHRpbmcudW5sb2NrTWlzc2lvbnMsXG4gICAgICBsb2NhbGUsXG4gICAgICB0aGlzLnNldHRpbmcsXG4gICAgKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5fbWlzc2lvbnNVaSk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEFkZGl0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQWJzdHJhY3RFcnJvciB9IGZyb20gXCIuL0Fic3RyYWN0RXJyb3IuanNcIjtcbi8qKlxuICogVXNlZCB3aGVuIHRoZSB1c2VyIHN1cHBsaWVkIGFuIGFyZ3VtZW50IHRoYXQgaXMgbm90IHZhbGlkIGluIHRoZSBjdXJyZW50XG4gKiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBBYnN0cmFjdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGlua2NvZGUgSW52YWxpZEFyZ3VtZW50RXJyb3J9LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1haW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gc3RhdHVzIC0gVGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gcmV0dXJuLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cyA9IDQwMCkge1xuICAgICAgICBzdXBlcihcIkVSUl9PU19JTlZBTElEX0FSR1VNRU5UXCIsIG1lc3NhZ2UsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiSW52YWxpZEFyZ3VtZW50RXJyb3JcIjtcbiAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIG5ldyBzdGFja3RyYWNlLCBvdGhlcndpc2UgaXQgd2lsbCBpbmNsdWRlIG91ciBiYXNlLWNsYXNzXG4gICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBjb2RlIGxvY2F0aW9uIHdlJ3JlIGFjdHVhbGx5IGludGVyZXN0ZWQgaW4uXG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBJbnZhbGlkQXJndW1lbnRFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnZhbGlkQXJndW1lbnRFcnJvci5qcy5tYXAiLCIvKipcbiAqIEBtb2R1bGUgY29uc3RhbnRzXG4gKiBAc3VtbWFyeSBVc2VmdWwgY29uc3RhbnRzXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbGxlY3Rpb24gb2YgdXNlZnVsIGRhdGUgY29uc3RhbnRzLlxuICpcbiAqIFRoZSBjb25zdGFudHMgY291bGQgYmUgaW1wb3J0ZWQgZnJvbSBgZGF0ZS1mbnMvY29uc3RhbnRzYDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbWF4VGltZSwgbWluVGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBmdW5jdGlvbiBpc0FsbG93ZWRUaW1lKHRpbWUpIHtcbiAqICAgcmV0dXJuIHRpbWUgPD0gbWF4VGltZSAmJiB0aW1lID49IG1pblRpbWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luV2Vla1xuICogQHN1bW1hcnkgRGF5cyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBkYXlzSW5XZWVrID0gNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGRheXNJblllYXJcbiAqIEBzdW1tYXJ5IERheXMgaW4gMSB5ZWFyLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSG93IG1hbnkgZGF5cyBpbiBhIHllYXIuXG4gKlxuICogT25lIHllYXJzIGVxdWFscyAzNjUuMjQyNSBkYXlzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYTpcbiAqXG4gKiA+IExlYXAgeWVhciBvY2N1cnMgZXZlcnkgNCB5ZWFycywgZXhjZXB0IGZvciB5ZWFycyB0aGF0IGFyZSBkaXZpc2libGUgYnkgMTAwIGFuZCBub3QgZGl2aXNpYmxlIGJ5IDQwMC5cbiAqID4gMSBtZWFuIHllYXIgPSAoMzY1KzEvNC0xLzEwMCsxLzQwMCkgZGF5cyA9IDM2NS4yNDI1IGRheXNcbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJblllYXIgPSAzNjUuMjQyNTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1heFRpbWVcbiAqIEBzdW1tYXJ5IE1heGltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtYXhUaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSA4NjQwMDAwMDAwMDAwMDAxIDw9IG1heFRpbWU7XG4gKiAvLz0+IGZhbHNlXG4gKlxuICogbmV3IERhdGUoODY0MDAwMDAwMDAwMDAwMSk7XG4gKiAvLz0+IEludmFsaWQgRGF0ZVxuICovXG5leHBvcnQgY29uc3QgbWF4VGltZSA9IE1hdGgucG93KDEwLCA4KSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW5UaW1lXG4gKiBAc3VtbWFyeSBNaW5pbXVtIGFsbG93ZWQgdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbWluVGltZSB9IGZyb20gXCIuL2NvbnN0YW50cy9kYXRlLWZucy9jb25zdGFudHNcIjtcbiAqXG4gKiBjb25zdCBpc1ZhbGlkID0gLTg2NDAwMDAwMDAwMDAwMDEgPj0gbWluVGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSgtODY0MDAwMDAwMDAwMDAwMSlcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtaW5UaW1lID0gLW1heFRpbWU7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbldlZWsgPSA2MDQ4MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5EYXkgPSA4NjQwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luTWludXRlXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBtaW51dGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luTWludXRlID0gNjAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIGhvdXJcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luSG91ciA9IDM2MDAwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaWxsaXNlY29uZHNJblNlY29uZFxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgc2Vjb25kXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJblNlY29uZCA9IDEwMDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5ZZWFyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJblllYXIgPSA1MjU2MDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Nb250aFxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIG1vbnRoLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luTW9udGggPSA0MzIwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkRheVxuICogQHN1bW1hcnkgTWludXRlcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbkRheSA9IDE0NDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtaW51dGVzSW5Ib3VyXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgaG91ci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbnV0ZXNJbkhvdXIgPSA2MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luUXVhcnRlclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgcXVhcnRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luUXVhcnRlciA9IDM7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBtb250aHNJblllYXJcbiAqIEBzdW1tYXJ5IE1vbnRocyBpbiAxIHllYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBtb250aHNJblllYXIgPSAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHF1YXJ0ZXJzSW5ZZWFyXG4gKiBAc3VtbWFyeSBRdWFydGVycyBpbiAxIHllYXJcbiAqL1xuZXhwb3J0IGNvbnN0IHF1YXJ0ZXJzSW5ZZWFyID0gNDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkhvdXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luSG91ciA9IDM2MDA7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtaW51dGUuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5NaW51dGUgPSA2MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbkRheVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGRheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbkRheSA9IHNlY29uZHNJbkhvdXIgKiAyNDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbldlZWtcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB3ZWVrLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luV2VlayA9IHNlY29uZHNJbkRheSAqIDc7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5ZZWFyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJblllYXIgPSBzZWNvbmRzSW5EYXkgKiBkYXlzSW5ZZWFyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luTW9udGhcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBtb250aFxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luTW9udGggPSBzZWNvbmRzSW5ZZWFyIC8gMTI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgcXVhcnRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJblF1YXJ0ZXIgPSBzZWNvbmRzSW5Nb250aCAqIDM7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tU3ltYm9sXG4gKiBAc3VtbWFyeSBTeW1ib2wgZW5hYmxpbmcgRGF0ZSBleHRlbnNpb25zIHRvIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIHRoZSByZWZlcmVuY2UgZGF0ZS5cbiAqXG4gKiBUaGUgc3ltYm9sIGlzIHVzZWQgdG8gZW5hYmxlIHRoZSBgY29uc3RydWN0RnJvbWAgZnVuY3Rpb24gdG8gY29uc3RydWN0IGEgZGF0ZVxuICogdXNpbmcgYSByZWZlcmVuY2UgZGF0ZSBhbmQgYSB2YWx1ZS4gSXQgYWxsb3dzIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS4gSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZVxuICogW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzXG4gKiBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICovXG5leHBvcnQgY29uc3QgY29uc3RydWN0RnJvbVN5bWJvbCA9IFN5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKTtcbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb21TeW1ib2wgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBjb25zdHJ1Y3RGcm9tXG4gKiBAY2F0ZWdvcnkgR2VuZXJpYyBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgZGF0ZSB1c2luZyB0aGUgcmVmZXJlbmNlIGRhdGUgYW5kIHRoZSB2YWx1ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGZ1bmN0aW9uIGNvbnN0cnVjdHMgYSBuZXcgZGF0ZSB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgcmVmZXJlbmNlXG4gKiBkYXRlIGFuZCB0aGUgZ2l2ZW4gdmFsdWUuIEl0IGhlbHBzIHRvIGJ1aWxkIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgYWNjZXB0XG4gKiBkYXRlIGV4dGVuc2lvbnMuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB2My43LjAsIGl0IGFsbG93cyB0byBjb25zdHJ1Y3QgYSBkYXRlIHVzaW5nIGBbU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpXWBcbiAqIGVuYWJsaW5nIHRvIHRyYW5zZmVyIGV4dHJhIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLlxuICogSXQncyB1c2VmdWwgZm9yIGV4dGVuc2lvbnMgbGlrZSBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eilcbiAqIHRoYXQgYWNjZXB0IGEgdGltZSB6b25lIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY3JlYXRlIHRoZSBkYXRlXG4gKlxuICogQHJldHVybnMgRGF0ZSBpbml0aWFsaXplZCB1c2luZyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdmFsdWVcbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20vZGF0ZS1mbnNcIjtcbiAqXG4gKiAvLyBBIGZ1bmN0aW9uIHRoYXQgY2xvbmVzIGEgZGF0ZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCB0eXBlXG4gKiBmdW5jdGlvbiBjbG9uZURhdGU8RGF0ZVR5cGUgZXh0ZW5kcyBEYXRlPihkYXRlOiBEYXRlVHlwZSk6IERhdGVUeXBlIHtcbiAqICAgcmV0dXJuIGNvbnN0cnVjdEZyb20oXG4gKiAgICAgZGF0ZSwgLy8gVXNlIGNvbnN0cnVjdG9yIGZyb20gdGhlIGdpdmVuIGRhdGVcbiAqICAgICBkYXRlLmdldFRpbWUoKSAvLyBVc2UgdGhlIGRhdGUgdmFsdWUgdG8gY3JlYXRlIGEgbmV3IGRhdGVcbiAqICAgKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN0cnVjdEZyb20oZGF0ZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBkYXRlID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBkYXRlKHZhbHVlKTtcblxuICBpZiAoZGF0ZSAmJiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiAmJiBjb25zdHJ1Y3RGcm9tU3ltYm9sIGluIGRhdGUpXG4gICAgcmV0dXJuIGRhdGVbY29uc3RydWN0RnJvbVN5bWJvbF0odmFsdWUpO1xuXG4gIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIG5ldyBkYXRlLmNvbnN0cnVjdG9yKHZhbHVlKTtcblxuICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGNvbnN0cnVjdEZyb207XG4iLCJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGNvbnN0cnVjdE5vd1xuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIG5ldyBjdXJyZW50IGRhdGUgdXNpbmcgdGhlIHBhc3NlZCB2YWx1ZSBjb25zdHJ1Y3Rvci5cbiAqIEBwdXJlIGZhbHNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgZnVuY3Rpb24gY29uc3RydWN0cyBhIG5ldyBjdXJyZW50IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb21cbiAqIHRoZSByZWZlcmVuY2UgZGF0ZS4gSXQgaGVscHMgdG8gYnVpbGQgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCBhY2NlcHQgZGF0ZVxuICogZXh0ZW5zaW9ucyBhbmQgdXNlIHRoZSBjdXJyZW50IGRhdGUuXG4gKlxuICogSXQgZGVmYXVsdHMgdG8gYERhdGVgIGlmIHRoZSBwYXNzZWQgcmVmZXJlbmNlIGRhdGUgaXMgYSBudW1iZXIgb3IgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgcmVmZXJlbmNlIGRhdGUgdG8gdGFrZSBjb25zdHJ1Y3RvciBmcm9tXG4gKlxuICogQHJldHVybnMgQ3VycmVudCBkYXRlIGluaXRpYWxpemVkIHVzaW5nIHRoZSBnaXZlbiBkYXRlIGNvbnN0cnVjdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdE5vdywgaXNTYW1lRGF5IH0gZnJvbSAnZGF0ZS1mbnMnXG4gKlxuICogZnVuY3Rpb24gaXNUb2RheTxEYXRlVHlwZSBleHRlbmRzIERhdGU+KFxuICogICBkYXRlOiBEYXRlQXJnPERhdGVUeXBlPixcbiAqICk6IGJvb2xlYW4ge1xuICogICAvLyBJZiB3ZSB3ZXJlIHRvIHVzZSBgbmV3IERhdGUoKWAgZGlyZWN0bHksIHRoZSBmdW5jdGlvbiB3b3VsZCAgYmVoYXZlXG4gKiAgIC8vIGRpZmZlcmVudGx5IGluIGRpZmZlcmVudCB0aW1lem9uZXMgYW5kIHJldHVybiBmYWxzZSBmb3IgdGhlIHNhbWUgZGF0ZS5cbiAqICAgcmV0dXJuIGlzU2FtZURheShkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSkpO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc3RydWN0Tm93KGRhdGUpIHtcbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oZGF0ZSwgRGF0ZS5ub3coKSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgY29uc3RydWN0Tm93O1xuIiwiY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRm9ybWF0TG9uZ0ZuKGFyZ3MpIHtcbiAgcmV0dXJuIChvcHRpb25zID0ge30pID0+IHtcbiAgICAvLyBUT0RPOiBSZW1vdmUgU3RyaW5nKClcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICBjb25zdCBmb3JtYXQgPSBhcmdzLmZvcm1hdHNbd2lkdGhdIHx8IGFyZ3MuZm9ybWF0c1thcmdzLmRlZmF1bHRXaWR0aF07XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfTtcbn1cbiIsImltcG9ydCB7IGJ1aWxkRm9ybWF0TG9uZ0ZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIjtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgTU1NTSBkbywgeVwiLFxuICBsb25nOiBcIk1NTU0gZG8sIHlcIixcbiAgbWVkaXVtOiBcIk1NTSBkLCB5XCIsXG4gIHNob3J0OiBcIk1NL2RkL3l5eXlcIixcbn07XG5cbmNvbnN0IHRpbWVGb3JtYXRzID0ge1xuICBmdWxsOiBcImg6bW06c3MgYSB6enp6XCIsXG4gIGxvbmc6IFwiaDptbTpzcyBhIHpcIixcbiAgbWVkaXVtOiBcImg6bW06c3MgYVwiLFxuICBzaG9ydDogXCJoOm1tIGFcIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAnYXQnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59O1xuIiwiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbiIsIi8qKlxuICogVGhlIGxvY2FsaXplIGZ1bmN0aW9uIGFyZ3VtZW50IGNhbGxiYWNrIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IHJhdyB2YWx1ZSB0b1xuICogdGhlIGFjdHVhbCB0eXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0XG4gKlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogVGhlIG1hcCBvZiBsb2NhbGl6ZWQgdmFsdWVzIGZvciBlYWNoIHdpZHRoLlxuICovXG5cbi8qKlxuICogVGhlIGluZGV4IHR5cGUgb2YgdGhlIGxvY2FsZSB1bml0IHZhbHVlLiBJdCB0eXBlcyBjb252ZXJzaW9uIG9mIHVuaXRzIG9mXG4gKiB2YWx1ZXMgdGhhdCBkb24ndCBzdGFydCBhdCAwIChpLmUuIHF1YXJ0ZXJzKS5cbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSB1bml0IHZhbHVlIHRvIHRoZSB0dXBsZSBvZiB2YWx1ZXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGVyYSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgQkMsXG4gKiB0aGUgc2Vjb25kIGVsZW1lbnQgcmVwcmVzZW50cyBBRC5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgcXVhcnRlciB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgUTEuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIGRheSB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgU3VuZGF5LlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBtb250aCB2YWx1ZXMuIFRoZSBmaXJzdCBlbGVtZW50IHJlcHJlc2VudHMgSmFudWFyeS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMb2NhbGl6ZUZuKGFyZ3MpIHtcbiAgcmV0dXJuICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8gU3RyaW5nKG9wdGlvbnMuY29udGV4dCkgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgIGxldCB2YWx1ZXNBcnJheTtcbiAgICBpZiAoY29udGV4dCA9PT0gXCJmb3JtYXR0aW5nXCIgJiYgYXJncy5mb3JtYXR0aW5nVmFsdWVzKSB7XG4gICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBhcmdzLmRlZmF1bHRGb3JtYXR0aW5nV2lkdGggfHwgYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9XG4gICAgICAgIGFyZ3MuZm9ybWF0dGluZ1ZhbHVlc1t3aWR0aF0gfHwgYXJncy5mb3JtYXR0aW5nVmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSBvcHRpb25zPy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuXG4gICAgICB2YWx1ZXNBcnJheSA9IGFyZ3MudmFsdWVzW3dpZHRoXSB8fCBhcmdzLnZhbHVlc1tkZWZhdWx0V2lkdGhdO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IGFyZ3MuYXJndW1lbnRDYWxsYmFjayA/IGFyZ3MuYXJndW1lbnRDYWxsYmFjayh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBGb3Igc29tZSByZWFzb24gVHlwZVNjcmlwdCBqdXN0IGRvbid0IHdhbnQgdG8gbWF0Y2ggaXQsIG5vIG1hdHRlciBob3cgaGFyZCB3ZSB0cnkuIEkgY2hhbGxlbmdlIHlvdSB0byB0cnkgdG8gcmVtb3ZlIGl0IVxuICAgIHJldHVybiB2YWx1ZXNBcnJheVtpbmRleF07XG4gIH07XG59XG4iLCJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkJcIiwgXCJBXCJdLFxuICBhYmJyZXZpYXRlZDogW1wiQkNcIiwgXCJBRFwiXSxcbiAgd2lkZTogW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIjFzdCBxdWFydGVyXCIsIFwiMm5kIHF1YXJ0ZXJcIiwgXCIzcmQgcXVhcnRlclwiLCBcIjR0aCBxdWFydGVyXCJdLFxufTtcblxuLy8gTm90ZTogaW4gRW5nbGlzaCwgdGhlIG5hbWVzIG9mIGRheXMgb2YgdGhlIHdlZWsgYW5kIG1vbnRocyBhcmUgY2FwaXRhbGl6ZWQuXG4vLyBJZiB5b3UgYXJlIG1ha2luZyBhIG5ldyBsb2NhbGUgYmFzZWQgb24gdGhpcyBvbmUsIGNoZWNrIGlmIHRoZSBzYW1lIGlzIHRydWUgZm9yIHRoZSBsYW5ndWFnZSB5b3UncmUgd29ya2luZyBvbi5cbi8vIEdlbmVyYWxseSwgZm9ybWF0dGVkIGRhdGVzIHNob3VsZCBsb29rIGxpa2UgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbnRlbmNlLFxuLy8gZS5nLiBpbiBTcGFuaXNoIGxhbmd1YWdlIHRoZSB3ZWVrZGF5cyBhbmQgbW9udGhzIHNob3VsZCBiZSBpbiB0aGUgbG93ZXJjYXNlLlxuY29uc3QgbW9udGhWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiSlwiLCBcIkZcIiwgXCJNXCIsIFwiQVwiLCBcIk1cIiwgXCJKXCIsIFwiSlwiLCBcIkFcIiwgXCJTXCIsIFwiT1wiLCBcIk5cIiwgXCJEXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiSmFuXCIsXG4gICAgXCJGZWJcIixcbiAgICBcIk1hclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2N0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlY1wiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhcnlcIixcbiAgICBcIkZlYnJ1YXJ5XCIsXG4gICAgXCJNYXJjaFwiLFxuICAgIFwiQXByaWxcIixcbiAgICBcIk1heVwiLFxuICAgIFwiSnVuZVwiLFxuICAgIFwiSnVseVwiLFxuICAgIFwiQXVndXN0XCIsXG4gICAgXCJTZXB0ZW1iZXJcIixcbiAgICBcIk9jdG9iZXJcIixcbiAgICBcIk5vdmVtYmVyXCIsXG4gICAgXCJEZWNlbWJlclwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIlNcIiwgXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIl0sXG4gIHNob3J0OiBbXCJTdVwiLCBcIk1vXCIsIFwiVHVcIiwgXCJXZVwiLCBcIlRoXCIsIFwiRnJcIiwgXCJTYVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlN1blwiLCBcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiXSxcbiAgd2lkZTogW1xuICAgIFwiU3VuZGF5XCIsXG4gICAgXCJNb25kYXlcIixcbiAgICBcIlR1ZXNkYXlcIixcbiAgICBcIldlZG5lc2RheVwiLFxuICAgIFwiVGh1cnNkYXlcIixcbiAgICBcIkZyaWRheVwiLFxuICAgIFwiU2F0dXJkYXlcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwibW9ybmluZ1wiLFxuICAgIGFmdGVybm9vbjogXCJhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwiYVwiLFxuICAgIHBtOiBcInBcIixcbiAgICBtaWRuaWdodDogXCJtaVwiLFxuICAgIG5vb246IFwiblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIkFNXCIsXG4gICAgcG06IFwiUE1cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwiYS5tLlwiLFxuICAgIHBtOiBcInAubS5cIixcbiAgICBtaWRuaWdodDogXCJtaWRuaWdodFwiLFxuICAgIG5vb246IFwibm9vblwiLFxuICAgIG1vcm5pbmc6IFwiaW4gdGhlIG1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiaW4gdGhlIGFmdGVybm9vblwiLFxuICAgIGV2ZW5pbmc6IFwiaW4gdGhlIGV2ZW5pbmdcIixcbiAgICBuaWdodDogXCJhdCBuaWdodFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgX29wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICAvLyBJZiBvcmRpbmFsIG51bWJlcnMgZGVwZW5kIG9uIGNvbnRleHQsIGZvciBleGFtcGxlLFxuICAvLyBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBncmFtbWF0aWNhbCBnZW5kZXJzLFxuICAvLyB1c2UgYG9wdGlvbnMudW5pdGAuXG4gIC8vXG4gIC8vIGB1bml0YCBjYW4gYmUgJ3llYXInLCAncXVhcnRlcicsICdtb250aCcsICd3ZWVrJywgJ2RhdGUnLCAnZGF5T2ZZZWFyJyxcbiAgLy8gJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnLlxuXG4gIGNvbnN0IHJlbTEwMCA9IG51bWJlciAlIDEwMDtcbiAgaWYgKHJlbTEwMCA+IDIwIHx8IHJlbTEwMCA8IDEwKSB7XG4gICAgc3dpdGNoIChyZW0xMDAgJSAxMCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJzdFwiO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJuZFwiO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gbnVtYmVyICsgXCJyZFwiO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVtYmVyICsgXCJ0aFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyLFxuXG4gIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGVyYVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiBcIndpZGVcIixcbiAgfSksXG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZE1hdGNoUGF0dGVybkZuKGFyZ3MpIHtcbiAgcmV0dXJuIChzdHJpbmcsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MubWF0Y2hQYXR0ZXJuKTtcbiAgICBpZiAoIW1hdGNoUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHN0cmluZy5tYXRjaChhcmdzLnBhcnNlUGF0dGVybik7XG4gICAgaWYgKCFwYXJzZVJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgbGV0IHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrXG4gICAgICA/IGFyZ3MudmFsdWVDYWxsYmFjayhwYXJzZVJlc3VsdFswXSlcbiAgICAgIDogcGFyc2VSZXN1bHRbMF07XG5cbiAgICAvLyBbVE9ET10gSSBjaGFsbGVuZ2UgeW91IHRvIGZpeCB0aGUgdHlwZVxuICAgIHZhbHVlID0gb3B0aW9ucy52YWx1ZUNhbGxiYWNrID8gb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgY29uc3QgcmVzdCA9IHN0cmluZy5zbGljZShtYXRjaGVkU3RyaW5nLmxlbmd0aCk7XG5cbiAgICByZXR1cm4geyB2YWx1ZSwgcmVzdCB9O1xuICB9O1xufVxuIiwiaW1wb3J0IHsgYnVpbGRNYXRjaEZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCI7XG5pbXBvcnQgeyBidWlsZE1hdGNoUGF0dGVybkZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qc1wiO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkKykodGh8c3R8bmR8cmQpPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14oYnxhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oYlxcLj9cXHM/Y1xcLj98YlxcLj9cXHM/Y1xcLj9cXHM/ZVxcLj98YVxcLj9cXHM/ZFxcLj98Y1xcLj9cXHM/ZVxcLj8pL2ksXG4gIHdpZGU6IC9eKGJlZm9yZSBjaHJpc3R8YmVmb3JlIGNvbW1vbiBlcmF8YW5ubyBkb21pbml8Y29tbW9uIGVyYSkvaSxcbn07XG5jb25zdCBwYXJzZUVyYVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXmIvaSwgL14oYXxjKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL15bMTIzNF0odGh8c3R8bmR8cmQpPyBxdWFydGVyL2ksXG59O1xuY29uc3QgcGFyc2VRdWFydGVyUGF0dGVybnMgPSB7XG4gIGFueTogWy8xL2ksIC8yL2ksIC8zL2ksIC80L2ldLFxufTtcblxuY29uc3QgbWF0Y2hNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW2pmbWFzb25kXS9pLFxuICBhYmJyZXZpYXRlZDogL14oamFufGZlYnxtYXJ8YXByfG1heXxqdW58anVsfGF1Z3xzZXB8b2N0fG5vdnxkZWMpL2ksXG4gIHdpZGU6IC9eKGphbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXmovaSxcbiAgICAvXmYvaSxcbiAgICAvXm0vaSxcbiAgICAvXmEvaSxcbiAgICAvXm0vaSxcbiAgICAvXmovaSxcbiAgICAvXmovaSxcbiAgICAvXmEvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcblxuICBhbnk6IFtcbiAgICAvXmphL2ksXG4gICAgL15mL2ksXG4gICAgL15tYXIvaSxcbiAgICAvXmFwL2ksXG4gICAgL15tYXkvaSxcbiAgICAvXmp1bi9pLFxuICAgIC9eanVsL2ksXG4gICAgL15hdS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltzbXR3Zl0vaSxcbiAgc2hvcnQ6IC9eKHN1fG1vfHR1fHdlfHRofGZyfHNhKS9pLFxuICBhYmJyZXZpYXRlZDogL14oc3VufG1vbnx0dWV8d2VkfHRodXxmcml8c2F0KS9pLFxuICB3aWRlOiAvXihzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFsvXnMvaSwgL15tL2ksIC9edC9pLCAvXncvaSwgL150L2ksIC9eZi9pLCAvXnMvaV0sXG4gIGFueTogWy9ec3UvaSwgL15tL2ksIC9edHUvaSwgL153L2ksIC9edGgvaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGF8cHxtaXxufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbiAgYW55OiAvXihbYXBdXFwuP1xccz9tXFwuP3xtaWRuaWdodHxub29ufChpbiB0aGV8YXQpIChtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0KSkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL15hL2ksXG4gICAgcG06IC9ecC9pLFxuICAgIG1pZG5pZ2h0OiAvXm1pL2ksXG4gICAgbm9vbjogL15uby9pLFxuICAgIG1vcm5pbmc6IC9tb3JuaW5nL2ksXG4gICAgYWZ0ZXJub29uOiAvYWZ0ZXJub29uL2ksXG4gICAgZXZlbmluZzogL2V2ZW5pbmcvaSxcbiAgICBuaWdodDogL25pZ2h0L2ksXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbWF0Y2ggPSB7XG4gIG9yZGluYWxOdW1iZXI6IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oe1xuICAgIG1hdGNoUGF0dGVybjogbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICBwYXJzZVBhdHRlcm46IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgdmFsdWVDYWxsYmFjazogKHZhbHVlKSA9PiBwYXJzZUludCh2YWx1ZSwgMTApLFxuICB9KSxcblxuICBlcmE6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VFcmFQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gICAgdmFsdWVDYWxsYmFjazogKGluZGV4KSA9PiBpbmRleCArIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJ3aWRlXCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwiYW55XCIsXG4gICAgcGFyc2VQYXR0ZXJuczogcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG59O1xuIiwiaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRMb25nIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRSZWxhdGl2ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIjtcbmltcG9ydCB7IGxvY2FsaXplIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiO1xuaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCI7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmV4cG9ydCBjb25zdCBlblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlblVTO1xuIiwibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGF0ZXMoY29udGV4dCwgLi4uZGF0ZXMpIHtcbiAgY29uc3Qgbm9ybWFsaXplID0gY29uc3RydWN0RnJvbS5iaW5kKFxuICAgIG51bGwsXG4gICAgY29udGV4dCB8fCBkYXRlcy5maW5kKChkYXRlKSA9PiB0eXBlb2YgZGF0ZSA9PT0gXCJvYmplY3RcIiksXG4gICk7XG4gIHJldHVybiBkYXRlcy5tYXAobm9ybWFsaXplKTtcbn1cbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIGNvbXBhcmVBc2NcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29tcGFyZSB0aGUgdHdvIGRhdGVzIGFuZCByZXR1cm4gLTEsIDAgb3IgMS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbXBhcmUgdGhlIHR3byBkYXRlcyBhbmQgcmV0dXJuIDEgaWYgdGhlIGZpcnN0IGRhdGUgaXMgYWZ0ZXIgdGhlIHNlY29uZCxcbiAqIC0xIGlmIHRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIG9yIDAgaWYgZGF0ZXMgYXJlIGVxdWFsLlxuICpcbiAqIEBwYXJhbSBkYXRlTGVmdCAtIFRoZSBmaXJzdCBkYXRlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBkYXRlUmlnaHQgLSBUaGUgc2Vjb25kIGRhdGUgdG8gY29tcGFyZVxuICpcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb25cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29tcGFyZSAxMSBGZWJydWFyeSAxOTg3IGFuZCAxMCBKdWx5IDE5ODk6XG4gKiBjb25zdCByZXN1bHQgPSBjb21wYXJlQXNjKG5ldyBEYXRlKDE5ODcsIDEsIDExKSwgbmV3IERhdGUoMTk4OSwgNiwgMTApKVxuICogLy89PiAtMVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTb3J0IHRoZSBhcnJheSBvZiBkYXRlczpcbiAqIGNvbnN0IHJlc3VsdCA9IFtcbiAqICAgbmV3IERhdGUoMTk5NSwgNiwgMiksXG4gKiAgIG5ldyBEYXRlKDE5ODcsIDEsIDExKSxcbiAqICAgbmV3IERhdGUoMTk4OSwgNiwgMTApXG4gKiBdLnNvcnQoY29tcGFyZUFzYylcbiAqIC8vPT4gW1xuICogLy8gICBXZWQgRmViIDExIDE5ODcgMDA6MDA6MDAsXG4gKiAvLyAgIE1vbiBKdWwgMTAgMTk4OSAwMDowMDowMCxcbiAqIC8vICAgU3VuIEp1bCAwMiAxOTk1IDAwOjAwOjAwXG4gKiAvLyBdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlQXNjKGRhdGVMZWZ0LCBkYXRlUmlnaHQpIHtcbiAgY29uc3QgZGlmZiA9ICt0b0RhdGUoZGF0ZUxlZnQpIC0gK3RvRGF0ZShkYXRlUmlnaHQpO1xuXG4gIGlmIChkaWZmIDwgMCkgcmV0dXJuIC0xO1xuICBlbHNlIGlmIChkaWZmID4gMCkgcmV0dXJuIDE7XG5cbiAgLy8gUmV0dXJuIDAgaWYgZGlmZiBpcyAwOyByZXR1cm4gTmFOIGlmIGRpZmYgaXMgTmFOXG4gIHJldHVybiBkaWZmO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGNvbXBhcmVBc2M7XG4iLCJpbXBvcnQgeyBub3JtYWxpemVEYXRlcyB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplRGF0ZXMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBjYWxlbmRhciBtb250aHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHBhcmFtIGxhdGVyRGF0ZSAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZWFybGllckRhdGUgLSBUaGUgZWFybGllciBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGNhbGVuZGFyIG1vbnRoc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBjYWxlbmRhciBtb250aHMgYXJlIGJldHdlZW4gMzEgSmFudWFyeSAyMDE0IGFuZCAxIFNlcHRlbWJlciAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDgsIDEpLFxuICogICBuZXcgRGF0ZSgyMDE0LCAwLCAzMSlcbiAqIClcbiAqIC8vPT4gOFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcblxuICBjb25zdCB5ZWFyc0RpZmYgPSBsYXRlckRhdGVfLmdldEZ1bGxZZWFyKCkgLSBlYXJsaWVyRGF0ZV8uZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGhzRGlmZiA9IGxhdGVyRGF0ZV8uZ2V0TW9udGgoKSAtIGVhcmxpZXJEYXRlXy5nZXRNb250aCgpO1xuXG4gIHJldHVybiB5ZWFyc0RpZmYgKiAxMiArIG1vbnRoc0RpZmY7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHM7XG4iLCJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGVuZE9mRGF5fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZW5kT2ZEYXlcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBlbmQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIGRheVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgZW5kIG9mIGEgZGF5IGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gZW5kT2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kT2ZEYXkoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIF9kYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlbmRPZkRheTtcbiIsImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZW5kT2ZNb250aH0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGVuZE9mTW9udGhcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGVuZCBvZiBhIG1vbnRoIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZW5kIG9mIGEgbW9udGggZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGVuZCBvZiBhIG1vbnRoXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBlbmQgb2YgYSBtb250aCBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGVuZE9mTW9udGgobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAzMCAyMDE0IDIzOjU5OjU5Ljk5OVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kT2ZNb250aChkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgbW9udGggPSBfZGF0ZS5nZXRNb250aCgpO1xuICBfZGF0ZS5zZXRGdWxsWWVhcihfZGF0ZS5nZXRGdWxsWWVhcigpLCBtb250aCArIDEsIDApO1xuICBfZGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICByZXR1cm4gX2RhdGU7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZW5kT2ZNb250aDtcbiIsImltcG9ydCB7IGVuZE9mRGF5IH0gZnJvbSBcIi4vZW5kT2ZEYXkuanNcIjtcbmltcG9ydCB7IGVuZE9mTW9udGggfSBmcm9tIFwiLi9lbmRPZk1vbnRoLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBpc0xhc3REYXlPZk1vbnRoXG4gKiBAY2F0ZWdvcnkgTW9udGggSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIGRhdGUgdGhlIGxhc3QgZGF5IG9mIGEgbW9udGg/XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJcyB0aGUgZ2l2ZW4gZGF0ZSB0aGUgbGFzdCBkYXkgb2YgYSBtb250aD9cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGF0ZSBpcyB0aGUgbGFzdCBkYXkgb2YgYSBtb250aFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJcyAyOCBGZWJydWFyeSAyMDE0IHRoZSBsYXN0IGRheSBvZiBhIG1vbnRoP1xuICogY29uc3QgcmVzdWx0ID0gaXNMYXN0RGF5T2ZNb250aChuZXcgRGF0ZSgyMDE0LCAxLCAyOCkpXG4gKiAvLz0+IHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGFzdERheU9mTW9udGgoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIHJldHVybiArZW5kT2ZEYXkoX2RhdGUsIG9wdGlvbnMpID09PSArZW5kT2ZNb250aChfZGF0ZSwgb3B0aW9ucyk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgaXNMYXN0RGF5T2ZNb250aDtcbiIsImltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgY29tcGFyZUFzYyB9IGZyb20gXCIuL2NvbXBhcmVBc2MuanNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VJbkNhbGVuZGFyTW9udGhzIH0gZnJvbSBcIi4vZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMuanNcIjtcbmltcG9ydCB7IGlzTGFzdERheU9mTW9udGggfSBmcm9tIFwiLi9pc0xhc3REYXlPZk1vbnRoLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5Nb250aHN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5Nb250aHNcbiAqIEBjYXRlZ29yeSBNb250aCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBmdWxsIG1vbnRocyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgZnVsbCBtb250aHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgZnVsbCBtb250aHMgYXJlIGJldHdlZW4gMzEgSmFudWFyeSAyMDE0IGFuZCAxIFNlcHRlbWJlciAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZGlmZmVyZW5jZUluTW9udGhzKG5ldyBEYXRlKDIwMTQsIDgsIDEpLCBuZXcgRGF0ZSgyMDE0LCAwLCAzMSkpXG4gKiAvLz0+IDdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJbk1vbnRocyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IFtsYXRlckRhdGVfLCB3b3JraW5nTGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV9dID0gbm9ybWFsaXplRGF0ZXMoXG4gICAgb3B0aW9ucz8uaW4sXG4gICAgbGF0ZXJEYXRlLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcblxuICBjb25zdCBzaWduID0gY29tcGFyZUFzYyh3b3JraW5nTGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZV8pO1xuICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoXG4gICAgZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMod29ya2luZ0xhdGVyRGF0ZSwgZWFybGllckRhdGVfKSxcbiAgKTtcblxuICBpZiAoZGlmZmVyZW5jZSA8IDEpIHJldHVybiAwO1xuXG4gIGlmICh3b3JraW5nTGF0ZXJEYXRlLmdldE1vbnRoKCkgPT09IDEgJiYgd29ya2luZ0xhdGVyRGF0ZS5nZXREYXRlKCkgPiAyNylcbiAgICB3b3JraW5nTGF0ZXJEYXRlLnNldERhdGUoMzApO1xuXG4gIHdvcmtpbmdMYXRlckRhdGUuc2V0TW9udGgod29ya2luZ0xhdGVyRGF0ZS5nZXRNb250aCgpIC0gc2lnbiAqIGRpZmZlcmVuY2UpO1xuXG4gIGxldCBpc0xhc3RNb250aE5vdEZ1bGwgPSBjb21wYXJlQXNjKHdvcmtpbmdMYXRlckRhdGUsIGVhcmxpZXJEYXRlXykgPT09IC1zaWduO1xuXG4gIGlmIChcbiAgICBpc0xhc3REYXlPZk1vbnRoKGxhdGVyRGF0ZV8pICYmXG4gICAgZGlmZmVyZW5jZSA9PT0gMSAmJlxuICAgIGNvbXBhcmVBc2MobGF0ZXJEYXRlXywgZWFybGllckRhdGVfKSA9PT0gMVxuICApIHtcbiAgICBpc0xhc3RNb250aE5vdEZ1bGwgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHNpZ24gKiAoZGlmZmVyZW5jZSAtICtpc0xhc3RNb250aE5vdEZ1bGwpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwID8gMCA6IHJlc3VsdDtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlSW5Nb250aHM7XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0Um91bmRpbmdNZXRob2QobWV0aG9kKSB7XG4gIHJldHVybiAobnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm91bmQgPSBtZXRob2QgPyBNYXRoW21ldGhvZF0gOiBNYXRoLnRydW5jO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJvdW5kKG51bWJlcik7XG4gICAgLy8gUHJldmVudCBuZWdhdGl2ZSB6ZXJvXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gMCA/IDAgOiByZXN1bHQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHNcbiAqIEBjYXRlZ29yeSBNaWxsaXNlY29uZCBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQHBhcmFtIGxhdGVyRGF0ZSAtIFRoZSBsYXRlciBkYXRlXG4gKiBAcGFyYW0gZWFybGllckRhdGUgLSBUaGUgZWFybGllciBkYXRlXG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSG93IG1hbnkgbWlsbGlzZWNvbmRzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxNCAxMjozMDoyMC42MDAgYW5kIDIgSnVseSAyMDE0IDEyOjMwOjIxLjcwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgMTIsIDMwLCAyMSwgNzAwKSxcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMiwgMTIsIDMwLCAyMCwgNjAwKVxuICogKVxuICogLy89PiAxMTAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSkge1xuICByZXR1cm4gK3RvRGF0ZShsYXRlckRhdGUpIC0gK3RvRGF0ZShlYXJsaWVyRGF0ZSk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzO1xuIiwiaW1wb3J0IHsgZ2V0Um91bmRpbmdNZXRob2QgfSBmcm9tIFwiLi9fbGliL2dldFJvdW5kaW5nTWV0aG9kLmpzXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5NaWxsaXNlY29uZHMuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGRpZmZlcmVuY2VJblNlY29uZHN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5TZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzLlxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgbGF0ZXIgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGVhcmxpZXIgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2Ygc2Vjb25kc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIb3cgbWFueSBzZWNvbmRzIGFyZSBiZXR3ZWVuXG4gKiAvLyAyIEp1bHkgMjAxNCAxMjozMDowNy45OTkgYW5kIDIgSnVseSAyMDE0IDEyOjMwOjIwLjAwMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJblNlY29uZHMoXG4gKiAgIG5ldyBEYXRlKDIwMTQsIDYsIDIsIDEyLCAzMCwgMjAsIDApLFxuICogICBuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxMiwgMzAsIDcsIDk5OSlcbiAqIClcbiAqIC8vPT4gMTJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VJblNlY29uZHMobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUpIC8gMTAwMDtcbiAgcmV0dXJuIGdldFJvdW5kaW5nTWV0aG9kKG9wdGlvbnM/LnJvdW5kaW5nTWV0aG9kKShkaWZmKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBkaWZmZXJlbmNlSW5TZWNvbmRzO1xuIiwiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIH0gZnJvbSBcIi4vX2xpYi9nZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVEYXRlcyB9IGZyb20gXCIuL19saWIvbm9ybWFsaXplRGF0ZXMuanNcIjtcbmltcG9ydCB7IGNvbXBhcmVBc2MgfSBmcm9tIFwiLi9jb21wYXJlQXNjLmpzXCI7XG5pbXBvcnQgeyBtaW51dGVzSW5EYXksIG1pbnV0ZXNJbk1vbnRoIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlSW5Nb250aHMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5Nb250aHMuanNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VJblNlY29uZHMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5TZWNvbmRzLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXREaXN0YW5jZX0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGZvcm1hdERpc3RhbmNlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMgaW4gd29yZHMuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGVzIGluIHdvcmRzLlxuICpcbiAqIHwgRGlzdGFuY2UgYmV0d2VlbiBkYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgMCAuLi4gMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsZXNzIHRoYW4gYSBtaW51dGUgIHxcbiAqIHwgMzAgc2VjcyAuLi4gMSBtaW4gMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxIG1pbnV0ZSAgICAgICAgICAgIHxcbiAqIHwgMSBtaW4gMzAgc2VjcyAuLi4gNDQgbWlucyAzMCBzZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbMi4uNDRdIG1pbnV0ZXMgICAgIHxcbiAqIHwgNDQgbWlucyAuLi4gMzAgc2VjcyAuLi4gODkgbWlucyAzMCBzZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCAxIGhvdXIgICAgICAgIHxcbiAqIHwgODkgbWlucyAzMCBzZWNzIC4uLiAyMyBocnMgNTkgbWlucyAzMCBzZWNzICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCBbMi4uMjRdIGhvdXJzIHxcbiAqIHwgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gNDEgaHJzIDU5IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgfCAxIGRheSAgICAgICAgICAgICAgIHxcbiAqIHwgNDEgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gMjkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzICAgICAgICAgfCBbMi4uMzBdIGRheXMgICAgICAgIHxcbiAqIHwgMjkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIC4uLiA0NCBkYXlzIDIzIGhycyA1OSBtaW5zIDMwIHNlY3MgfCBhYm91dCAxIG1vbnRoICAgICAgIHxcbiAqIHwgNDQgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIC4uLiA1OSBkYXlzIDIzIGhycyA1OSBtaW5zIDMwIHNlY3MgfCBhYm91dCAyIG1vbnRocyAgICAgIHxcbiAqIHwgNTkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIC4uLiAxIHlyICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbMi4uMTJdIG1vbnRocyAgICAgIHxcbiAqIHwgMSB5ciAuLi4gMSB5ciAzIG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCAxIHllYXIgICAgICAgIHxcbiAqIHwgMSB5ciAzIG1vbnRocyAuLi4gMSB5ciA5IG1vbnRoIHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdmVyIDEgeWVhciAgICAgICAgIHxcbiAqIHwgMSB5ciA5IG1vbnRocyAuLi4gMiB5cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbG1vc3QgMiB5ZWFycyAgICAgIHxcbiAqIHwgTiB5cnMgLi4uIE4geXJzIDMgbW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYm91dCBOIHllYXJzICAgICAgIHxcbiAqIHwgTiB5cnMgMyBtb250aHMgLi4uIE4geXJzIDkgbW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdmVyIE4geWVhcnMgICAgICAgIHxcbiAqIHwgTiB5cnMgOSBtb250aHMgLi4uIE4rMSB5cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbG1vc3QgTisxIHllYXJzICAgIHxcbiAqXG4gKiBXaXRoIGBvcHRpb25zLmluY2x1ZGVTZWNvbmRzID09IHRydWVgOlxuICogfCBEaXN0YW5jZSBiZXR3ZWVuIGRhdGVzIHwgUmVzdWx0ICAgICAgICAgICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCAwIHNlY3MgLi4uIDUgc2VjcyAgICAgIHwgbGVzcyB0aGFuIDUgc2Vjb25kcyAgfFxuICogfCA1IHNlY3MgLi4uIDEwIHNlY3MgICAgIHwgbGVzcyB0aGFuIDEwIHNlY29uZHMgfFxuICogfCAxMCBzZWNzIC4uLiAyMCBzZWNzICAgIHwgbGVzcyB0aGFuIDIwIHNlY29uZHMgfFxuICogfCAyMCBzZWNzIC4uLiA0MCBzZWNzICAgIHwgaGFsZiBhIG1pbnV0ZSAgICAgICAgfFxuICogfCA0MCBzZWNzIC4uLiA2MCBzZWNzICAgIHwgbGVzcyB0aGFuIGEgbWludXRlICAgfFxuICogfCA2MCBzZWNzIC4uLiA5MCBzZWNzICAgIHwgMSBtaW51dGUgICAgICAgICAgICAgfFxuICpcbiAqIEBwYXJhbSBsYXRlckRhdGUgLSBUaGUgZGF0ZVxuICogQHBhcmFtIGVhcmxpZXJEYXRlIC0gVGhlIGRhdGUgdG8gY29tcGFyZSB3aXRoXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgZGlzdGFuY2UgaW4gd29yZHNcbiAqXG4gKiBAdGhyb3dzIGBkYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3MgYGJhc2VEYXRlYCBtdXN0IG5vdCBiZSBJbnZhbGlkIERhdGVcbiAqIEB0aHJvd3MgYG9wdGlvbnMubG9jYWxlYCBtdXN0IGNvbnRhaW4gYGZvcm1hdERpc3RhbmNlYCBwcm9wZXJ0eVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGF0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIDIgSnVseSAyMDE0IGFuZCAxIEphbnVhcnkgMjAxNT9cbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdERpc3RhbmNlKG5ldyBEYXRlKDIwMTQsIDYsIDIpLCBuZXcgRGF0ZSgyMDE1LCAwLCAxKSlcbiAqIC8vPT4gJzYgbW9udGhzJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGF0IGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIDEgSmFudWFyeSAyMDE1IDAwOjAwOjE1XG4gKiAvLyBhbmQgMSBKYW51YXJ5IDIwMTUgMDA6MDA6MDAsIGluY2x1ZGluZyBzZWNvbmRzP1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2UoXG4gKiAgIG5ldyBEYXRlKDIwMTUsIDAsIDEsIDAsIDAsIDE1KSxcbiAqICAgbmV3IERhdGUoMjAxNSwgMCwgMSwgMCwgMCwgMCksXG4gKiAgIHsgaW5jbHVkZVNlY29uZHM6IHRydWUgfVxuICogKVxuICogLy89PiAnbGVzcyB0aGFuIDIwIHNlY29uZHMnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoYXQgaXMgdGhlIGRpc3RhbmNlIGZyb20gMSBKYW51YXJ5IDIwMTZcbiAqIC8vIHRvIDEgSmFudWFyeSAyMDE1LCB3aXRoIGEgc3VmZml4P1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2UobmV3IERhdGUoMjAxNSwgMCwgMSksIG5ldyBEYXRlKDIwMTYsIDAsIDEpLCB7XG4gKiAgIGFkZFN1ZmZpeDogdHJ1ZVxuICogfSlcbiAqIC8vPT4gJ2Fib3V0IDEgeWVhciBhZ28nXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoYXQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gMSBBdWd1c3QgMjAxNiBhbmQgMSBKYW51YXJ5IDIwMTUgaW4gRXNwZXJhbnRvP1xuICogaW1wb3J0IHsgZW9Mb2NhbGUgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUvZW8nXG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXREaXN0YW5jZShuZXcgRGF0ZSgyMDE2LCA3LCAxKSwgbmV3IERhdGUoMjAxNSwgMCwgMSksIHtcbiAqICAgbG9jYWxlOiBlb0xvY2FsZVxuICogfSlcbiAqIC8vPT4gJ3BsaSBvbCAxIGphcm8nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREaXN0YW5jZShsYXRlckRhdGUsIGVhcmxpZXJEYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3QgbG9jYWxlID0gb3B0aW9ucz8ubG9jYWxlID8/IGRlZmF1bHRPcHRpb25zLmxvY2FsZSA/PyBkZWZhdWx0TG9jYWxlO1xuICBjb25zdCBtaW51dGVzSW5BbG1vc3RUd29EYXlzID0gMjUyMDtcblxuICBjb25zdCBjb21wYXJpc29uID0gY29tcGFyZUFzYyhsYXRlckRhdGUsIGVhcmxpZXJEYXRlKTtcblxuICBpZiAoaXNOYU4oY29tcGFyaXNvbikpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0aW1lIHZhbHVlXCIpO1xuXG4gIGNvbnN0IGxvY2FsaXplT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHtcbiAgICBhZGRTdWZmaXg6IG9wdGlvbnM/LmFkZFN1ZmZpeCxcbiAgICBjb21wYXJpc29uOiBjb21wYXJpc29uLFxuICB9KTtcblxuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIC4uLihjb21wYXJpc29uID4gMCA/IFtlYXJsaWVyRGF0ZSwgbGF0ZXJEYXRlXSA6IFtsYXRlckRhdGUsIGVhcmxpZXJEYXRlXSksXG4gICk7XG5cbiAgY29uc3Qgc2Vjb25kcyA9IGRpZmZlcmVuY2VJblNlY29uZHMoZWFybGllckRhdGVfLCBsYXRlckRhdGVfKTtcbiAgY29uc3Qgb2Zmc2V0SW5TZWNvbmRzID1cbiAgICAoZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhlYXJsaWVyRGF0ZV8pIC1cbiAgICAgIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMobGF0ZXJEYXRlXykpIC9cbiAgICAxMDAwO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5yb3VuZCgoc2Vjb25kcyAtIG9mZnNldEluU2Vjb25kcykgLyA2MCk7XG4gIGxldCBtb250aHM7XG5cbiAgLy8gMCB1cCB0byAyIG1pbnNcbiAgaWYgKG1pbnV0ZXMgPCAyKSB7XG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVTZWNvbmRzKSB7XG4gICAgICBpZiAoc2Vjb25kcyA8IDUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImxlc3NUaGFuWFNlY29uZHNcIiwgNSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDEwKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJsZXNzVGhhblhTZWNvbmRzXCIsIDEwLCBsb2NhbGl6ZU9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChzZWNvbmRzIDwgMjApIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImxlc3NUaGFuWFNlY29uZHNcIiwgMjAsIGxvY2FsaXplT3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKHNlY29uZHMgPCA0MCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwiaGFsZkFNaW51dGVcIiwgMCwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vjb25kcyA8IDYwKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJsZXNzVGhhblhNaW51dGVzXCIsIDEsIGxvY2FsaXplT3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwieE1pbnV0ZXNcIiwgMSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1pbnV0ZXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImxlc3NUaGFuWE1pbnV0ZXNcIiwgMSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJ4TWludXRlc1wiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIgbWlucyB1cCB0byAwLjc1IGhyc1xuICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA0NSkge1xuICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJ4TWludXRlc1wiLCBtaW51dGVzLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMC43NSBocnMgdXAgdG8gMS41IGhyc1xuICB9IGVsc2UgaWYgKG1pbnV0ZXMgPCA5MCkge1xuICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJhYm91dFhIb3Vyc1wiLCAxLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMS41IGhycyB1cCB0byAyNCBocnNcbiAgfSBlbHNlIGlmIChtaW51dGVzIDwgbWludXRlc0luRGF5KSB7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyA2MCk7XG4gICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcImFib3V0WEhvdXJzXCIsIGhvdXJzLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMSBkYXkgdXAgdG8gMS43NSBkYXlzXG4gIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbkFsbW9zdFR3b0RheXMpIHtcbiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwieERheXNcIiwgMSwgbG9jYWxpemVPcHRpb25zKTtcblxuICAgIC8vIDEuNzUgZGF5cyB1cCB0byAzMCBkYXlzXG4gIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoKSB7XG4gICAgY29uc3QgZGF5cyA9IE1hdGgucm91bmQobWludXRlcyAvIG1pbnV0ZXNJbkRheSk7XG4gICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcInhEYXlzXCIsIGRheXMsIGxvY2FsaXplT3B0aW9ucyk7XG5cbiAgICAvLyAxIG1vbnRoIHVwIHRvIDIgbW9udGhzXG4gIH0gZWxzZSBpZiAobWludXRlcyA8IG1pbnV0ZXNJbk1vbnRoICogMikge1xuICAgIG1vbnRocyA9IE1hdGgucm91bmQobWludXRlcyAvIG1pbnV0ZXNJbk1vbnRoKTtcbiAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwiYWJvdXRYTW9udGhzXCIsIG1vbnRocywgbG9jYWxpemVPcHRpb25zKTtcbiAgfVxuXG4gIG1vbnRocyA9IGRpZmZlcmVuY2VJbk1vbnRocyhlYXJsaWVyRGF0ZV8sIGxhdGVyRGF0ZV8pO1xuXG4gIC8vIDIgbW9udGhzIHVwIHRvIDEyIG1vbnRoc1xuICBpZiAobW9udGhzIDwgMTIpIHtcbiAgICBjb25zdCBuZWFyZXN0TW9udGggPSBNYXRoLnJvdW5kKG1pbnV0ZXMgLyBtaW51dGVzSW5Nb250aCk7XG4gICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcInhNb250aHNcIiwgbmVhcmVzdE1vbnRoLCBsb2NhbGl6ZU9wdGlvbnMpO1xuXG4gICAgLy8gMSB5ZWFyIHVwIHRvIG1heCBEYXRlXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbW9udGhzU2luY2VTdGFydE9mWWVhciA9IG1vbnRocyAlIDEyO1xuICAgIGNvbnN0IHllYXJzID0gTWF0aC50cnVuYyhtb250aHMgLyAxMik7XG5cbiAgICAvLyBOIHllYXJzIHVwIHRvIDEgeWVhcnMgMyBtb250aHNcbiAgICBpZiAobW9udGhzU2luY2VTdGFydE9mWWVhciA8IDMpIHtcbiAgICAgIHJldHVybiBsb2NhbGUuZm9ybWF0RGlzdGFuY2UoXCJhYm91dFhZZWFyc1wiLCB5ZWFycywgbG9jYWxpemVPcHRpb25zKTtcblxuICAgICAgLy8gTiB5ZWFycyAzIG1vbnRocyB1cCB0byBOIHllYXJzIDkgbW9udGhzXG4gICAgfSBlbHNlIGlmIChtb250aHNTaW5jZVN0YXJ0T2ZZZWFyIDwgOSkge1xuICAgICAgcmV0dXJuIGxvY2FsZS5mb3JtYXREaXN0YW5jZShcIm92ZXJYWWVhcnNcIiwgeWVhcnMsIGxvY2FsaXplT3B0aW9ucyk7XG5cbiAgICAgIC8vIE4geWVhcnMgOSBtb250aHMgdXAgdG8gTiB5ZWFyIDEyIG1vbnRoc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbG9jYWxlLmZvcm1hdERpc3RhbmNlKFwiYWxtb3N0WFllYXJzXCIsIHllYXJzICsgMSwgbG9jYWxpemVPcHRpb25zKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBmb3JtYXREaXN0YW5jZTtcbiIsImltcG9ydCB7IGNvbnN0cnVjdE5vdyB9IGZyb20gXCIuL2NvbnN0cnVjdE5vdy5qc1wiO1xuXG5pbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXREaXN0YW5jZVRvTm93fSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZm9ybWF0RGlzdGFuY2VUb05vd1xuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUgYW5kIG5vdyBpbiB3b3Jkcy5cbiAqIEBwdXJlIGZhbHNlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUgYW5kIG5vdyBpbiB3b3Jkcy5cbiAqXG4gKiB8IERpc3RhbmNlIHRvIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IDAgLi4uIDMwIHNlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbGVzcyB0aGFuIGEgbWludXRlICB8XG4gKiB8IDMwIHNlY3MgLi4uIDEgbWluIDMwIHNlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMSBtaW51dGUgICAgICAgICAgICB8XG4gKiB8IDEgbWluIDMwIHNlY3MgLi4uIDQ0IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWzIuLjQ0XSBtaW51dGVzICAgICB8XG4gKiB8IDQ0IG1pbnMgLi4uIDMwIHNlY3MgLi4uIDg5IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgMSBob3VyICAgICAgICB8XG4gKiB8IDg5IG1pbnMgMzAgc2VjcyAuLi4gMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgWzIuLjI0XSBob3VycyB8XG4gKiB8IDIzIGhycyA1OSBtaW5zIDMwIHNlY3MgLi4uIDQxIGhycyA1OSBtaW5zIDMwIHNlY3MgICAgICAgICAgICAgICAgIHwgMSBkYXkgICAgICAgICAgICAgICB8XG4gKiB8IDQxIGhycyA1OSBtaW5zIDMwIHNlY3MgLi4uIDI5IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAgICAgICAgIHwgWzIuLjMwXSBkYXlzICAgICAgICB8XG4gKiB8IDI5IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gNDQgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIHwgYWJvdXQgMSBtb250aCAgICAgICB8XG4gKiB8IDQ0IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gNTkgZGF5cyAyMyBocnMgNTkgbWlucyAzMCBzZWNzIHwgYWJvdXQgMiBtb250aHMgICAgICB8XG4gKiB8IDU5IGRheXMgMjMgaHJzIDU5IG1pbnMgMzAgc2VjcyAuLi4gMSB5ciAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWzIuLjEyXSBtb250aHMgICAgICB8XG4gKiB8IDEgeXIgLi4uIDEgeXIgMyBtb250aHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgMSB5ZWFyICAgICAgICB8XG4gKiB8IDEgeXIgMyBtb250aHMgLi4uIDEgeXIgOSBtb250aCBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3ZlciAxIHllYXIgICAgICAgICB8XG4gKiB8IDEgeXIgOSBtb250aHMgLi4uIDIgeXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxtb3N0IDIgeWVhcnMgICAgICB8XG4gKiB8IE4geXJzIC4uLiBOIHlycyAzIG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWJvdXQgTiB5ZWFycyAgICAgICB8XG4gKiB8IE4geXJzIDMgbW9udGhzIC4uLiBOIHlycyA5IG1vbnRocyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3ZlciBOIHllYXJzICAgICAgICB8XG4gKiB8IE4geXJzIDkgbW9udGhzIC4uLiBOKzEgeXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxtb3N0IE4rMSB5ZWFycyAgICB8XG4gKlxuICogV2l0aCBgb3B0aW9ucy5pbmNsdWRlU2Vjb25kcyA9PSB0cnVlYDpcbiAqIHwgRGlzdGFuY2UgdG8gbm93ICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgMCBzZWNzIC4uLiA1IHNlY3MgICB8IGxlc3MgdGhhbiA1IHNlY29uZHMgIHxcbiAqIHwgNSBzZWNzIC4uLiAxMCBzZWNzICB8IGxlc3MgdGhhbiAxMCBzZWNvbmRzIHxcbiAqIHwgMTAgc2VjcyAuLi4gMjAgc2VjcyB8IGxlc3MgdGhhbiAyMCBzZWNvbmRzIHxcbiAqIHwgMjAgc2VjcyAuLi4gNDAgc2VjcyB8IGhhbGYgYSBtaW51dGUgICAgICAgIHxcbiAqIHwgNDAgc2VjcyAuLi4gNjAgc2VjcyB8IGxlc3MgdGhhbiBhIG1pbnV0ZSAgIHxcbiAqIHwgNjAgc2VjcyAuLi4gOTAgc2VjcyB8IDEgbWludXRlICAgICAgICAgICAgIHxcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRpc3RhbmNlIGluIHdvcmRzXG4gKlxuICogQHRocm93cyBgZGF0ZWAgbXVzdCBub3QgYmUgSW52YWxpZCBEYXRlXG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXREaXN0YW5jZWAgcHJvcGVydHlcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdG9kYXkgaXMgMSBKYW51YXJ5IDIwMTUsIHdoYXQgaXMgdGhlIGRpc3RhbmNlIHRvIDIgSnVseSAyMDE0P1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2VUb05vdyhcbiAqICAgbmV3IERhdGUoMjAxNCwgNiwgMilcbiAqIClcbiAqIC8vPT4gJzYgbW9udGhzJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiBub3cgaXMgMSBKYW51YXJ5IDIwMTUgMDA6MDA6MDAsXG4gKiAvLyB3aGF0IGlzIHRoZSBkaXN0YW5jZSB0byAxIEphbnVhcnkgMjAxNSAwMDowMDoxNSwgaW5jbHVkaW5nIHNlY29uZHM/XG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXREaXN0YW5jZVRvTm93KFxuICogICBuZXcgRGF0ZSgyMDE1LCAwLCAxLCAwLCAwLCAxNSksXG4gKiAgIHtpbmNsdWRlU2Vjb25kczogdHJ1ZX1cbiAqIClcbiAqIC8vPT4gJ2xlc3MgdGhhbiAyMCBzZWNvbmRzJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBJZiB0b2RheSBpcyAxIEphbnVhcnkgMjAxNSxcbiAqIC8vIHdoYXQgaXMgdGhlIGRpc3RhbmNlIHRvIDEgSmFudWFyeSAyMDE2LCB3aXRoIGEgc3VmZml4P1xuICogY29uc3QgcmVzdWx0ID0gZm9ybWF0RGlzdGFuY2VUb05vdyhcbiAqICAgbmV3IERhdGUoMjAxNiwgMCwgMSksXG4gKiAgIHthZGRTdWZmaXg6IHRydWV9XG4gKiApXG4gKiAvLz0+ICdpbiBhYm91dCAxIHllYXInXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRvZGF5IGlzIDEgSmFudWFyeSAyMDE1LFxuICogLy8gd2hhdCBpcyB0aGUgZGlzdGFuY2UgdG8gMSBBdWd1c3QgMjAxNiBpbiBFc3BlcmFudG8/XG4gKiBjb25zdCBlb0xvY2FsZSA9IHJlcXVpcmUoJ2RhdGUtZm5zL2xvY2FsZS9lbycpXG4gKiBjb25zdCByZXN1bHQgPSBmb3JtYXREaXN0YW5jZVRvTm93KFxuICogICBuZXcgRGF0ZSgyMDE2LCA3LCAxKSxcbiAqICAge2xvY2FsZTogZW9Mb2NhbGV9XG4gKiApXG4gKiAvLz0+ICdwbGkgb2wgMSBqYXJvJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGlzdGFuY2VUb05vdyhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmb3JtYXREaXN0YW5jZShkYXRlLCBjb25zdHJ1Y3ROb3coZGF0ZSksIG9wdGlvbnMpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGZvcm1hdERpc3RhbmNlVG9Ob3c7XG4iLCJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZldlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1xuICogQGNhdGVnb3J5IFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgd2Vla1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gU3VuIEF1ZyAzMSAyMDE0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHRoZSB3ZWVrIHN0YXJ0cyBvbiBNb25kYXksIHRoZSBzdGFydCBvZiB0aGUgd2VlayBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMCksIHsgd2Vla1N0YXJ0c09uOiAxIH0pXG4gKiAvLz0+IE1vbiBTZXAgMDEgMjAxNCAwMDowMDowMFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZldlZWsoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IHdlZWtTdGFydHNPbiA9XG4gICAgb3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy53ZWVrU3RhcnRzT24gPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIDA7XG5cbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkYXkgPSBfZGF0ZS5nZXREYXkoKTtcbiAgY29uc3QgZGlmZiA9IChkYXkgPCB3ZWVrU3RhcnRzT24gPyA3IDogMCkgKyBkYXkgLSB3ZWVrU3RhcnRzT247XG5cbiAgX2RhdGUuc2V0RGF0ZShfZGF0ZS5nZXREYXRlKCkgLSBkaWZmKTtcbiAgX2RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2VlaztcbiIsImltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgaXNTYW1lV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIGlzU2FtZVdlZWtcbiAqIEBjYXRlZ29yeSBXZWVrIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFyZSB0aGUgZ2l2ZW4gZGF0ZXMgaW4gdGhlIHNhbWUgd2VlayAoYW5kIG1vbnRoIGFuZCB5ZWFyKT9cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGZpcnN0IGRhdGUgdG8gY2hlY2tcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVja1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGVzIGFyZSBpbiB0aGUgc2FtZSB3ZWVrIChhbmQgbW9udGggYW5kIHllYXIpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFyZSAzMSBBdWd1c3QgMjAxNCBhbmQgNCBTZXB0ZW1iZXIgMjAxNCBpbiB0aGUgc2FtZSB3ZWVrP1xuICogY29uc3QgcmVzdWx0ID0gaXNTYW1lV2VlayhuZXcgRGF0ZSgyMDE0LCA3LCAzMSksIG5ldyBEYXRlKDIwMTQsIDgsIDQpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElmIHdlZWsgc3RhcnRzIHdpdGggTW9uZGF5LFxuICogLy8gYXJlIDMxIEF1Z3VzdCAyMDE0IGFuZCA0IFNlcHRlbWJlciAyMDE0IGluIHRoZSBzYW1lIHdlZWs/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVXZWVrKG5ldyBEYXRlKDIwMTQsIDcsIDMxKSwgbmV3IERhdGUoMjAxNCwgOCwgNCksIHtcbiAqICAgd2Vla1N0YXJ0c09uOiAxXG4gKiB9KVxuICogLy89PiBmYWxzZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBcmUgMSBKYW51YXJ5IDIwMTQgYW5kIDEgSmFudWFyeSAyMDE1IGluIHRoZSBzYW1lIHdlZWs/XG4gKiBjb25zdCByZXN1bHQgPSBpc1NhbWVXZWVrKG5ldyBEYXRlKDIwMTQsIDAsIDEpLCBuZXcgRGF0ZSgyMDE1LCAwLCAxKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZVdlZWsobGF0ZXJEYXRlLCBlYXJsaWVyRGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBbbGF0ZXJEYXRlXywgZWFybGllckRhdGVfXSA9IG5vcm1hbGl6ZURhdGVzKFxuICAgIG9wdGlvbnM/LmluLFxuICAgIGxhdGVyRGF0ZSxcbiAgICBlYXJsaWVyRGF0ZSxcbiAgKTtcbiAgcmV0dXJuIChcbiAgICArc3RhcnRPZldlZWsobGF0ZXJEYXRlXywgb3B0aW9ucykgPT09ICtzdGFydE9mV2VlayhlYXJsaWVyRGF0ZV8sIG9wdGlvbnMpXG4gICk7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgaXNTYW1lV2VlaztcbiIsImNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIndlbmlnZXIgYWxzIDEgU2VrdW5kZVwiLFxuICAgICAgb3RoZXI6IFwid2VuaWdlciBhbHMge3tjb3VudH19IFNla3VuZGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJ3ZW5pZ2VyIGFscyAxIFNla3VuZGVcIixcbiAgICAgIG90aGVyOiBcIndlbmlnZXIgYWxzIHt7Y291bnR9fSBTZWt1bmRlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBTZWt1bmRlXCIsXG4gICAgICBvdGhlcjogXCJ7e2NvdW50fX0gU2VrdW5kZW5cIixcbiAgICB9LFxuICAgIHdpdGhQcmVwb3NpdGlvbjoge1xuICAgICAgb25lOiBcIjEgU2VrdW5kZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFNla3VuZGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICBoYWxmQU1pbnV0ZToge1xuICAgIHN0YW5kYWxvbmU6IFwiZWluZSBoYWxiZSBNaW51dGVcIixcbiAgICB3aXRoUHJlcG9zaXRpb246IFwiZWluZXIgaGFsYmVuIE1pbnV0ZVwiLFxuICB9LFxuXG4gIGxlc3NUaGFuWE1pbnV0ZXM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwid2VuaWdlciBhbHMgMSBNaW51dGVcIixcbiAgICAgIG90aGVyOiBcIndlbmlnZXIgYWxzIHt7Y291bnR9fSBNaW51dGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJ3ZW5pZ2VyIGFscyAxIE1pbnV0ZVwiLFxuICAgICAgb3RoZXI6IFwid2VuaWdlciBhbHMge3tjb3VudH19IE1pbnV0ZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIjEgTWludXRlXCIsXG4gICAgICBvdGhlcjogXCJ7e2NvdW50fX0gTWludXRlblwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBNaW51dGVcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBNaW51dGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIHN0YW5kYWxvbmU6IHtcbiAgICAgIG9uZTogXCJldHdhIDEgU3R1bmRlXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBTdHVuZGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJldHdhIDEgU3R1bmRlXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBTdHVuZGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBTdHVuZGVcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBTdHVuZGVuXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCIxIFN0dW5kZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFN0dW5kZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIjEgVGFnXCIsXG4gICAgICBvdGhlcjogXCJ7e2NvdW50fX0gVGFnZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBUYWdcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBUYWdlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgYWJvdXRYV2Vla3M6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiZXR3YSAxIFdvY2hlXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBXb2NoZW5cIixcbiAgICB9LFxuICAgIHdpdGhQcmVwb3NpdGlvbjoge1xuICAgICAgb25lOiBcImV0d2EgMSBXb2NoZVwiLFxuICAgICAgb3RoZXI6IFwiZXR3YSB7e2NvdW50fX0gV29jaGVuXCIsXG4gICAgfSxcbiAgfSxcblxuICB4V2Vla3M6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBXb2NoZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFdvY2hlblwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBXb2NoZVwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IFdvY2hlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgYWJvdXRYTW9udGhzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcImV0d2EgMSBNb25hdFwiLFxuICAgICAgb3RoZXI6IFwiZXR3YSB7e2NvdW50fX0gTW9uYXRlXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCJldHdhIDEgTW9uYXRcIixcbiAgICAgIG90aGVyOiBcImV0d2Ege3tjb3VudH19IE1vbmF0ZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIHhNb250aHM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwiMSBNb25hdFwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IE1vbmF0ZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiMSBNb25hdFwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IE1vbmF0ZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcImV0d2EgMSBKYWhyXCIsXG4gICAgICBvdGhlcjogXCJldHdhIHt7Y291bnR9fSBKYWhyZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiZXR3YSAxIEphaHJcIixcbiAgICAgIG90aGVyOiBcImV0d2Ege3tjb3VudH19IEphaHJlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcIjEgSmFoclwiLFxuICAgICAgb3RoZXI6IFwie3tjb3VudH19IEphaHJlXCIsXG4gICAgfSxcbiAgICB3aXRoUHJlcG9zaXRpb246IHtcbiAgICAgIG9uZTogXCIxIEphaHJcIixcbiAgICAgIG90aGVyOiBcInt7Y291bnR9fSBKYWhyZW5cIixcbiAgICB9LFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBzdGFuZGFsb25lOiB7XG4gICAgICBvbmU6IFwibWVociBhbHMgMSBKYWhyXCIsXG4gICAgICBvdGhlcjogXCJtZWhyIGFscyB7e2NvdW50fX0gSmFocmVcIixcbiAgICB9LFxuICAgIHdpdGhQcmVwb3NpdGlvbjoge1xuICAgICAgb25lOiBcIm1laHIgYWxzIDEgSmFoclwiLFxuICAgICAgb3RoZXI6IFwibWVociBhbHMge3tjb3VudH19IEphaHJlblwiLFxuICAgIH0sXG4gIH0sXG5cbiAgYWxtb3N0WFllYXJzOiB7XG4gICAgc3RhbmRhbG9uZToge1xuICAgICAgb25lOiBcImZhc3QgMSBKYWhyXCIsXG4gICAgICBvdGhlcjogXCJmYXN0IHt7Y291bnR9fSBKYWhyZVwiLFxuICAgIH0sXG4gICAgd2l0aFByZXBvc2l0aW9uOiB7XG4gICAgICBvbmU6IFwiZmFzdCAxIEphaHJcIixcbiAgICAgIG90aGVyOiBcImZhc3Qge3tjb3VudH19IEphaHJlblwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RGlzdGFuY2UgPSAodG9rZW4sIGNvdW50LCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQ7XG5cbiAgY29uc3QgdG9rZW5WYWx1ZSA9IG9wdGlvbnM/LmFkZFN1ZmZpeFxuICAgID8gZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dLndpdGhQcmVwb3NpdGlvblxuICAgIDogZm9ybWF0RGlzdGFuY2VMb2NhbGVbdG9rZW5dLnN0YW5kYWxvbmU7XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgU3RyaW5nKGNvdW50KSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwidm9yIFwiICsgcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiaW1wb3J0IHsgYnVpbGRGb3JtYXRMb25nRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZEZvcm1hdExvbmdGbi5qc1wiO1xuXG4vLyBESU4gNTAwODogaHR0cHM6Ly9kZS53aWtpcGVkaWEub3JnL3dpa2kvRGF0dW1zZm9ybWF0I0RJTl81MDA4XG5jb25zdCBkYXRlRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJFRUVFLCBkbyBNTU1NIHlcIiwgLy8gTW9udGFnLCA3LiBKYW51YXIgMjAxOFxuICBsb25nOiBcImRvIE1NTU0geVwiLCAvLyA3LiBKYW51YXIgMjAxOFxuICBtZWRpdW06IFwiZG8gTU1NIHlcIiwgLy8gNy4gSmFuLiAyMDE4XG4gIHNob3J0OiBcImRkLk1NLnlcIiwgLy8gMDcuMDEuMjAxOFxufTtcblxuY29uc3QgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiSEg6bW06c3Mgenp6elwiLFxuICBsb25nOiBcIkhIOm1tOnNzIHpcIixcbiAgbWVkaXVtOiBcIkhIOm1tOnNzXCIsXG4gIHNob3J0OiBcIkhIOm1tXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ3VtJyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICd1bScge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19IHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19IHt7dGltZX19XCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9uZyA9IHtcbiAgZGF0ZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIHRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiB0aW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICBkYXRlVGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IGRhdGVUaW1lRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcbn07XG4iLCJjb25zdCBmb3JtYXRSZWxhdGl2ZUxvY2FsZSA9IHtcbiAgbGFzdFdlZWs6IFwiJ2xldHp0ZW4nIGVlZWUgJ3VtJyBwXCIsXG4gIHllc3RlcmRheTogXCInZ2VzdGVybiB1bScgcFwiLFxuICB0b2RheTogXCInaGV1dGUgdW0nIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ21vcmdlbiB1bScgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICd1bScgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG4iLCJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcInYuQ2hyLlwiLCBcIm4uQ2hyLlwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcInYuQ2hyLlwiLCBcIm4uQ2hyLlwiXSxcbiAgd2lkZTogW1widm9yIENocmlzdHVzXCIsIFwibmFjaCBDaHJpc3R1c1wiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxLiBRdWFydGFsXCIsIFwiMi4gUXVhcnRhbFwiLCBcIjMuIFF1YXJ0YWxcIiwgXCI0LiBRdWFydGFsXCJdLFxufTtcblxuLy8gTm90ZTogaW4gR2VybWFuLCB0aGUgbmFtZXMgb2YgZGF5cyBvZiB0aGUgd2VlayBhbmQgbW9udGhzIGFyZSBjYXBpdGFsaXplZC5cbi8vIElmIHlvdSBhcmUgbWFraW5nIGEgbmV3IGxvY2FsZSBiYXNlZCBvbiB0aGlzIG9uZSwgY2hlY2sgaWYgdGhlIHNhbWUgaXMgdHJ1ZSBmb3IgdGhlIGxhbmd1YWdlIHlvdSdyZSB3b3JraW5nIG9uLlxuLy8gR2VuZXJhbGx5LCBmb3JtYXR0ZWQgZGF0ZXMgc2hvdWxkIGxvb2sgbGlrZSB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc2VudGVuY2UsXG4vLyBlLmcuIGluIFNwYW5pc2ggbGFuZ3VhZ2UgdGhlIHdlZWtkYXlzIGFuZCBtb250aHMgc2hvdWxkIGJlIGluIHRoZSBsb3dlcmNhc2UuXG5jb25zdCBtb250aFZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJKXCIsIFwiRlwiLCBcIk1cIiwgXCJBXCIsIFwiTVwiLCBcIkpcIiwgXCJKXCIsIFwiQVwiLCBcIlNcIiwgXCJPXCIsIFwiTlwiLCBcIkRcIl0sXG4gIGFiYnJldmlhdGVkOiBbXG4gICAgXCJKYW5cIixcbiAgICBcIkZlYlwiLFxuICAgIFwiTcOkclwiLFxuICAgIFwiQXByXCIsXG4gICAgXCJNYWlcIixcbiAgICBcIkp1blwiLFxuICAgIFwiSnVsXCIsXG4gICAgXCJBdWdcIixcbiAgICBcIlNlcFwiLFxuICAgIFwiT2t0XCIsXG4gICAgXCJOb3ZcIixcbiAgICBcIkRlelwiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIkphbnVhclwiLFxuICAgIFwiRmVicnVhclwiLFxuICAgIFwiTcOkcnpcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYWlcIixcbiAgICBcIkp1bmlcIixcbiAgICBcIkp1bGlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPa3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGV6ZW1iZXJcIixcbiAgXSxcbn07XG5cbi8vIGh0dHBzOi8vc3QudW5pY29kZS5vcmcvY2xkci1hcHBzL3YjL2RlL0dyZWdvcmlhbi9cbmNvbnN0IGZvcm1hdHRpbmdNb250aFZhbHVlcyA9IHtcbiAgbmFycm93OiBtb250aFZhbHVlcy5uYXJyb3csXG4gIGFiYnJldmlhdGVkOiBbXG4gICAgXCJKYW4uXCIsXG4gICAgXCJGZWIuXCIsXG4gICAgXCJNw6RyelwiLFxuICAgIFwiQXByLlwiLFxuICAgIFwiTWFpXCIsXG4gICAgXCJKdW5pXCIsXG4gICAgXCJKdWxpXCIsXG4gICAgXCJBdWcuXCIsXG4gICAgXCJTZXAuXCIsXG4gICAgXCJPa3QuXCIsXG4gICAgXCJOb3YuXCIsXG4gICAgXCJEZXouXCIsXG4gIF0sXG5cbiAgd2lkZTogbW9udGhWYWx1ZXMud2lkZSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIkRcIiwgXCJNXCIsIFwiRFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU29cIiwgXCJNb1wiLCBcIkRpXCIsIFwiTWlcIiwgXCJEb1wiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTby5cIiwgXCJNby5cIiwgXCJEaS5cIiwgXCJNaS5cIiwgXCJEby5cIiwgXCJGci5cIiwgXCJTYS5cIl0sXG4gIHdpZGU6IFtcbiAgICBcIlNvbm50YWdcIixcbiAgICBcIk1vbnRhZ1wiLFxuICAgIFwiRGllbnN0YWdcIixcbiAgICBcIk1pdHR3b2NoXCIsXG4gICAgXCJEb25uZXJzdGFnXCIsXG4gICAgXCJGcmVpdGFnXCIsXG4gICAgXCJTYW1zdGFnXCIsXG4gIF0sXG59O1xuXG4vLyBodHRwczovL3d3dy51bmljb2RlLm9yZy9jbGRyL2NoYXJ0cy8zMi9zdW1tYXJ5L2RlLmh0bWwjMTg4MVxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCJ2bS5cIixcbiAgICBwbTogXCJubS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJNb3JnZW5cIixcbiAgICBhZnRlcm5vb246IFwiTmFjaG0uXCIsXG4gICAgZXZlbmluZzogXCJBYmVuZFwiLFxuICAgIG5pZ2h0OiBcIk5hY2h0XCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwidm9ybS5cIixcbiAgICBwbTogXCJuYWNobS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJNb3JnZW5cIixcbiAgICBhZnRlcm5vb246IFwiTmFjaG1pdHRhZ1wiLFxuICAgIGV2ZW5pbmc6IFwiQWJlbmRcIixcbiAgICBuaWdodDogXCJOYWNodFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwidm9ybWl0dGFnc1wiLFxuICAgIHBtOiBcIm5hY2htaXR0YWdzXCIsXG4gICAgbWlkbmlnaHQ6IFwiTWl0dGVybmFjaHRcIixcbiAgICBub29uOiBcIk1pdHRhZ1wiLFxuICAgIG1vcm5pbmc6IFwiTW9yZ2VuXCIsXG4gICAgYWZ0ZXJub29uOiBcIk5hY2htaXR0YWdcIixcbiAgICBldmVuaW5nOiBcIkFiZW5kXCIsXG4gICAgbmlnaHQ6IFwiTmFjaHRcIixcbiAgfSxcbn07XG5jb25zdCBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCJ2bS5cIixcbiAgICBwbTogXCJubS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJtb3JnZW5zXCIsXG4gICAgYWZ0ZXJub29uOiBcIm5hY2htLlwiLFxuICAgIGV2ZW5pbmc6IFwiYWJlbmRzXCIsXG4gICAgbmlnaHQ6IFwibmFjaHRzXCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwidm9ybS5cIixcbiAgICBwbTogXCJuYWNobS5cIixcbiAgICBtaWRuaWdodDogXCJNaXR0ZXJuYWNodFwiLFxuICAgIG5vb246IFwiTWl0dGFnXCIsXG4gICAgbW9ybmluZzogXCJtb3JnZW5zXCIsXG4gICAgYWZ0ZXJub29uOiBcIm5hY2htaXR0YWdzXCIsXG4gICAgZXZlbmluZzogXCJhYmVuZHNcIixcbiAgICBuaWdodDogXCJuYWNodHNcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcInZvcm1pdHRhZ3NcIixcbiAgICBwbTogXCJuYWNobWl0dGFnc1wiLFxuICAgIG1pZG5pZ2h0OiBcIk1pdHRlcm5hY2h0XCIsXG4gICAgbm9vbjogXCJNaXR0YWdcIixcbiAgICBtb3JuaW5nOiBcIm1vcmdlbnNcIixcbiAgICBhZnRlcm5vb246IFwibmFjaG1pdHRhZ3NcIixcbiAgICBldmVuaW5nOiBcImFiZW5kc1wiLFxuICAgIG5pZ2h0OiBcIm5hY2h0c1wiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlcikgPT4ge1xuICBjb25zdCBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIHJldHVybiBudW1iZXIgKyBcIi5cIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ01vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6IFwid2lkZVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBidWlsZE1hdGNoRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4uanNcIjtcbmltcG9ydCB7IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzXCI7XG5cbmNvbnN0IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXihcXGQrKShcXC4pPy9pO1xuY29uc3QgcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9cXGQrL2k7XG5cbmNvbnN0IG1hdGNoRXJhUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL14odlxcLj8gP0NoclxcLj98blxcLj8gP0NoclxcLj8pL2ksXG4gIGFiYnJldmlhdGVkOiAvXih2XFwuPyA/Q2hyXFwuP3xuXFwuPyA/Q2hyXFwuPykvaSxcbiAgd2lkZTogL14odm9yIENocmlzdHVzfHZvciB1bnNlcmVyIFplaXRyZWNobnVuZ3xuYWNoIENocmlzdHVzfHVuc2VyZXIgWmVpdHJlY2hudW5nKS9pLFxufTtcbmNvbnN0IHBhcnNlRXJhUGF0dGVybnMgPSB7XG4gIGFueTogWy9edi9pLCAvXm4vaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKFxcLik/IFF1YXJ0YWwvaSxcbn07XG5jb25zdCBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgYW55OiBbLzEvaSwgLzIvaSwgLzMvaSwgLzQvaV0sXG59O1xuXG5jb25zdCBtYXRjaE1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bamZtYXNvbmRdL2ksXG4gIGFiYnJldmlhdGVkOlxuICAgIC9eKGpbYcOkXW58ZmVifG3DpHJbel0/fGFwcnxtYWl8anVuW2ldP3xqdWxbaV0/fGF1Z3xzZXB8b2t0fG5vdnxkZXopXFwuPy9pLFxuICB3aWRlOiAvXihqYW51YXJ8ZmVicnVhcnxtw6RyenxhcHJpbHxtYWl8anVuaXxqdWxpfGF1Z3VzdHxzZXB0ZW1iZXJ8b2t0b2Jlcnxub3ZlbWJlcnxkZXplbWJlcikvaSxcbn07XG5jb25zdCBwYXJzZU1vbnRoUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogW1xuICAgIC9eai9pLFxuICAgIC9eZi9pLFxuICAgIC9ebS9pLFxuICAgIC9eYS9pLFxuICAgIC9ebS9pLFxuICAgIC9eai9pLFxuICAgIC9eai9pLFxuICAgIC9eYS9pLFxuICAgIC9ecy9pLFxuICAgIC9eby9pLFxuICAgIC9ebi9pLFxuICAgIC9eZC9pLFxuICBdLFxuXG4gIGFueTogW1xuICAgIC9ealthw6RdL2ksXG4gICAgL15mL2ksXG4gICAgL15tw6RyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWFpL2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc21kbWZdL2ksXG4gIHNob3J0OiAvXihzb3xtb3xkaXxtaXxkb3xmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHNvbj98bW9uP3xkaWU/fG1pdD98ZG9uP3xmcmU/fHNhbT8pXFwuPy9pLFxuICB3aWRlOiAvXihzb25udGFnfG1vbnRhZ3xkaWVuc3RhZ3xtaXR0d29jaHxkb25uZXJzdGFnfGZyZWl0YWd8c2Ftc3RhZykvaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBhbnk6IFsvXnNvL2ksIC9ebW8vaSwgL15kaS9pLCAvXm1pL2ksIC9eZG8vaSwgL15mL2ksIC9ec2EvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKHZtXFwuP3xubVxcLj98TWl0dGVybmFjaHR8TWl0dGFnfG1vcmdlbnN8bmFjaG1cXC4/fGFiZW5kc3xuYWNodHMpL2ksXG4gIGFiYnJldmlhdGVkOlxuICAgIC9eKHZvcm1cXC4/fG5hY2htXFwuP3xNaXR0ZXJuYWNodHxNaXR0YWd8bW9yZ2Vuc3xuYWNobVxcLj98YWJlbmRzfG5hY2h0cykvaSxcbiAgd2lkZTogL14odm9ybWl0dGFnc3xuYWNobWl0dGFnc3xNaXR0ZXJuYWNodHxNaXR0YWd8bW9yZ2Vuc3xuYWNobWl0dGFnc3xhYmVuZHN8bmFjaHRzKS9pLFxufTtcbmNvbnN0IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMgPSB7XG4gIGFueToge1xuICAgIGFtOiAvXnYvaSxcbiAgICBwbTogL15uL2ksXG4gICAgbWlkbmlnaHQ6IC9eTWl0dGUvaSxcbiAgICBub29uOiAvXk1pdHRhL2ksXG4gICAgbW9ybmluZzogL21vcmdlbnMvaSxcbiAgICBhZnRlcm5vb246IC9uYWNobWl0dGFncy9pLCAvLyB3aWxsIG5ldmVyIGJlIG1hdGNoZWQuIEFmdGVybm9vbiBpcyBtYXRjaGVkIGJ5IGBwbWBcbiAgICBldmVuaW5nOiAvYWJlbmRzL2ksXG4gICAgbmlnaHQ6IC9uYWNodHMvaSwgLy8gd2lsbCBuZXZlciBiZSBtYXRjaGVkLiBOaWdodCBpcyBtYXRjaGVkIGJ5IGBwbWBcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBtYXRjaCA9IHtcbiAgb3JkaW5hbE51bWJlcjogYnVpbGRNYXRjaFBhdHRlcm5Gbih7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiAodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2RlL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi9kZS9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vZGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi9kZS9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL2RlL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgR2VybWFuIGxvY2FsZS5cbiAqIEBsYW5ndWFnZSBHZXJtYW5cbiAqIEBpc28tNjM5LTIgZGV1XG4gKiBAYXV0aG9yIFRob21hcyBFaWxtc3RlaW5lciBbQERlTXV1XShodHRwczovL2dpdGh1Yi5jb20vRGVNdXUpXG4gKiBAYXV0aG9yIEFzaWEgW0Bhc2lhLXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hc2lhLXQpXG4gKiBAYXV0aG9yIFZhbiBWdW9uZyBOZ28gW0B2YW52dW9uZ25nb10oaHR0cHM6Ly9naXRodWIuY29tL3ZhbnZ1b25nbmdvKVxuICogQGF1dGhvciBSb21hbkVybnN0IFtAcGV4XShodHRwczovL2dpdGh1Yi5jb20vcGV4KVxuICogQGF1dGhvciBQaGlsaXBwIEtlY2sgW0BQaGlsaXBwOTFdKGh0dHBzOi8vZ2l0aHViLmNvbS9QaGlsaXBwOTEpXG4gKi9cbmV4cG9ydCBjb25zdCBkZSA9IHtcbiAgY29kZTogXCJkZVwiLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDEgLyogTW9uZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCxcbiAgfSxcbn07XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZGU7XG4iLCJjb25zdCBmb3JtYXREaXN0YW5jZUxvY2FsZSA9IHtcbiAgbGVzc1RoYW5YU2Vjb25kczoge1xuICAgIG9uZTogXCLXpNeX15XXqiDXntep16DXmdeZ15RcIixcbiAgICB0d286IFwi16TXl9eV16og157Xqdeq15kg16nXoNeZ15XXqlwiLFxuICAgIG90aGVyOiBcItek15fXldeqINee1r57e2NvdW50fX0g16nXoNeZ15XXqlwiLFxuICB9LFxuXG4gIHhTZWNvbmRzOiB7XG4gICAgb25lOiBcItep16DXmdeZ15RcIixcbiAgICB0d286IFwi16nXqteZINep16DXmdeV16pcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g16nXoNeZ15XXqlwiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcIteX16bXmSDXk9en15RcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcItek15fXldeqINee15PXp9eUXCIsXG4gICAgdHdvOiBcItek15fXldeqINee16nXqteZINeT16fXldeqXCIsXG4gICAgb3RoZXI6IFwi16TXl9eV16og157Wvnt7Y291bnR9fSDXk9en15XXqlwiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIteT16fXlFwiLFxuICAgIHR3bzogXCLXqdeq15kg15PXp9eV16pcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g15PXp9eV16pcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCLXm9ep16LXlFwiLFxuICAgIHR3bzogXCLXm9ep16LXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcIteb1r57e2NvdW50fX0g16nXoteV16pcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwi16nXoteUXCIsXG4gICAgdHdvOiBcItep16LXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSDXqdei15XXqlwiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIteZ15XXnVwiLFxuICAgIHR3bzogXCLXmdeV157XmdeZ151cIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g15nXnteZ151cIixcbiAgfSxcblxuICBhYm91dFhXZWVrczoge1xuICAgIG9uZTogXCLXm9ep15HXldeiXCIsXG4gICAgdHdvOiBcIteb16nXkdeV16LXmdeZ151cIixcbiAgICBvdGhlcjogXCLXm9a+e3tjb3VudH19INep15HXldei15XXqlwiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCLXqdeR15XXolwiLFxuICAgIHR3bzogXCLXqdeR15XXoteZ15nXnVwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSDXqdeR15XXoteV16pcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwi15vXl9eV15PXqVwiLFxuICAgIHR3bzogXCLXm9eX15XXk9ep15nXmdedXCIsXG4gICAgb3RoZXI6IFwi15vWvnt7Y291bnR9fSDXl9eV15PXqdeZ151cIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIteX15XXk9epXCIsXG4gICAgdHdvOiBcIteX15XXk9ep15nXmdedXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19INeX15XXk9ep15nXnVwiLFxuICB9LFxuXG4gIGFib3V0WFllYXJzOiB7XG4gICAgb25lOiBcIteb16nXoNeUXCIsXG4gICAgdHdvOiBcIteb16nXoNeq15nXmdedXCIsXG4gICAgb3RoZXI6IFwi15vWvnt7Y291bnR9fSDXqdeg15nXnVwiLFxuICB9LFxuXG4gIHhZZWFyczoge1xuICAgIG9uZTogXCLXqdeg15RcIixcbiAgICB0d286IFwi16nXoNeq15nXmdedXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19INep16DXmdedXCIsXG4gIH0sXG5cbiAgb3ZlclhZZWFyczoge1xuICAgIG9uZTogXCLXmdeV16rXqCDXntep16DXlFwiLFxuICAgIHR3bzogXCLXmdeV16rXqCDXntep16DXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcIteZ15XXqteoINee1r57e2NvdW50fX0g16nXoNeZ151cIixcbiAgfSxcblxuICBhbG1vc3RYWWVhcnM6IHtcbiAgICBvbmU6IFwi15vXntei15gg16nXoNeUXCIsXG4gICAgdHdvOiBcIteb157XoteYINep16DXqteZ15nXnVwiLFxuICAgIG90aGVyOiBcIteb157XoteYIHt7Y291bnR9fSDXqdeg15nXnVwiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICAvLyBSZXR1cm4gd29yZCBpbnN0ZWFkIG9mIGBpbiBvbmUgZGF5YCBvciBgb25lIGRheSBhZ29gXG4gIGlmICh0b2tlbiA9PT0gXCJ4RGF5c1wiICYmIG9wdGlvbnM/LmFkZFN1ZmZpeCAmJiBjb3VudCA8PSAyKSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gY291bnQgPT09IDEgPyBcItee15fXqFwiIDogXCLXnteX16jXqteZ15nXnVwiO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudCA9PT0gMSA/IFwi15DXqtee15XXnFwiIDogXCLXqdec16nXldedXCI7XG4gIH1cblxuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIGlmIChjb3VudCA9PT0gMikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUudHdvO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWUub3RoZXIucmVwbGFjZShcInt7Y291bnR9fVwiLCBTdHJpbmcoY291bnQpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5hZGRTdWZmaXgpIHtcbiAgICBpZiAob3B0aW9ucy5jb21wYXJpc29uICYmIG9wdGlvbnMuY29tcGFyaXNvbiA+IDApIHtcbiAgICAgIHJldHVybiBcIteR16LXldeTIFwiICsgcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCLXnNek16DXmSBcIiArIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsImltcG9ydCB7IGJ1aWxkRm9ybWF0TG9uZ0ZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRGb3JtYXRMb25nRm4uanNcIjtcblxuY29uc3QgZGF0ZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiRUVFRSwgZCDXkU1NTU0geVwiLFxuICBsb25nOiBcImQg15FNTU1NIHlcIixcbiAgbWVkaXVtOiBcImQg15FNTU0geVwiLFxuICBzaG9ydDogXCJkLk0ueVwiLFxufTtcblxuY29uc3QgdGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwiSDptbTpzcyB6enp6XCIsXG4gIGxvbmc6IFwiSDptbTpzcyB6XCIsXG4gIG1lZGl1bTogXCJIOm1tOnNzXCIsXG4gIHNob3J0OiBcIkg6bW1cIixcbn07XG5cbmNvbnN0IGRhdGVUaW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ7e2RhdGV9fSAn15HXqdei15QnIHt7dGltZX19XCIsXG4gIGxvbmc6IFwie3tkYXRlfX0gJ9eR16nXoteUJyB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gIHNob3J0OiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvbmcgPSB7XG4gIGRhdGU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlRm9ybWF0cyxcbiAgICBkZWZhdWx0V2lkdGg6IFwiZnVsbFwiLFxuICB9KSxcblxuICB0aW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogdGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgZGF0ZVRpbWU6IGJ1aWxkRm9ybWF0TG9uZ0ZuKHtcbiAgICBmb3JtYXRzOiBkYXRlVGltZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG59O1xuIiwiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcImVlZWUgJ9ep16LXkdeoINeR16nXoteUJyBwXCIsXG4gIHllc3RlcmRheTogXCIn15DXqtee15XXnCDXkdep16LXlCcgcFwiLFxuICB0b2RheTogXCIn15TXmdeV150g15HXqdei15QnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ9ee15fXqCDXkdep16LXlCcgcFwiLFxuICBuZXh0V2VlazogXCJlZWVlICfXkdep16LXlCcgcFwiLFxuICBvdGhlcjogXCJQXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIF9kYXRlLCBfYmFzZURhdGUsIF9vcHRpb25zKSA9PlxuICBmb3JtYXRSZWxhdGl2ZUxvY2FsZVt0b2tlbl07XG4iLCJpbXBvcnQgeyBidWlsZExvY2FsaXplRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZExvY2FsaXplRm4uanNcIjtcblxuY29uc3QgZXJhVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcItec16TXoNeU17TXoVwiLCBcItec16HXpNeZ16jXlFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcItec16TXoNeU17TXoVwiLCBcItec16HXpNeZ16jXlFwiXSxcbiAgd2lkZTogW1wi15zXpNeg15kg15TXodek15nXqNeUXCIsIFwi15zXodek15nXqNeUXCJdLFxufTtcblxuY29uc3QgcXVhcnRlclZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCJdLFxuICBhYmJyZXZpYXRlZDogW1wiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG4gIHdpZGU6IFtcIteo15HXoteV158gMVwiLCBcIteo15HXoteV158gMlwiLCBcIteo15HXoteV158gM1wiLCBcIteo15HXoteV158gNFwiXSxcbn07XG5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXSxcblxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwi15nXoNeV17NcIixcbiAgICBcItek15HXqNezXCIsXG4gICAgXCLXnteo16VcIixcbiAgICBcIteQ16TXqNezXCIsXG4gICAgXCLXnteQ15lcIixcbiAgICBcIteZ15XXoNeZXCIsXG4gICAgXCLXmdeV15zXmVwiLFxuICAgIFwi15DXldeS17NcIixcbiAgICBcIteh16TXmNezXCIsXG4gICAgXCLXkNeV16fXs1wiLFxuICAgIFwi16DXldeR17NcIixcbiAgICBcIteT16bXntezXCIsXG4gIF0sXG5cbiAgd2lkZTogW1xuICAgIFwi15nXoNeV15DXqFwiLFxuICAgIFwi16TXkdeo15XXkNeoXCIsXG4gICAgXCLXnteo16VcIixcbiAgICBcIteQ16TXqNeZ15xcIixcbiAgICBcItee15DXmVwiLFxuICAgIFwi15nXldeg15lcIixcbiAgICBcIteZ15XXnNeZXCIsXG4gICAgXCLXkNeV15LXldeh15hcIixcbiAgICBcIteh16TXmNee15HXqFwiLFxuICAgIFwi15DXlden15jXldeR16hcIixcbiAgICBcIteg15XXkdee15HXqFwiLFxuICAgIFwi15PXptee15HXqFwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5VmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIteQ17NcIiwgXCLXkdezXCIsIFwi15LXs1wiLCBcIteT17NcIiwgXCLXlNezXCIsIFwi15XXs1wiLCBcItep17NcIl0sXG4gIHNob3J0OiBbXCLXkNezXCIsIFwi15HXs1wiLCBcIteS17NcIiwgXCLXk9ezXCIsIFwi15TXs1wiLCBcIteV17NcIiwgXCLXqdezXCJdLFxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwi15nXldedINeQ17NcIixcbiAgICBcIteZ15XXnSDXkdezXCIsXG4gICAgXCLXmdeV150g15LXs1wiLFxuICAgIFwi15nXldedINeT17NcIixcbiAgICBcIteZ15XXnSDXlNezXCIsXG4gICAgXCLXmdeV150g15XXs1wiLFxuICAgIFwi16nXkdeqXCIsXG4gIF0sXG5cbiAgd2lkZTogW1xuICAgIFwi15nXldedINeo15DXqdeV159cIixcbiAgICBcIteZ15XXnSDXqdeg15lcIixcbiAgICBcIteZ15XXnSDXqdec15nXqdeZXCIsXG4gICAgXCLXmdeV150g16jXkdeZ16LXmVwiLFxuICAgIFwi15nXldedINeX157Xmdep15lcIixcbiAgICBcIteZ15XXnSDXqdeZ16nXmVwiLFxuICAgIFwi15nXldedINep15HXqlwiLFxuICBdLFxufTtcblxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCLXnNek16DXlNe016ZcIixcbiAgICBwbTogXCLXkNeX15TXtNemXCIsXG4gICAgbWlkbmlnaHQ6IFwi15fXpteV16pcIixcbiAgICBub29uOiBcItem15TXqNeZ15nXnVwiLFxuICAgIG1vcm5pbmc6IFwi15HXlden16hcIixcbiAgICBhZnRlcm5vb246IFwi15DXl9eoINeU16bXlNeo15nXmdedXCIsXG4gICAgZXZlbmluZzogXCLXoteo15FcIixcbiAgICBuaWdodDogXCLXnNeZ15zXlFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcItec16TXoNeU17TXplwiLFxuICAgIHBtOiBcIteQ15fXlNe016ZcIixcbiAgICBtaWRuaWdodDogXCLXl9em15XXqlwiLFxuICAgIG5vb246IFwi16bXlNeo15nXmdedXCIsXG4gICAgbW9ybmluZzogXCLXkdeV16fXqFwiLFxuICAgIGFmdGVybm9vbjogXCLXkNeX16gg15TXpteU16jXmdeZ151cIixcbiAgICBldmVuaW5nOiBcItei16jXkVwiLFxuICAgIG5pZ2h0OiBcItec15nXnNeUXCIsXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogXCLXnNek16DXlNe016ZcIixcbiAgICBwbTogXCLXkNeX15TXtNemXCIsXG4gICAgbWlkbmlnaHQ6IFwi15fXpteV16pcIixcbiAgICBub29uOiBcItem15TXqNeZ15nXnVwiLFxuICAgIG1vcm5pbmc6IFwi15HXlden16hcIixcbiAgICBhZnRlcm5vb246IFwi15DXl9eoINeU16bXlNeo15nXmdedXCIsXG4gICAgZXZlbmluZzogXCLXoteo15FcIixcbiAgICBuaWdodDogXCLXnNeZ15zXlFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwi15zXpNeg15TXtNemXCIsXG4gICAgcG06IFwi15DXl9eU17TXplwiLFxuICAgIG1pZG5pZ2h0OiBcIteX16bXldeqXCIsXG4gICAgbm9vbjogXCLXpteU16jXmdeZ151cIixcbiAgICBtb3JuaW5nOiBcIteR15HXlden16hcIixcbiAgICBhZnRlcm5vb246IFwi15HXpteU16jXmdeZ151cIixcbiAgICBldmVuaW5nOiBcIteR16LXqNeRXCIsXG4gICAgbmlnaHQ6IFwi15HXnNeZ15zXlFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcItec16TXoNeU17TXplwiLFxuICAgIHBtOiBcIteQ15fXlNe016ZcIixcbiAgICBtaWRuaWdodDogXCLXl9em15XXqlwiLFxuICAgIG5vb246IFwi16bXlNeo15nXmdedXCIsXG4gICAgbW9ybmluZzogXCLXkdeR15XXp9eoXCIsXG4gICAgYWZ0ZXJub29uOiBcIteQ15fXqCDXlNem15TXqNeZ15nXnVwiLFxuICAgIGV2ZW5pbmc6IFwi15HXoteo15FcIixcbiAgICBuaWdodDogXCLXkdec15nXnNeUXCIsXG4gIH0sXG4gIHdpZGU6IHtcbiAgICBhbTogXCLXnNek16DXlNe016ZcIixcbiAgICBwbTogXCLXkNeX15TXtNemXCIsXG4gICAgbWlkbmlnaHQ6IFwi15fXpteV16pcIixcbiAgICBub29uOiBcItem15TXqNeZ15nXnVwiLFxuICAgIG1vcm5pbmc6IFwi15HXkdeV16fXqFwiLFxuICAgIGFmdGVybm9vbjogXCLXkNeX16gg15TXpteU16jXmdeZ151cIixcbiAgICBldmVuaW5nOiBcIteR16LXqNeRXCIsXG4gICAgbmlnaHQ6IFwi15HXnNeZ15zXlFwiLFxuICB9LFxufTtcblxuY29uc3Qgb3JkaW5hbE51bWJlciA9IChkaXJ0eU51bWJlciwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBudW1iZXIgPSBOdW1iZXIoZGlydHlOdW1iZXIpO1xuXG4gIC8vIFdlIG9ubHkgc2hvdyB3b3JkcyB0aWxsIDEwXG4gIGlmIChudW1iZXIgPD0gMCB8fCBudW1iZXIgPiAxMCkgcmV0dXJuIFN0cmluZyhudW1iZXIpO1xuXG4gIGNvbnN0IHVuaXQgPSBTdHJpbmcob3B0aW9ucz8udW5pdCk7XG5cbiAgY29uc3QgaXNGZW1hbGUgPSBbXCJ5ZWFyXCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiXS5pbmRleE9mKHVuaXQpID49IDA7XG5cbiAgY29uc3QgbWFsZSA9IFtcbiAgICBcIteo15DXqdeV159cIixcbiAgICBcItep16DXmVwiLFxuICAgIFwi16nXnNeZ16nXmVwiLFxuICAgIFwi16jXkdeZ16LXmVwiLFxuICAgIFwi15fXnteZ16nXmVwiLFxuICAgIFwi16nXmdep15lcIixcbiAgICBcItep15HXmdei15lcIixcbiAgICBcItep157Xmdeg15lcIixcbiAgICBcIteq16nXmdei15lcIixcbiAgICBcItei16nXmdeo15lcIixcbiAgXTtcblxuICBjb25zdCBmZW1hbGUgPSBbXG4gICAgXCLXqNeQ16nXldeg15RcIixcbiAgICBcItep16DXmdeZ15RcIixcbiAgICBcItep15zXmdep15nXqlwiLFxuICAgIFwi16jXkdeZ16LXmdeqXCIsXG4gICAgXCLXl9ee15nXqdeZ16pcIixcbiAgICBcItep15nXqdeZ16pcIixcbiAgICBcItep15HXmdei15nXqlwiLFxuICAgIFwi16nXnteZ16DXmdeqXCIsXG4gICAgXCLXqtep15nXoteZ16pcIixcbiAgICBcItei16nXmdeo15nXqlwiLFxuICBdO1xuXG4gIGNvbnN0IGluZGV4ID0gbnVtYmVyIC0gMTtcbiAgcmV0dXJuIGlzRmVtYWxlID8gZmVtYWxlW2luZGV4XSA6IG1hbGVbaW5kZXhdO1xufTtcblxuZXhwb3J0IGNvbnN0IGxvY2FsaXplID0ge1xuICBvcmRpbmFsTnVtYmVyLFxuXG4gIGVyYTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGVyYVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogcXVhcnRlclZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGFyZ3VtZW50Q2FsbGJhY2s6IChxdWFydGVyKSA9PiBxdWFydGVyIC0gMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBtb250aFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXk6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5UGVyaW9kOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgZm9ybWF0dGluZ1ZhbHVlczogZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0Rm9ybWF0dGluZ1dpZHRoOiBcIndpZGVcIixcbiAgfSksXG59O1xuIiwiaW1wb3J0IHsgYnVpbGRNYXRjaEZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaEZuLmpzXCI7XG5pbXBvcnQgeyBidWlsZE1hdGNoUGF0dGVybkZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRNYXRjaFBhdHRlcm5Gbi5qc1wiO1xuXG5jb25zdCBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuID1cbiAgL14oXFxkK3wo16jXkNep15XXn3zXqdeg15l816nXnNeZ16nXmXzXqNeR15nXoteZfNeX157Xmdep15l816nXmdep15l816nXkdeZ16LXmXzXqdee15nXoNeZfNeq16nXmdei15l816LXqdeZ16jXmXzXqNeQ16nXldeg15R816nXoNeZ15nXlHzXqdec15nXqdeZ16p816jXkdeZ16LXmdeqfNeX157Xmdep15nXqnzXqdeZ16nXmdeqfNep15HXmdei15nXqnzXqdee15nXoNeZ16p816rXqdeZ16LXmdeqfNei16nXmdeo15nXqikpL2k7XG5jb25zdCBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL14oXFxkK3zXqNeQfNep16B816nXnHzXqNeRfNeXfNep15l816nXkXzXqdeefNeqfNeiKS9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9e15wo16HXpNeZ16jXlHzXpNeg15TXtNehKS9pLFxuICBhYmJyZXZpYXRlZDogL17XnCjXodek15nXqNeUfNek16DXlNe016EpL2ksXG4gIHdpZGU6IC9e15wo16TXoNeZINeUKT/Xodek15nXqNeUL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL17XnNekL2ksIC9e15zXoS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoUXVhcnRlclBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eWzEyMzRdL2ksXG4gIGFiYnJldmlhdGVkOiAvXnFbMTIzNF0vaSxcbiAgd2lkZTogL17XqNeR16LXldefIFsxMjM0XS9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlxcZCsvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKNeZ16DXlXzXpNeR16h8157XqNelfNeQ16TXqHzXnteQ15l815nXldeg15l815nXldec15l815DXldeSfNeh16TXmHzXkNeV16d816DXldeRfNeT16bXninXsz8vaSxcbiAgd2lkZTogL14o15nXoNeV15DXqHzXpNeR16jXldeQ16h8157XqNelfNeQ16TXqNeZ15x8157XkNeZfNeZ15XXoNeZfNeZ15XXnNeZfNeQ15XXkteV16HXmHzXodek15jXnteR16h815DXlden15jXldeR16h816DXldeR157XkdeofNeT16bXnteR16gpL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXjEkL2ksXG4gICAgL14yL2ksXG4gICAgL14zL2ksXG4gICAgL140L2ksXG4gICAgL141L2ksXG4gICAgL142L2ksXG4gICAgL143L2ksXG4gICAgL144L2ksXG4gICAgL145L2ksXG4gICAgL14xMC9pLFxuICAgIC9eMTEvaSxcbiAgICAvXjEyL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL17XmdegL2ksXG4gICAgL17XpC9pLFxuICAgIC9e157XqC9pLFxuICAgIC9e15DXpC9pLFxuICAgIC9e157XkC9pLFxuICAgIC9e15nXldegL2ksXG4gICAgL17XmdeV15wvaSxcbiAgICAvXteQ15XXki9pLFxuICAgIC9e16EvaSxcbiAgICAvXteQ15XXpy9pLFxuICAgIC9e16AvaSxcbiAgICAvXteTL2ksXG4gIF0sXG59O1xuXG5jb25zdCBtYXRjaERheVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eW9eQ15HXkteT15TXldepXdezL2ksXG4gIHNob3J0OiAvXlvXkNeR15LXk9eU15XXqV3Xsy9pLFxuICBhYmJyZXZpYXRlZDogL14o16nXkdeqfNeZ15XXnSAo15B815F815J815N815R815Up17MpL2ksXG4gIHdpZGU6IC9e15nXldedICjXqNeQ16nXldeffNep16DXmXzXqdec15nXqdeZfNeo15HXmdei15l815fXnteZ16nXmXzXqdeZ16nXmXzXqdeR16opL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgYWJicmV2aWF0ZWQ6IFsv15DXsyQvaSwgL9eR17MkL2ksIC/XktezJC9pLCAv15PXsyQvaSwgL9eU17MkL2ksIC/XldezJC9pLCAvXtepL2ldLFxuICB3aWRlOiBbL9efJC9pLCAv16DXmSQvaSwgL9ec15nXqdeZJC9pLCAv16LXmSQvaSwgL9ee15nXqdeZJC9pLCAv16nXmdep15kkL2ksIC/XqiQvaV0sXG4gIGFueTogWy9e15AvaSwgL17XkS9pLCAvXteSL2ksIC9e15MvaSwgL17XlC9pLCAvXteVL2ksIC9e16kvaV0sXG59O1xuXG5jb25zdCBtYXRjaERheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IC9eKNeQ15fXqCDXlHzXkSk/KNeX16bXldeqfNem15TXqNeZ15nXnXzXkdeV16fXqHzXoteo15F815zXmdec15R815DXl9eU17TXpnzXnNek16DXlNe016YpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9e15zXpC9pLFxuICAgIHBtOiAvXteQ15fXlC9pLFxuICAgIG1pZG5pZ2h0OiAvXteXL2ksXG4gICAgbm9vbjogL17Xpi9pLFxuICAgIG1vcm5pbmc6IC/XkdeV16fXqC9pLFxuICAgIGFmdGVybm9vbjogL9eR16Z815DXl9eoL2ksXG4gICAgZXZlbmluZzogL9ei16jXkS9pLFxuICAgIG5pZ2h0OiAv15zXmdec15QvaSxcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOYW1lID0gW1wi16jXkFwiLCBcItep16BcIiwgXCLXqdecXCIsIFwi16jXkVwiLCBcIteXXCIsIFwi16nXmVwiLCBcItep15FcIiwgXCLXqdeeXCIsIFwi16pcIiwgXCLXolwiXTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgbnVtYmVyID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgIHJldHVybiBpc05hTihudW1iZXIpID8gb3JkaW5hbE5hbWUuaW5kZXhPZih2YWx1ZSkgKyAxIDogbnVtYmVyO1xuICAgIH0sXG4gIH0pLFxuXG4gIGVyYTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgICB2YWx1ZUNhbGxiYWNrOiAoaW5kZXgpID0+IGluZGV4ICsgMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJhbnlcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL2hlL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi9oZS9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vaGUvX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi9oZS9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL2hlL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgSGVicmV3IGxvY2FsZS5cbiAqIEBsYW5ndWFnZSBIZWJyZXdcbiAqIEBpc28tNjM5LTIgaGViXG4gKiBAYXV0aG9yIE5pciBMYWhhZCBbQG5pcmxhaF0oaHR0cHM6Ly9naXRodWIuY29tL25pcmxhaClcbiAqL1xuZXhwb3J0IGNvbnN0IGhlID0ge1xuICBjb2RlOiBcImhlXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBoZTtcbiIsImNvbnN0IGZvcm1hdERpc3RhbmNlTG9jYWxlID0ge1xuICBsZXNzVGhhblhTZWNvbmRzOiB7XG4gICAgb25lOiBcIuS4jeWIsCAxIOenklwiLFxuICAgIG90aGVyOiBcIuS4jeWIsCB7e2NvdW50fX0g56eSXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSDnp5JcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g56eSXCIsXG4gIH0sXG5cbiAgaGFsZkFNaW51dGU6IFwi5Y2K5YiG6ZKfXCIsXG5cbiAgbGVzc1RoYW5YTWludXRlczoge1xuICAgIG9uZTogXCLkuI3liLAgMSDliIbpkp9cIixcbiAgICBvdGhlcjogXCLkuI3liLAge3tjb3VudH19IOWIhumSn1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEg5YiG6ZKfXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IOWIhumSn1wiLFxuICB9LFxuXG4gIHhIb3Vyczoge1xuICAgIG9uZTogXCIxIOWwj+aXtlwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSDlsI/ml7ZcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCLlpKfnuqYgMSDlsI/ml7ZcIixcbiAgICBvdGhlcjogXCLlpKfnuqYge3tjb3VudH19IOWwj+aXtlwiLFxuICB9LFxuXG4gIHhEYXlzOiB7XG4gICAgb25lOiBcIjEg5aSpXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IOWkqVwiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcIuWkp+e6piAxIOS4quaYn+acn1wiLFxuICAgIG90aGVyOiBcIuWkp+e6piB7e2NvdW50fX0g5Liq5pif5pyfXCIsXG4gIH0sXG5cbiAgeFdlZWtzOiB7XG4gICAgb25lOiBcIjEg5Liq5pif5pyfXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IOS4quaYn+acn1wiLFxuICB9LFxuXG4gIGFib3V0WE1vbnRoczoge1xuICAgIG9uZTogXCLlpKfnuqYgMSDkuKrmnIhcIixcbiAgICBvdGhlcjogXCLlpKfnuqYge3tjb3VudH19IOS4quaciFwiLFxuICB9LFxuXG4gIHhNb250aHM6IHtcbiAgICBvbmU6IFwiMSDkuKrmnIhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g5Liq5pyIXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwi5aSn57qmIDEg5bm0XCIsXG4gICAgb3RoZXI6IFwi5aSn57qmIHt7Y291bnR9fSDlubRcIixcbiAgfSxcblxuICB4WWVhcnM6IHtcbiAgICBvbmU6IFwiMSDlubRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0g5bm0XCIsXG4gIH0sXG5cbiAgb3ZlclhZZWFyczoge1xuICAgIG9uZTogXCLotoXov4cgMSDlubRcIixcbiAgICBvdGhlcjogXCLotoXov4cge3tjb3VudH19IOW5tFwiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCLlsIbov5EgMSDlubRcIixcbiAgICBvdGhlcjogXCLlsIbov5Ege3tjb3VudH19IOW5tFwiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgU3RyaW5nKGNvdW50KSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgXCLlhoVcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwi5YmNXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcInkn5bm0J00n5pyIJ2Qn5pelJyBFRUVFXCIsXG4gIGxvbmc6IFwieSflubQnTSfmnIgnZCfml6UnXCIsXG4gIG1lZGl1bTogXCJ5eXl5LU1NLWRkXCIsXG4gIHNob3J0OiBcInl5LU1NLWRkXCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJ6enp6IGEgaDptbTpzc1wiLFxuICBsb25nOiBcInogYSBoOm1tOnNzXCIsXG4gIG1lZGl1bTogXCJhIGg6bW06c3NcIixcbiAgc2hvcnQ6IFwiYSBoOm1tXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0ge3t0aW1lfX1cIixcbiAgbG9uZzogXCJ7e2RhdGV9fSB7e3RpbWV9fVwiLFxuICBtZWRpdW06IFwie3tkYXRlfX0ge3t0aW1lfX1cIixcbiAgc2hvcnQ6IFwie3tkYXRlfX0ge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsImltcG9ydCB7IGlzU2FtZVdlZWsgfSBmcm9tIFwiLi4vLi4vLi4vaXNTYW1lV2Vlay5qc1wiO1xuXG5mdW5jdGlvbiBjaGVja1dlZWsoZGF0ZSwgYmFzZURhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgYmFzZUZvcm1hdCA9IFwiZWVlZSBwXCI7XG5cbiAgaWYgKGlzU2FtZVdlZWsoZGF0ZSwgYmFzZURhdGUsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGJhc2VGb3JtYXQ7IC8vIGluIHNhbWUgd2Vla1xuICB9IGVsc2UgaWYgKGRhdGUuZ2V0VGltZSgpID4gYmFzZURhdGUuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIFwiJ+S4i+S4qidcIiArIGJhc2VGb3JtYXQ7IC8vIGluIG5leHQgd2Vla1xuICB9XG4gIHJldHVybiBcIifkuIrkuKonXCIgKyBiYXNlRm9ybWF0OyAvLyBpbiBsYXN0IHdlZWtcbn1cblxuY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBjaGVja1dlZWssIC8vIGRheXMgYmVmb3JlIHllc3RlcmRheSwgbWF5YmUgaW4gdGhpcyB3ZWVrIG9yIGxhc3Qgd2Vla1xuICB5ZXN0ZXJkYXk6IFwiJ+aYqOWkqScgcFwiLFxuICB0b2RheTogXCIn5LuK5aSpJyBwXCIsXG4gIHRvbW9ycm93OiBcIifmmI7lpKknIHBcIixcbiAgbmV4dFdlZWs6IGNoZWNrV2VlaywgLy8gZGF5cyBhZnRlciB0b21vcnJvdywgbWF5YmUgaW4gdGhpcyB3ZWVrIG9yIG5leHQgd2Vla1xuICBvdGhlcjogXCJQUCBwXCIsXG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0UmVsYXRpdmUgPSAodG9rZW4sIGRhdGUsIGJhc2VEYXRlLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGZvcm1hdCA9IGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcblxuICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGZvcm1hdChkYXRlLCBiYXNlRGF0ZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0O1xufTtcbiIsImltcG9ydCB7IGJ1aWxkTG9jYWxpemVGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTG9jYWxpemVGbi5qc1wiO1xuXG5jb25zdCBlcmFWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wi5YmNXCIsIFwi5YWs5YWDXCJdLFxuICBhYmJyZXZpYXRlZDogW1wi5YmNXCIsIFwi5YWs5YWDXCJdLFxuICB3aWRlOiBbXCLlhazlhYPliY1cIiwgXCLlhazlhYNcIl0sXG59O1xuXG5jb25zdCBxdWFydGVyVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCLnrKzkuIDlraNcIiwgXCLnrKzkuozlraNcIiwgXCLnrKzkuInlraNcIiwgXCLnrKzlm5vlraNcIl0sXG4gIHdpZGU6IFtcIuesrOS4gOWto+W6plwiLCBcIuesrOS6jOWto+W6plwiLCBcIuesrOS4ieWto+W6plwiLCBcIuesrOWbm+Wto+W6plwiXSxcbn07XG5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcbiAgICBcIuS4gFwiLFxuICAgIFwi5LqMXCIsXG4gICAgXCLkuIlcIixcbiAgICBcIuWbm1wiLFxuICAgIFwi5LqUXCIsXG4gICAgXCLlha1cIixcbiAgICBcIuS4g1wiLFxuICAgIFwi5YWrXCIsXG4gICAgXCLkuZ1cIixcbiAgICBcIuWNgVwiLFxuICAgIFwi5Y2B5LiAXCIsXG4gICAgXCLljYHkuoxcIixcbiAgXSxcblxuICBhYmJyZXZpYXRlZDogW1xuICAgIFwiMeaciFwiLFxuICAgIFwiMuaciFwiLFxuICAgIFwiM+aciFwiLFxuICAgIFwiNOaciFwiLFxuICAgIFwiNeaciFwiLFxuICAgIFwiNuaciFwiLFxuICAgIFwiN+aciFwiLFxuICAgIFwiOOaciFwiLFxuICAgIFwiOeaciFwiLFxuICAgIFwiMTDmnIhcIixcbiAgICBcIjEx5pyIXCIsXG4gICAgXCIxMuaciFwiLFxuICBdLFxuXG4gIHdpZGU6IFtcbiAgICBcIuS4gOaciFwiLFxuICAgIFwi5LqM5pyIXCIsXG4gICAgXCLkuInmnIhcIixcbiAgICBcIuWbm+aciFwiLFxuICAgIFwi5LqU5pyIXCIsXG4gICAgXCLlha3mnIhcIixcbiAgICBcIuS4g+aciFwiLFxuICAgIFwi5YWr5pyIXCIsXG4gICAgXCLkuZ3mnIhcIixcbiAgICBcIuWNgeaciFwiLFxuICAgIFwi5Y2B5LiA5pyIXCIsXG4gICAgXCLljYHkuozmnIhcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCLml6VcIiwgXCLkuIBcIiwgXCLkuoxcIiwgXCLkuIlcIiwgXCLlm5tcIiwgXCLkupRcIiwgXCLlha1cIl0sXG4gIHNob3J0OiBbXCLml6VcIiwgXCLkuIBcIiwgXCLkuoxcIiwgXCLkuIlcIiwgXCLlm5tcIiwgXCLkupRcIiwgXCLlha1cIl0sXG4gIGFiYnJldmlhdGVkOiBbXCLlkajml6VcIiwgXCLlkajkuIBcIiwgXCLlkajkuoxcIiwgXCLlkajkuIlcIiwgXCLlkajlm5tcIiwgXCLlkajkupRcIiwgXCLlkajlha1cIl0sXG5cbiAgd2lkZTogW1wi5pif5pyf5pelXCIsIFwi5pif5pyf5LiAXCIsIFwi5pif5pyf5LqMXCIsIFwi5pif5pyf5LiJXCIsIFwi5pif5pyf5ZubXCIsIFwi5pif5pyf5LqUXCIsIFwi5pif5pyf5YWtXCJdLFxufTtcblxuY29uc3QgZGF5UGVyaW9kVmFsdWVzID0ge1xuICBuYXJyb3c6IHtcbiAgICBhbTogXCLkuIpcIixcbiAgICBwbTogXCLkuItcIixcbiAgICBtaWRuaWdodDogXCLlh4zmmahcIixcbiAgICBub29uOiBcIuWNiFwiLFxuICAgIG1vcm5pbmc6IFwi5pepXCIsXG4gICAgYWZ0ZXJub29uOiBcIuS4i+WNiFwiLFxuICAgIGV2ZW5pbmc6IFwi5pmaXCIsXG4gICAgbmlnaHQ6IFwi5aScXCIsXG4gIH0sXG4gIGFiYnJldmlhdGVkOiB7XG4gICAgYW06IFwi5LiK5Y2IXCIsXG4gICAgcG06IFwi5LiL5Y2IXCIsXG4gICAgbWlkbmlnaHQ6IFwi5YeM5pmoXCIsXG4gICAgbm9vbjogXCLkuK3ljYhcIixcbiAgICBtb3JuaW5nOiBcIuaXqeaZqFwiLFxuICAgIGFmdGVybm9vbjogXCLkuK3ljYhcIixcbiAgICBldmVuaW5nOiBcIuaZmuS4ilwiLFxuICAgIG5pZ2h0OiBcIuWknOmXtFwiLFxuICB9LFxuICB3aWRlOiB7XG4gICAgYW06IFwi5LiK5Y2IXCIsXG4gICAgcG06IFwi5LiL5Y2IXCIsXG4gICAgbWlkbmlnaHQ6IFwi5YeM5pmoXCIsXG4gICAgbm9vbjogXCLkuK3ljYhcIixcbiAgICBtb3JuaW5nOiBcIuaXqeaZqFwiLFxuICAgIGFmdGVybm9vbjogXCLkuK3ljYhcIixcbiAgICBldmVuaW5nOiBcIuaZmuS4ilwiLFxuICAgIG5pZ2h0OiBcIuWknOmXtFwiLFxuICB9LFxufTtcblxuY29uc3QgZm9ybWF0dGluZ0RheVBlcmlvZFZhbHVlcyA9IHtcbiAgbmFycm93OiB7XG4gICAgYW06IFwi5LiKXCIsXG4gICAgcG06IFwi5LiLXCIsXG4gICAgbWlkbmlnaHQ6IFwi5YeM5pmoXCIsXG4gICAgbm9vbjogXCLljYhcIixcbiAgICBtb3JuaW5nOiBcIuaXqVwiLFxuICAgIGFmdGVybm9vbjogXCLkuIvljYhcIixcbiAgICBldmVuaW5nOiBcIuaZmlwiLFxuICAgIG5pZ2h0OiBcIuWknFwiLFxuICB9LFxuICBhYmJyZXZpYXRlZDoge1xuICAgIGFtOiBcIuS4iuWNiFwiLFxuICAgIHBtOiBcIuS4i+WNiFwiLFxuICAgIG1pZG5pZ2h0OiBcIuWHjOaZqFwiLFxuICAgIG5vb246IFwi5Lit5Y2IXCIsXG4gICAgbW9ybmluZzogXCLml6nmmahcIixcbiAgICBhZnRlcm5vb246IFwi5Lit5Y2IXCIsXG4gICAgZXZlbmluZzogXCLmmZrkuIpcIixcbiAgICBuaWdodDogXCLlpJzpl7RcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcIuS4iuWNiFwiLFxuICAgIHBtOiBcIuS4i+WNiFwiLFxuICAgIG1pZG5pZ2h0OiBcIuWHjOaZqFwiLFxuICAgIG5vb246IFwi5Lit5Y2IXCIsXG4gICAgbW9ybmluZzogXCLml6nmmahcIixcbiAgICBhZnRlcm5vb246IFwi5Lit5Y2IXCIsXG4gICAgZXZlbmluZzogXCLmmZrkuIpcIixcbiAgICBuaWdodDogXCLlpJzpl7RcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcblxuICBzd2l0Y2ggKG9wdGlvbnM/LnVuaXQpIHtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpICsgXCLml6VcIjtcbiAgICBjYXNlIFwiaG91clwiOlxuICAgICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpICsgXCLml7ZcIjtcbiAgICBjYXNlIFwibWludXRlXCI6XG4gICAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkgKyBcIuWIhlwiO1xuICAgIGNhc2UgXCJzZWNvbmRcIjpcbiAgICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKSArIFwi56eSXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcIuesrCBcIiArIG51bWJlci50b1N0cmluZygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbG9jYWxpemUgPSB7XG4gIG9yZGluYWxOdW1iZXIsXG5cbiAgZXJhOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZXJhVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBxdWFydGVyVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gICAgYXJndW1lbnRDYWxsYmFjazogKHF1YXJ0ZXIpID0+IHF1YXJ0ZXIgLSAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IG1vbnRoVmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBkYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBmb3JtYXR0aW5nVmFsdWVzOiBmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzLFxuICAgIGRlZmF1bHRGb3JtYXR0aW5nV2lkdGg6IFwid2lkZVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBidWlsZE1hdGNoRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoRm4uanNcIjtcbmltcG9ydCB7IGJ1aWxkTWF0Y2hQYXR0ZXJuRm4gfSBmcm9tIFwiLi4vLi4vX2xpYi9idWlsZE1hdGNoUGF0dGVybkZuLmpzXCI7XG5cbmNvbnN0IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXijnrKxcXHMqKT9cXGQrKOaXpXzml7Z85YiGfOenkik/L2k7XG5jb25zdCBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gL1xcZCsvaTtcblxuY29uc3QgbWF0Y2hFcmFQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXijliY0pL2ksXG4gIGFiYnJldmlhdGVkOiAvXijliY0pL2ksXG4gIHdpZGU6IC9eKOWFrOWFg+WJjXzlhazlhYMpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL14o5YmNKS9pLCAvXijlhazlhYMpL2ldLFxufTtcblxuY29uc3QgbWF0Y2hRdWFydGVyUGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bMTIzNF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9e56ysW+S4gOS6jOS4ieWbm13liLsvaSxcbiAgd2lkZTogL17nrKxb5LiA5LqM5LiJ5ZubXeWIu+mSny9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvKDF85LiAKS9pLCAvKDJ85LqMKS9pLCAvKDN85LiJKS9pLCAvKDR85ZubKS9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXijkuIB85LqMfOS4iXzlm5t85LqUfOWFrXzkuIN85YWrfOS5nXzljYFb5LqM5LiAXSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdfOWNgVvkuozkuIBdfFxcZHwxWzEyXSnmnIgvaSxcbiAgd2lkZTogL14o5LiAfOS6jHzkuIl85ZubfOS6lHzlha185LiDfOWFq3zkuZ185Y2BW+S6jOS4gF0p5pyIL2ksXG59O1xuY29uc3QgcGFyc2VNb250aFBhdHRlcm5zID0ge1xuICBuYXJyb3c6IFtcbiAgICAvXuS4gC9pLFxuICAgIC9e5LqML2ksXG4gICAgL17kuIkvaSxcbiAgICAvXuWbmy9pLFxuICAgIC9e5LqUL2ksXG4gICAgL17lha0vaSxcbiAgICAvXuS4gy9pLFxuICAgIC9e5YWrL2ksXG4gICAgL17kuZ0vaSxcbiAgICAvXuWNgSg/ISjkuIB85LqMKSkvaSxcbiAgICAvXuWNgeS4gC9pLFxuICAgIC9e5Y2B5LqML2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL17kuIB8MS9pLFxuICAgIC9e5LqMfDIvaSxcbiAgICAvXuS4iXwzL2ksXG4gICAgL17lm5t8NC9pLFxuICAgIC9e5LqUfDUvaSxcbiAgICAvXuWFrXw2L2ksXG4gICAgL17kuIN8Ny9pLFxuICAgIC9e5YWrfDgvaSxcbiAgICAvXuS5nXw5L2ksXG4gICAgL17ljYEoPyEo5LiAfOS6jCkpfDEwL2ksXG4gICAgL17ljYHkuIB8MTEvaSxcbiAgICAvXuWNgeS6jHwxMi9pLFxuICBdLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlvkuIDkuozkuInlm5vkupTlha3ml6VdL2ksXG4gIHNob3J0OiAvXlvkuIDkuozkuInlm5vkupTlha3ml6VdL2ksXG4gIGFiYnJldmlhdGVkOiAvXuWRqFvkuIDkuozkuInlm5vkupTlha3ml6VdL2ksXG4gIHdpZGU6IC9e5pif5pyfW+S4gOS6jOS4ieWbm+S6lOWFreaXpV0vaSxcbn07XG5jb25zdCBwYXJzZURheVBhdHRlcm5zID0ge1xuICBhbnk6IFsv5pelL2ksIC/kuIAvaSwgL+S6jC9pLCAv5LiJL2ksIC/lm5svaSwgL+S6lC9pLCAv5YWtL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiAvXijkuIrljYg/fOS4i+WNiD985Y2I5aScfFvkuK3mraNd5Y2IfOaXqeS4ij985LiL5Y2IfOaZmuS4ij985YeM5pmofCkvaSxcbn07XG5jb25zdCBwYXJzZURheVBlcmlvZFBhdHRlcm5zID0ge1xuICBhbnk6IHtcbiAgICBhbTogL17kuIrljYg/L2ksXG4gICAgcG06IC9e5LiL5Y2IPy9pLFxuICAgIG1pZG5pZ2h0OiAvXuWNiOWknC9pLFxuICAgIG5vb246IC9eW+S4reato13ljYgvaSxcbiAgICBtb3JuaW5nOiAvXuaXqeS4ii9pLFxuICAgIGFmdGVybm9vbjogL17kuIvljYgvaSxcbiAgICBldmVuaW5nOiAvXuaZmuS4ij8vaSxcbiAgICBuaWdodDogL17lh4zmmagvaSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBtYXRjaCA9IHtcbiAgb3JkaW5hbE51bWJlcjogYnVpbGRNYXRjaFBhdHRlcm5Gbih7XG4gICAgbWF0Y2hQYXR0ZXJuOiBtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHBhcnNlUGF0dGVybjogcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybixcbiAgICB2YWx1ZUNhbGxiYWNrOiAodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlLCAxMCksXG4gIH0pLFxuXG4gIGVyYTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaEVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZUVyYVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBxdWFydGVyOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZVF1YXJ0ZXJQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgICB2YWx1ZUNhbGxiYWNrOiAoaW5kZXgpID0+IGluZGV4ICsgMSxcbiAgfSksXG5cbiAgbW9udGg6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hNb250aFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZU1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheTogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcIndpZGVcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcblxuICBkYXlQZXJpb2Q6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyxcbiAgICBkZWZhdWx0TWF0Y2hXaWR0aDogXCJhbnlcIixcbiAgICBwYXJzZVBhdHRlcm5zOiBwYXJzZURheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICB9KSxcbn07XG4iLCJpbXBvcnQgeyBmb3JtYXREaXN0YW5jZSB9IGZyb20gXCIuL3poLUNOL19saWIvZm9ybWF0RGlzdGFuY2UuanNcIjtcbmltcG9ydCB7IGZvcm1hdExvbmcgfSBmcm9tIFwiLi96aC1DTi9fbGliL2Zvcm1hdExvbmcuanNcIjtcbmltcG9ydCB7IGZvcm1hdFJlbGF0aXZlIH0gZnJvbSBcIi4vemgtQ04vX2xpYi9mb3JtYXRSZWxhdGl2ZS5qc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi96aC1DTi9fbGliL2xvY2FsaXplLmpzXCI7XG5pbXBvcnQgeyBtYXRjaCB9IGZyb20gXCIuL3poLUNOL19saWIvbWF0Y2guanNcIjtcblxuLyoqXG4gKiBAY2F0ZWdvcnkgTG9jYWxlc1xuICogQHN1bW1hcnkgQ2hpbmVzZSBTaW1wbGlmaWVkIGxvY2FsZS5cbiAqIEBsYW5ndWFnZSBDaGluZXNlIFNpbXBsaWZpZWRcbiAqIEBpc28tNjM5LTIgemhvXG4gKiBAYXV0aG9yIENoYW5neXUgR2VuZyBbQEtpbmdNYXJpb10oaHR0cHM6Ly9naXRodWIuY29tL0tpbmdNYXJpbylcbiAqIEBhdXRob3IgU29uZyBTaHVveXVuIFtAZm5sY3RybF0oaHR0cHM6Ly9naXRodWIuY29tL2ZubGN0cmwpXG4gKiBAYXV0aG9yIHNhYnJpbmFNIFtAc2FicmluYW1pYW9dKGh0dHBzOi8vZ2l0aHViLmNvbS9zYWJyaW5hbWlhbylcbiAqIEBhdXRob3IgQ2FybmV5IFd1IFtAY3ViaWN3b3JrXShodHRwczovL2dpdGh1Yi5jb20vY3ViaWN3b3JrKVxuICogQGF1dGhvciBUZXJyZW5jZSBMYW0gW0Bza3l1cGxhbV0oaHR0cHM6Ly9naXRodWIuY29tL3NreXVwbGFtKVxuICovXG5leHBvcnQgY29uc3QgemhDTiA9IHtcbiAgY29kZTogXCJ6aC1DTlwiLFxuICBmb3JtYXREaXN0YW5jZTogZm9ybWF0RGlzdGFuY2UsXG4gIGZvcm1hdExvbmc6IGZvcm1hdExvbmcsXG4gIGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcbiAgbG9jYWxpemU6IGxvY2FsaXplLFxuICBtYXRjaDogbWF0Y2gsXG4gIG9wdGlvbnM6IHtcbiAgICB3ZWVrU3RhcnRzT246IDEgLyogTW9uZGF5ICovLFxuICAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNCxcbiAgfSxcbn07XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgemhDTjtcbiIsImltcG9ydCB0eXBlIHsgS0dTYXZlRGF0YSB9IGZyb20gXCIuLi90eXBlcy9fc2F2ZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHYW1lUGFnZSB9IGZyb20gXCIuLi90eXBlcy9nYW1lLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTYXZlZ2FtZUxvYWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dhbWU6IEdhbWVQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKGdhbWU6IEdhbWVQYWdlKSB7XG4gICAgdGhpcy5fZ2FtZSA9IGdhbWU7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVudGx5IHdyYXBzIHRoZSBzYXZlZ2FtZSBsb2FkaW5nIHByb2Nlc3MgaW4gYW4gYXN5bmMgY29uc3RydWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc2F2ZWdhbWUgZGF0YSB0byBsb2FkLiBXZSBhY2NlcHQgYG51bGxgIGhlcmUgZm9yIGNvbnZlbmllbmNlXG4gICAqIHdoZW4gZGVhbGluZyB3aXRoIGBpbXBvcnRgZWQgc2F2ZSBnYW1lIGRhdGEuXG4gICAqIEByZXR1cm5zIE5vdGhpbmdcbiAgICovXG4gIGxvYWQoZGF0YTogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZ2FtZS5zYXZlSW1wb3J0RHJvcGJveFRleHQoZGF0YSwgZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFJhdyhkYXRhOiBLR1NhdmVEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tcHJlc3NlZCA9IHRoaXMuX2dhbWUuY29tcHJlc3NMWkRhdGEoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIHJldHVybiB0aGlzLmxvYWQoY29tcHJlc3NlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQnV0dG9uIH0gZnJvbSBcIi4vQnV0dG9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEljb25CdXR0b24gfSBmcm9tIFwiLi9JY29uQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBMaXN0SXRlbSwgdHlwZSBMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9MaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9Ub29sYmFyTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRvb2xiYXJMaXN0SXRlbU9wdGlvbnMgPSBUaGlzVHlwZTxUb29sYmFyTGlzdEl0ZW0+ICYgTGlzdEl0ZW1PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgVG9vbGJhckxpc3RJdGVtIGV4dGVuZHMgTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFRvb2xiYXJMaXN0SXRlbU9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBVaUNvbXBvbmVudCwgb3B0aW9ucz86IFRvb2xiYXJMaXN0SXRlbU9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKHN0eWxlcy50b29sYmFyKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtUb29sYmFyTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRkQ2hpbGQoY2hpbGQ6IEJ1dHRvbiB8IEljb25CdXR0b24pOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGQoY2hpbGQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB7IHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9lcnJvcnMvY29uc29sZS5qc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2Vycm9ycy9JbnZhbGlkQXJndW1lbnRFcnJvci5qc1wiO1xuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2VUb05vdyB9IGZyb20gXCJkYXRlLWZucy9mb3JtYXREaXN0YW5jZVRvTm93XCI7XG5pbXBvcnQgeyBkZSwgZW5VUywgaGUsIHR5cGUgTG9jYWxlLCB6aENOIH0gZnJvbSBcImRhdGUtZm5zL2xvY2FsZVwiO1xuaW1wb3J0IHsgRW5naW5lLCB0eXBlIEVuZ2luZVN0YXRlLCB0eXBlIFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHsgS2l0dGVuU2NpZW50aXN0cyB9IGZyb20gXCIuLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU3RhdGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVW5pcXVlIH0gZnJvbSBcIi4uL3Rvb2xzL0VudHJpZXMuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHsgU2F2ZWdhbWVMb2FkZXIgfSBmcm9tIFwiLi4vdG9vbHMvU2F2ZWdhbWVMb2FkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgS0dTYXZlRGF0YSB9IGZyb20gXCIuLi90eXBlcy9fc2F2ZS5qc1wiO1xuaW1wb3J0IHsgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuLi9Vc2VyU2NyaXB0TG9hZGVyLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5qc1wiO1xuaW1wb3J0IHsgQnV0dG9uTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbkxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGVsaW1pdGVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EZWxpbWl0ZXIuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gXCIuL2NvbXBvbmVudHMvSWNvbkJ1dHRvbi5qc1wiO1xuaW1wb3J0IHsgTGFiZWxMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9MaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL1RleHRCdXR0b24uanNcIjtcbmltcG9ydCB7IFRvb2xiYXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvVG9vbGJhckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTdG9yZWRHYW1lID0ge1xuICBsYWJlbDogc3RyaW5nO1xuICBnYW1lOiBLR1NhdmVEYXRhO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBTdG9yZWRTdGF0ZSA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgc3RhdGU6IEVuZ2luZVN0YXRlO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZU1hbmFnZW1lbnRVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8U3RhdGVTZXR0aW5ncz4ge1xuICByZWFkb25seSBnYW1lcyA9IG5ldyBBcnJheTxVbmlxdWU8U3RvcmVkR2FtZT4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0ZXMgcGVyc2lzdGVkIHRvIGxvY2FsIHN0b3JhZ2UuIFRoZXkgdXNlIFVuaXF1ZTxUPiBzbyB0aGF0IHdoZW4gd2VcbiAgICogcHJvdmlkZSBhIHN0YXRlIHRvIHRoZSBlbmdpbmUgdG8gbG9hZCBvciBnZXQgYSBzdGF0ZSBmcm9tIHRoZSBlbmdpbmUgdG9cbiAgICogc2F2ZSwgd2UgYXJlIG5vdCBhY2NpZGVudGFsbHkgc2hhcmluZyBhIHJlZmVyZW5jZSB0byBhIGxpdmUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVzID0gbmV3IEFycmF5PFVuaXF1ZTxTdG9yZWRTdGF0ZT4+KCk7XG5cbiAgcmVhZG9ubHkgZ2FtZUxpc3Q6IFNldHRpbmdzTGlzdDtcbiAgcmVhZG9ubHkgc3RhdGVMaXN0OiBTZXR0aW5nc0xpc3Q7XG4gIHJlYWRvbmx5IGxvY2FsZTogTG9jYWxlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFN0YXRlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtTdGF0ZU1hbmFnZW1lbnRVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS50aXRsZVwiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IExhYmVsTGlzdEl0ZW0ocGFyZW50LCBsYWJlbCwge1xuICAgICAgICBjbGFzc2VzOiBbc3R5bGVzU2V0dGluZ0xpc3RJdGVtLmNoZWNrZWQsIHN0eWxlc1NldHRpbmdMaXN0SXRlbS5zZXR0aW5nXSxcbiAgICAgICAgaWNvbjogSWNvbnMuU3RhdGUsXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgICBuZXcgQ29udGFpbmVyKHBhcmVudCwge1xuICAgICAgICAgIGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0sXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3JlZnJlc2hHYW1lTGlzdCgpO1xuICAgICAgICAgIHRoaXMuX3JlZnJlc2hTdGF0ZUxpc3QoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuZ2FtZUxpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLnN0YXRlTGlzdCA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2NhbGUgPVxuICAgICAgbG9jYWxlLnNlbGVjdGVkID09PSBcInpoLUNOXCJcbiAgICAgICAgPyB6aENOXG4gICAgICAgIDogbG9jYWxlLnNlbGVjdGVkID09PSBcImhlLUlMXCJcbiAgICAgICAgICA/IGhlXG4gICAgICAgICAgOiBsb2NhbGUuc2VsZWN0ZWQgPT09IFwiZGUtREVcIlxuICAgICAgICAgICAgPyBkZVxuICAgICAgICAgICAgOiBlblVTO1xuXG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQoXG4gICAgICBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgICAgaGFzRGlzYWJsZUFsbDogZmFsc2UsXG4gICAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgICB9KS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nLm5vQ29uZmlybSwgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUubm9Db25maXJtXCIpKSxcbiAgICAgICAgbmV3IExpc3RJdGVtKHRoaXMpLmFkZENoaWxkKG5ldyBEZWxpbWl0ZXIodGhpcykpLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5sb2NhbFwiKSksXG4gICAgICAgIG5ldyBUb29sYmFyTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGRyZW4oW1xuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuaW1wb3J0XCIpLCBJY29ucy5JbXBvcnQsIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pbXBvcnQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuaW1wb3J0VGl0bGVcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQobmV3IERlbGltaXRlcih0aGlzKSksXG5cbiAgICAgICAgbmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmxvY2FsU3RhdGVzXCIpKSxcbiAgICAgICAgbmV3IFRvb2xiYXJMaXN0SXRlbSh0aGlzKS5hZGRDaGlsZHJlbihbXG4gICAgICAgICAgbmV3IEJ1dHRvbih0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5zdG9yZVwiKSwgSWNvbnMuU2F2ZUFzLCB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmVTdGF0ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5zdG9yZVN0YXRlXCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiY29weVwiKSwgSWNvbnMuQ29weSwge1xuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvcHlTdGF0ZSgpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLmNvcGllZC5zdGF0ZUN1cnJlbnRcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmNvcHkuc3RhdGVDdXJyZW50XCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUubmV3XCIpLCBJY29ucy5EcmFmdCwge1xuICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN0b3JlU3RhdGVGYWN0b3J5RGVmYXVsdHMoKTtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLnN0b3JlZC5zdGF0ZVwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuc3RvcmVGYWN0b3J5XCIpLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBCdXR0b24odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuZXhwb3J0QWxsXCIpLCBJY29ucy5TeW5jLCB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZXhwb3J0U3RhdGVBbGwoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuZXhwb3J0QWxsVGl0bGVcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQodGhpcy5zdGF0ZUxpc3QpLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQobmV3IERlbGltaXRlcih0aGlzKSksXG5cbiAgICAgICAgbmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmxvY2FsR2FtZXNcIikpLFxuICAgICAgICBuZXcgVG9vbGJhckxpc3RJdGVtKHRoaXMpLmFkZENoaWxkcmVuKFtcbiAgICAgICAgICBuZXcgQnV0dG9uKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLnN0b3JlXCIpLCBJY29ucy5TYXZlQXMsIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZUdhbWUoKTtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLnN0b3JlZC5nYW1lXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5zdG9yZUdhbWVcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IEJ1dHRvbih0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJjb3B5XCIpLCBJY29ucy5Db3B5LCB7XG4gICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY29weUdhbWUoKS5jYXRjaChyZWRpcmVjdEVycm9yc1RvQ29uc29sZShjb25zb2xlKSk7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5jb3BpZWQuZ2FtZUN1cnJlbnRcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmNvcHkuZ2FtZUN1cnJlbnRcIiksXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBuZXcgTGlzdEl0ZW0odGhpcykuYWRkQ2hpbGQodGhpcy5nYW1lTGlzdCksXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0odGhpcywgdGhpcy5zZXR0aW5nLmNvbXByZXNzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5jb21wcmVzc1wiKSksXG4gICAgICBdKSxcbiAgICApO1xuXG4gICAgdGhpcy5fbG9hZEdhbWVzKCk7XG4gICAgdGhpcy5fbG9hZFN0YXRlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZEdhbWVzKCkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGdhbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3MuZ2FtZS4ke2luZGV4fWApO1xuICAgIHRoaXMuZ2FtZXMuc3BsaWNlKDApO1xuICAgIHRyeSB7XG4gICAgICB3aGlsZSAoIWlzTmlsKGdhbWUpKSB7XG4gICAgICAgIGNvbnN0IGdhbWVPYmplY3QgPSBKU09OLnBhcnNlKGdhbWUpIGFzIFN0b3JlZEdhbWU7XG4gICAgICAgIHRoaXMuZ2FtZXMucHVzaChuZXcgVW5pcXVlKGdhbWVPYmplY3QpKTtcbiAgICAgICAgZ2FtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBrcy5nYW1lLiR7KytpbmRleH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvciguLi5jbChlcnJvcikpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9zdG9yZUdhbWVzKCkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGdhbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3MuZ2FtZS4ke2luZGV4fWApO1xuICAgIHdoaWxlICghaXNOaWwoZ2FtZSkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBrcy5nYW1lLiR7aW5kZXh9YCk7XG4gICAgICBnYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYGtzLmdhbWUuJHsrK2luZGV4fWApO1xuICAgIH1cblxuICAgIGluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IGdhbWUgb2YgdGhpcy5nYW1lcykge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGtzLmdhbWUuJHtpbmRleCsrfWAsIEpTT04uc3RyaW5naWZ5KGdhbWUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2FkU3RhdGVzKCkge1xuICAgIGxldCBzdGF0ZUluZGV4ID0gMDtcbiAgICBsZXQgc3RhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3Muc3RhdGUuJHtzdGF0ZUluZGV4fWApO1xuICAgIHRoaXMuc3RhdGVzLnNwbGljZSgwKTtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKCFpc05pbChzdGF0ZSkpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVPYmplY3QgPSBKU09OLnBhcnNlKHN0YXRlKSBhcyBTdG9yZWRTdGF0ZTtcbiAgICAgICAgS2l0dGVuU2NpZW50aXN0cy51bmtub3duQXNFbmdpbmVTdGF0ZU9yVGhyb3coc3RhdGVPYmplY3Quc3RhdGUpO1xuICAgICAgICB0aGlzLnN0YXRlcy5wdXNoKG5ldyBVbmlxdWUoc3RhdGVPYmplY3QpKTtcbiAgICAgICAgc3RhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShga3Muc3RhdGUuJHsrK3N0YXRlSW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woZXJyb3IpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfc3RvcmVTdGF0ZXMoKSB7XG4gICAgbGV0IHN0YXRlSW5kZXggPSAwO1xuICAgIGxldCBzdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBrcy5zdGF0ZS4ke3N0YXRlSW5kZXh9YCk7XG4gICAgd2hpbGUgKCFpc05pbChzdGF0ZSkpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBrcy5zdGF0ZS4ke3N0YXRlSW5kZXh9YCk7XG4gICAgICBzdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBrcy5zdGF0ZS4keysrc3RhdGVJbmRleH1gKTtcbiAgICB9XG5cbiAgICBzdGF0ZUluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRoaXMuc3RhdGVzKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShga3Muc3RhdGUuJHtzdGF0ZUluZGV4Kyt9YCwgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoR2FtZUxpc3QoKSB7XG4gICAgdGhpcy5nYW1lTGlzdC5yZW1vdmVDaGlsZHJlbih0aGlzLmdhbWVMaXN0LmNoaWxkcmVuKTtcbiAgICB0aGlzLmdhbWVMaXN0LmFkZENoaWxkcmVuKFxuICAgICAgdGhpcy5nYW1lc1xuICAgICAgICAuc29ydChcbiAgICAgICAgICAoYSwgYikgPT5cbiAgICAgICAgICAgIG5ldyBEYXRlKGEudW53cmFwKCkudGltZXN0YW1wKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLnVud3JhcCgpLnRpbWVzdGFtcCkuZ2V0VGltZSgpLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoZ2FtZSA9PiBbZ2FtZS51bndyYXAoKSwgZ2FtZV0gYXMgY29uc3QpXG4gICAgICAgIC5tYXAoKFtnYW1lLCBnYW1lU2xvdF0pID0+XG4gICAgICAgICAgbmV3IEJ1dHRvbkxpc3RJdGVtKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBUZXh0QnV0dG9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBgJHtnYW1lLmxhYmVsfSAoJHtmb3JtYXREaXN0YW5jZVRvTm93KG5ldyBEYXRlKGdhbWUudGltZXN0YW1wKSwge1xuICAgICAgICAgICAgICAgIGFkZFN1ZmZpeDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICB9KX0pYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZEdhbWUoZ2FtZS5nYW1lKS5jYXRjaChyZWRpcmVjdEVycm9yc1RvQ29uc29sZShjb25zb2xlKSk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUubG9hZGVkLmdhbWVcIiwgW2dhbWUubGFiZWxdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuZXcgRGF0ZShnYW1lLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKS5hZGRDaGlsZHJlbihbXG4gICAgICAgICAgICBuZXcgQ29udGFpbmVyKHRoaXMsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgICAgICAgIG5ldyBJY29uQnV0dG9uKHRoaXMsIEljb25zLlNhdmUsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLnVwZGF0ZS5nYW1lXCIpLCB7XG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUdhbWUoZ2FtZVNsb3QsIHRoaXMuaG9zdC5nYW1lLnNhdmUoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLnVwZGF0ZWQuZ2FtZVwiLCBbZ2FtZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5FZGl0LCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5lZGl0LmdhbWVcIiksIHtcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmVHYW1lKGdhbWUuZ2FtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVHYW1lKGdhbWVTbG90LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUudXBkYXRlZC5nYW1lXCIsIFtnYW1lLmxhYmVsXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBJY29uQnV0dG9uKHRoaXMsIEljb25zLkNvcHksIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmNvcHkuZ2FtZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5R2FtZShnYW1lLmdhbWUpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuY29waWVkLmdhbWVcIiwgW2dhbWUubGFiZWxdKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEljb25CdXR0b24odGhpcywgSWNvbnMuRGVsZXRlLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5kZWxldGUuZ2FtZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVHYW1lKGdhbWVTbG90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuZGVsZXRlZC5nYW1lXCIsIFtnYW1lLmxhYmVsXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgX3JlZnJlc2hTdGF0ZUxpc3QoKSB7XG4gICAgdGhpcy5zdGF0ZUxpc3QucmVtb3ZlQ2hpbGRyZW4odGhpcy5zdGF0ZUxpc3QuY2hpbGRyZW4pO1xuICAgIHRoaXMuc3RhdGVMaXN0LmFkZENoaWxkcmVuKFxuICAgICAgdGhpcy5zdGF0ZXNcbiAgICAgICAgLnNvcnQoXG4gICAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgICBuZXcgRGF0ZShhLnVud3JhcCgpLnRpbWVzdGFtcCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi51bndyYXAoKS50aW1lc3RhbXApLmdldFRpbWUoKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKHN0YXRlU2xvdCA9PiBbc3RhdGVTbG90LnVud3JhcCgpLCBzdGF0ZVNsb3RdIGFzIGNvbnN0KVxuICAgICAgICAubWFwKChbc3RhdGUsIHN0YXRlU2xvdF0pID0+XG4gICAgICAgICAgbmV3IEJ1dHRvbkxpc3RJdGVtKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG5ldyBUZXh0QnV0dG9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBgJHtzdGF0ZS5sYWJlbH0gKCR7Zm9ybWF0RGlzdGFuY2VUb05vdyhuZXcgRGF0ZShzdGF0ZS50aW1lc3RhbXApLCB7XG4gICAgICAgICAgICAgICAgYWRkU3VmZml4OiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgIH0pfSlgLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkU3RhdGUoc3RhdGUuc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLmxvYWRlZC5zdGF0ZVwiLCBbc3RhdGUubGFiZWxdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBuZXcgRGF0ZShzdGF0ZS50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICkuYWRkQ2hpbGRyZW4oW1xuICAgICAgICAgICAgbmV3IENvbnRhaW5lcih0aGlzLCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5TYXZlLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS51cGRhdGUuc3RhdGVcIiksIHtcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdGUoc3RhdGVTbG90LCB0aGlzLmhvc3QuZW5naW5lLnN0YXRlU2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS51cGRhdGVkLnN0YXRlXCIsIFtzdGF0ZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5FZGl0LCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5lZGl0LnN0YXRlXCIpLCB7XG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlU3RhdGUoc3RhdGUuc3RhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlU3RhdGUoc3RhdGVTbG90LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUudXBkYXRlZC5zdGF0ZVwiLCBbc3RhdGUubGFiZWxdKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEljb25CdXR0b24odGhpcywgSWNvbnMuQ29weSwgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuY29weS5zdGF0ZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3B5U3RhdGUoc3RhdGUuc3RhdGUpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuY29waWVkLnN0YXRlXCIsIFtzdGF0ZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgSWNvbkJ1dHRvbih0aGlzLCBJY29ucy5EZWxldGUsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLmRlbGV0ZS5zdGF0ZVwiKSwge1xuICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVTdGF0ZShzdGF0ZVNsb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5kZWxldGVkLnN0YXRlXCIsIFtzdGF0ZS5sYWJlbF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTdGF0ZShzdGF0ZT86IEVuZ2luZVN0YXRlKSB7XG4gICAgYXdhaXQgdGhpcy5ob3N0LmNvcHlTZXR0aW5ncyhzdGF0ZSwgZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgY29weUdhbWUoZ2FtZT86IEtHU2F2ZURhdGEpIHtcbiAgICBjb25zdCBzYXZlRGF0YSA9IGdhbWUgPz8gdGhpcy5ob3N0LmdhbWUuc2F2ZSgpO1xuICAgIGNvbnN0IHNhdmVEYXRhU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoc2F2ZURhdGEpO1xuICAgIGNvbnN0IGVuY29kZWREYXRhID0gdGhpcy5zZXR0aW5nLmNvbXByZXNzLmVuYWJsZWRcbiAgICAgID8gdGhpcy5ob3N0LmdhbWUuY29tcHJlc3NMWkRhdGEoc2F2ZURhdGFTdHJpbmcpXG4gICAgICA6IHNhdmVEYXRhU3RyaW5nO1xuXG4gICAgYXdhaXQgVXNlclNjcmlwdExvYWRlci53aW5kb3cubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoZW5jb2RlZERhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbmQgdHJ5IHRvIGltcG9ydCBpdC5cbiAgICpcbiAgICogVGhpbmdzIHVzZXJzIG1pZ2h0IHBhc3RlLCBpbiBubyBzcGVjaWZpYyBvcmRlcjpcbiAgICogMS4gS2l0dGVucyBHYW1lIFNhdmUsIHVuY29tcHJlc3NlZCBsaW5lLWFnbm9zdGljIEpTT05cbiAgICogMi4gS2l0dGVucyBHYW1lIFNhdmUsIGx6LXN0cmluZyBjb21wcmVzc2VkIHNpbmdsZS1saW5lIFVURi04IHN0cmluZ1xuICAgKiAzLiBLaXR0ZW5zIEdhbWUgU2F2ZSwgbHotc3RyaW5nIGNvbXByZXNzZWQgc2luZ2xlLWxpbmUgVVRGLTE2IHN0cmluZ1xuICAgKiA0LiBLaXR0ZW4gU2NpZW50aXN0cyBTZXR0aW5ncywgdW5jb21wcmVzc2VkIGxpbmUtYWdub3N0aWMgSlNPTlxuICAgKiA1LiBLaXR0ZW4gU2NpZW50aXN0cyBTZXR0aW5ncywgbHotc3RyaW5nIGNvbXByZXNzZWQgc2luZ2xlLWxpbmUgQmFzZTY0IHN0cmluZ1xuICAgKiA2LiBLaXR0ZW4gU2NpZW50aXN0cyBTZXR0aW5ncyBFeHBvcnQsIG11bHRpLWxpbmUgc3RyaW5nIHdoZXJlIGFsbCBsaW5lcyBhcmUgZWl0aGVyOlxuICAgKiAgICAtICM0LCBidXQgbXVzdCBiZSBzaW5nbGUtbGluZVxuICAgKiAgICAtICM1XG4gICAqIDcuIEtpdHRlbiBTY2llbnRpc3RzIFNldHRpbmdzIEV4cG9ydCwgbXVsdGktbGluZSBzdHJpbmcgd2hlcmUgZWFjaCBsaW5lIGlzXG4gICAqICAgIGFuIHVuY29tcHJlc3NlZCBKU09OIHN0cmluZyBzZXJpYWxpemF0aW9uIG9mOlxuICAgKiAgICB7XG4gICAqICAgICAgbGFiZWw6IFwiVGhlIGxhYmVsIHRoZSB1c2VyIHByZXZpb3VzbHkgYXNzaWduZWQgdG8gdGhlc2Ugc2V0dGluZ3MuXCIsXG4gICAqICAgICAgc3RhdGU6IFwiVGhlIHNhbWUgb3B0aW9ucyBhcyAjNlwiLFxuICAgKiAgICAgIHRpbWVzdGFtcDogXCJMYXN0IHRpbWUgdGhlIHNldHRpbmdzIHdlcmUgbW9kaWZpZWQuIEFzIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5cIixcbiAgICogICAgfVxuICAgKi9cbiAgaW1wb3J0KCkge1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LnByb21wdCh0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5sb2FkUHJvbXB0XCIpKTtcbiAgICBpZiAoaXNOaWwodXNlcklucHV0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydElkID0gbmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKTtcbiAgICBsZXQgaW1wb3J0U2VxdWVuY2UgPSAxO1xuICAgIGNvbnN0IG1ha2VJbXBvcnRMYWJlbCA9ICgpID0+XG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5pbXBvcnRlZFN0YXRlXCIsIFtgJHtpbXBvcnRJZH0gIyR7aW1wb3J0U2VxdWVuY2UrK31gXSk7XG5cbiAgICBjb25zdCBpbnRlcm5hbEltcG9ydCA9IChpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBIYW5kbGVzICM0IGFuZCAjNVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZGVjb2RlU2V0dGluZ3MgdGhyb3dzIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBlbmdpbmUgc3RhdGUuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gS2l0dGVuU2NpZW50aXN0cy5kZWNvZGVTZXR0aW5ncyhpbnB1dCk7XG4gICAgICAgIHRoaXMuc3RvcmVTdGF0ZShzdGF0ZSwgbWFrZUltcG9ydExhYmVsKCkpO1xuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdGUuaW1wb3J0ZWQuc3RhdGVcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBOb3QgYSB2YWxpZCBLaXR0ZW4gU2NpZW50aXN0cyBzdGF0ZS5cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlcyAjN1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3ViamVjdERhdGEgPSBKU09OLnBhcnNlKGlucHV0KSBhcyB7XG4gICAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgICBzdGF0ZTogc3RyaW5nO1xuICAgICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGF0ZSA9IEtpdHRlblNjaWVudGlzdHMuZGVjb2RlU2V0dGluZ3Moc3ViamVjdERhdGEuc3RhdGUpO1xuICAgICAgICB0aGlzLnN0b3JlU3RhdGUoc3RhdGUsIHN1YmplY3REYXRhLmxhYmVsKTtcbiAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXRlLmltcG9ydGVkLnN0YXRlXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgLy8gTm90IGEgdmFsaWQgS2l0dGVuIFNjaWVudGlzdHMgc3RhdGUuXG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gcGFyc2UgYXMgS0cgc2F2ZS5cbiAgICAgIGxldCBzdWJqZWN0RGF0YTogS0dTYXZlRGF0YTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1YmplY3REYXRhID0gSlNPTi5wYXJzZShpbnB1dCkgYXMgS0dTYXZlRGF0YTtcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBFeHBlY3RlZCwgYXMgd2UgYXNzdW1lIGNvbXByZXNzZWQgaW5wdXQuXG4gICAgICAgIGNvbnN0IHVuY29tcHJlc3NlZCA9IHRoaXMuaG9zdC5nYW1lLmRlY29tcHJlc3NMWkRhdGEoaW5wdXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN1YmplY3REYXRhID0gSlNPTi5wYXJzZSh1bmNvbXByZXNzZWQpIGFzIEtHU2F2ZURhdGE7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgIC8vIENvbnRpbnVlZCBmYWlsdXJlIHRvIHBhcnNlIGFzIEpTT04gbWlnaHQgaW5kaWNhdGUgbmV3bGluZS1kZWxpbWl0ZWQgSlNPTi5cbiAgICAgICAgICBpZiAoaW5wdXQubWF0Y2goL1xccj9cXG4vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnNwbGl0KC9cXHI/XFxuLykubWFwKGxpbmUgPT4gdm9pZCBpbnRlcm5hbEltcG9ydChsaW5lKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcHJvdmlkZWQgaW5wdXQgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYW55dGhpbmcgd2UgdW5kZXJzdGFuZC5cIixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGdhbWUgY29udGFpbnMgS1Mgc2V0dGluZ3MsIGltcG9ydCB0aG9zZSBzZXBhcmF0ZWx5LlxuICAgICAgbGV0IHN0YXRlTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaXNOaWwoc3ViamVjdERhdGEpICYmIFwia3NcIiBpbiBzdWJqZWN0RGF0YSAmJiAhaXNOaWwoc3ViamVjdERhdGEua3MpKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3ViamVjdERhdGEua3Muc3RhdGVbMF07XG4gICAgICAgIHN0YXRlTGFiZWwgPSB0aGlzLnN0b3JlU3RhdGUoc3RhdGUsIG1ha2VJbXBvcnRMYWJlbCgpKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5pbXBvcnRlZC5zdGF0ZVwiKTtcbiAgICAgICAgc3ViamVjdERhdGEua3MgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmVHYW1lKHN1YmplY3REYXRhLCBzdGF0ZUxhYmVsKTtcbiAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0ZS5pbXBvcnRlZC5nYW1lXCIpO1xuICAgIH07XG5cbiAgICBpbnRlcm5hbEltcG9ydCh1c2VySW5wdXQpO1xuICB9XG5cbiAgc3RvcmVHYW1lKGdhbWU/OiBLR1NhdmVEYXRhLCBsYWJlbD86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBnYW1lTGFiZWwgPSBsYWJlbDtcblxuICAgIGlmIChpc05pbChnYW1lTGFiZWwpKSB7XG4gICAgICBnYW1lTGFiZWwgPVxuICAgICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5wcm9tcHQodGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUuc3RvcmVHYW1lLnByb21wdFwiKSkgPz9cbiAgICAgICAgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChpc05pbChnYW1lTGFiZWwpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgZW1wdHkgc3RyaW5nIHRvIFwibm8gbGFiZWxcIi5cbiAgICBnYW1lTGFiZWwgPVxuICAgICAgKGdhbWVMYWJlbCA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IGdhbWVMYWJlbCkgPz8gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUudW5sYWJlbGVkR2FtZVwiKTtcblxuICAgIC8vIEVuc3VyZSBsYWJlbHMgYXJlbid0IGV4Y2Vzc2l2ZWx5IGxvbmcuXG4gICAgZ2FtZUxhYmVsID0gZ2FtZUxhYmVsLnN1YnN0cmluZygwLCAxMjcpO1xuXG4gICAgdGhpcy5nYW1lcy5wdXNoKFxuICAgICAgbmV3IFVuaXF1ZSh7XG4gICAgICAgIGdhbWU6IGdhbWUgPz8gdGhpcy5ob3N0LmdhbWUuc2F2ZSgpLFxuICAgICAgICBsYWJlbDogZ2FtZUxhYmVsLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLl9zdG9yZUdhbWVzKCk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuXG4gICAgcmV0dXJuIGdhbWVMYWJlbDtcbiAgfVxuXG4gIHN0b3JlU3RhdGUoc3RhdGU/OiBFbmdpbmVTdGF0ZSwgbGFiZWw/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBsZXQgc3RhdGVMYWJlbCA9IGxhYmVsO1xuXG4gICAgaWYgKGlzTmlsKHN0YXRlTGFiZWwpKSB7XG4gICAgICBzdGF0ZUxhYmVsID1cbiAgICAgICAgVXNlclNjcmlwdExvYWRlci53aW5kb3cucHJvbXB0KHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInN0YXRlLnN0b3JlU3RhdGUucHJvbXB0XCIpKSA/P1xuICAgICAgICB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTmlsKHN0YXRlTGFiZWwpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgZW1wdHkgc3RyaW5nIHRvIFwibm8gbGFiZWxcIi5cbiAgICBzdGF0ZUxhYmVsID1cbiAgICAgIChzdGF0ZUxhYmVsID09PSBcIlwiID8gdW5kZWZpbmVkIDogc3RhdGVMYWJlbCkgPz8gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwic3RhdGUudW5sYWJlbGVkU3RhdGVcIik7XG5cbiAgICAvLyBFbnN1cmUgbGFiZWxzIGFyZW4ndCBleGNlc3NpdmVseSBsb25nLlxuICAgIHN0YXRlTGFiZWwgPSBzdGF0ZUxhYmVsLnN1YnN0cmluZygwLCAxMjcpO1xuXG4gICAgdGhpcy5zdGF0ZXMucHVzaChcbiAgICAgIG5ldyBVbmlxdWUoe1xuICAgICAgICBsYWJlbDogc3RhdGVMYWJlbCxcbiAgICAgICAgc3RhdGU6IHN0YXRlID8/IHRoaXMuaG9zdC5lbmdpbmUuc3RhdGVTZXJpYWxpemUoKSxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5fc3RvcmVTdGF0ZXMoKTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG5cbiAgICByZXR1cm4gc3RhdGVMYWJlbDtcbiAgfVxuXG4gIHN0b3JlU3RhdGVGYWN0b3J5RGVmYXVsdHMoKSB7XG4gICAgdGhpcy5zdG9yZVN0YXRlKEVuZ2luZS5ERUZBVUxUX1NUQVRFKTtcbiAgfVxuXG4gIHN0b3JlQXV0b1NhdmUoc3RhdGU6IEVuZ2luZVN0YXRlKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnN0YXRlcy5maW5kKHN0YXRlID0+IHN0YXRlLnVud3JhcCgpLmxhYmVsID09PSBcIkF1dG8tU2F2ZVwiKTtcbiAgICBpZiAoIWlzTmlsKGV4aXN0aW5nKSkge1xuICAgICAgY29uc29sZS5pbmZvKC4uLmNsKFwiVXBkYXRpbmcgZXhpc3RpbmcgQXV0by1TYXZlLi4uXCIpKTtcbiAgICAgIGV4aXN0aW5nLnJlcGxhY2Uoe1xuICAgICAgICAuLi5leGlzdGluZy51bndyYXAoKSxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3N0b3JlU3RhdGVzKCk7XG4gICAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oLi4uY2woXCJTdG9yaW5nIG5ldyBBdXRvLVNhdmUuLi5cIikpO1xuICAgIHRoaXMuc3RvcmVTdGF0ZShzdGF0ZSwgXCJBdXRvLVNhdmVcIik7XG4gIH1cblxuICBleHBvcnRTdGF0ZUFsbCgpIHtcbiAgICBjb25zdCBzdGF0ZXNKc29uID0gdGhpcy5zdGF0ZXNcbiAgICAgIC5tYXAoc3RhdGUgPT4gc3RhdGUudW53cmFwKCkpXG4gICAgICAubWFwKHN0YXRlID0+XG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBsYWJlbDogc3RhdGUubGFiZWwsXG4gICAgICAgICAgc3RhdGU6IEtpdHRlblNjaWVudGlzdHMuZW5jb2RlU2V0dGluZ3Moc3RhdGUuc3RhdGUsIGZhbHNlKSxcbiAgICAgICAgICB0aW1lc3RhbXA6IHN0YXRlLnRpbWVzdGFtcCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzdGF0ZXNKc29uXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL3gtbmRqc29uXCIgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBhLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdXJsKTtcbiAgICBhLnNldEF0dHJpYnV0ZShcImRvd25sb2FkXCIsIGBrcy1sb2NhbC1zdGF0ZXMtJHtEYXRlLm5vdygpfS5uZGpzb25gKTtcbiAgICBhLmNsaWNrKCk7XG4gIH1cblxuICBhc3luYyBsb2FkR2FtZShnYW1lOiBLR1NhdmVEYXRhKSB7XG4gICAgaWYgKHRoaXMuX2Rlc3RydWN0aXZlQWN0aW9uUHJldmVudGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgU2F2ZWdhbWVMb2FkZXIodGhpcy5ob3N0LmdhbWUpLmxvYWRSYXcoZ2FtZSk7XG4gIH1cblxuICBsb2FkU3RhdGUoc3RhdGU6IEVuZ2luZVN0YXRlKSB7XG4gICAgaWYgKHRoaXMuX2Rlc3RydWN0aXZlQWN0aW9uUHJldmVudGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhvc3QuZW5naW5lLnN0YXRlTG9hZChzdGF0ZSwgdHJ1ZSk7XG4gICAgdGhpcy5ob3N0LnJlZnJlc2hFbnRpcmVVc2VySW50ZXJmYWNlKCk7XG4gIH1cblxuICBsb2FkQXV0b1NhdmUoKSB7XG4gICAgaWYgKHRoaXMuaG9zdC5lbmdpbmUuaXNMb2FkZWQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIk5vdCBhdHRlbXB0aW5nIHRvIGxvYWQgQXV0by1TYXZlLCBiZWNhdXNlIGEgc3RhdGUgaXMgYWxyZWFkeSBsb2FkZWQuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuc3RhdGVzLmZpbmQoc3RhdGUgPT4gc3RhdGUudW53cmFwKCkubGFiZWwgPT09IFwiQXV0by1TYXZlXCIpO1xuICAgIGlmIChpc05pbChleGlzdGluZykpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIk5vIEF1dG8tU2F2ZSBzZXR0aW5ncyBmb3VuZC5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkxvYWRpbmcgQXV0by1TYXZlLi4uXCIpKTtcbiAgICB0aGlzLmhvc3QuZW5naW5lLnN0YXRlTG9hZChleGlzdGluZy51bndyYXAoKS5zdGF0ZSwgZmFsc2UpO1xuICB9XG5cbiAgdXBkYXRlR2FtZShnYW1lOiBVbmlxdWU8U3RvcmVkR2FtZT4sIG5ld0dhbWU6IEtHU2F2ZURhdGEpIHtcbiAgICBpZiAodGhpcy5fZGVzdHJ1Y3RpdmVBY3Rpb25QcmV2ZW50ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhYmVsID0gZ2FtZS51bndyYXAoKS5sYWJlbDtcbiAgICBnYW1lLnJlcGxhY2Uoe1xuICAgICAgZ2FtZTogbmV3R2FtZSxcbiAgICAgIGxhYmVsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfSk7XG4gICAgdGhpcy5fc3RvcmVHYW1lcygpO1xuICAgIHRoaXMucmVxdWVzdFJlZnJlc2goKTtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHN0YXRlOiBVbmlxdWU8U3RvcmVkU3RhdGU+LCBuZXdTdGF0ZTogRW5naW5lU3RhdGUpIHtcbiAgICBpZiAodGhpcy5fZGVzdHJ1Y3RpdmVBY3Rpb25QcmV2ZW50ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhYmVsID0gc3RhdGUudW53cmFwKCkubGFiZWw7XG4gICAgc3RhdGUucmVwbGFjZSh7XG4gICAgICBsYWJlbCxcbiAgICAgIHN0YXRlOiBuZXdTdGF0ZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICAgIHRoaXMuX3N0b3JlU3RhdGVzKCk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICB9XG5cbiAgZGVsZXRlR2FtZShnYW1lOiBVbmlxdWU8U3RvcmVkR2FtZT4sIGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlICYmIHRoaXMuX2Rlc3RydWN0aXZlQWN0aW9uUHJldmVudGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2FtZXMuaW5kZXhPZihnYW1lKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5nYW1lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX3N0b3JlR2FtZXMoKTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cblxuICBkZWxldGVTdGF0ZShzdGF0ZTogVW5pcXVlPFN0b3JlZFN0YXRlPiwgZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICghZm9yY2UgJiYgdGhpcy5fZGVzdHJ1Y3RpdmVBY3Rpb25QcmV2ZW50ZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGF0ZXMuaW5kZXhPZihzdGF0ZSk7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5fc3RvcmVTdGF0ZXMoKTtcbiAgICB0aGlzLnJlcXVlc3RSZWZyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIF9kZXN0cnVjdGl2ZUFjdGlvblByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zZXR0aW5nLm5vQ29uZmlybS5lbmFibGVkICYmXG4gICAgICAhVXNlclNjcmlwdExvYWRlci53aW5kb3cuY29uZmlybSh0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJzdGF0ZS5jb25maXJtRGVzdHJ1Y3Rpb25cIikpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQ29sbGFwc2libGVQYW5lbCwgdHlwZSBDb2xsYXBzaWJsZVBhbmVsT3B0aW9ucyB9IGZyb20gXCIuL0NvbGxhcHNpYmxlUGFuZWwuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgTGFiZWxMaXN0SXRlbSwgdHlwZSBMYWJlbExpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0uanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlc1NldHRpbmdMaXN0SXRlbSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIEljb25TZXR0aW5nc1BhbmVsT3B0aW9ucyA9IFRoaXNUeXBlPEljb25TZXR0aW5nc1BhbmVsPiAmXG4gIExhYmVsTGlzdEl0ZW1PcHRpb25zICZcbiAgQ29sbGFwc2libGVQYW5lbE9wdGlvbnMgJiB7XG4gICAgLyoqXG4gICAgICogV2hlbiBzZXQgdG8gYW4gU1ZHIHBhdGgsIHdpbGwgYmUgdXNlZCBhcyBhbiBpY29uIG9uIHRoZSBwYW5lbC5cbiAgICAgKi9cbiAgICByZWFkb25seSBpY29uOiBzdHJpbmc7XG4gIH07XG5cbmV4cG9ydCBjbGFzcyBJY29uU2V0dGluZ3NQYW5lbDxUU2V0dGluZyBleHRlbmRzIFNldHRpbmcgPSBTZXR0aW5nPiBleHRlbmRzIENvbGxhcHNpYmxlUGFuZWwge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IEljb25TZXR0aW5nc1BhbmVsT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogVFNldHRpbmc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBzZXR0aW5ncyBwYW5lbCB0aGF0IGNhbiBoYXZlIGFuIGljb24uXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IEEgcmVmZXJlbmNlIHRvIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHB1dCBtYWluIGNoZWNrYm94IG9mIHRoaXMgc2VjdGlvbi5cbiAgICogQHBhcmFtIHNldHRpbmcgQW4gc2V0dGluZyBmb3Igd2hpY2ggdGhpcyBpcyB0aGUgc2V0dGluZ3MgcGFuZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBwYW5lbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBzZXR0aW5nOiBUU2V0dGluZyxcbiAgICBvcHRpb25zPzogSWNvblNldHRpbmdzUGFuZWxPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIG5ldyBMYWJlbExpc3RJdGVtKHBhcmVudCwgbGFiZWwsIHtcbiAgICAgICAgY2xhc3NlczogW3N0eWxlc1NldHRpbmdMaXN0SXRlbS5jaGVja2VkLCBzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uc2V0dGluZ10sXG4gICAgICAgIGljb246IG9wdGlvbnM/Lmljb24sXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc2V0Qm9uZmlyZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1Jlc2V0Qm9uZmlyZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdGFnZWRCdWlsZGluZyB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgc3R5bGVzRGVsaW1pdGVyIGZyb20gXCIuL2NvbXBvbmVudHMvRGVsaW1pdGVyLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBIZWFkZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IEljb25TZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldEJvbmZpcmVTZXR0aW5nc1VpIGV4dGVuZHMgSWNvblNldHRpbmdzUGFuZWw8UmVzZXRCb25maXJlU2V0dGluZ3M+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfYnVpbGRpbmdzOiBBcnJheTxIZWFkZXJMaXN0SXRlbSB8IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFJlc2V0Qm9uZmlyZVNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmJ1aWxkXCIpO1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHNldHRpbmdzLCB7XG4gICAgICBpY29uOiBJY29ucy5Cb25maXJlLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPD0gMCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYnVpbGRpbmdzID0gW107XG4gICAgZm9yIChjb25zdCBidWlsZGluZ0dyb3VwIG9mIHRoaXMuaG9zdC5nYW1lLmJsZC5idWlsZGluZ0dyb3Vwcykge1xuICAgICAgdGhpcy5fYnVpbGRpbmdzLnB1c2gobmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIGJ1aWxkaW5nR3JvdXAudGl0bGUpKTtcbiAgICAgIGZvciAoY29uc3QgYnVpbGRpbmcgb2YgYnVpbGRpbmdHcm91cC5idWlsZGluZ3MpIHtcbiAgICAgICAgaWYgKGJ1aWxkaW5nID09PSBcInVuaWNvcm5QYXN0dXJlXCIgfHwgaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZ10pKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5ob3N0LmdhbWUuYmxkLmdldEJ1aWxkaW5nRXh0KGJ1aWxkaW5nKS5tZXRhO1xuICAgICAgICBpZiAoIWlzTmlsKG1ldGEuc3RhZ2VzKSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3QudmFsdWVzKHRoaXMuc2V0dGluZy5idWlsZGluZ3MpLmZpbmQoXG4gICAgICAgICAgICBpdGVtID0+IGl0ZW0uYmFzZUJ1aWxkaW5nID09PSBidWlsZGluZyxcbiAgICAgICAgICApPy5idWlsZGluZyBhcyBTdGFnZWRCdWlsZGluZztcbiAgICAgICAgICB0aGlzLl9idWlsZGluZ3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuX2dldFJlc2V0T3B0aW9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2J1aWxkaW5nXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgbWV0YS5zdGFnZXNbMF0ubGFiZWwsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbbmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgIG1ldGEuc3RhZ2VzWzFdLmxhYmVsLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwobWV0YS5sYWJlbCkpIHtcbiAgICAgICAgICB0aGlzLl9idWlsZGluZ3MucHVzaChcbiAgICAgICAgICAgIHRoaXMuX2dldFJlc2V0T3B0aW9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2J1aWxkaW5nXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgICAgbWV0YS5sYWJlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgcGFkZGluZyBhZnRlciBlYWNoIGdyb3VwLiBFeGNlcHQgZm9yIHRoZSBsYXN0IGdyb3VwLCB3aGljaCBlbmRzIHRoZSBsaXN0LlxuICAgICAgaWYgKFxuICAgICAgICBidWlsZGluZ0dyb3VwICE9PVxuICAgICAgICB0aGlzLmhvc3QuZ2FtZS5ibGQuYnVpbGRpbmdHcm91cHNbdGhpcy5ob3N0LmdhbWUuYmxkLmJ1aWxkaW5nR3JvdXBzLmxlbmd0aCAtIDFdXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fYnVpbGRpbmdzLmF0KC0xKT8uZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNEZWxpbWl0ZXIuZGVsaW1pdGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaXN0QnVpbGRpbmdzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKTtcbiAgICBsaXN0QnVpbGRpbmdzLmFkZENoaWxkcmVuKHRoaXMuX2J1aWxkaW5ncyk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEJ1aWxkaW5ncyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZXNldE9wdGlvbihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIG9wdGlvbjogU2V0dGluZ1RyaWdnZXIsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBSZXNldEJvbmZpcmVTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFJlbGlnaW9uU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvUmVzZXRSZWxpZ2lvblNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgVW5pY29ybkl0ZW1zLCB0eXBlIFppZ2d1cmF0VXBncmFkZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGVsaW1pdGVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EZWxpbWl0ZXIuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBIZWFkZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvSGVhZGVyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IEljb25TZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZWxpZ2lvblNldHRpbmdzVWkgZXh0ZW5kcyBJY29uU2V0dGluZ3NQYW5lbDxSZXNldFJlbGlnaW9uU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogUmVzZXRSZWxpZ2lvblNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLmZhaXRoXCIpO1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHNldHRpbmdzLCB7XG4gICAgICBpY29uOiBJY29ucy5SZWxpZ2lvbixcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5idWlsZGluZ3MpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgXy50cmlnZ2VyIDw9IDApO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSk7XG5cbiAgICBjb25zdCB1bmljb3Juc0FycmF5OiBBcnJheTxaaWdndXJhdFVwZ3JhZGUgfCBcInVuaWNvcm5QYXN0dXJlXCI+ID0gWy4uLlVuaWNvcm5JdGVtc107XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcykuYWRkQ2hpbGRyZW4oW1xuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHJlbGlnaW9uLnBhbmVsLnppZ2d1cmF0LmxhYmVsXCIpKSxcbiAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkYnVpbGRpbmdzLnVuaWNvcm5QYXN0dXJlLmxhYmVsXCIpLFxuICAgICAgICApLFxuXG4gICAgICAgIC4uLnRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnppZ2d1cmF0VXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgaXRlbSA9PiB1bmljb3Juc0FycmF5LmluY2x1ZGVzKGl0ZW0ubmFtZSkgJiYgIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoemlnZ3VyYXRVcGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t6aWdndXJhdFVwZ3JhZGUubmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgIHppZ2d1cmF0VXBncmFkZS5sYWJlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgbmV3IERlbGltaXRlcih0aGlzKSxcblxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi56aWdndXJhdFVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIGl0ZW0gPT4gIXVuaWNvcm5zQXJyYXkuaW5jbHVkZXMoaXRlbS5uYW1lKSAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICB1cGdyYWRlLmxhYmVsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICBuZXcgRGVsaW1pdGVyKHRoaXMpLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkcmVsaWdpb24ucGFuZWwub3JkZXJPZlRoZVN1bi5sYWJlbFwiKSksXG4gICAgICAgIC4uLnRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnJlbGlnaW9uVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICB1cGdyYWRlLmxhYmVsLFxuICAgICAgICAgICAgICB1cGdyYWRlLm5hbWUgPT09IHRoaXMuaG9zdC5nYW1lLnJlbGlnaW9uLnJlbGlnaW9uVXBncmFkZXMuYXQoLTEpPy5uYW1lLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkcmVsaWdpb24ucGFuZWwuY3J5cHRvdGhlb2xvZ3kubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS5yZWxpZ2lvbi50cmFuc2NlbmRlbmNlVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcCh1cGdyYWRlID0+XG4gICAgICAgICAgICB0aGlzLl9nZXRSZXNldE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1t1cGdyYWRlLm5hbWVdLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICB1cGdyYWRlLmxhYmVsLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlc2V0T3B0aW9uKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBTZXR0aW5nVHJpZ2dlcixcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFJlc2V0UmVsaWdpb25TZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVzZXRSZXNvdXJjZXNTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNldFJlc291cmNlc1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyB1Y2ZpcnN0IH0gZnJvbSBcIi4uL3Rvb2xzL0Zvcm1hdC5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEljb25TZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9JY29uU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRSZXNvdXJjZXNTZXR0aW5nc1VpIGV4dGVuZHMgSWNvblNldHRpbmdzUGFuZWw8UmVzZXRSZXNvdXJjZXNTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFJlc291cmNlc1NldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnJlc291cmNlc1wiKTtcbiAgICBzdXBlcihwYXJlbnQsIGxhYmVsLCBzZXR0aW5ncywge1xuICAgICAgaWNvbjogSWNvbnMuUmVzb3VyY2VzLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLnJlc291cmNlcykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPCAwKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5ob3N0LmdhbWUucmVzUG9vbC5yZXNvdXJjZXM7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGxldCBsYXN0TGFiZWwgPSByZXNvdXJjZXNbMF0udGl0bGU7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBbLi4ucmVzb3VyY2VzXS5zb3J0KChhLCBiKSA9PlxuICAgICAgYS50aXRsZS5sb2NhbGVDb21wYXJlKGIudGl0bGUsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgKSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5zZXR0aW5nLnJlc291cmNlc1tyZXNvdXJjZS5uYW1lXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHRoaXMsIG9wdGlvbiwgbG9jYWxlLCB1Y2ZpcnN0KHJlc291cmNlLnRpdGxlKSwge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtyZXNvdXJjZS50aXRsZV0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJiBvcHRpb24uZW5hYmxlZCAmJiBvcHRpb24udHJpZ2dlciA9PT0gLTE7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5mbG9hdFwiKSxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgcmVzb3VyY2UudGl0bGUsXG4gICAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBvcHRpb24udHJpZ2dlciAhPT0gLTEgPyB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucmVzZXQucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIG9wdGlvbi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSBwYXJlbnQuaG9zdC5wYXJzZUFic29sdXRlKHZhbHVlKSA/PyBvcHRpb24udHJpZ2dlcjtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbcmVzb3VyY2UudGl0bGVdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcblxuICAgICAgaWYgKHRoaXMuaG9zdC5lbmdpbmUubG9jYWxlU3VwcG9ydHNGaXJzdExldHRlclNwbGl0cyhsb2NhbGUuc2VsZWN0ZWQpKSB7XG4gICAgICAgIGlmIChsYXN0TGFiZWxbMF0gIT09IHJlc291cmNlLnRpdGxlWzBdKSB7XG4gICAgICAgICAgZWxlbWVudC5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0xhYmVsTGlzdEl0ZW0uc3BsaXR0ZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goZWxlbWVudCk7XG5cbiAgICAgIGxhc3RMYWJlbCA9IHJlc291cmNlLnRpdGxlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KG5ldyBTZXR0aW5nc0xpc3QodGhpcykuYWRkQ2hpbGRyZW4oaXRlbXMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFNwYWNlU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvUmVzZXRTcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zLCBTZXR0aW5nVHJpZ2dlciB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgSWNvblNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0ljb25TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNldFNwYWNlU2V0dGluZ3NVaSBleHRlbmRzIEljb25TZXR0aW5nc1BhbmVsPFJlc2V0U3BhY2VTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFNwYWNlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuc3BhY2VcIik7XG4gICAgc3VwZXIocGFyZW50LCBsYWJlbCwgc2V0dGluZ3MsIHtcbiAgICAgIGljb246IEljb25zLlNwYWNlLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPD0gMCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgICAgdGhpcy5ob3N0LmdhbWUuc3BhY2UucGxhbmV0c1xuICAgICAgICAgIC5maWx0ZXIocGxhbnQgPT4gMCA8IHBsYW50LmJ1aWxkaW5ncy5sZW5ndGgpXG4gICAgICAgICAgLmZsYXRNYXAoKHBsYW5ldCwgaW5kZXhQbGFuZXQsIGFycmF5UGxhbnQpID0+IFtcbiAgICAgICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmxhYmVsRm9yUGxhbmV0KHBsYW5ldC5uYW1lKSksXG4gICAgICAgICAgICAuLi5wbGFuZXQuYnVpbGRpbmdzXG4gICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiAhaXNOaWwodGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tpdGVtLm5hbWVdKSlcbiAgICAgICAgICAgICAgLm1hcCgoYnVpbGRpbmcsIGluZGV4QnVpbGRpbmcsIGFycmF5QnVpbGRpbmcpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZy5uYW1lXSxcbiAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICAgICAgYnVpbGRpbmcubGFiZWwsXG4gICAgICAgICAgICAgICAgICBpbmRleFBsYW5ldCA8IGFycmF5UGxhbnQubGVuZ3RoIC0gMSAmJiBpbmRleEJ1aWxkaW5nID09PSBhcnJheUJ1aWxkaW5nLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlc2V0T3B0aW9uKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBTZXR0aW5nVHJpZ2dlcixcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFJlc2V0U3BhY2VTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFRpbWVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNldFRpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucywgU2V0dGluZ1RyaWdnZXIgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZUl0ZW0gfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBJY29uU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvSWNvblNldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL2NvbXBvbmVudHMvTGFiZWxMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc2V0VGltZVNldHRpbmdzVWkgZXh0ZW5kcyBJY29uU2V0dGluZ3NQYW5lbDxSZXNldFRpbWVTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFRpbWVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50aW1lXCIpO1xuICAgIHN1cGVyKHBhcmVudCwgbGFiZWwsIHNldHRpbmdzLCB7XG4gICAgICBpY29uOiBJY29ucy5UaW1lLFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPD0gMCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkd29ya3Nob3AuY2hyb25vZm9yZ2UubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS50aW1lLmNocm9ub2ZvcmdlVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcChidWlsZGluZyA9PlxuICAgICAgICAgICAgdGhpcy5fZ2V0UmVzZXRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbYnVpbGRpbmcubmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgc2V0dGluZ3MsXG4gICAgICAgICAgICAgIGJ1aWxkaW5nLmxhYmVsLFxuICAgICAgICAgICAgICBidWlsZGluZy5uYW1lID09PSB0aGlzLmhvc3QuZ2FtZS50aW1lLmNocm9ub2ZvcmdlVXBncmFkZXMuYXQoLTEpPy5uYW1lLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkc2NpZW5jZS52b2lkU3BhY2UubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS50aW1lLnZvaWRzcGFjZVVwZ3JhZGVzXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0ubmFtZSBpbiB0aGlzLnNldHRpbmcuYnVpbGRpbmdzKVxuICAgICAgICAgIC5tYXAoYnVpbGRpbmcgPT5cbiAgICAgICAgICAgIHRoaXMuX2dldFJlc2V0T3B0aW9uKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYnVpbGRpbmdzW2J1aWxkaW5nLm5hbWUgYXMgVGltZUl0ZW1dLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIHNldHRpbmdzLFxuICAgICAgICAgICAgICBidWlsZGluZy5sYWJlbCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZXNldE9wdGlvbihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIG9wdGlvbjogU2V0dGluZ1RyaWdnZXIsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBSZXNldFRpbWVTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmluYWN0aXZlXCIpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnJlc2V0LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIG9wdGlvbi50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIi4uL2ltYWdlcy9JY29ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFVwZ3JhZGVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9SZXNldFVwZ3JhZGVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nLCBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Db250YWluZXIuanNcIjtcbmltcG9ydCBzdHlsZXNEZWxpbWl0ZXIgZnJvbSBcIi4vY29tcG9uZW50cy9EZWxpbWl0ZXIubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgSWNvblNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL0ljb25TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVzZXRVcGdyYWRlc1NldHRpbmdzVWkgZXh0ZW5kcyBJY29uU2V0dGluZ3NQYW5lbDxSZXNldFVwZ3JhZGVTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFVwZ3JhZGVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlc1wiKTtcbiAgICBzdXBlcihwYXJlbnQsIGxhYmVsLCBzZXR0aW5ncywge1xuICAgICAgaWNvbjogSWNvbnMuV29ya3Nob3AsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pO1xuXG4gICAgY29uc3QgdXBncmFkZXMgPSB0aGlzLmhvc3QuZ2FtZS53b3Jrc2hvcC51cGdyYWRlcy5maWx0ZXIoXG4gICAgICB1cGdyYWRlID0+ICFpc05pbCh0aGlzLnNldHRpbmcudXBncmFkZXNbdXBncmFkZS5uYW1lXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgbGV0IGxhc3RMYWJlbCA9IHVwZ3JhZGVzWzBdLmxhYmVsO1xuICAgIGxldCBsYXN0RWxlbWVudDogU2V0dGluZ0xpc3RJdGVtIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgdXBncmFkZSBvZiB1cGdyYWRlcy5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgKSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5zZXR0aW5nLnVwZ3JhZGVzW3VwZ3JhZGUubmFtZV07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRSZXNldE9wdGlvbih0aGlzLCBvcHRpb24sIHVwZ3JhZGUubGFiZWwpO1xuXG4gICAgICBpZiAodGhpcy5ob3N0LmVuZ2luZS5sb2NhbGVTdXBwb3J0c0ZpcnN0TGV0dGVyU3BsaXRzKGxvY2FsZS5zZWxlY3RlZCkpIHtcbiAgICAgICAgaWYgKGxhc3RMYWJlbFswXSAhPT0gdXBncmFkZS5sYWJlbFswXSkge1xuICAgICAgICAgIGlmICghaXNOaWwobGFzdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICBsYXN0RWxlbWVudC5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0RlbGltaXRlci5kZWxpbWl0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50LmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzTGFiZWxMaXN0SXRlbS5zcGxpdHRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgaXRlbXMucHVzaChlbGVtZW50KTtcblxuICAgICAgbGFzdExhYmVsID0gdXBncmFkZS5sYWJlbDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChuZXcgU2V0dGluZ3NMaXN0KHRoaXMpLmFkZENoaWxkcmVuKGl0ZW1zKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRSZXNldE9wdGlvbihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIG9wdGlvbjogU2V0dGluZyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRlbGltaXRlciA9IGZhbHNlLFxuICAgIHVwZ3JhZGVJbmRpY2F0b3IgPSBmYWxzZSxcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5nTGlzdEl0ZW0ocGFyZW50LCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5yZXNldC5jaGVjay5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIHVwZ3JhZGVJbmRpY2F0b3IsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNldFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1Jlc2V0U2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgUmVzZXRCb25maXJlU2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0Qm9uZmlyZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFJlc2V0UmVsaWdpb25TZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVzZXRSZWxpZ2lvblNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFJlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0UmVzb3VyY2VzU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgUmVzZXRTcGFjZVNldHRpbmdzVWkgfSBmcm9tIFwiLi9SZXNldFNwYWNlU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgUmVzZXRUaW1lU2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0VGltZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFJlc2V0VXBncmFkZXNTZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVzZXRVcGdyYWRlc1NldHRpbmdzVWkuanNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc2V0U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8UmVzZXRTZXR0aW5ncz4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9ib25maXJlVWk6IFJlc2V0Qm9uZmlyZVNldHRpbmdzVWk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlbGlnaW9uVWk6IFJlc2V0UmVsaWdpb25TZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNvdXJjZXNVaTogUmVzZXRSZXNvdXJjZXNTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zcGFjZVVpOiBSZXNldFNwYWNlU2V0dGluZ3NVaTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZVVpOiBSZXNldFRpbWVTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91cGdyYWRlc1VpOiBSZXNldFVwZ3JhZGVzU2V0dGluZ3NVaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBSZXNldFNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi50aW1lLnJlc2V0XCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgdGhpcy5fYm9uZmlyZVVpLFxuICAgICAgICAgICAgICB0aGlzLl9yZWxpZ2lvblVpLFxuICAgICAgICAgICAgICB0aGlzLl9yZXNvdXJjZXNVaSxcbiAgICAgICAgICAgICAgdGhpcy5fc3BhY2VVaSxcbiAgICAgICAgICAgICAgdGhpcy5fdGltZVVpLFxuICAgICAgICAgICAgICB0aGlzLl91cGdyYWRlc1VpLFxuICAgICAgICAgICAgXS5zb21lKF8gPT4gXy5leHBhbmRvLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICB9KTtcbiAgICB0aGlzLl9ib25maXJlVWkgPSBuZXcgUmVzZXRCb25maXJlU2V0dGluZ3NVaSh0aGlzLCB0aGlzLnNldHRpbmcuYm9uZmlyZSwgbG9jYWxlKTtcbiAgICB0aGlzLl9yZWxpZ2lvblVpID0gbmV3IFJlc2V0UmVsaWdpb25TZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy5yZWxpZ2lvbiwgbG9jYWxlKTtcbiAgICB0aGlzLl9yZXNvdXJjZXNVaSA9IG5ldyBSZXNldFJlc291cmNlc1NldHRpbmdzVWkodGhpcywgdGhpcy5zZXR0aW5nLnJlc291cmNlcywgbG9jYWxlKTtcbiAgICB0aGlzLl9zcGFjZVVpID0gbmV3IFJlc2V0U3BhY2VTZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy5zcGFjZSwgbG9jYWxlKTtcbiAgICB0aGlzLl90aW1lVWkgPSBuZXcgUmVzZXRUaW1lU2V0dGluZ3NVaSh0aGlzLCB0aGlzLnNldHRpbmcudGltZSwgbG9jYWxlKTtcbiAgICB0aGlzLl91cGdyYWRlc1VpID0gbmV3IFJlc2V0VXBncmFkZXNTZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy51cGdyYWRlcywgbG9jYWxlKTtcblxuICAgIGxpc3QuYWRkQ2hpbGRyZW4oW1xuICAgICAgdGhpcy5fYm9uZmlyZVVpLFxuICAgICAgdGhpcy5fcmVsaWdpb25VaSxcbiAgICAgIHRoaXMuX3Jlc291cmNlc1VpLFxuICAgICAgdGhpcy5fc3BhY2VVaSxcbiAgICAgIHRoaXMuX3RpbWVVaSxcbiAgICAgIHRoaXMuX3VwZ3JhZGVzVWksXG4gICAgXSk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDeWNsZSB9IGZyb20gXCIuLi8uLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QsIHR5cGUgU2V0dGluZ3NMaXN0T3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdXaXRoQ3ljbGVzID0gUmVjb3JkPEN5Y2xlLCBTZXR0aW5nPjtcblxuZXhwb3J0IHR5cGUgQ3ljbGVzTGlzdE9wdGlvbnMgPSBUaGlzVHlwZTxDeWNsZXNMaXN0PiAmXG4gIFNldHRpbmdzTGlzdE9wdGlvbnMgJiB7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gYSBjeWNsZSBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgY3ljbGUgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZyBUaGUgc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGN5Y2xlLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9uQ2hlY2tDeWNsZT86IChsYWJlbDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIGN5Y2xlIGlzIHVuY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgb24gdGhlIGN5Y2xlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBjeWNsZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvblVuQ2hlY2tDeWNsZT86IChsYWJlbDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIH07XG5cbi8qKlxuICogQSBsaXN0IG9mIHNldHRpbmdzIGNvcnJlbGF0aW5nIHRvIHRoZSBwbGFuZXRhcnkgY3ljbGVzIGluIHRoZSBnYW1lLlxuICovXG5leHBvcnQgY2xhc3MgQ3ljbGVzTGlzdCBleHRlbmRzIFNldHRpbmdzTGlzdCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQ3ljbGVzTGlzdE9wdGlvbnM7XG4gIHJlYWRvbmx5IHNldHRpbmc6IFNldHRpbmdXaXRoQ3ljbGVzO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYFNlYXNvbnNMaXN0YC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgQSByZWZlcmVuY2UgdG8gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBzZXR0aW5nIFRoZSBzZXR0aW5ncyB0aGF0IGNvcnJlbGF0ZSB0byB0aGlzIGxpc3QuXG4gICAqIEBwYXJhbSBiZWhhdmlvciBDb250cm9sIGN5Y2xlIGNoZWNrIGJveCBsb2cgb3V0cHV0XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoaXMgbGlzdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogVWlDb21wb25lbnQsIHNldHRpbmc6IFNldHRpbmdXaXRoQ3ljbGVzLCBvcHRpb25zPzogQ3ljbGVzTGlzdE9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuc2V0dGluZyA9IHNldHRpbmc7XG5cbiAgICBjb25zdCBtYWtlQ3ljbGUgPSAoY3ljbGU6IEN5Y2xlLCBzZXR0aW5nOiBTZXR0aW5nKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5sYWJlbEZvckN5Y2xlKGN5Y2xlKTtcbiAgICAgIHJldHVybiBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKGlzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIG9wdGlvbnM/Lm9uQ2hlY2tDeWNsZT8uKGxhYmVsLCBzZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKGlzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIG9wdGlvbnM/Lm9uVW5DaGVja0N5Y2xlPy4obGFiZWwsIHNldHRpbmcsIGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBjeWNsZXMgPSBbXG4gICAgICBtYWtlQ3ljbGUoXCJjaGFyb25cIiwgdGhpcy5zZXR0aW5nLmNoYXJvbiksXG4gICAgICBtYWtlQ3ljbGUoXCJ1bWJyYVwiLCB0aGlzLnNldHRpbmcudW1icmEpLFxuICAgICAgbWFrZUN5Y2xlKFwieWFyblwiLCB0aGlzLnNldHRpbmcueWFybiksXG4gICAgICBtYWtlQ3ljbGUoXCJoZWxpb3NcIiwgdGhpcy5zZXR0aW5nLmhlbGlvcyksXG4gICAgICBtYWtlQ3ljbGUoXCJjYXRoXCIsIHRoaXMuc2V0dGluZy5jYXRoKSxcbiAgICAgIG1ha2VDeWNsZShcInJlZG1vb25cIiwgdGhpcy5zZXR0aW5nLnJlZG1vb24pLFxuICAgICAgbWFrZUN5Y2xlKFwiZHVuZVwiLCB0aGlzLnNldHRpbmcuZHVuZSksXG4gICAgICBtYWtlQ3ljbGUoXCJwaXNjaW5lXCIsIHRoaXMuc2V0dGluZy5waXNjaW5lKSxcbiAgICAgIG1ha2VDeWNsZShcInRlcm1pbnVzXCIsIHRoaXMuc2V0dGluZy50ZXJtaW51cyksXG4gICAgICBtYWtlQ3ljbGUoXCJrYWlyb1wiLCB0aGlzLnNldHRpbmcua2Fpcm8pLFxuICAgIF07XG4gICAgdGhpcy5hZGRDaGlsZHJlbihjeWNsZXMpO1xuXG4gICAgdGhpcy5lbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmFibGVBbGxcIiwgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjeWNsZSBvZiBjeWNsZXMpIHtcbiAgICAgICAgY3ljbGUuY2hlY2sodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJkaXNhYmxlQWxsXCIsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY3ljbGUgb2YgY3ljbGVzKSB7XG4gICAgICAgIGN5Y2xlLnVuY2hlY2sodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2V0dGluZyB9IGZyb20gXCIuLi8uLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZWFzb24gfSBmcm9tIFwiLi4vLi4vdHlwZXMvaW5kZXguanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0LCB0eXBlIFNldHRpbmdzTGlzdE9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nV2l0aFNlYXNvbnMgPSBSZWNvcmQ8U2Vhc29uLCBTZXR0aW5nPjtcblxuZXhwb3J0IHR5cGUgU2Vhc29uc0xpc3RPcHRpb25zID0gVGhpc1R5cGU8U2Vhc29uc0xpc3Q+ICZcbiAgU2V0dGluZ3NMaXN0T3B0aW9ucyAmIHtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHNlYXNvbiBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBvbiB0aGUgc2Vhc29uIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWFzb24uXG4gICAgICovXG4gICAgcmVhZG9ubHkgb25DaGVja1NlYXNvbj86IChsYWJlbDogc3RyaW5nLCBzZXR0aW5nOiBTZXR0aW5nLCBpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBhIHNlYXNvbiBpcyB1bmNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIG9uIHRoZSBzZWFzb24gZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZyBUaGUgc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlYXNvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBvblVuQ2hlY2tTZWFzb24/OiAobGFiZWw6IHN0cmluZywgc2V0dGluZzogU2V0dGluZywgaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB2b2lkO1xuICB9O1xuXG4vKipcbiAqIEEgbGlzdCBvZiA0IHNldHRpbmdzIGNvcnJlbGF0aW5nIHRvIHRoZSA0IHNlYXNvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFzb25zTGlzdCBleHRlbmRzIFNldHRpbmdzTGlzdCB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2Vhc29uc0xpc3RPcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nV2l0aFNlYXNvbnM7XG5cbiAgcmVhZG9ubHkgc3ByaW5nOiBTZXR0aW5nTGlzdEl0ZW07XG4gIHJlYWRvbmx5IHN1bW1lcjogU2V0dGluZ0xpc3RJdGVtO1xuICByZWFkb25seSBhdXR1bW46IFNldHRpbmdMaXN0SXRlbTtcbiAgcmVhZG9ubHkgd2ludGVyOiBTZXR0aW5nTGlzdEl0ZW07XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgU2Vhc29uc0xpc3RgLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBBIHJlZmVyZW5jZSB0byB0aGUgaG9zdC5cbiAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmdzIHRoYXQgY29ycmVsYXRlIHRvIHRoaXMgbGlzdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhpcyBsaXN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFVpQ29tcG9uZW50LCBzZXR0aW5nOiBTZXR0aW5nV2l0aFNlYXNvbnMsIG9wdGlvbnM/OiBTZWFzb25zTGlzdE9wdGlvbnMpIHtcbiAgICBzdXBlcihwYXJlbnQsIG9wdGlvbnMpO1xuICAgIHRoaXMuc2V0dGluZyA9IHNldHRpbmc7XG5cbiAgICBjb25zdCBtYWtlU2Vhc29uID0gKGxhYmVsOiBzdHJpbmcsIHNldHRpbmc6IFNldHRpbmcpID0+IHtcbiAgICAgIHJldHVybiBuZXcgU2V0dGluZ0xpc3RJdGVtKHRoaXMsIHNldHRpbmcsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBvcHRpb25zPy5vbkNoZWNrU2Vhc29uPy4obGFiZWwsIHNldHRpbmcsIGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgb3B0aW9ucz8ub25VbkNoZWNrU2Vhc29uPy4obGFiZWwsIHNldHRpbmcsIGlzQmF0Y2hQcm9jZXNzKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLnNwcmluZyA9IG1ha2VTZWFzb24odGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJGNhbGVuZGFyLnNlYXNvbi5zcHJpbmdcIiksIHRoaXMuc2V0dGluZy5zcHJpbmcpO1xuICAgIHRoaXMuc3VtbWVyID0gbWFrZVNlYXNvbih0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkY2FsZW5kYXIuc2Vhc29uLnN1bW1lclwiKSwgdGhpcy5zZXR0aW5nLnN1bW1lcik7XG4gICAgdGhpcy5hdXR1bW4gPSBtYWtlU2Vhc29uKHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIiRjYWxlbmRhci5zZWFzb24uYXV0dW1uXCIpLCB0aGlzLnNldHRpbmcuYXV0dW1uKTtcbiAgICB0aGlzLndpbnRlciA9IG1ha2VTZWFzb24odGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJGNhbGVuZGFyLnNlYXNvbi53aW50ZXJcIiksIHRoaXMuc2V0dGluZy53aW50ZXIpO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbihbdGhpcy5zcHJpbmcsIHRoaXMuc3VtbWVyLCB0aGlzLmF1dHVtbiwgdGhpcy53aW50ZXJdKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTZWFzb25zTGlzdC5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1RpbWVDb250cm9sU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZVNraXBIZWF0U2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZVNraXBIZWF0U2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZVNraXBTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UaW1lU2tpcFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBDeWNsZXNMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9DeWNsZXNMaXN0LmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL1RpbWVTa2lwSGVhdFNldHRpbmdzVWkubW9kdWxlLmNzc1wiO1xuXG5leHBvcnQgY2xhc3MgVGltZVNraXBIZWF0U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8XG4gIFRpbWVTa2lwSGVhdFNldHRpbmdzLFxuICBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogVGltZVNraXBIZWF0U2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIHNlY3Rpb25TZXR0aW5nOiBUaW1lU2tpcFNldHRpbmdzLFxuICAgIHNlY3Rpb25QYXJlbnRTZXR0aW5nOiBUaW1lQ29udHJvbFNldHRpbmdzLFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnRpbWUuYWN0aXZlSGVhdFRyYW5zZmVyXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYWN0aXZlSGVhdFRyYW5zZmVyLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5hY3RpdmVIZWF0VHJhbnNmZXIucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYWN0aXZlSGVhdFRyYW5zZmVyLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgc2V0dGluZ3MuYWN0aXZlSGVhdFRyYW5zZmVyU3RhdHVzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIXNldHRpbmdzLmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5zZXR0aW5nSXRlbS50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25QYXJlbnRTZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuXG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25QYXJlbnRTZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLmN5Y2xlcykuc29tZShjeWNsZSA9PiBjeWNsZS5lbmFibGVkKTtcblxuICAgICAgICAgIGlmIChzZXR0aW5ncy5hY3RpdmVIZWF0VHJhbnNmZXJTdGF0dXMuZW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnRMYWJlbC5hdHRyKFwiZGF0YS1rcy1hY3RpdmUtZnJvbVwiLCBcIuKXjlwiKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZC5lbGVtZW50TGFiZWwuYXR0cihcImRhdGEta3MtYWN0aXZlLXRvXCIsIFwi4peOXCIpO1xuICAgICAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnRMYWJlbC5hZGRDbGFzcyhzdHlsZXMuYWN0aXZlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oZWFkLmVsZW1lbnRMYWJlbC5yZW1vdmVDbGFzcyhzdHlsZXMuYWN0aXZlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgbmV3IEN5Y2xlc0xpc3QodGhpcywgdGhpcy5zZXR0aW5nLmN5Y2xlcywge1xuICAgICAgICAgIG9uQ2hlY2tDeWNsZTogKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLmhlYXRUcmFuc2Zlci5jeWNsZS5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblVuQ2hlY2tDeWNsZTogKGxhYmVsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLmhlYXRUcmFuc2Zlci5jeWNsZS5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCIuLi9pbWFnZXMvSWNvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVGltZUNvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UaW1lQ29udHJvbFNldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRpbWVTa2lwU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZVNraXBTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgdWNmaXJzdCB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vY29tcG9uZW50cy9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgQ29sbGFwc2libGVQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29sbGFwc2libGVQYW5lbC5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vY29tcG9uZW50cy9Db250YWluZXIuanNcIjtcbmltcG9ydCB7IEN5Y2xlc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL0N5Y2xlc0xpc3QuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBMYWJlbExpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2Vhc29uc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NlYXNvbnNMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc1NldHRpbmdMaXN0SXRlbSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFRpbWVTa2lwSGVhdFNldHRpbmdzVWkgfSBmcm9tIFwiLi9UaW1lU2tpcEhlYXRTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2tpcFNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFRpbWVTa2lwU2V0dGluZ3MsIFNldHRpbmdNYXhUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3ljbGVzOiBDb2xsYXBzaWJsZVBhbmVsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZWFzb25zOiBDb2xsYXBzaWJsZVBhbmVsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3RpdmVIZWF0VHJhbnNmZXJVSTogVGltZVNraXBIZWF0U2V0dGluZ3NVaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBUaW1lU2tpcFNldHRpbmdzLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBzZWN0aW9uU2V0dGluZzogVGltZUNvbnRyb2xTZXR0aW5ncyxcbiAgKSB7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi50aW1lLnNraXBcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nTWF4VHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaE1heCgpIHtcbiAgICAgICAgICB0aGlzLm1heEJ1dHRvbi51cGRhdGVMYWJlbChwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5ncy5tYXgpKTtcbiAgICAgICAgICB0aGlzLm1heEJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID1cbiAgICAgICAgICAgIHNldHRpbmdzLm1heCA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC50aW1lU2tpcC50aXRsZUluZmluaXRlXCIsIFtsYWJlbF0pXG4gICAgICAgICAgICAgIDogc2V0dGluZ3MubWF4ID09PSAwXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC50aW1lU2tpcC50aXRsZVplcm9cIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LnRpbWVTa2lwLnRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZ3MubWF4KSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcigpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogYCR7cGFyZW50Lmhvc3QucmVuZGVyRmxvYXQoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkKX0gVENgLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldE1heDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LnRpbWVTa2lwLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LnRpbWVTa2lwLnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZ3MubWF4LCBsb2NhbGUuc2VsZWN0ZWQpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5ncy5tYXgpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXgudGltZVNraXAucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgc2V0dGluZ3MubWF4ID0gLTE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldHRpbmdzLm1heCA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmdzLm1heDtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnRpbWVTa2lwLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci50aW1lU2tpcC5wcm9tcHRUaXRsZVwiLCBbXG4gICAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmdzLnRyaWdnZXIpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnRpbWVTa2lwLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gc2V0dGluZ3MudHJpZ2dlcjtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0ubWF4QnV0dG9uLmluYWN0aXZlID0gIXNldHRpbmdzLmVuYWJsZWQgfHwgc2V0dGluZ3MubWF4ID09PSAtMTtcbiAgICAgICAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhc2V0dGluZ3MuZW5hYmxlZCB8fCBzZXR0aW5ncy50cmlnZ2VyID09PSAtMTtcblxuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0ubWF4QnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgc2V0dGluZ3MuZW5hYmxlZCAmJiBzZXR0aW5ncy5tYXggPT09IDA7XG5cbiAgICAgICAgICB0aGlzLl9jeWNsZXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICAhT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5jeWNsZXMpLnNvbWUoY3ljbGUgPT4gY3ljbGUuZW5hYmxlZCk7XG4gICAgICAgICAgdGhpcy5fc2Vhc29ucy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiZcbiAgICAgICAgICAgICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnNlYXNvbnMpLnNvbWUoc2Vhc29uID0+IHNlYXNvbi5lbmFibGVkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uZWxlbWVudC5yZW1vdmVDbGFzcyhzdHlsZXNCdXR0b24ubGFzdEhlYWRBY3Rpb24pO1xuXG4gICAgdGhpcy5fY3ljbGVzID0gbmV3IENvbGxhcHNpYmxlUGFuZWwoXG4gICAgICB0aGlzLFxuICAgICAgbmV3IExhYmVsTGlzdEl0ZW0odGhpcywgdWNmaXJzdCh0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5jeWNsZXNcIikpLCB7XG4gICAgICAgIGNsYXNzZXM6IFtzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uY2hlY2tlZCwgc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnNldHRpbmddLFxuICAgICAgICBpY29uOiBJY29ucy5DeWNsZXMsXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIodGhpcywgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pXSksXG4gICAgKS5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgbmV3IEN5Y2xlc0xpc3QodGhpcywgdGhpcy5zZXR0aW5nLmN5Y2xlcywge1xuICAgICAgICBvbkNoZWNrQ3ljbGU6IChsYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInRpbWUuc2tpcC5jeWNsZS5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVja0N5Y2xlOiAobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLnNraXAuY3ljbGUuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICAgIHRoaXMuX3NlYXNvbnMgPSBuZXcgQ29sbGFwc2libGVQYW5lbChcbiAgICAgIHRoaXMsXG4gICAgICBuZXcgTGFiZWxMaXN0SXRlbSh0aGlzLCB1Y2ZpcnN0KHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInRyYWRlLnNlYXNvbnNcIikpLCB7XG4gICAgICAgIGNsYXNzZXM6IFtzdHlsZXNTZXR0aW5nTGlzdEl0ZW0uY2hlY2tlZCwgc3R5bGVzU2V0dGluZ0xpc3RJdGVtLnNldHRpbmddLFxuICAgICAgICBpY29uOiBJY29ucy5TZWFzb25zLFxuICAgICAgfSkuYWRkQ2hpbGRyZW5IZWFkKFtuZXcgQ29udGFpbmVyKHRoaXMsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICkuYWRkQ2hpbGRyZW5Db250ZW50KFtcbiAgICAgIG5ldyBTZWFzb25zTGlzdCh0aGlzLCB0aGlzLnNldHRpbmcuc2Vhc29ucywge1xuICAgICAgICBvbkNoZWNrU2Vhc29uOiAobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLnNraXAuc2Vhc29uLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrU2Vhc29uOiAobGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0aW1lLnNraXAuc2Vhc29uLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdKTtcbiAgICB0aGlzLl9hY3RpdmVIZWF0VHJhbnNmZXJVSSA9IG5ldyBUaW1lU2tpcEhlYXRTZXR0aW5nc1VpKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5hY3RpdmVIZWF0VHJhbnNmZXIsXG4gICAgICBsb2NhbGUsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHNlY3Rpb25TZXR0aW5nLFxuICAgICk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtcbiAgICAgICAgdGhpcy5fY3ljbGVzLFxuICAgICAgICB0aGlzLl9zZWFzb25zLFxuICAgICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5zZXR0aW5nLmlnbm9yZU92ZXJoZWF0LFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi50aW1lLnNraXAuaWdub3JlT3ZlcmhlYXRcIiksXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuX2FjdGl2ZUhlYXRUcmFuc2ZlclVJLFxuICAgICAgXSksXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFRpbWVDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvVGltZUNvbnRyb2xTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IENvbnRhaW5lciB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFJlc2V0U2V0dGluZ3NVaSB9IGZyb20gXCIuL1Jlc2V0U2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgVGltZVNraXBTZXR0aW5nc1VpIH0gZnJvbSBcIi4vVGltZVNraXBTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lQ29udHJvbFNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFRpbWVDb250cm9sU2V0dGluZ3M+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pdGVtczogQXJyYXk8U2V0dGluZ0xpc3RJdGVtPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hY2NlbGVyYXRlVGltZTogU2V0dGluZ1RyaWdnZXJMaXN0SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZVNraXBVaTogVGltZVNraXBTZXR0aW5nc1VpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNldFVpOiBSZXNldFNldHRpbmdzVWk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nczogVGltZUNvbnRyb2xTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYENvbnN0cnVjdGluZyAke1RpbWVDb250cm9sU2V0dGluZ3NVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50aW1lQ3RybFwiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICB9KS5hZGRDaGlsZHJlbkhlYWQoW25ldyBDb250YWluZXIocGFyZW50LCB7IGNsYXNzZXM6IFtzdHlsZXNMYWJlbExpc3RJdGVtLmZpbGxTcGFjZV0gfSldKSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmIFt0aGlzLl90aW1lU2tpcFVpLCB0aGlzLl9yZXNldFVpXS5zb21lKF8gPT4gXy5leHBhbmRvLmluZWZmZWN0aXZlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3QgPSBuZXcgU2V0dGluZ3NMaXN0KHRoaXMsIHtcbiAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBhY2NlbGVyYXRlTGFiZWwgPSB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uYWNjZWxlcmF0ZVwiKTtcbiAgICB0aGlzLl9hY2NlbGVyYXRlVGltZSA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5hY2NlbGVyYXRlVGltZSxcbiAgICAgIGxvY2FsZSxcbiAgICAgIGFjY2VsZXJhdGVMYWJlbCxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbYWNjZWxlcmF0ZUxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2FjY2VsZXJhdGVUaW1lLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhdGhpcy5zZXR0aW5nLmFjY2VsZXJhdGVUaW1lLmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5fYWNjZWxlcmF0ZVRpbWUudHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFjY2VsZXJhdGVUaW1lLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hY2NlbGVyYXRlVGltZS50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYWNjZWxlcmF0ZVRpbWUucHJvbXB0XCIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5hY2NlbGVyYXRlVGltZS5wcm9tcHRUaXRsZVwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hY2NlbGVyYXRlVGltZS50cmlnZ2VyLFxuICAgICAgICAgICAgICAgIGxvY2FsZS5zZWxlY3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZSh0aGlzLnNldHRpbmcuYWNjZWxlcmF0ZVRpbWUudHJpZ2dlciksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmFjY2VsZXJhdGVUaW1lLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldHRpbmcuYWNjZWxlcmF0ZVRpbWUudHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFthY2NlbGVyYXRlTGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9hY2NlbGVyYXRlVGltZS50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICB0aGlzLl90aW1lU2tpcFVpID0gbmV3IFRpbWVTa2lwU2V0dGluZ3NVaSh0aGlzLCB0aGlzLnNldHRpbmcudGltZVNraXAsIGxvY2FsZSwgc2V0dGluZ3MpO1xuICAgIHRoaXMuX3Jlc2V0VWkgPSBuZXcgUmVzZXRTZXR0aW5nc1VpKHRoaXMsIHRoaXMuc2V0dGluZy5yZXNldCwgbG9jYWxlKTtcblxuICAgIHRoaXMuX2l0ZW1zID0gW3RoaXMuX2FjY2VsZXJhdGVUaW1lLCB0aGlzLl90aW1lU2tpcFVpLCB0aGlzLl9yZXNldFVpXTtcblxuICAgIGxpc3QuYWRkQ2hpbGRyZW4odGhpcy5faXRlbXMpO1xuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3QpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUaW1lSXRlbSwgVGltZVNldHRpbmdzIH0gZnJvbSBcIi4uL3NldHRpbmdzL1RpbWVTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBCdWlsZFNlY3Rpb25Ub29scyB9IGZyb20gXCIuL0J1aWxkU2VjdGlvblRvb2xzLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUaW1lU2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8VGltZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFRpbWVTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICkge1xuICAgIGNvbnNvbGUuZGVidWcoLi4uY2woYENvbnN0cnVjdGluZyAke1RpbWVTZXR0aW5nc1VpLm5hbWV9YCkpO1xuXG4gICAgY29uc3QgbGFiZWwgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRpbWVcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyKCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlckJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb25cIiwgW1xuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmFjdGl2ZVwiKVxuICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuaW5maW5pdHlcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgIT09IC0xID8gcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gLTE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhc2V0dGluZ3MuZW5hYmxlZCB8fCBzZXR0aW5ncy50cmlnZ2VyIDwgMDtcbiAgICAgICAgICB0aGlzLnNldHRpbmdJdGVtLnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJlxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciA8IDAgJiZcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoc2V0dGluZ3MuYnVpbGRpbmdzKS5zb21lKF8gPT4gXy5lbmFibGVkICYmIDAgPCBfLm1heCAmJiBfLnRyaWdnZXIgPCAwKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHNldHRpbmdzLmJ1aWxkaW5ncykuc29tZShcbiAgICAgICAgICAgICAgXyA9PiBfLmVuYWJsZWQgJiYgKDAgPT09IF8ubWF4IHx8IChfLnRyaWdnZXIgPCAwICYmIHNldHRpbmdzLnRyaWdnZXIgPCAwKSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihbXG4gICAgICAgIG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCIkd29ya3Nob3AuY2hyb25vZm9yZ2UubGFiZWxcIikpLFxuICAgICAgICAuLi50aGlzLmhvc3QuZ2FtZS50aW1lLmNocm9ub2ZvcmdlVXBncmFkZXNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5idWlsZGluZ3NbaXRlbS5uYW1lXSkpXG4gICAgICAgICAgLm1hcChidWlsZGluZyA9PlxuICAgICAgICAgICAgQnVpbGRTZWN0aW9uVG9vbHMuZ2V0QnVpbGRPcHRpb24oXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5idWlsZGluZ3NbYnVpbGRpbmcubmFtZV0sXG4gICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLFxuICAgICAgICAgICAgICBidWlsZGluZy5sYWJlbCxcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IGJ1aWxkaW5nLm5hbWUgPT09IHRoaXMuaG9zdC5nYW1lLnRpbWUuY2hyb25vZm9yZ2VVcGdyYWRlcy5hdCgtMSk/Lm5hbWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFiZWxUcmlnZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcblxuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiJHNjaWVuY2Uudm9pZFNwYWNlLmxhYmVsXCIpKSxcbiAgICAgICAgLi4udGhpcy5ob3N0LmdhbWUudGltZS52b2lkc3BhY2VVcGdyYWRlc1xuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgaW4gdGhpcy5zZXR0aW5nLmJ1aWxkaW5ncylcbiAgICAgICAgICAubWFwKGJ1aWxkaW5nID0+XG4gICAgICAgICAgICBCdWlsZFNlY3Rpb25Ub29scy5nZXRCdWlsZE9wdGlvbihcbiAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJ1aWxkaW5nc1tidWlsZGluZy5uYW1lIGFzIFRpbWVJdGVtXSxcbiAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICB0aGlzLnNldHRpbmcsXG4gICAgICAgICAgICAgIGJ1aWxkaW5nLmxhYmVsLFxuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgeyByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICBdKSxcblxuICAgICAgbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICAgIGhhc0Rpc2FibGVBbGw6IGZhbHNlLFxuICAgICAgICBoYXNFbmFibGVBbGw6IGZhbHNlLFxuICAgICAgfSkuYWRkQ2hpbGRyZW4oW1xuICAgICAgICBuZXcgSGVhZGVyTGlzdEl0ZW0odGhpcywgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkuYWRkaXRpb25hbFwiKSksXG4gICAgICAgIG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLnNldHRpbmcuZml4Q3J5b2NoYW1iZXJzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5maXguY3J5XCIpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZml4LmNyeVwiKSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5maXguY3J5XCIpLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgIF0pLFxuICAgIF0pO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi8uLi8uLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0J1eSwgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuLi9EaWFsb2cuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24sIHR5cGUgVGV4dEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vVGV4dEJ1dHRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9CdXlCdXR0b24ubW9kdWxlLmNzc1wiO1xuXG5leHBvcnQgdHlwZSBCdXlCdXR0b25PcHRpb25zID0gVGhpc1R5cGU8QnV5QnV0dG9uPiAmIFRleHRCdXR0b25PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgQnV5QnV0dG9uIGV4dGVuZHMgVGV4dEJ1dHRvbiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogQnV5QnV0dG9uT3B0aW9ucztcbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZ0J1eTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdCdXksXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICAgIG9wdGlvbnM/OiBCdXlCdXR0b25PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHVuZGVmaW5lZCwge1xuICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgcGFyZW50LFxuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwiYmxhY2tjb2luLmJ1eS5wcm9tcHRcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJibGFja2NvaW4uYnV5LnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmcuYnV5LCBsb2NhbGUuc2VsZWN0ZWQpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKHNldHRpbmcuYnV5KSxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5idXkucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2V0dGluZy5idXkgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXR0aW5nLmJ1eSA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmcuYnV5O1xuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICB0aGlzLmVsZW1lbnQucHJvcChcbiAgICAgICAgICBcInRpdGxlXCIsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwiYmxhY2tjb2luLmJ1eS50aXRsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLmJ1eSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWxlbWVudC50ZXh0KFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5idXlcIiwgW3RoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuYnV5KV0pLFxuICAgICAgICApO1xuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLmJ1eUJ1dHRvbik7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0J1eUJ1dHRvbi5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nT3B0aW9ucywgU2V0dGluZ1NlbGwgfSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuLi9EaWFsb2cuanNcIjtcbmltcG9ydCB7IFRleHRCdXR0b24sIHR5cGUgVGV4dEJ1dHRvbk9wdGlvbnMgfSBmcm9tIFwiLi4vVGV4dEJ1dHRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuLi9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9TZWxsQnV0dG9uLm1vZHVsZS5jc3NcIjtcblxuZXhwb3J0IHR5cGUgU2VsbEJ1dHRvbk9wdGlvbnMgPSBUaGlzVHlwZTxTZWxsQnV0dG9uPiAmIFRleHRCdXR0b25PcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgU2VsbEJ1dHRvbiBleHRlbmRzIFRleHRCdXR0b24ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFNlbGxCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nU2VsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdTZWxsLFxuICAgIGxvY2FsZTogU2V0dGluZ09wdGlvbnM8U3VwcG9ydGVkTG9jYWxlPixcbiAgICBvcHRpb25zPzogU2VsbEJ1dHRvbk9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgdW5kZWZpbmVkLCB7XG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJibGFja2NvaW4uc2VsbC5wcm9tcHRcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJibGFja2NvaW4uc2VsbC5wcm9tcHRUaXRsZVwiLCBbXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShzZXR0aW5nLnNlbGwsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUoc2V0dGluZy5zZWxsKSxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5zZWxsLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgIHNldHRpbmcuc2VsbCA9IC0xO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRpbmcuc2VsbCA9IHBhcmVudC5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IHNldHRpbmcuc2VsbDtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnByb3AoXG4gICAgICAgICAgXCJ0aXRsZVwiLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5zZWxsLnRpdGxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcuc2VsbCksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZWxlbWVudC50ZXh0KFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcImJsYWNrY29pbi5zZWxsXCIsIFt0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLnNlbGwpXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgb3B0aW9ucz8ub25SZWZyZXNoPy4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzLnNlbGxCdXR0b24pO1xuXG4gICAgdGhpcy5zZXR0aW5nID0gc2V0dGluZztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTZWxsQnV0dG9uLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dYDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vLi4vLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdMaW1pdGVkIH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBCdXR0b24sIHR5cGUgQnV0dG9uT3B0aW9ucyB9IGZyb20gXCIuLi9CdXR0b24uanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4uL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4uL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIExpbWl0ZWRCdXR0b25PcHRpb25zID0gVGhpc1R5cGU8TGltaXRlZEJ1dHRvbj4gJlxuICBCdXR0b25PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IG9uTGltaXRlZENoZWNrPzogKCkgPT4gdm9pZDtcbiAgICByZWFkb25seSBvbkxpbWl0ZWRVbkNoZWNrPzogKCkgPT4gdm9pZDtcbiAgfTtcblxuZXhwb3J0IGNsYXNzIExpbWl0ZWRCdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IExpbWl0ZWRCdXR0b25PcHRpb25zO1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nTGltaXRlZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdMaW1pdGVkLFxuICAgIG9wdGlvbnM6IE9taXQ8TGltaXRlZEJ1dHRvbk9wdGlvbnMsIFwib25DbGlja1wiPixcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBcIlwiLCBJY29ucy5FY28sIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBjbGFzc2VzOiBbXSxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXR0aW5nLmxpbWl0ZWQgPSAhdGhpcy5zZXR0aW5nLmxpbWl0ZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5saW1pdGVkKSB7XG4gICAgICAgICAgb3B0aW9ucz8ub25MaW1pdGVkQ2hlY2s/LmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9ucz8ub25MaW1pdGVkVW5DaGVjaz8uY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bih0aGlzLnNldHRpbmcubGltaXRlZCA/IFwidWkubGltaXRlZC5vblwiIDogXCJ1aS5saW1pdGVkLm9mZlwiKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmxpbWl0ZWQgJiYgIXRoaXMuaW5hY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnM/Lm9uUmVmcmVzaD8uY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmcgPSBzZXR0aW5nO1xuXG4gICAgZm9yIChjb25zdCBjbGFzc05hbWUgb2Ygb3B0aW9ucz8uY2xhc3NlcyA/PyBbXSkge1xuICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske0xpbWl0ZWRCdXR0b24ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV1gO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNldHRpbmdMaW1pdGVkIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBMaW1pdGVkQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9MaW1pdGVkQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9Db250YWluZXIuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtLCB0eXBlIFNldHRpbmdMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nTGltaXRlZExpc3RJdGVtT3B0aW9ucyA9IFRoaXNUeXBlPFNldHRpbmdMaW1pdGVkTGlzdEl0ZW0+ICZcbiAgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyAmIHtcbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgXCJMaW1pdGVkXCIgY2hlY2tib3ggaXMgY2hlY2tlZC5cbiAgICAgKi9cbiAgICByZWFkb25seSBvbkxpbWl0ZWRDaGVjaz86ICgpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJcyBjYWxsZWQgd2hlbiB0aGUgXCJMaW1pdGVkXCIgY2hlY2tib3ggaXMgdW5jaGVja2VkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9uTGltaXRlZFVuQ2hlY2s/OiAoKSA9PiB2b2lkO1xuICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbSBleHRlbmRzIFNldHRpbmdMaXN0SXRlbSB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnM7XG4gIHJlYWRvbmx5IGxpbWl0ZWRCdXR0b246IExpbWl0ZWRCdXR0b247XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFVJIGVsZW1lbnQgZm9yIGEgc2V0dGluZyB0aGF0IGNhbiBiZSBsaW1pdGVkLlxuICAgKiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGVsZW1lbnQgd2l0aCBhIGNoZWNrYm94IHRoYXQgaGFzIGEgXCJMaW1pdGVkXCIgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IFRoZSB1c2Vyc2NyaXB0IGluc3RhbmNlLlxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGZvciB0aGUgc2V0dGluZy5cbiAgICogQHBhcmFtIHNldHRpbmcgVGhlIHNldHRpbmcgbW9kZWwuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBsaXN0IGl0ZW0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdMaW1pdGVkLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5saW1pdGVkQnV0dG9uID0gbmV3IExpbWl0ZWRCdXR0b24ocGFyZW50LCBzZXR0aW5nLCB7XG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgb25MaW1pdGVkQ2hlY2s6IG9wdGlvbnM/Lm9uTGltaXRlZENoZWNrXG4gICAgICAgID8gKCkgPT4gb3B0aW9ucy5vbkxpbWl0ZWRDaGVjaz8uY2FsbCh0aGlzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG9uTGltaXRlZFVuQ2hlY2s6IG9wdGlvbnM/Lm9uTGltaXRlZFVuQ2hlY2tcbiAgICAgICAgPyAoKSA9PiBvcHRpb25zLm9uTGltaXRlZFVuQ2hlY2s/LmNhbGwodGhpcylcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgIHRoaXMubGltaXRlZEJ1dHRvbixcbiAgICBdKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbJHtTZXR0aW5nTGltaXRlZExpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dOiAnJHt0aGlzLmVsZW1lbnRMYWJlbC50ZXh0KCl9J2A7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uLy4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTGltaXRlZFRyaWdnZXIsIFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBUcmlnZ2VyQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9UcmlnZ2VyQnV0dG9uLmpzXCI7XG5pbXBvcnQge1xuICBTZXR0aW5nTGltaXRlZExpc3RJdGVtLFxuICB0eXBlIFNldHRpbmdMaW1pdGVkTGlzdEl0ZW1PcHRpb25zLFxufSBmcm9tIFwiLi9TZXR0aW5nTGltaXRlZExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zID0gU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyAmXG4gIFNldHRpbmdMaW1pdGVkTGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbU9wdGlvbnMgJlxuICBUaGlzVHlwZTxTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbT47XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbSBleHRlbmRzIFNldHRpbmdMaW1pdGVkTGlzdEl0ZW0ge1xuICBkZWNsYXJlIHJlYWRvbmx5IG9wdGlvbnM6IFNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgdHJpZ2dlckJ1dHRvbjogVHJpZ2dlckJ1dHRvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmc6IFNldHRpbmdMaW1pdGVkVHJpZ2dlcixcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbU9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKHBhcmVudCwgc2V0dGluZywgbGFiZWwsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uID0gbmV3IFRyaWdnZXJCdXR0b24ocGFyZW50LCBzZXR0aW5nLCBsb2NhbGUsIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBvbkNsaWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMub25TZXRUcmlnZ2VyLmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoOiBvcHRpb25zPy5vblJlZnJlc2hUcmlnZ2VyID8gKCkgPT4gb3B0aW9ucy5vblJlZnJlc2hUcmlnZ2VyPy5jYWxsKHRoaXMpIDogdW5kZWZpbmVkLFxuICAgICAgcmVuZGVyTGFiZWw6IG9wdGlvbnM/LnJlbmRlckxhYmVsVHJpZ2dlciA/PyB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkQ2hpbGRIZWFkKHRoaXMudHJpZ2dlckJ1dHRvbik7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ0xpbWl0ZWRUcmlnZ2VyTGlzdEl0ZW0ubmFtZX0jJHt0aGlzLmNvbXBvbmVudElkfV06ICcke3RoaXMuZWxlbWVudExhYmVsLnRleHQoKX0nYDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTZXR0aW5nTWF4IH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBNYXhCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL01heEJ1dHRvbi5qc1wiO1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSBcIi4vQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgc3R5bGVzTGFiZWxMaXN0SXRlbSBmcm9tIFwiLi9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSwgdHlwZSBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vVWlDb21wb25lbnQuanNcIjtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ01heExpc3RJdGVtT3B0aW9ucyA9IFRoaXNUeXBlPFNldHRpbmdNYXhMaXN0SXRlbT4gJlxuICBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICYge1xuICAgIHJlYWRvbmx5IG9uUmVmcmVzaE1heD86ICgpID0+IHZvaWQ7XG4gICAgcmVhZG9ubHkgb25TZXRNYXg6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9O1xuXG5leHBvcnQgY2xhc3MgU2V0dGluZ01heExpc3RJdGVtIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtPFNldHRpbmdNYXg+IHtcbiAgZGVjbGFyZSByZWFkb25seSBvcHRpb25zOiBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zO1xuICByZWFkb25seSBtYXhCdXR0b246IE1heEJ1dHRvbjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgVUkgZWxlbWVudCBmb3IgYSBzZXR0aW5nIHRoYXQgY2FuIGhhdmUgYSBtYXhpbXVtLlxuICAgKiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGVsZW1lbnQgd2l0aCBhIGxhYmVsZWQgY2hlY2tib3ggYW5kIGEgXCJNYXhcIiBpbmRpY2F0b3IsXG4gICAqIHdoaWNoIGNvbnRyb2xzIHRoZSByZXNwZWN0aXZlIGBtYXhgIHByb3BlcnR5IGluIHRoZSBzZXR0aW5nIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0gaG9zdCBUaGUgdXNlcnNjcmlwdCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBmb3IgdGhlIHNldHRpbmcuXG4gICAqIEBwYXJhbSBzZXR0aW5nIFRoZSBzZXR0aW5nIG1vZGVsLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgbGlzdCBpdGVtLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nOiBTZXR0aW5nTWF4LFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2V0dGluZ01heExpc3RJdGVtT3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCBzZXR0aW5nLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLm1heEJ1dHRvbiA9IG5ldyBNYXhCdXR0b24ocGFyZW50LCBzZXR0aW5nLCB7XG4gICAgICBib3JkZXI6IGZhbHNlLFxuICAgICAgb25DbGljazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBvcHRpb25zLm9uU2V0TWF4LmNhbGwodGhpcyk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoOiBvcHRpb25zPy5vblJlZnJlc2hNYXggPyAoKSA9PiBvcHRpb25zLm9uUmVmcmVzaE1heD8uY2FsbCh0aGlzKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLmFkZENoaWxkcmVuSGVhZChbXG4gICAgICBuZXcgQ29udGFpbmVyKHBhcmVudCwgeyBjbGFzc2VzOiBbc3R5bGVzTGFiZWxMaXN0SXRlbS5maWxsU3BhY2VdIH0pLFxuICAgICAgdGhpcy5tYXhCdXR0b24sXG4gICAgXSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7U2V0dGluZ01heExpc3RJdGVtLm5hbWV9IyR7dGhpcy5jb21wb25lbnRJZH1dOiAnJHt0aGlzLmVsZW1lbnRMYWJlbC50ZXh0KCl9J2A7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEVtYmFzc3lTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9FbWJhc3N5U2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ01heCwgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgVHJhZGVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9UcmFkZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgc3R5bGVzQnV0dG9uIGZyb20gXCIuL2NvbXBvbmVudHMvQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gXCIuL2NvbXBvbmVudHMvRGlhbG9nLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTWF4TGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdNYXhMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NMaXN0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdzUGFuZWwgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzUGFuZWwuanNcIjtcbmltcG9ydCB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdUcmlnZ2VyTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB0eXBlIHsgVWlDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRzL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBFbWJhc3N5U2V0dGluZ3NVaSBleHRlbmRzIFNldHRpbmdzUGFuZWw8RW1iYXNzeVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IEVtYmFzc3lTZXR0aW5ncyxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFRyYWRlU2V0dGluZ3MsXG4gICkge1xuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZW1iYXNzaWVzXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShwYXJlbnQsIHNldHRpbmdzLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuZW1iYXNzaWVzLnByb21wdFwiKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5lbWJhc3NpZXMucHJvbXB0VGl0bGVcIiwgW1xuICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuZW1iYXNzaWVzLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9IHNldHRpbmdzLmVuYWJsZWQgJiYgc2V0dGluZ3MudHJpZ2dlciA9PT0gLTE7XG5cbiAgICAgICAgICB0aGlzLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2VjdGlvblNldHRpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJlxuICAgICAgICAgICAgIU9iamVjdC52YWx1ZXMoc2V0dGluZ3MucmFjZXMpLnNvbWUocmFjZSA9PiByYWNlLmVuYWJsZWQpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgbGlzdFJhY2VzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgIHRoaXMuaG9zdC5nYW1lLmRpcGxvbWFjeS5yYWNlc1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5uYW1lICE9PSBcImxldmlhdGhhbnNcIiAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLnJhY2VzW2l0ZW0ubmFtZV0pKVxuICAgICAgICAubWFwKHJhY2UgPT5cbiAgICAgICAgICB0aGlzLl9tYWtlRW1iYXNzeVNldHRpbmcoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnJhY2VzW3JhY2UubmFtZV0sXG4gICAgICAgICAgICBsb2NhbGUuc2VsZWN0ZWQsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIHJhY2UudGl0bGUsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3RSYWNlcyk7XG4gIH1cblxuICBwcml2YXRlIF9tYWtlRW1iYXNzeVNldHRpbmcoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBvcHRpb246IFNldHRpbmdNYXgsXG4gICAgbG9jYWxlOiBTdXBwb3J0ZWRMb2NhbGUsXG4gICAgc2VjdGlvblNldHRpbmc6IEVtYmFzc3lTZXR0aW5ncyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBvblNldE1heCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5wcm9tcHQuYWJzb2x1dGVcIiksXG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmJ1aWxkLnByb21wdFwiLCBbXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgcGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCwgbG9jYWxlKSxcbiAgICAgICAgXSksXG4gICAgICAgIHBhcmVudC5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgpLFxuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5idWlsZC5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICApO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBvcHRpb24ubWF4ID0gLTE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICBvcHRpb24uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvcHRpb24ubWF4ID0gcGFyZW50Lmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gb3B0aW9uLm1heDtcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nTWF4TGlzdEl0ZW0ocGFyZW50LCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBvbkNoZWNrOiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICBpZiAob3B0aW9uLm1heCA9PT0gMCAmJiAhaXNCYXRjaFByb2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gb25TZXRNYXgoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCBvcHRpb24ubWF4ID09PSAtMTtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgb3B0aW9uLm1heCA9PT0gMDtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2hNYXg6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24udXBkYXRlTGFiZWwocGFyZW50Lmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCkpO1xuICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi5lbGVtZW50WzBdLnRpdGxlID1cbiAgICAgICAgICBvcHRpb24ubWF4IDwgMFxuICAgICAgICAgICAgPyBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5lbWJhc3N5LnRpdGxlSW5maW5pdGVcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgIDogb3B0aW9uLm1heCA9PT0gMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmVtYmFzc3kudGl0bGVaZXJvXCIsIFtsYWJlbF0pXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXguZW1iYXNzeS50aXRsZVwiLCBbXG4gICAgICAgICAgICAgICAgICBwYXJlbnQuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIG9uU2V0TWF4LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgZWxlbWVudC5tYXhCdXR0b24uZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNCdXR0b24ubGFzdEhlYWRBY3Rpb24pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG59XG4iLCJpbXBvcnQgeyBpc05pbCB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZGF0YS9uaWwuanNcIjtcbmltcG9ydCB0eXBlIHsgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4uL0VuZ2luZS5qc1wiO1xuaW1wb3J0IHR5cGUge1xuICBTZXR0aW5nQnV5U2VsbFRocmVzaG9sZCxcbiAgU2V0dGluZ0xpbWl0ZWRUcmlnZ2VyLFxuICBTZXR0aW5nT3B0aW9ucyxcbiAgU2V0dGluZ1RyaWdnZXIsXG59IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFkZVNldHRpbmdzLCBUcmFkZVNldHRpbmdzSXRlbSB9IGZyb20gXCIuLi9zZXR0aW5ncy9UcmFkZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyB1Y2ZpcnN0IH0gZnJvbSBcIi4uL3Rvb2xzL0Zvcm1hdC5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBCdXlCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2J1dHRvbnMtdGV4dC9CdXlCdXR0b24uanNcIjtcbmltcG9ydCB7IFNlbGxCdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2J1dHRvbnMtdGV4dC9TZWxsQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHsgSGVhZGVyTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL0hlYWRlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZWFzb25zTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2Vhc29uc0xpc3QuanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgRW1iYXNzeVNldHRpbmdzVWkgfSBmcm9tIFwiLi9FbWJhc3N5U2V0dGluZ3NVaS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVHJhZGVTZXR0aW5nc1VpIGV4dGVuZHMgU2V0dGluZ3NQYW5lbDxUcmFkZVNldHRpbmdzLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPiB7XG4gIHByaXZhdGUgX3JhY2VQYW5lbHM6IEFycmF5PFNldHRpbmdzUGFuZWw8U2V0dGluZ0xpbWl0ZWRUcmlnZ2VyLCBTZXR0aW5nTGltaXRlZFRyaWdnZXJMaXN0SXRlbT4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFRyYWRlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtUcmFkZVNldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJhZGVcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXIoKSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvblwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5yYWNlcykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPCAwKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuX3JhY2VQYW5lbHMpLnNvbWUoXG4gICAgICAgICAgICAgIF8gPT4gXy5leHBhbmRvLmluZWZmZWN0aXZlIHx8IF8uc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLl9yYWNlUGFuZWxzID0gdGhpcy5ob3N0LmdhbWUuZGlwbG9tYWN5LnJhY2VzXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5yYWNlc1tpdGVtLm5hbWVdKSlcbiAgICAgIC5tYXAocmFjZSA9PlxuICAgICAgICB0aGlzLl9nZXRUcmFkZU9wdGlvbihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuc2V0dGluZy5yYWNlc1tyYWNlLm5hbWVdLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICByYWNlLnRpdGxlLFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgIHJhY2UubmFtZSA9PT0gdGhpcy5ob3N0LmdhbWUuZGlwbG9tYWN5LnJhY2VzLmF0KC0yKT8ubmFtZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgY29uc3QgbGlzdFJhY2VzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgfSkuYWRkQ2hpbGRyZW4odGhpcy5fcmFjZVBhbmVscyk7XG5cbiAgICBsaXN0UmFjZXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLnNldHRpbmcuZmVlZExldmlhdGhhbnMsXG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5hdXRvZmVlZFwiKSxcbiAgICAgICAge1xuICAgICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5hdXRvZmVlZFwiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmF1dG9mZWVkXCIpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGxpc3RSYWNlcy5hZGRDaGlsZChcbiAgICAgIG5ldyBTZXR0aW5nc1BhbmVsPFNldHRpbmdCdXlTZWxsVGhyZXNob2xkLCBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtPihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLFxuICAgICAgICBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuc2V0dGluZy50cmFkZUJsYWNrY29pbixcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmNyeXB0b1wiKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmNyeXB0b1wiKSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25SZWZyZXNoUmVxdWVzdCgpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIXRoaXMuc2V0dGluZy5lbmFibGVkIHx8IHRoaXMuc2V0dGluZy50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5jcnlwdG8ucHJvbXB0VGl0bGVcIiksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5jcnlwdG8ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZSh0aGlzLnNldHRpbmcudHJhZGVCbGFja2NvaW4udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUodGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLnRyaWdnZXIpLFxuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuY3J5cHRvLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuc2V0dGluZy50cmFkZUJsYWNrY29pbi50cmlnZ2VyID1cbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QucGFyc2VBYnNvbHV0ZSh2YWx1ZSkgPz8gdGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLnRyaWdnZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5jcnlwdG9cIiksXG4gICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKS5hZGRDaGlsZHJlbkNvbnRlbnQoW1xuICAgICAgICBuZXcgQnV5QnV0dG9uKHRoaXMsIHRoaXMuc2V0dGluZy50cmFkZUJsYWNrY29pbiwgbG9jYWxlKSxcbiAgICAgICAgbmV3IFNlbGxCdXR0b24odGhpcywgdGhpcy5zZXR0aW5nLnRyYWRlQmxhY2tjb2luLCBsb2NhbGUpLFxuICAgICAgXSksXG4gICAgKTtcbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChsaXN0UmFjZXMpO1xuXG4gICAgY29uc3QgbGlzdEFkZGl0aW9uID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgfSk7XG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKG5ldyBIZWFkZXJMaXN0SXRlbSh0aGlzLCB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5hZGRpdGlvbmFsXCIpKSk7XG5cbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQoXG4gICAgICBuZXcgRW1iYXNzeVNldHRpbmdzVWkodGhpcywgdGhpcy5zZXR0aW5nLmJ1aWxkRW1iYXNzaWVzLCBsb2NhbGUsIHNldHRpbmdzKSxcbiAgICApO1xuXG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKFxuICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5zZXR0aW5nLnVubG9ja1JhY2VzLFxuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS51cGdyYWRlLnJhY2VzXCIpLFxuICAgICAgICB7XG4gICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS5yYWNlc1wiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS5yYWNlc1wiKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEFkZGl0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFRyYWRlT3B0aW9uKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgb3B0aW9uOiBUcmFkZVNldHRpbmdzSXRlbSxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgc2VjdGlvblNldHRpbmc6IFNldHRpbmdUcmlnZ2VyLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgc2VjdGlvbkxhYmVsOiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyID0gZmFsc2UsXG4gICAgdXBncmFkZUluZGljYXRvciA9IGZhbHNlLFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgb3B0aW9uLCBsb2NhbGUsIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgfSxcbiAgICAgIG9uTGltaXRlZENoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInRyYWRlLmxpbWl0ZWRcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25MaW1pdGVkVW5DaGVjazogKCkgPT4ge1xuICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0cmFkZS51bmxpbWl0ZWRcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICA/IHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgID8gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24uYmxvY2tlZFwiLCBbc2VjdGlvbkxhYmVsXSlcbiAgICAgICAgICAgICAgOiBgJHtwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3BhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluaGVyaXRlZFwiKX0pYFxuICAgICAgICAgICAgOiBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICBdKTtcbiAgICAgIH0sXG4gICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgIT09IC0xXG4gICAgICAgICAgICAgID8gcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICA6IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluaGVyaXRlZFwiKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBvcHRpb24udHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24udHJpZ2dlciA9IHBhcmVudC5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgIH0sXG4gICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgdXBncmFkZUluZGljYXRvcixcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhbmVsID0gbmV3IFNldHRpbmdzUGFuZWwocGFyZW50LCBvcHRpb24sIGVsZW1lbnQsIHtcbiAgICAgIG9uUmVmcmVzaFJlcXVlc3Q6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5saW1pdGVkQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8ICFvcHRpb24ubGltaXRlZDtcblxuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICBvcHRpb24uZW5hYmxlZCAmJlxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLnRyaWdnZXIgPT09IC0xICYmXG4gICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuXG4gICAgICAgIHBhbmVsLmV4cGFuZG8uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgIHNlY3Rpb25TZXR0aW5nLmVuYWJsZWQgJiZcbiAgICAgICAgICBvcHRpb24uZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy5hdXR1bW4uZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy5zcHJpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy5zdW1tZXIuZW5hYmxlZCAmJlxuICAgICAgICAgICFvcHRpb24uc2Vhc29ucy53aW50ZXIuZW5hYmxlZDtcbiAgICAgIH0sXG4gICAgfSkuYWRkQ2hpbGRDb250ZW50KFxuICAgICAgbmV3IFNlYXNvbnNMaXN0KHBhcmVudCwgb3B0aW9uLnNlYXNvbnMsIHtcbiAgICAgICAgb25DaGVja1NlYXNvbjogKGxhYmVsU2Vhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJ0cmFkZS5zZWFzb24uZW5hYmxlXCIsIFt1Y2ZpcnN0KGxhYmVsKSwgbGFiZWxTZWFzb25dKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrU2Vhc29uOiAobGFiZWxTZWFzb246IHN0cmluZykgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInRyYWRlLnNlYXNvbi5kaXNhYmxlXCIsIFt1Y2ZpcnN0KGxhYmVsKSwgbGFiZWxTZWFzb25dKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdNYXgsIFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFZpbGxhZ2VTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9WaWxsYWdlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHN0eWxlc0J1dHRvbiBmcm9tIFwiLi9jb21wb25lbnRzL0J1dHRvbi5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9jb21wb25lbnRzL0NvbnRhaW5lci5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IEhlYWRlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9IZWFkZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IE9wdGlvbnNMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvT3B0aW9uc0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0gfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ01heExpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nTWF4TGlzdEl0ZW0uanNcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVmlsbGFnZVNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFZpbGxhZ2VTZXR0aW5ncz4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9odW50OiBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mZXN0aXZhbHM6IFNldHRpbmdMaXN0SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvbW90ZUtpdHRlbnM6IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW07XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21vdGVMZWFkZXI6IFNldHRpbmdMaXN0SXRlbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWxlY3RMZWFkZXI6IFNldHRpbmdMaXN0SXRlbTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBWaWxsYWdlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtWaWxsYWdlU2V0dGluZ3NVaS5uYW1lfWApKTtcblxuICAgIGNvbnN0IGxhYmVsID0gcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5kaXN0cmlidXRlXCIpO1xuICAgIHN1cGVyKFxuICAgICAgcGFyZW50LFxuICAgICAgc2V0dGluZ3MsXG4gICAgICBuZXcgU2V0dGluZ0xpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZW5hYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6IChfaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgcGFyZW50Lmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmF1dG8uZGlzYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLmFkZENoaWxkcmVuSGVhZChbbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KV0pLFxuICAgICAge1xuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5leHBhbmRvLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiYgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5qb2JzKS5zb21lKF8gPT4gXy5lbmFibGVkICYmIDAgPT09IF8ubWF4KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IGxpc3RKb2JzID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzKS5hZGRDaGlsZHJlbihcbiAgICAgIHRoaXMuaG9zdC5nYW1lLnZpbGxhZ2Uuam9ic1xuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gIWlzTmlsKHRoaXMuc2V0dGluZy5qb2JzW2l0ZW0ubmFtZV0pKVxuICAgICAgICAubWFwKGpvYiA9PlxuICAgICAgICAgIHRoaXMuX2dldERpc3RyaWJ1dGVPcHRpb24oXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuam9ic1tqb2IubmFtZV0sXG4gICAgICAgICAgICBsb2NhbGUuc2VsZWN0ZWQsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIGpvYi50aXRsZSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdEpvYnMpO1xuXG4gICAgY29uc3QgbGlzdEFkZGl0aW9uID0gbmV3IFNldHRpbmdzTGlzdCh0aGlzLCB7XG4gICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgIGhhc0VuYWJsZUFsbDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQobmV3IEhlYWRlckxpc3RJdGVtKHRoaXMsIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLmFkZGl0aW9uYWxcIikpKTtcblxuICAgIHRoaXMuX2h1bnQgPSBuZXcgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNldHRpbmcuaHVudCxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5odW50XCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFt0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uaHVudFwiKV0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hSZXF1ZXN0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faHVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIXRoaXMuc2V0dGluZy5odW50LmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5faHVudC50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5lbmFibGVkICYmIHRoaXMuc2V0dGluZy5odW50LmVuYWJsZWQgJiYgdGhpcy5zZXR0aW5nLmh1bnQudHJpZ2dlciA9PT0gLTE7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5odW50LnByb21wdFwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZy5odW50LnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHRoaXMuc2V0dGluZy5odW50LnRyaWdnZXIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5odW50LnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldHRpbmcuaHVudC50cmlnZ2VyID0gdGhpcy5ob3N0LnBhcnNlUGVyY2VudGFnZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW3RoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5odW50XCIpXSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5faHVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5faHVudCk7XG5cbiAgICB0aGlzLl9mZXN0aXZhbHMgPSBuZXcgU2V0dGluZ0xpc3RJdGVtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5ob2xkRmVzdGl2YWxzLFxuICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmZlc3RpdmFsXCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5mZXN0aXZhbFwiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZmVzdGl2YWxcIiksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKHRoaXMuX2Zlc3RpdmFscyk7XG5cbiAgICB0aGlzLl9wcm9tb3RlS2l0dGVucyA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2V0dGluZy5wcm9tb3RlS2l0dGVucyxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5wcm9tb3Rla2l0dGVuc1wiKSxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ucHJvbW90ZWtpdHRlbnNcIiksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3Byb21vdGVLaXR0ZW5zLnRyaWdnZXJCdXR0b24uaW5hY3RpdmUgPSAhdGhpcy5zZXR0aW5nLnByb21vdGVLaXR0ZW5zLmVuYWJsZWQ7XG4gICAgICAgICAgdGhpcy5fcHJvbW90ZUtpdHRlbnMudHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuZW5hYmxlZCAmJlxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnByb21vdGVLaXR0ZW5zLmVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wcm9tb3RlS2l0dGVucy50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbW90ZUtpdHRlbnMucHJvbXB0VGl0bGVcIiksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21vdGVLaXR0ZW5zLnByb21wdFwiLCBbXG4gICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wcm9tb3RlS2l0dGVucy50cmlnZ2VyLFxuICAgICAgICAgICAgICAgIGxvY2FsZS5zZWxlY3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZSh0aGlzLnNldHRpbmcucHJvbW90ZUtpdHRlbnMudHJpZ2dlciksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21vdGVLaXR0ZW5zLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnNldHRpbmcucHJvbW90ZUtpdHRlbnMudHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5wcm9tb3Rla2l0dGVuc1wiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9wcm9tb3RlS2l0dGVucy50cmlnZ2VyQnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5fcHJvbW90ZUtpdHRlbnMpO1xuXG4gICAgdGhpcy5fcHJvbW90ZUxlYWRlciA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLnByb21vdGVMZWFkZXIsXG4gICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ucHJvbW90ZVwiKSxcbiAgICAgIHtcbiAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnByb21vdGVcIildKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24ucHJvbW90ZVwiKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBsaXN0QWRkaXRpb24uYWRkQ2hpbGQodGhpcy5fcHJvbW90ZUxlYWRlcik7XG5cbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLnNldHRpbmcuZWxlY3RMZWFkZXIuam9iLm9wdGlvbnMpIHtcbiAgICAgIGlmIChvcHRpb24udmFsdWUgPT09IFwiYW55XCIpIHtcbiAgICAgICAgb3B0aW9uLmxhYmVsID0gdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0LmpvYi5hbnlcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb24ubGFiZWwgPSB0aGlzLmhvc3QuZW5naW5lLmkxOG4oYCR2aWxsYWdlLmpvYi4ke29wdGlvbi52YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiB0aGlzLnNldHRpbmcuZWxlY3RMZWFkZXIudHJhaXQub3B0aW9ucykge1xuICAgICAgb3B0aW9uLmxhYmVsID0gdGhpcy5ob3N0LmVuZ2luZS5pMThuKGAkdmlsbGFnZS50cmFpdC4ke29wdGlvbi52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVjdExlYWRlciA9IG5ldyBTZXR0aW5nTGlzdEl0ZW0oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXR0aW5nLmVsZWN0TGVhZGVyLFxuICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0XCIpLFxuICAgICAge1xuICAgICAgICBvbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZW5hYmxlXCIsIFt0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZWxlY3RcIildKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5zdWIuZGlzYWJsZVwiLCBbdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0XCIpXSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICkuYWRkQ2hpbGRyZW4oW1xuICAgICAgbmV3IE9wdGlvbnNMaXN0SXRlbShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLmVsZWN0LmpvYlwiKSxcbiAgICAgICAgdGhpcy5zZXR0aW5nLmVsZWN0TGVhZGVyLmpvYixcbiAgICAgICksXG4gICAgICBuZXcgT3B0aW9uc0xpc3RJdGVtKFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uZWxlY3QudHJhaXRcIiksXG4gICAgICAgIHRoaXMuc2V0dGluZy5lbGVjdExlYWRlci50cmFpdCxcbiAgICAgICksXG4gICAgXSk7XG4gICAgbGlzdEFkZGl0aW9uLmFkZENoaWxkKHRoaXMuX2VsZWN0TGVhZGVyKTtcblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KGxpc3RBZGRpdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9nZXREaXN0cmlidXRlT3B0aW9uKFxuICAgIG9wdGlvbjogU2V0dGluZ01heCxcbiAgICBsb2NhbGU6IFN1cHBvcnRlZExvY2FsZSxcbiAgICBzZWN0aW9uU2V0dGluZzogVmlsbGFnZVNldHRpbmdzLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZGVsaW1pdGVyID0gZmFsc2UsXG4gICkge1xuICAgIGNvbnN0IG9uU2V0TWF4ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXguZGlzdHJpYnV0ZS5wcm9tcHRcIiwgW2xhYmVsXSksXG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICB0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCwgbG9jYWxlKSxcbiAgICAgICAgXSksXG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmRpc3RyaWJ1dGUucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgb3B0aW9uLm1heCA9IC0xO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gXCIwXCIpIHtcbiAgICAgICAgb3B0aW9uLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uLm1heCA9IHRoaXMuaG9zdC5wYXJzZUFic29sdXRlKHZhbHVlKSA/PyBvcHRpb24ubWF4O1xuICAgIH07XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3IFNldHRpbmdNYXhMaXN0SXRlbSh0aGlzLCBvcHRpb24sIGxhYmVsLCB7XG4gICAgICBkZWxpbWl0ZXIsXG4gICAgICBvbkNoZWNrOiAoaXNCYXRjaFByb2Nlc3M/OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgaWYgKG9wdGlvbi5tYXggPT09IDAgJiYgIWlzQmF0Y2hQcm9jZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIG9uU2V0TWF4KCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLm1heCA9PT0gLTE7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICBzZWN0aW9uU2V0dGluZy5lbmFibGVkICYmIG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5tYXggPT09IDA7XG4gICAgICB9LFxuICAgICAgb25SZWZyZXNoTWF4OiAoKSA9PiB7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLnVwZGF0ZUxhYmVsKHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSk7XG4gICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPVxuICAgICAgICAgIG9wdGlvbi5tYXggPCAwXG4gICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnRpdGxlSW5maW5pdGVcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgIDogb3B0aW9uLm1heCA9PT0gMFxuICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnRpdGxlWmVyb1wiLCBbbGFiZWxdKVxuICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5kaXN0cmlidXRlLnRpdGxlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgfSxcbiAgICAgIG9uU2V0TWF4LFxuICAgICAgb25VbkNoZWNrOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGVsZW1lbnQubWF4QnV0dG9uLmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENyYWZ0U2V0dGluZ3NJdGVtIH0gZnJvbSBcIi4uLy4uL3NldHRpbmdzL1dvcmtzaG9wU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vQnV0dG9uLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IExpbWl0ZWRCdXR0b24gfSBmcm9tIFwiLi9idXR0b25zL0xpbWl0ZWRCdXR0b24uanNcIjtcbmltcG9ydCB7IE1heEJ1dHRvbiB9IGZyb20gXCIuL2J1dHRvbnMvTWF4QnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBUcmlnZ2VyQnV0dG9uIH0gZnJvbSBcIi4vYnV0dG9ucy9UcmlnZ2VyQnV0dG9uLmpzXCI7XG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tIFwiLi9Db250YWluZXIuanNcIjtcbmltcG9ydCBzdHlsZXNMYWJlbExpc3RJdGVtIGZyb20gXCIuL0xhYmVsTGlzdEl0ZW0ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlc0xpc3RJdGVtIGZyb20gXCIuL0xpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnMgfSBmcm9tIFwiLi9TZXR0aW5nTGltaXRlZExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nTGlzdEl0ZW0sIHR5cGUgU2V0dGluZ0xpc3RJdGVtT3B0aW9ucyB9IGZyb20gXCIuL1NldHRpbmdMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ01heExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW1PcHRpb25zIH0gZnJvbSBcIi4vU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL1VpQ29tcG9uZW50LmpzXCI7XG5cbmV4cG9ydCB0eXBlIFdvcmtzaG9wQ3JhZnRMaXN0SXRlbU9wdGlvbnMgPSBTZXR0aW5nTGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbU9wdGlvbnMgJlxuICBTZXR0aW5nTWF4TGlzdEl0ZW1PcHRpb25zICZcbiAgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbU9wdGlvbnMgJlxuICBUaGlzVHlwZTxXb3Jrc2hvcENyYWZ0TGlzdEl0ZW0+O1xuXG5leHBvcnQgY2xhc3MgV29ya3Nob3BDcmFmdExpc3RJdGVtIGV4dGVuZHMgU2V0dGluZ0xpc3RJdGVtPENyYWZ0U2V0dGluZ3NJdGVtPiB7XG4gIGRlY2xhcmUgcmVhZG9ubHkgb3B0aW9uczogV29ya3Nob3BDcmFmdExpc3RJdGVtT3B0aW9ucztcbiAgcmVhZG9ubHkgbGltaXRlZEJ1dHRvbjogTGltaXRlZEJ1dHRvbjtcbiAgcmVhZG9ubHkgbWF4QnV0dG9uOiBNYXhCdXR0b247XG4gIHJlYWRvbmx5IHRyaWdnZXJCdXR0b246IFRyaWdnZXJCdXR0b247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50OiBVaUNvbXBvbmVudCxcbiAgICBzZXR0aW5nOiBDcmFmdFNldHRpbmdzSXRlbSxcbiAgICBsb2NhbGU6IFNldHRpbmdPcHRpb25zPFN1cHBvcnRlZExvY2FsZT4sXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBXb3Jrc2hvcENyYWZ0TGlzdEl0ZW1PcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihwYXJlbnQsIHNldHRpbmcsIGxhYmVsLCBvcHRpb25zKTtcblxuICAgIHRoaXMubGltaXRlZEJ1dHRvbiA9IG5ldyBMaW1pdGVkQnV0dG9uKHBhcmVudCwgc2V0dGluZywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNsYXNzZXM6IFtzdHlsZXNMaXN0SXRlbS5oZWFkQWN0aW9uXSxcbiAgICB9KTtcblxuICAgIHRoaXMubWF4QnV0dG9uID0gbmV3IE1heEJ1dHRvbihwYXJlbnQsIHNldHRpbmcsIHtcbiAgICAgIGFsaWdubWVudDogXCJyaWdodFwiLFxuICAgICAgYm9yZGVyOiBmYWxzZSxcbiAgICAgIGNsYXNzZXM6IFtzdHlsZXNCdXR0b24uaGVhZEFjdGlvbl0sXG4gICAgICBvbkNsaWNrOiAoKSA9PiBvcHRpb25zLm9uU2V0TWF4LmNhbGwodGhpcyksXG4gICAgICBvblJlZnJlc2g6IG9wdGlvbnM/Lm9uUmVmcmVzaE1heCA/ICgpID0+IG9wdGlvbnMub25SZWZyZXNoTWF4Py5jYWxsKHRoaXMpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uID0gbmV3IFRyaWdnZXJCdXR0b24ocGFyZW50LCBzZXR0aW5nLCBsb2NhbGUsIHtcbiAgICAgIGJvcmRlcjogZmFsc2UsXG4gICAgICBjbGFzc2VzOiBbc3R5bGVzQnV0dG9uLmxhc3RIZWFkQWN0aW9uXSxcbiAgICAgIG9uQ2xpY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5vblNldFRyaWdnZXIuY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBvblJlZnJlc2g6IG9wdGlvbnM/Lm9uUmVmcmVzaFRyaWdnZXIgPyAoKSA9PiBvcHRpb25zLm9uUmVmcmVzaFRyaWdnZXI/LmNhbGwodGhpcykgOiB1bmRlZmluZWQsXG4gICAgICByZW5kZXJMYWJlbDogb3B0aW9ucz8ucmVuZGVyTGFiZWxUcmlnZ2VyID8/IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5hZGRDaGlsZHJlbkhlYWQoW1xuICAgICAgbmV3IENvbnRhaW5lcihwYXJlbnQsIHsgY2xhc3NlczogW3N0eWxlc0xhYmVsTGlzdEl0ZW0uZmlsbFNwYWNlXSB9KSxcbiAgICAgIHRoaXMubGltaXRlZEJ1dHRvbixcbiAgICAgIHRoaXMubWF4QnV0dG9uLFxuICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLFxuICAgIF0pO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFske1dvcmtzaG9wQ3JhZnRMaXN0SXRlbS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzTmlsIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9kYXRhL25pbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTdXBwb3J0ZWRMb2NhbGUgfSBmcm9tIFwiLi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdPcHRpb25zIH0gZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVwZ3JhZGVTZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5ncy9VcGdyYWRlU2V0dGluZ3MuanNcIjtcbmltcG9ydCBzdHlsZXNCdXR0b24gZnJvbSBcIi4vY29tcG9uZW50cy9CdXR0b24ubW9kdWxlLmNzc1wiO1xuaW1wb3J0IHN0eWxlc0RlbGltaXRlciBmcm9tIFwiLi9jb21wb25lbnRzL0RlbGltaXRlci5tb2R1bGUuY3NzXCI7XG5pbXBvcnQgeyBEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzL0RpYWxvZy5qc1wiO1xuaW1wb3J0IHN0eWxlc0xhYmVsTGlzdEl0ZW0gZnJvbSBcIi4vY29tcG9uZW50cy9MYWJlbExpc3RJdGVtLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFNldHRpbmdzTGlzdCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NMaXN0LmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nc1BhbmVsLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtIH0gZnJvbSBcIi4vY29tcG9uZW50cy9TZXR0aW5nVHJpZ2dlckxpc3RJdGVtLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVXBncmFkZVNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFVwZ3JhZGVTZXR0aW5ncywgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbT4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJlbnQ6IFVpQ29tcG9uZW50LFxuICAgIHNldHRpbmdzOiBVcGdyYWRlU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudXBncmFkZS51cGdyYWRlc1wiKTtcbiAgICBzdXBlcihcbiAgICAgIHBhcmVudCxcbiAgICAgIHNldHRpbmdzLFxuICAgICAgbmV3IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0ocGFyZW50LCBzZXR0aW5ncywgbG9jYWxlLCBsYWJlbCwge1xuICAgICAgICBvbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmVuYWJsZVwiLCBbbGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoVHJpZ2dlcigpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlclwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID09PSAtMVxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy51cGdyYWRlcykuc29tZShfID0+IF8uZW5hYmxlZCAmJiBfLnRyaWdnZXIgPCAwKTtcblxuICAgICAgICAgIHRoaXMuZXhwYW5kby5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmICFPYmplY3QudmFsdWVzKHNldHRpbmdzLnVwZ3JhZGVzKS5zb21lKF8gPT4gXy5lbmFibGVkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZ3JhZGVzID0gdGhpcy5ob3N0LmdhbWUud29ya3Nob3AudXBncmFkZXMuZmlsdGVyKFxuICAgICAgdXBncmFkZSA9PiAhaXNOaWwodGhpcy5zZXR0aW5nLnVwZ3JhZGVzW3VwZ3JhZGUubmFtZV0pLFxuICAgICk7XG5cbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGxldCBsYXN0TGFiZWwgPSB1cGdyYWRlc1swXS5sYWJlbDtcbiAgICBsZXQgbGFzdEVsZW1lbnQ6IFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCB1cGdyYWRlIG9mIHVwZ3JhZGVzLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbCwgbG9jYWxlLnNlbGVjdGVkKSxcbiAgICApKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLnNldHRpbmcudXBncmFkZXNbdXBncmFkZS5uYW1lXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHRoaXMsIG9wdGlvbiwgbG9jYWxlLCB1cGdyYWRlLmxhYmVsLCB7XG4gICAgICAgIG9uQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW3VwZ3JhZGUubGFiZWxdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCBvcHRpb24udHJpZ2dlciA9PT0gLTE7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluZWZmZWN0aXZlID1cbiAgICAgICAgICAgIHNldHRpbmdzLmVuYWJsZWQgJiYgb3B0aW9uLmVuYWJsZWQgJiYgc2V0dGluZ3MudHJpZ2dlciA9PT0gLTEgJiYgb3B0aW9uLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyXCIsIFtcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHNldHRpbmdzLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLmJsb2NrZWRcIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IGAke3RoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSl9ICgke3RoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRUcmlnZ2VyOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBEaWFsb2cucHJvbXB0KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0XCIsIFtcbiAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIsIGxvY2FsZS5zZWxlY3RlZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5pbmhlcml0ZWRcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIG9wdGlvbi50cmlnZ2VyICE9PSAtMSA/IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyKSA6IFwiXCIsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnNlY3Rpb24ucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFt1cGdyYWRlLmxhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnQudHJpZ2dlckJ1dHRvbi5lbGVtZW50LmFkZENsYXNzKHN0eWxlc0J1dHRvbi5sYXN0SGVhZEFjdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLmhvc3QuZW5naW5lLmxvY2FsZVN1cHBvcnRzRmlyc3RMZXR0ZXJTcGxpdHMobG9jYWxlLnNlbGVjdGVkKSkge1xuICAgICAgICBpZiAobGFzdExhYmVsWzBdICE9PSB1cGdyYWRlLmxhYmVsWzBdKSB7XG4gICAgICAgICAgaWYgKCFpc05pbChsYXN0RWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxhc3RFbGVtZW50LmVsZW1lbnQuYWRkQ2xhc3Moc3R5bGVzRGVsaW1pdGVyLmRlbGltaXRlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQuZWxlbWVudC5hZGRDbGFzcyhzdHlsZXNMYWJlbExpc3RJdGVtLnNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICBpdGVtcy5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICBsYXN0TGFiZWwgPSB1cGdyYWRlLmxhYmVsO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50KG5ldyBTZXR0aW5nc0xpc3QodGhpcykuYWRkQ2hpbGRyZW4oaXRlbXMpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuLi9FbmdpbmUuanNcIjtcbmltcG9ydCB0eXBlIHsgU2V0dGluZ09wdGlvbnMgfSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IHR5cGUgQ3JhZnRTZXR0aW5nc0l0ZW0sIFdvcmtzaG9wU2V0dGluZ3MgfSBmcm9tIFwiLi4vc2V0dGluZ3MvV29ya3Nob3BTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgdWNmaXJzdCB9IGZyb20gXCIuLi90b29scy9Gb3JtYXQuanNcIjtcbmltcG9ydCB7IGNsIH0gZnJvbSBcIi4uL3Rvb2xzL0xvZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUNyYWZ0YWJsZSB9IGZyb20gXCIuLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRGlhbG9nIH0gZnJvbSBcIi4vY29tcG9uZW50cy9EaWFsb2cuanNcIjtcbmltcG9ydCB7IFNldHRpbmdMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ0xpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBTZXR0aW5nc0xpc3QgfSBmcm9tIFwiLi9jb21wb25lbnRzL1NldHRpbmdzTGlzdC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ3NQYW5lbC5qc1wiO1xuaW1wb3J0IHsgU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvU2V0dGluZ1RyaWdnZXJMaXN0SXRlbS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBVaUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudHMvVWlDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFdvcmtzaG9wQ3JhZnRMaXN0SXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvV29ya3Nob3BDcmFmdExpc3RJdGVtLmpzXCI7XG5pbXBvcnQgeyBVcGdyYWRlU2V0dGluZ3NVaSB9IGZyb20gXCIuL1VwZ3JhZGVTZXR0aW5nc1VpLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hvcFNldHRpbmdzVWkgZXh0ZW5kcyBTZXR0aW5nc1BhbmVsPFdvcmtzaG9wU2V0dGluZ3MsIFNldHRpbmdUcmlnZ2VyTGlzdEl0ZW0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3JhZnRzOiBBcnJheTxTZXR0aW5nTGlzdEl0ZW0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhcmVudDogVWlDb21wb25lbnQsXG4gICAgc2V0dGluZ3M6IFdvcmtzaG9wU2V0dGluZ3MsXG4gICAgbG9jYWxlOiBTZXR0aW5nT3B0aW9uczxTdXBwb3J0ZWRMb2NhbGU+LFxuICApIHtcbiAgICBjb25zb2xlLmRlYnVnKC4uLmNsKGBDb25zdHJ1Y3RpbmcgJHtXb3Jrc2hvcFNldHRpbmdzVWkubmFtZX1gKSk7XG5cbiAgICBjb25zdCBsYWJlbCA9IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkuY3JhZnRcIik7XG4gICAgc3VwZXIoXG4gICAgICBwYXJlbnQsXG4gICAgICBzZXR0aW5ncyxcbiAgICAgIG5ldyBTZXR0aW5nVHJpZ2dlckxpc3RJdGVtKHBhcmVudCwgc2V0dGluZ3MsIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgb25DaGVjazogKF9pc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuYXV0by5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXIoKSB7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyQnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPSBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvblwiLCBbXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMFxuICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLmluYWN0aXZlXCIpXG4gICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QucmVuZGVyUGVyY2VudGFnZShzZXR0aW5ncy50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblNldFRyaWdnZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IERpYWxvZy5wcm9tcHQoXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIucHJvbXB0LnBlcmNlbnRhZ2VcIiksXG4gICAgICAgICAgICBwYXJlbnQuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuc2VjdGlvbi5wcm9tcHRcIiwgW1xuICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHBhcmVudC5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKVxuICAgICAgICAgICAgICAgIDogcGFyZW50Lmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5pbmZpbml0eVwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgc2V0dGluZ3MudHJpZ2dlciAhPT0gLTEgPyBwYXJlbnQuaG9zdC5yZW5kZXJQZXJjZW50YWdlKHNldHRpbmdzLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdEV4cGxhaW5lclwiKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgIHNldHRpbmdzLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyID0gcGFyZW50Lmhvc3QucGFyc2VQZXJjZW50YWdlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VbkNoZWNrOiAoX2lzQmF0Y2hQcm9jZXNzPzogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHBhcmVudC5ob3N0LmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5hdXRvLmRpc2FibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlckxhYmVsVHJpZ2dlcjogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmFjdGl2ZSA9ICFzZXR0aW5ncy5lbmFibGVkIHx8IHNldHRpbmdzLnRyaWdnZXIgPT09IC0xO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ0l0ZW0udHJpZ2dlckJ1dHRvbi5pbmVmZmVjdGl2ZSA9XG4gICAgICAgICAgICBzZXR0aW5ncy5lbmFibGVkICYmXG4gICAgICAgICAgICBzZXR0aW5ncy50cmlnZ2VyIDwgMCAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzZXR0aW5ncy5yZXNvdXJjZXMpLnNvbWUoXyA9PiBfLmVuYWJsZWQgJiYgMCAhPT0gXy5tYXggJiYgXy50cmlnZ2VyIDwgMCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBsZXQgZXhjbHVkZUNyYWZ0c0FycmF5OiBBcnJheTxSZXNvdXJjZUNyYWZ0YWJsZT4gPSBbXTtcbiAgICBpZiAoIWdhbWUuY2hhbGxlbmdlcy5nZXRDaGFsbGVuZ2UoXCJpcm9uV2lsbFwiKS5hY3RpdmUpIHtcbiAgICAgIHRoaXMuc2V0dGluZy5yZXNvdXJjZXMuYmxvb2RzdG9uZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldHRpbmcucmVzb3VyY2VzLnRNeXRocmlsLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGV4Y2x1ZGVDcmFmdHNBcnJheSA9IFtcImJsb29kc3RvbmVcIiwgXCJ0TXl0aHJpbFwiXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVwYXJlZENyYWZ0czogQXJyYXk8W0NyYWZ0U2V0dGluZ3NJdGVtLCBzdHJpbmddPiA9IHRoaXMuaG9zdC5nYW1lLndvcmtzaG9wLmNyYWZ0c1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgaXRlbSA9PlxuICAgICAgICAgICFleGNsdWRlQ3JhZnRzQXJyYXkuaW5jbHVkZXMoaXRlbS5uYW1lKSAmJiAhaXNOaWwodGhpcy5zZXR0aW5nLnJlc291cmNlc1tpdGVtLm5hbWVdKSxcbiAgICAgIClcbiAgICAgIC5tYXAocmVzb3VyY2UgPT4gW3RoaXMuc2V0dGluZy5yZXNvdXJjZXNbcmVzb3VyY2UubmFtZV0sIHVjZmlyc3QocmVzb3VyY2UubGFiZWwpXSk7XG5cbiAgICB0aGlzLl9jcmFmdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtvcHRpb24sIGxhYmVsXSBvZiBwcmVwYXJlZENyYWZ0cykge1xuICAgICAgY29uc3Qgb25TZXRNYXggPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC5wcm9tcHRcIiwgW2xhYmVsXSksXG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkubWF4LmNyYWZ0LnByb21wdFRpdGxlXCIsIFtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgsIGxvY2FsZS5zZWxlY3RlZCksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgdGhpcy5ob3N0LnJlbmRlckFic29sdXRlKG9wdGlvbi5tYXgpLFxuICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC5wcm9tcHRFeHBsYWluZXJcIiksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBvcHRpb24ubWF4ID0gLTE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBcIjBcIikge1xuICAgICAgICAgIG9wdGlvbi5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24ubWF4ID0gdGhpcy5ob3N0LnBhcnNlQWJzb2x1dGUodmFsdWUpID8/IG9wdGlvbi5tYXg7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3IFdvcmtzaG9wQ3JhZnRMaXN0SXRlbSh0aGlzLCBvcHRpb24sIGxvY2FsZSwgbGFiZWwsIHtcbiAgICAgICAgZGVsaW1pdGVyOiBvcHRpb24ucmVzb3VyY2UgPT09IFwia2Vyb3NlbmVcIiB8fCBvcHRpb24ucmVzb3VyY2UgPT09IFwiYmx1ZXByaW50XCIsXG4gICAgICAgIG9uQ2hlY2s6IChpc0JhdGNoUHJvY2Vzcz86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5lbmFibGVcIiwgW2xhYmVsXSk7XG4gICAgICAgICAgaWYgKG9wdGlvbi5tYXggPT09IDAgJiYgIWlzQmF0Y2hQcm9jZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gb25TZXRNYXgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uTGltaXRlZENoZWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pbWVzc2FnZShcImNyYWZ0LmxpbWl0ZWRcIiwgW2xhYmVsXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTGltaXRlZFVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwiY3JhZnQudW5saW1pdGVkXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICBvblJlZnJlc2hNYXg6ICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50Lm1heEJ1dHRvbi51cGRhdGVMYWJlbCh0aGlzLmhvc3QucmVuZGVyQWJzb2x1dGUob3B0aW9uLm1heCkpO1xuICAgICAgICAgIGVsZW1lbnQubWF4QnV0dG9uLmVsZW1lbnRbMF0udGl0bGUgPVxuICAgICAgICAgICAgb3B0aW9uLm1heCA8IDBcbiAgICAgICAgICAgICAgPyB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS5tYXguY3JhZnQudGl0bGVJbmZpbml0ZVwiLCBbbGFiZWxdKVxuICAgICAgICAgICAgICA6IG9wdGlvbi5tYXggPT09IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC50aXRsZVplcm9cIiwgW2xhYmVsXSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLm1heC5jcmFmdC50aXRsZVwiLCBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5yZW5kZXJBYnNvbHV0ZShvcHRpb24ubWF4KSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZWZyZXNoUmVxdWVzdDogKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQubGltaXRlZEJ1dHRvbi5pbmFjdGl2ZSA9ICFvcHRpb24uZW5hYmxlZCB8fCAhb3B0aW9uLmxpbWl0ZWQ7XG4gICAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5hY3RpdmUgPSAhb3B0aW9uLmVuYWJsZWQgfHwgb3B0aW9uLm1heCA9PT0gLTE7XG4gICAgICAgICAgZWxlbWVudC5tYXhCdXR0b24uaW5lZmZlY3RpdmUgPSBzZXR0aW5ncy5lbmFibGVkICYmIG9wdGlvbi5lbmFibGVkICYmIG9wdGlvbi5tYXggPT09IDA7XG4gICAgICAgICAgZWxlbWVudC50cmlnZ2VyQnV0dG9uLmluYWN0aXZlID0gIW9wdGlvbi5lbmFibGVkIHx8IG9wdGlvbi50cmlnZ2VyID09PSAtMTtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uaW5lZmZlY3RpdmUgPVxuICAgICAgICAgICAgc2V0dGluZ3MuZW5hYmxlZCAmJiBvcHRpb24uZW5hYmxlZCAmJiBzZXR0aW5ncy50cmlnZ2VyID09PSAtMSAmJiBvcHRpb24udHJpZ2dlciA9PT0gLTE7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVmcmVzaFRyaWdnZXI6ICgpID0+IHtcbiAgICAgICAgICBlbGVtZW50LnRyaWdnZXJCdXR0b24uZWxlbWVudFswXS50aXRsZSA9IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXJcIiwgW1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPCAwXG4gICAgICAgICAgICAgID8gc2V0dGluZ3MudHJpZ2dlciA8IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQuYmxvY2tlZFwiLCBbbGFiZWxdKVxuICAgICAgICAgICAgICAgIDogYCR7dGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKX0gKCR7dGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5idWlsZC5pbmhlcml0ZWRcIil9KWBcbiAgICAgICAgICAgICAgOiB0aGlzLmhvc3QucmVuZGVyUGVyY2VudGFnZShvcHRpb24udHJpZ2dlciwgbG9jYWxlLnNlbGVjdGVkLCB0cnVlKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25TZXRNYXgsXG4gICAgICAgIG9uU2V0VHJpZ2dlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgRGlhbG9nLnByb21wdChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLnByb21wdC5wZXJjZW50YWdlXCIpLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwidWkudHJpZ2dlci5zZWN0aW9uLnByb21wdFwiLCBbXG4gICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICBvcHRpb24udHJpZ2dlciAhPT0gLTFcbiAgICAgICAgICAgICAgICA/IHRoaXMuaG9zdC5yZW5kZXJQZXJjZW50YWdlKG9wdGlvbi50cmlnZ2VyLCBsb2NhbGUuc2VsZWN0ZWQsIHRydWUpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJ1aS50cmlnZ2VyLmJ1aWxkLmluaGVyaXRlZFwiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgIT09IC0xID8gdGhpcy5ob3N0LnJlbmRlclBlcmNlbnRhZ2Uob3B0aW9uLnRyaWdnZXIpIDogXCJcIixcbiAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcInVpLnRyaWdnZXIuYnVpbGQucHJvbXB0RXhwbGFpbmVyXCIpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgb3B0aW9uLnRyaWdnZXIgPSAtMTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb24udHJpZ2dlciA9IHRoaXMuaG9zdC5wYXJzZVBlcmNlbnRhZ2UodmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtsYWJlbF0pO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJMYWJlbFRyaWdnZXI6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLl9jcmFmdHMucHVzaChlbGVtZW50KTtcblxuICAgICAgaWYgKG9wdGlvbi5yZXNvdXJjZSA9PT0gXCJzaGlwXCIpIHtcbiAgICAgICAgdGhpcy5fY3JhZnRzLnB1c2goXG4gICAgICAgICAgbmV3IFNldHRpbmdMaXN0SXRlbShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuc2hpcE92ZXJyaWRlLFxuICAgICAgICAgICAgdGhpcy5ob3N0LmVuZ2luZS5pMThuKFwib3B0aW9uLnNoaXBPdmVycmlkZVwiKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb25DaGVjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaW1lc3NhZ2UoXCJzdGF0dXMuc3ViLmVuYWJsZVwiLCBbXG4gICAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmkxOG4oXCJvcHRpb24uc2hpcE92ZXJyaWRlXCIpLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvblVuQ2hlY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3QuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLnN1Yi5kaXNhYmxlXCIsIFtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5lbmdpbmUuaTE4bihcIm9wdGlvbi5zaGlwT3ZlcnJpZGVcIiksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHVwZ3JhZGVJbmRpY2F0b3I6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdENyYWZ0cyA9IG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgb25SZXNldDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNldHRpbmcubG9hZCh7IHJlc291cmNlczogbmV3IFdvcmtzaG9wU2V0dGluZ3MoKS5yZXNvdXJjZXMgfSk7XG4gICAgICB9LFxuICAgIH0pLmFkZENoaWxkcmVuKHRoaXMuX2NyYWZ0cyk7XG4gICAgdGhpcy5hZGRDaGlsZENvbnRlbnQobGlzdENyYWZ0cyk7XG5cbiAgICB0aGlzLmFkZENoaWxkQ29udGVudChcbiAgICAgIG5ldyBTZXR0aW5nc0xpc3QodGhpcywge1xuICAgICAgICBoYXNEaXNhYmxlQWxsOiBmYWxzZSxcbiAgICAgICAgaGFzRW5hYmxlQWxsOiBmYWxzZSxcbiAgICAgIH0pLmFkZENoaWxkcmVuKFtuZXcgVXBncmFkZVNldHRpbmdzVWkodGhpcywgdGhpcy5zZXR0aW5nLnVubG9ja1VwZ3JhZGVzLCBsb2NhbGUpXSksXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0TWlsbGlzZWNvbmRzIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9mb3JtYXQvbWlsbGlzZWNvbmRzLmpzXCI7XG5pbXBvcnQgeyBtZWFzdXJlIH0gZnJvbSBcIkBvbGl2ZXJzYWx6YnVyZy9qcy11dGlscy9tZWFzdXJlbWVudC9wZXJmb3JtYW5jZS5qc1wiO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiLi4vaW1hZ2VzL0ljb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi4vS2l0dGVuU2NpZW50aXN0cy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi4vdG9vbHMvTG9nLmpzXCI7XG5pbXBvcnQgeyBVc2VyU2NyaXB0TG9hZGVyIH0gZnJvbSBcIi4uL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IEJvbmZpcmVTZXR0aW5nc1VpIH0gZnJvbSBcIi4vQm9uZmlyZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFVpQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50cy9VaUNvbXBvbmVudC5qc1wiO1xuaW1wb3J0IHsgRW5naW5lU2V0dGluZ3NVaSB9IGZyb20gXCIuL0VuZ2luZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IEludGVybmFsc1VpIH0gZnJvbSBcIi4vSW50ZXJuYWxzVWkuanNcIjtcbmltcG9ydCB7IExvZ0ZpbHRlcnNTZXR0aW5nc1VpIH0gZnJvbSBcIi4vTG9nRmlsdGVyU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgUmVsaWdpb25TZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVsaWdpb25TZXR0aW5nc1VpLmpzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZXNTZXR0aW5nc1VpIH0gZnJvbSBcIi4vUmVzb3VyY2VzU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgU2NpZW5jZVNldHRpbmdzVWkgfSBmcm9tIFwiLi9TY2llbmNlU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHsgU3BhY2VTZXR0aW5nc1VpIH0gZnJvbSBcIi4vU3BhY2VTZXR0aW5nc1VpLmpzXCI7XG5pbXBvcnQgeyBTdGF0ZU1hbmFnZW1lbnRVaSB9IGZyb20gXCIuL1N0YXRlTWFuYWdlbWVudFVpLmpzXCI7XG5pbXBvcnQgeyBUaW1lQ29udHJvbFNldHRpbmdzVWkgfSBmcm9tIFwiLi9UaW1lQ29udHJvbFNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFRpbWVTZXR0aW5nc1VpIH0gZnJvbSBcIi4vVGltZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFRyYWRlU2V0dGluZ3NVaSB9IGZyb20gXCIuL1RyYWRlU2V0dGluZ3NVaS5qc1wiO1xuaW1wb3J0IHN0eWxlcyBmcm9tIFwiLi9Vc2VySW50ZXJmYWNlLm1vZHVsZS5jc3NcIjtcbmltcG9ydCB7IFZpbGxhZ2VTZXR0aW5nc1VpIH0gZnJvbSBcIi4vVmlsbGFnZVNldHRpbmdzVWkuanNcIjtcbmltcG9ydCB7IFdvcmtzaG9wU2V0dGluZ3NVaSB9IGZyb20gXCIuL1dvcmtzaG9wU2V0dGluZ3NVaS5qc1wiO1xuXG5leHBvcnQgY2xhc3MgVXNlckludGVyZmFjZSBleHRlbmRzIFVpQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgc2hvd0FjdGl2aXR5OiBKUXVlcnk7XG5cbiAgcHJpdmF0ZSBfZW5naW5lVWk6IEVuZ2luZVNldHRpbmdzVWk7XG4gIHByaXZhdGUgX3NlY3Rpb25zOiBBcnJheTxcbiAgICB8IEJvbmZpcmVTZXR0aW5nc1VpXG4gICAgfCBTcGFjZVNldHRpbmdzVWlcbiAgICB8IFdvcmtzaG9wU2V0dGluZ3NVaVxuICAgIHwgUmVzb3VyY2VzU2V0dGluZ3NVaVxuICAgIHwgU2NpZW5jZVNldHRpbmdzVWlcbiAgICB8IFRyYWRlU2V0dGluZ3NVaVxuICAgIHwgUmVsaWdpb25TZXR0aW5nc1VpXG4gICAgfCBUaW1lU2V0dGluZ3NVaVxuICAgIHwgVGltZUNvbnRyb2xTZXR0aW5nc1VpXG4gICAgfCBWaWxsYWdlU2V0dGluZ3NVaVxuICAgIHwgTG9nRmlsdGVyc1NldHRpbmdzVWlcbiAgICB8IFN0YXRlTWFuYWdlbWVudFVpXG4gICAgfCBJbnRlcm5hbHNVaVxuICA+O1xuICBzdGF0ZU1hbmFnZW1lbnRVaTogU3RhdGVNYW5hZ2VtZW50VWk7XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBLaXR0ZW5TY2llbnRpc3RzKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5jbChgQ29uc3RydWN0aW5nICR7VXNlckludGVyZmFjZS5uYW1lfWApKTtcblxuICAgIHN1cGVyKHsgaG9zdCB9LCB7fSk7XG5cbiAgICBjb25zdCBlbmdpbmUgPSBob3N0LmVuZ2luZTtcbiAgICB0aGlzLl9lbmdpbmVVaSA9IG5ldyBFbmdpbmVTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zZXR0aW5ncyk7XG4gICAgdGhpcy5zdGF0ZU1hbmFnZW1lbnRVaSA9IG5ldyBTdGF0ZU1hbmFnZW1lbnRVaShcbiAgICAgIHRoaXMsXG4gICAgICBlbmdpbmUuc2V0dGluZ3Muc3RhdGVzLFxuICAgICAgZW5naW5lLnNldHRpbmdzLmxvY2FsZSxcbiAgICApO1xuICAgIHRoaXMuX3NlY3Rpb25zID0gW1xuICAgICAgbmV3IEJvbmZpcmVTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5ib25maXJlTWFuYWdlci5zZXR0aW5ncywgZW5naW5lLnNldHRpbmdzLmxvY2FsZSksXG4gICAgICBuZXcgVmlsbGFnZVNldHRpbmdzVWkodGhpcywgZW5naW5lLnZpbGxhZ2VNYW5hZ2VyLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICAgIG5ldyBTY2llbmNlU2V0dGluZ3NVaSh0aGlzLCBlbmdpbmUuc2NpZW5jZU1hbmFnZXIuc2V0dGluZ3MsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IFdvcmtzaG9wU2V0dGluZ3NVaSh0aGlzLCBlbmdpbmUud29ya3Nob3BNYW5hZ2VyLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICAgIG5ldyBSZXNvdXJjZXNTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zZXR0aW5ncy5yZXNvdXJjZXMsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IFRyYWRlU2V0dGluZ3NVaSh0aGlzLCBlbmdpbmUudHJhZGVNYW5hZ2VyLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICAgIG5ldyBSZWxpZ2lvblNldHRpbmdzVWkodGhpcywgZW5naW5lLnJlbGlnaW9uTWFuYWdlci5zZXR0aW5ncywgZW5naW5lLnNldHRpbmdzLmxvY2FsZSksXG4gICAgICBuZXcgU3BhY2VTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zcGFjZU1hbmFnZXIuc2V0dGluZ3MsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IFRpbWVTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS50aW1lTWFuYWdlci5zZXR0aW5ncywgZW5naW5lLnNldHRpbmdzLmxvY2FsZSksXG4gICAgICBuZXcgVGltZUNvbnRyb2xTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS50aW1lQ29udHJvbE1hbmFnZXIuc2V0dGluZ3MsIGVuZ2luZS5zZXR0aW5ncy5sb2NhbGUpLFxuICAgICAgbmV3IExvZ0ZpbHRlcnNTZXR0aW5nc1VpKHRoaXMsIGVuZ2luZS5zZXR0aW5ncy5maWx0ZXJzKSxcbiAgICAgIHRoaXMuc3RhdGVNYW5hZ2VtZW50VWksXG4gICAgICBuZXcgSW50ZXJuYWxzVWkodGhpcywgZW5naW5lLnNldHRpbmdzLCBlbmdpbmUuc2V0dGluZ3MubG9jYWxlKSxcbiAgICBdO1xuXG4gICAgdGhpcy5wYXJlbnQgPSB0aGlzO1xuICAgIHRoaXMuZWxlbWVudCA9ICQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3MoXCJraXR0ZW4tc2NpZW50aXN0c1wiKS5hZGRDbGFzcyhzdHlsZXMudWkpO1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBbdGhpcy5fZW5naW5lVWksIC4uLnRoaXMuX3NlY3Rpb25zXSkge1xuICAgICAgdGhpcy5hZGRDaGlsZChzZWN0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zTGlzdEVsZW1lbnQgPSAkKFwiPHVsLz5cIik7XG4gICAgb3B0aW9uc0xpc3RFbGVtZW50LmFwcGVuZCh0aGlzLl9lbmdpbmVVaS5lbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc2VjdGlvbnMpIHtcbiAgICAgIG9wdGlvbnNMaXN0RWxlbWVudC5hcHBlbmQoc2VjdGlvbi5lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZChvcHRpb25zTGlzdEVsZW1lbnQpO1xuXG4gICAgLy8gTWFrZSBfZW5naW5lVUkncyBleHBhbmRvIGJ1dHRvbiBoaWRlL3Nob3cgdGhlIG90aGVyIG9wdGlvbiBncm91cHNcbiAgICBjb25zdCBleHBhbmRvID0gdGhpcy5fZW5naW5lVWkuZXhwYW5kbztcbiAgICBsZXQgc2VjdGlvbnNWaXNpYmxlID0gZmFsc2U7XG4gICAgZXhwYW5kby5lbGVtZW50Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgc2VjdGlvbnNWaXNpYmxlID0gIXNlY3Rpb25zVmlzaWJsZTtcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLl9zZWN0aW9ucykge1xuICAgICAgICBzZWN0aW9uLnRvZ2dsZShzZWN0aW9uc1Zpc2libGUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBvcGVuIHBhbmVscyBhbmQgYWRqdXN0IHRoZSBzdGF0ZSBvZiB0aGVcbiAgICAvLyBleHBhbmRvIGFjY29yZGluZ2x5LlxuICAgIGxldCBwYW5lbHNPcGVuID0gMDtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc2VjdGlvbnMpIHtcbiAgICAgIHNlY3Rpb24uZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFwicGFuZWxIaWRkZW5cIiwgKCkgPT4ge1xuICAgICAgICAtLXBhbmVsc09wZW47XG4gICAgICAgIGlmIChwYW5lbHNPcGVuID09PSAwKSB7XG4gICAgICAgICAgc2VjdGlvbnNWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWN0aW9uc1Zpc2libGUpIHtcbiAgICAgICAgICBleHBhbmRvLnNldENvbGxhcHNlZCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHNlY3Rpb24uZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFwicGFuZWxTaG93blwiLCAoKSA9PiB7XG4gICAgICAgICsrcGFuZWxzT3BlbjtcbiAgICAgICAgc2VjdGlvbnNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgZXhwYW5kby5zZXRFeHBhbmRlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIHRoZSBcInNob3cgYWN0aXZpdHkgc3VtbWFyeVwiIGFyZWEuXG4gICAgdGhpcy5zaG93QWN0aXZpdHkgPSAkKFwiPHNwYW4vPlwiLCB7XG4gICAgICBodG1sOiBgPHN2ZyBzdHlsZT1cIndpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjxwYXRoIGQ9XCIke0ljb25zLlN1bW1hcnl9XCIvPjwvc3ZnPmAsXG4gICAgICB0aXRsZTogaG9zdC5lbmdpbmUuaTE4bihcInN1bW1hcnkuc2hvd1wiKSxcbiAgICB9KS5hZGRDbGFzcyhzdHlsZXMuc2hvd0FjdGl2aXR5KTtcblxuICAgIHRoaXMuc2hvd0FjdGl2aXR5Lm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgaG9zdC5lbmdpbmUuZGlzcGxheUFjdGl2aXR5U3VtbWFyeSgpO1xuICAgIH0pO1xuXG4gICAgJChcIiNjbGVhckxvZ1wiKS5wcmVwZW5kKHRoaXMuc2hvd0FjdGl2aXR5KTtcblxuICAgIC8vIEFkZCBLaXR0ZW4gU2NpZW50aXN0cyBhYm92ZSB0aGUgZ2FtZSBsb2cuXG5cbiAgICBjb25zdCB1c2luZ0tTQ29sdW1uID0gZW5naW5lLnNldHRpbmdzLmtzQ29sdW1uLmVuYWJsZWQgJiYgZ2FtZS5jb2xvclNjaGVtZSAhPT0gXCJzbGVla1wiO1xuICAgIGlmICh1c2luZ0tTQ29sdW1uKSB7XG4gICAgICAkKFwiI3JpZ2h0Q29sdW1uXCIpLmFmdGVyKFxuICAgICAgICBgPGRpdiBpZD1cImtzQ29sdW1uXCIgY2xhc3M9XCJjb2x1bW5cIj48c3BhbiBjbGFzcz1cIiR7c3R5bGVzLnNwYWNlcn1cIj48L3NwYW4+PC9kaXY+YCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoXCIja3NDb2x1bW5cIikucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmlnaHQgPSAkKHVzaW5nS1NDb2x1bW4gPyBcIiNrc0NvbHVtblwiIDogXCIjcmlnaHRDb2x1bW5cIik7XG4gICAgaWYgKHJpZ2h0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVHJ5IHRvIGZhbGwgYmFjayB0byBvcHRpb25zIHBhZ2UuXG4gICAgICBjb25zdCBvcHRpb25zUGFnZUNvbnRlbnQgPSAkKFwiI29wdGlvbnNQYWdlIC5mdWxsLXNjcmVlbi1wb3NpdGlvbiAucGFnZSAucGFnZS1jb250ZW50XCIpO1xuICAgICAgaWYgKG9wdGlvbnNQYWdlQ29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLmNsKFwiVW5hYmxlIHRvIGZpbmQgcmlnaHQgY29sdW1uIHRvIGluamVjdCBVSSBpbnRvLiBSdW5uaW5nIGhlYWRsZXNzLlwiKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zUGFnZUNvbnRlbnQuYXBwZW5kKHRoaXMuZWxlbWVudCk7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKFwic3R5bGVcIiwgXCJib3JkZXItdG9wOjFweCBzb2xpZCBncmV5OyBwYWRkaW5nOjE1cHhcIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpZ2h0LnByZXBlbmQodGhpcy5lbGVtZW50KTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgdGhpcy5fbmVlZHNSZWZyZXNoID0gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWyR7VXNlckludGVyZmFjZS5uYW1lfSMke3RoaXMuY29tcG9uZW50SWR9XWA7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9yZWZyZXNoVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fcmVmcmVzaFRpbWVvdXQpO1xuICAgICAgdGhpcy5fcmVmcmVzaFRpbWVvdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuc2hvd0FjdGl2aXR5LnJlbW92ZSgpO1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcbiAgfVxuXG4gIHJlcXVlc3RSZWZyZXNoKF93aXRoQ2hpbGRyZW4gPSB0cnVlLCBkZXB0aCA9IDAsIF90cmFjZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX25lZWRzUmVmcmVzaCkge1xuICAgICAgaWYgKHRoaXMuX3JlZnJlc2hUaW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvciguLi5jbChcIlVzZXIgaW50ZXJmYWNlIGNsYWltcyB0byBoYXZlIGEgcmVmcmVzaCBwZW5kaW5nLCBidXQgdGhlcmUgaXNuJ3QuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWZyZXNoVGltZW91dCA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgW18sIGR1cmF0aW9uXSA9IG1lYXN1cmUoKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xuICAgICAgY29uc29sZS5pbmZvKC4uLmNsKGBVSSByZWZyZXNoIHRvb2sgJHtmb3JtYXRNaWxsaXNlY29uZHMoZHVyYXRpb24pfS5gKSk7XG4gICAgICB0aGlzLl9yZWZyZXNoVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9LCAwKTtcblxuICAgIHN1cGVyLnJlcXVlc3RSZWZyZXNoKHRydWUsIGRlcHRoLCBmYWxzZSk7XG4gIH1cblxuICBmb3JjZUZ1bGxSZWZyZXNoKCk6IHZvaWQge1xuICAgIGNvbnNvbGUud2FybiguLi5jbChcIkZvcmNpbmcgcmVmcmVzaCBvbiBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cy4uLlwiKSk7XG4gICAgdGhpcy5yZXF1ZXN0UmVmcmVzaCgpO1xuICAgIGNvbnNvbGUud2FybiguLi5jbChcIlJlZnJlc2ggb24gYWxsIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgZW5mb3JjZWQuXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNOaWwgfSBmcm9tIFwiQG9saXZlcnNhbHpidXJnL2pzLXV0aWxzL2RhdGEvbmlsLmpzXCI7XG5pbXBvcnQgeyByZWRpcmVjdEVycm9yc1RvQ29uc29sZSB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL2NvbnNvbGUuanNcIjtcbmltcG9ydCB7IEludmFsaWRPcGVyYXRpb25FcnJvciB9IGZyb20gXCJAb2xpdmVyc2FsemJ1cmcvanMtdXRpbHMvZXJyb3JzL0ludmFsaWRPcGVyYXRpb25FcnJvci5qc1wiO1xuaW1wb3J0IGd0IGZyb20gXCJzZW12ZXIvZnVuY3Rpb25zL2d0LmpzXCI7XG5pbXBvcnQgeyBFbmdpbmUsIHR5cGUgRW5naW5lU3RhdGUsIHR5cGUgU3VwcG9ydGVkTG9jYWxlIH0gZnJvbSBcIi4vRW5naW5lLmpzXCI7XG5pbXBvcnQgeyBTY2llbmNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TY2llbmNlU2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IFNwYWNlU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5ncy9TcGFjZVNldHRpbmdzLmpzXCI7XG5pbXBvcnQgeyBXb3Jrc2hvcFNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3MvV29ya3Nob3BTZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgY2wgfSBmcm9tIFwiLi90b29scy9Mb2cuanNcIjtcbmltcG9ydCB0eXBlIHsgUmVsZWFzZUNoYW5uZWwsIFJlbGVhc2VJbmZvU2NoZW1hIH0gZnJvbSBcIi4vdHlwZXMvX3JlbGVhc2VzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVQYWdlIH0gZnJvbSBcIi4vdHlwZXMvZ2FtZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJMThuRW5naW5lLCBMb2NhbGUgfSBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgVXNlclNjcmlwdExvYWRlciB9IGZyb20gXCIuL1VzZXJTY3JpcHRMb2FkZXIuanNcIjtcbmltcG9ydCB7IFVzZXJJbnRlcmZhY2UgfSBmcm9tIFwiLi91aS9Vc2VySW50ZXJmYWNlLmpzXCI7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgY29uc3QgR006IHVua25vd247XG4gIGNvbnN0IFJFTEVBU0VfQ0hBTk5FTDogUmVsZWFzZUNoYW5uZWw7XG4gIGNvbnN0IFJFTEVBU0VfVkVSU0lPTjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY29uc3Qga3NWZXJzaW9uID0gKHByZWZpeCA9IFwiXCIpID0+IHtcbiAgaWYgKGlzTmlsKFJFTEVBU0VfVkVSU0lPTikpIHtcbiAgICB0aHJvdyBFcnJvcihcIkJ1aWxkIGVycm9yOiBSRUxFQVNFX1ZFUlNJT04gaXMgbm90IGRlZmluZWQuXCIpO1xuICB9XG5cbiAgcmV0dXJuIGAke3ByZWZpeH0ke1JFTEVBU0VfVkVSU0lPTn1gO1xufTtcblxuZXhwb3J0IGNsYXNzIEtpdHRlblNjaWVudGlzdHMge1xuICByZWFkb25seSBnYW1lOiBHYW1lUGFnZTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiBpbiB0aGUgZ2FtZSB0aGF0IGFsbG93cyB0byByZXRyaWV2ZSB0cmFuc2xhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBJZGVhbGx5LCB5b3Ugc2hvdWxkIG5ldmVyIGFjY2VzcyB0aGlzIGRpcmVjdGx5IGFuZCBpbnN0ZWFkIHVzZSB0aGVcbiAgICogaTE4biBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgYEVuZ2luZWAuXG4gICAqL1xuICByZWFkb25seSBpMThuRW5naW5lOiBJMThuRW5naW5lO1xuXG4gIHByaXZhdGUgX3VzZXJJbnRlcmZhY2U6IFVzZXJJbnRlcmZhY2U7XG4gIGVuZ2luZTogRW5naW5lO1xuXG4gIHByaXZhdGUgX2dhbWVCZWZvcmVTYXZlSGFuZGxlOiBbXCJnYW1lL2JlZm9yZXNhdmVcIiwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2VydmVyTG9hZEhhbmRsZTogW1wic2VydmVyL2xvYWRcIiwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBnYW1lOiBHYW1lUGFnZSxcbiAgICBpMThuRW5naW5lOiBJMThuRW5naW5lLFxuICAgIGdhbWVMYW5ndWFnZTogTG9jYWxlID0gXCJlblwiLFxuICAgIGVuZ2luZVN0YXRlPzogRW5naW5lU3RhdGUsXG4gICkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIC4uLmNsKGBLaXR0ZW4gU2NpZW50aXN0cyAke2tzVmVyc2lvbihcInZcIil9IGNvbnN0cnVjdGVkLiBDaGVja2luZyBmb3IgcHJldmlvdXMgaW5zdGFuY2VzLi4uYCksXG4gICAgKTtcbiAgICBpZiAoXCJraXR0ZW5TY2llbnRpc3RzXCIgaW4gVXNlclNjcmlwdExvYWRlci53aW5kb3cpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChcIkRldGVjdGVkIGV4aXN0aW5nIEtTIGluc3RhbmNlLiBUcnlpbmcgdG8gdW5sb2FkIGl0Li4uXCIpKTtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmtpdHRlblNjaWVudGlzdHM/LnVubG9hZCgpO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oLi4uY2woYFlvdSBhcmUgb24gdGhlICcke1N0cmluZyhSRUxFQVNFX0NIQU5ORUwpfScgcmVsZWFzZSBjaGFubmVsLmApKTtcblxuICAgIHRoaXMuZ2FtZSA9IGdhbWU7XG4gICAgdGhpcy5pMThuRW5naW5lID0gaTE4bkVuZ2luZTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgRW5naW5lKHRoaXMsIGdhbWVMYW5ndWFnZSk7XG4gICAgICB0aGlzLl91c2VySW50ZXJmYWNlID0gbmV3IFVzZXJJbnRlcmZhY2UodGhpcyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoLi4uY2woXCJGYWlsZWQgdG8gY29uc3RydWN0IGNvcmUgY29tcG9uZW50cy5cIiwgZXJyb3IpKTtcbiAgICAgIGlmICh0eXBlb2YgR00gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKC4uLmNsKFwiRGV0ZWN0ZWQgcnVubmluZyBpbiBHcmVhc2Vtb25rZXkuXCIpKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmICghaXNOaWwoZW5naW5lU3RhdGUpKSB7XG4gICAgICB0aGlzLnNldFNldHRpbmdzKGVuZ2luZVN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXNlckludGVyZmFjZS5zdGF0ZU1hbmFnZW1lbnRVaS5sb2FkQXV0b1NhdmUoKTtcbiAgICB9XG4gIH1cblxuICByZWJ1aWxkVWkoKSB7XG4gICAgdGhpcy5fdXNlckludGVyZmFjZS5kZXN0cm95KCk7XG4gICAgdGhpcy5fdXNlckludGVyZmFjZSA9IG5ldyBVc2VySW50ZXJmYWNlKHRoaXMpO1xuICAgIHRoaXMuX3VzZXJJbnRlcmZhY2UuZm9yY2VGdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc29tZSB2YWxpZGF0aW9ucyBhZ2FpbnN0IHRoZSBnYW1lIHRvIGRldGVybWluZSBpZiBpbnRlcm5hbCBjb250cm9sXG4gICAqIHN0cnVjdHVyZXMgc3RpbGwgbWF0Y2ggdXAgd2l0aCBleHBlY3RhdGlvbnMuXG4gICAqIElzc3VlcyBzaG91bGQgYmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxuICAgKi9cbiAgdmFsaWRhdGVHYW1lKCkge1xuICAgIFNjaWVuY2VTZXR0aW5ncy52YWxpZGF0ZUdhbWUodGhpcy5nYW1lLCB0aGlzLmVuZ2luZS5zY2llbmNlTWFuYWdlci5zZXR0aW5ncyk7XG4gICAgU3BhY2VTZXR0aW5ncy52YWxpZGF0ZUdhbWUodGhpcy5nYW1lLCB0aGlzLmVuZ2luZS5zcGFjZU1hbmFnZXIuc2V0dGluZ3MpO1xuICAgIFdvcmtzaG9wU2V0dGluZ3MudmFsaWRhdGVHYW1lKHRoaXMuZ2FtZSwgdGhpcy5lbmdpbmUud29ya3Nob3BNYW5hZ2VyLnNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIEtpdHRlbiBTY2llbnRpc3RzIGZyb20gdGhlIGJyb3dzZXIuXG4gICAqL1xuICB1bmxvYWQoKTogdm9pZCB7XG4gICAgY29uc29sZS53YXJuKC4uLmNsKFwiVW5sb2FkaW5nIEtpdHRlbiBTY2llbnRpc3RzLi4uXCIpKTtcbiAgICB0aGlzLmVuZ2luZS5zdG9wKCk7XG4gICAgdGhpcy5fdXNlckludGVyZmFjZS5kZXN0cm95KCk7XG4gICAgJChcIiNrcy1zdHlsZXNcIikucmVtb3ZlKCk7XG4gICAgaWYgKHRoaXMuX2dhbWVCZWZvcmVTYXZlSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8udW5zdWJzY3JpYmUodGhpcy5fZ2FtZUJlZm9yZVNhdmVIYW5kbGUpO1xuICAgICAgdGhpcy5fZ2FtZUJlZm9yZVNhdmVIYW5kbGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZXJ2ZXJMb2FkSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8udW5zdWJzY3JpYmUodGhpcy5fc2VydmVyTG9hZEhhbmRsZSk7XG4gICAgICB0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWFuYWdlckluZGV4ID0gdGhpcy5nYW1lLm1hbmFnZXJzLmluZGV4T2YodGhpcy5fc2F2ZU1hbmFnZXIpO1xuICAgIGlmICgtMSA8IG1hbmFnZXJJbmRleCkge1xuICAgICAgdGhpcy5nYW1lLm1hbmFnZXJzLnNwbGljZShtYW5hZ2VySW5kZXgsIDEpO1xuICAgIH1cbiAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5raXR0ZW5TY2llbnRpc3RzID0gdW5kZWZpbmVkO1xuICAgIGNvbnNvbGUud2FybiguLi5jbChcIktpdHRlbiBTY2llbnRpc3RzIGhhdmUgYmVlbiB1bmxvYWRlZCFcIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSB1c2VyIHNjcmlwdCBhZnRlciBsb2FkaW5nIGFuZCBjb25maWd1cmluZyBpdC5cbiAgICovXG4gIHJ1bigpOiB2b2lkIHtcbiAgICAvLyBJbmNyZWFzZSBtZXNzYWdlcyBkaXNwbGF5ZWQgaW4gbG9nXG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgY29uZmlndXJhYmxlLlxuICAgIHRoaXMuZ2FtZS5jb25zb2xlLm1heE1lc3NhZ2VzID0gMTAwMDtcblxuICAgIHRoaXMucmVmcmVzaEVudGlyZVVzZXJJbnRlcmZhY2UoKTtcblxuICAgIGlmICh0aGlzLmVuZ2luZS5zZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmVuZ2luZS5zdGFydCh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZ2luZS5pbWVzc2FnZShcInN0YXR1cy5rcy5pbml0XCIpO1xuXG4gICAgdGhpcy5ydW5VcGRhdGVDaGVjaygpLmNhdGNoKHJlZGlyZWN0RXJyb3JzVG9Db25zb2xlKGNvbnNvbGUpKTtcblxuICAgIGlmICh0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5kb2pvLnVuc3Vic2NyaWJlKHRoaXMuX2dhbWVCZWZvcmVTYXZlSGFuZGxlKTtcbiAgICAgIHRoaXMuX2dhbWVCZWZvcmVTYXZlSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uc3Vic2NyaWJlKFxuICAgICAgXCJnYW1lL2JlZm9yZXNhdmVcIixcbiAgICAgIChzYXZlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc29sZS5pbmZvKC4uLmNsKFwiSW5qZWN0aW5nIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZSBzdGF0ZSBpbnRvIHNhdmUgZGF0YS4uLlwiKSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTZXR0aW5ncygpO1xuICAgICAgICBzYXZlRGF0YS5rcyA9IHsgc3RhdGU6IFtzdGF0ZV0gfTtcbiAgICAgICAgdGhpcy5fdXNlckludGVyZmFjZS5zdGF0ZU1hbmFnZW1lbnRVaS5zdG9yZUF1dG9TYXZlKHN0YXRlKTtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8dHlwZW9mIHNhdmVEYXRhPihcImtzLnJlcG9ydFNhdmVnYW1lXCIsIHsgZGV0YWlsOiBzYXZlRGF0YSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmICh0aGlzLl9zZXJ2ZXJMb2FkSGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8udW5zdWJzY3JpYmUodGhpcy5fc2VydmVyTG9hZEhhbmRsZSk7XG4gICAgICB0aGlzLl9nYW1lQmVmb3JlU2F2ZUhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5fc2VydmVyTG9hZEhhbmRsZSA9IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmRvam8uc3Vic2NyaWJlKFxuICAgICAgXCJzZXJ2ZXIvbG9hZFwiLFxuICAgICAgKHNhdmVEYXRhOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gVXNlclNjcmlwdExvYWRlci50cnlFbmdpbmVTdGF0ZUZyb21TYXZlRGF0YShcImtzXCIsIHNhdmVEYXRhKSBhc1xuICAgICAgICAgIHwgRW5naW5lU3RhdGVcbiAgICAgICAgICB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgLi4uY2woXG4gICAgICAgICAgICAgIFwiVGhlIEtpdHRlbnMgR2FtZSBzYXZlIGRhdGEgZGlkIG5vdCBjb250YWluIGEgc2NyaXB0IHN0YXRlLiBUcnlpbmcgdG8gbG9hZCBBdXRvLVNhdmUgc2V0dGluZ3MuLi5cIixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmluZm8oLi4uY2woXCJGb3VuZCEgTG9hZGluZyBzZXR0aW5ncy4uLlwiKSk7XG4gICAgICAgIHRoaXMuZW5naW5lLnN0YXRlTG9hZChzdGF0ZSk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hpY2ggdmVyc2lvbnMgb2YgS1MgYXJlIGN1cnJlbnRseSBwdWJsaXNoZWQuXG4gICAqL1xuICBhc3luYyBydW5VcGRhdGVDaGVjaygpIHtcbiAgICBpZiAoUkVMRUFTRV9DSEFOTkVMID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoLi4uY2woXCJObyB1cGRhdGUgY2hlY2sgb24gJ2ZpeGVkJyByZWxlYXNlIGNoYW5uZWwuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8va2l0dGVuLXNjaWVuY2UuY29tL3JlbGVhc2UtaW5mby5qc29uXCIpO1xuICAgICAgY29uc3QgcmVsZWFzZUluZm8gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBSZWxlYXNlSW5mb1NjaGVtYTtcbiAgICAgIGNvbnNvbGUuZGVidWcoLi4uY2wocmVsZWFzZUluZm8pKTtcblxuICAgICAgaWYgKFxuICAgICAgICBpc05pbChyZWxlYXNlSW5mb1tSRUxFQVNFX0NIQU5ORUxdLnZlcnNpb24pIHx8XG4gICAgICAgIHJlbGVhc2VJbmZvW1JFTEVBU0VfQ0hBTk5FTF0udmVyc2lvbiA9PT0gXCJcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgXCJDb3VsZCBub3QgcmVhZCBjdXJyZW50IHZlcnNpb24gZm9yIG91ciByZWxlYXNlIGNoYW5uZWwgZnJvbSBwcm92aWRlZCBtZXRhZGF0YSFcIixcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmlsKFJFTEVBU0VfVkVSU0lPTikgJiYgZ3QocmVsZWFzZUluZm9bUkVMRUFTRV9DSEFOTkVMXS52ZXJzaW9uLCBSRUxFQVNFX1ZFUlNJT04pKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLmltZXNzYWdlKFwic3RhdHVzLmtzLnVwZ3JhZGVcIiwgW1xuICAgICAgICAgIHJlbGVhc2VJbmZvW1JFTEVBU0VfQ0hBTk5FTF0udmVyc2lvbixcbiAgICAgICAgICBSRUxFQVNFX1ZFUlNJT04sXG4gICAgICAgICAgcmVsZWFzZUluZm9bUkVMRUFTRV9DSEFOTkVMXS51cmwucmVsZWFzZSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChcIlVwZGF0ZSBjaGVjayBmYWlsZWQuXCIpKTtcbiAgICAgIGNvbnNvbGUud2FybiguLi5jbChlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgdXNlciBpbnRlcmZhY2UgdG8gcmVmcmVzaC5cbiAgICovXG4gIHJlZnJlc2hFbnRpcmVVc2VySW50ZXJmYWNlKCk6IHZvaWQge1xuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIlJlcXVlc3RpbmcgZW50aXJlIHVzZXIgaW50ZXJmYWNlIHRvIGJlIHJlZnJlc2hlZC5cIikpO1xuICAgIHRoaXMuX3VzZXJJbnRlcmZhY2UuZm9yY2VGdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgc3RyaW5nIGxpa2UgNTIuNyBpbnRvIHRoZSBudW1iZXIgNTIuN1xuICAgKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIEEgbnVtYmVyIGJldHdlZW4gMCBhbmQgSW5maW5pdHksIHdoZXJlIEluZmluaXR5IGlzIHJlcHJlc2VudGVkIGFzIC0xLlxuICAgKi9cbiAgcGFyc2VGbG9hdCh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzU3VmZml4ID0gL1tLTUdUUF0kL2kudGVzdCh2YWx1ZSk7XG4gICAgY29uc3QgYmFzZVZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCAtIChoYXNTdWZmaXggPyAxIDogMCkpO1xuXG4gICAgbGV0IG51bWVyaWNWYWx1ZSA9XG4gICAgICB2YWx1ZS5pbmNsdWRlcyhcImVcIikgfHwgaGFzU3VmZml4ID8gTnVtYmVyLnBhcnNlRmxvYXQoYmFzZVZhbHVlKSA6IE51bWJlci5wYXJzZUludChiYXNlVmFsdWUpO1xuICAgIGlmIChoYXNTdWZmaXgpIHtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sZW5ndGggLSAxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgbnVtZXJpY1ZhbHVlID0gbnVtZXJpY1ZhbHVlICogMTAwMCAqKiBbXCJcIiwgXCJLXCIsIFwiTVwiLCBcIkdcIiwgXCJUXCIsIFwiUFwiXS5pbmRleE9mKHN1ZmZpeCk7XG4gICAgfVxuICAgIGlmIChudW1lcmljVmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1lcmljVmFsdWUgPCAwKSB7XG4gICAgICBudW1lcmljVmFsdWUgPSAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVtZXJpY1ZhbHVlO1xuICB9XG5cbiAgcGFyc2VBYnNvbHV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGZsb2F0VmFsdWUgPSB0aGlzLnBhcnNlRmxvYXQodmFsdWUpO1xuICAgIHJldHVybiBmbG9hdFZhbHVlICE9PSBudWxsID8gTWF0aC5yb3VuZChmbG9hdFZhbHVlKSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSBzdHJpbmcgbGlrZSA1Mi43IGludG8gdGhlIG51bWJlciAwLjUyN1xuICAgKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwZXJjZW50YWdlLlxuICAgKiBAcmV0dXJucyBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgcmVwcmVzZW50aW5nIHRoZSBkZXNjcmliZWQgcGVyY2VudGFnZS5cbiAgICovXG4gIHBhcnNlUGVyY2VudGFnZSh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjbGVhbmVkVmFsdWUgPSB2YWx1ZS50cmltKCkucmVwbGFjZSgvJSQvLCBcIlwiKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgTnVtYmVyLnBhcnNlRmxvYXQoY2xlYW5lZFZhbHVlKSAvIDEwMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm5zIGEgbnVtYmVyIGludG8gYSBnYW1lLW5hdGl2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAqIEluZmluaXR5LCBlaXRoZXIgYnkgYWN0dWFsIHZhbHVlIG9yIGJ5IC0xIHJlcHJlc2VudGF0aW9uLCBpcyByZW5kZXJlZCBhcyBhIHN5bWJvbC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG51bWJlciB0byByZW5kZXIgYXMgYSBzdHJpbmcuXG4gICAqIEBwYXJhbSBob3N0IC0gVGhlIGhvc3QgaW5zdGFuY2Ugd2hpY2ggd2UgY2FuIHVzZSB0byBsZXQgdGhlIGdhbWUgcmVuZGVyIHZhbHVlcyBmb3IgdXMuXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gbnVtYmVyLlxuICAgKi9cbiAgcmVuZGVyQWJzb2x1dGUodmFsdWU6IG51bWJlciwgbG9jYWxlOiBTdXBwb3J0ZWRMb2NhbGUgfCBcImludmFyaWFudFwiID0gXCJpbnZhcmlhbnRcIikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgcmV0dXJuIFwi4oieXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsZSAhPT0gXCJpbnZhcmlhbnRcIiAmJiBNYXRoLmZsb29yKE1hdGgubG9nMTAodmFsdWUpKSA8IDlcbiAgICAgID8gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDAsIHN0eWxlOiBcImRlY2ltYWxcIiB9KS5mb3JtYXQodmFsdWUpXG4gICAgICA6IHRoaXMuZ2FtZS5nZXREaXNwbGF5VmFsdWVFeHQodmFsdWUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSBudW1iZXIgbGlrZSAwLjUyNyBpbnRvIGEgc3RyaW5nIGxpa2UgNTIuN1xuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIHRvIHJlbmRlciBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIGxvY2FsZSAtIFRoZSBsb2NhbGUgaW4gd2hpY2ggdG8gcmVuZGVyIHRoZSBwZXJjZW50YWdlLlxuICAgKiBAcGFyYW0gd2l0aFVuaXQgLSBTaG91bGQgdGhlIHBlcmNlbnRhZ2Ugc2lnbiBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0P1xuICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHBlcmNlbnRhZ2UuXG4gICAqL1xuICByZW5kZXJQZXJjZW50YWdlKFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgbG9jYWxlOiBTdXBwb3J0ZWRMb2NhbGUgfCBcImludmFyaWFudFwiID0gXCJpbnZhcmlhbnRcIixcbiAgICB3aXRoVW5pdD86IGJvb2xlYW4sXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICByZXR1cm4gXCLiiJ5cIjtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxlICE9PSBcImludmFyaWFudFwiXG4gICAgICA/IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIHsgc3R5bGU6IFwicGVyY2VudFwiIH0pLmZvcm1hdCh2YWx1ZSlcbiAgICAgIDogYCR7dGhpcy5nYW1lLmdldERpc3BsYXlWYWx1ZUV4dCh2YWx1ZSAqIDEwMCwgZmFsc2UsIGZhbHNlKX0ke3dpdGhVbml0ID8gXCIlXCIgOiBcIlwifWA7XG4gIH1cblxuICByZW5kZXJGbG9hdCh2YWx1ZTogbnVtYmVyLCBsb2NhbGU6IFN1cHBvcnRlZExvY2FsZSB8IFwiaW52YXJpYW50XCIgPSBcImludmFyaWFudFwiKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHtcbiAgICAgIHJldHVybiBcIuKInlwiO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbGUgIT09IFwiaW52YXJpYW50XCJcbiAgICAgID8gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgeyBzdHlsZTogXCJkZWNpbWFsXCIgfSkuZm9ybWF0KHZhbHVlKVxuICAgICAgOiB0aGlzLmdhbWUuZ2V0RGlzcGxheVZhbHVlRXh0KHZhbHVlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgLy8jcmVnaW9uIFNldHRpbmdzXG4gIC8qKlxuICAgKiBFbmNvZGVzIGFuIGVuZ2luZSBzdGF0ZXMgaW50byBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBlbmdpbmUgc3RhdGUgdG8gZW5jb2RlLlxuICAgKiBAcGFyYW0gY29tcHJlc3MgU2hvdWxkIHdlIHVzZSBMWlN0cmluZyBjb21wcmVzc2lvbj9cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmdzIGVuY29kZWQgaW50byBhIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyBlbmNvZGVTZXR0aW5ncyhzZXR0aW5nczogRW5naW5lU3RhdGUsIGNvbXByZXNzID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2V0dGluZ3NTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgcmV0dXJuIGNvbXByZXNzXG4gICAgICA/IFVzZXJTY3JpcHRMb2FkZXIud2luZG93LkxaU3RyaW5nLmNvbXByZXNzVG9CYXNlNjQoc2V0dGluZ3NTdHJpbmcpXG4gICAgICA6IHNldHRpbmdzU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc2VyaWFsaXplZCBlbmdpbmUgc3RhdGUsIGF0dGVtcHRzIHRvIGRlc2VyaWFsaXplIHRoYXQgZW5naW5lIHN0YXRlLlxuICAgKiBBc3N1bWVzIHRoZSBpbnB1dCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggTFpTdHJpbmcsIHdpbGwgYWNjZXB0IHVuY29tcHJlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIGNvbXByZXNzZWRTZXR0aW5ncyBBbiBlbmdpbmUgc3RhdGUgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcuXG4gICAqIEByZXR1cm5zIFRoZSBlbmdpbmUgc3RhdGUsIGlmIHZhbGlkLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZVNldHRpbmdzKGNvbXByZXNzZWRTZXR0aW5nczogc3RyaW5nKTogRW5naW5lU3RhdGUge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuYWl2ZVBhcnNlID0gSlNPTi5wYXJzZShjb21wcmVzc2VkU2V0dGluZ3MpIGFzIHsgdj86IHN0cmluZyB9O1xuICAgICAgcmV0dXJuIEtpdHRlblNjaWVudGlzdHMudW5rbm93bkFzRW5naW5lU3RhdGVPclRocm93KG5haXZlUGFyc2UpO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgLyogZXhwZWN0ZWQsIGFzIHdlIGFzc3VtZSB0aGUgaW5wdXQgdG8gYmUgY29tcHJlc3NlZC4gKi9cbiAgICB9XG5cbiAgICBpZiAoY29tcHJlc3NlZFNldHRpbmdzLm1hdGNoKC9cXHI/XFxuLykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXJyb3IoXCJNdWx0aS1saW5lIG5vbi1KU09OIGlucHV0IGNhbid0IGJlIGRlY29kZWQuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzU3RyaW5nID1cbiAgICAgIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LkxaU3RyaW5nLmRlY29tcHJlc3NGcm9tQmFzZTY0KGNvbXByZXNzZWRTZXR0aW5ncyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzZXR0aW5nc1N0cmluZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIEtpdHRlblNjaWVudGlzdHMudW5rbm93bkFzRW5naW5lU3RhdGVPclRocm93KHBhcnNlZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzdGF0ZSBmcm9tIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBlbmdpbmUgc3RhdGUuXG4gICAqL1xuICBnZXRTZXR0aW5ncygpOiBFbmdpbmVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuZW5naW5lLnN0YXRlU2VyaWFsaXplKCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0FzSnNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldFNldHRpbmdzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVuZ2luZSB3aXRoIGEgbmV3IHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgVGhlIGVuZ2luZSBzdGF0ZSB0byBhcHBseS5cbiAgICovXG4gIHNldFNldHRpbmdzKHNldHRpbmdzOiBFbmdpbmVTdGF0ZSkge1xuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkxvYWRpbmcgZW5naW5lIHN0YXRlLi4uXCIpKTtcbiAgICBjb25zdCByZXF1aXJlc1VpUmVidWlsZCA9XG4gICAgICB0aGlzLmVuZ2luZS5zZXR0aW5ncy5rc0NvbHVtbi5lbmFibGVkICE9PSBzZXR0aW5ncy5lbmdpbmUua3NDb2x1bW4uZW5hYmxlZDtcbiAgICB0aGlzLmVuZ2luZS5zdGF0ZUxvYWQoc2V0dGluZ3MpO1xuXG4gICAgaWYgKHJlcXVpcmVzVWlSZWJ1aWxkKSB7XG4gICAgICB0aGlzLnJlYnVpbGRVaSgpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzZXJJbnRlcmZhY2UucmVmcmVzaCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbiBlbmNvZGVkIHN0YXRlIGludG8gdGhlIGVuZ2luZS5cbiAgICpcbiAgICogQHBhcmFtIGVuY29kZWRTZXR0aW5ncyBUaGUgZW5jb2RlZCBzZXR0aW5ncy5cbiAgICovXG4gIGltcG9ydFNldHRpbmdzRnJvbVN0cmluZyhlbmNvZGVkU2V0dGluZ3M6IHN0cmluZykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gS2l0dGVuU2NpZW50aXN0cy5kZWNvZGVTZXR0aW5ncyhlbmNvZGVkU2V0dGluZ3MpO1xuICAgIHRoaXMuc2V0U2V0dGluZ3Moc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyBhbiBlbmdpbmUgc3RhdGUgdG8gdGhlIGNsaXBib2FyZC5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIFRoZSBlbmdpbmUgc3RhdGUgdG8gY29weSB0byB0aGUgY2xpcGJvYXJkLlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGlzIGVuZ2luZSdzIGN1cnJlbnQgc3RhdGUuXG4gICAqIEBwYXJhbSBjb21wcmVzcyBTaG91bGQgdGhlIHN0YXRlIGJlIGNvbXByZXNzZWQ/XG4gICAqL1xuICBhc3luYyBjb3B5U2V0dGluZ3Moc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCksIGNvbXByZXNzID0gdHJ1ZSkge1xuICAgIGNvbnN0IGVuY29kZWRTZXR0aW5ncyA9IEtpdHRlblNjaWVudGlzdHMuZW5jb2RlU2V0dGluZ3Moc2V0dGluZ3MsIGNvbXByZXNzKTtcbiAgICBhd2FpdCBVc2VyU2NyaXB0TG9hZGVyLndpbmRvdy5uYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChlbmNvZGVkU2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYW4gb2JqZWN0IGlzIGFuIGVuZ2luZSBzdGF0ZSwgYW5kIHRocm93cyBhblxuICAgKiBleGNlcHRpb24gb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gc3ViamVjdCBUaGUgb2JqZWN0IHRoYXQgaXMgaG9wZWZ1bGx5IGFuIGVuZ2luZSBzdGF0ZS5cbiAgICogQHBhcmFtIHN1YmplY3QudiBUaGUgdmVyc2lvbiBpbiB0aGUgZW5naW5lIHN0YXRlLlxuICAgKiBAcmV0dXJucyBBbiBlbmdpbmUgc3RhdGUuXG4gICAqL1xuICBzdGF0aWMgdW5rbm93bkFzRW5naW5lU3RhdGVPclRocm93KHN1YmplY3Q/OiB1bmtub3duKTogRW5naW5lU3RhdGUge1xuICAgIGNvbnN0IHYgPSAoc3ViamVjdCBhcyB7IHY/OiBzdHJpbmcgfSkudjtcbiAgICBpZiAoIWlzTmlsKHYpICYmIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAodi5zdGFydHNXaXRoKFwiMlwiKSkge1xuICAgICAgICByZXR1cm4gc3ViamVjdCBhcyBFbmdpbmVTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGEgdmFsaWQgZW5naW5lIHN0YXRlLlwiKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2F2ZU1hbmFnZXJcbiAgaW5zdGFsbFNhdmVNYW5hZ2VyKCkge1xuICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkluc3RhbGxpbmcgc2F2ZSBnYW1lIG1hbmFnZXIuLi5cIikpO1xuICAgIHRoaXMuZ2FtZS5tYW5hZ2Vycy5wdXNoKHRoaXMuX3NhdmVNYW5hZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVNYW5hZ2VyID0ge1xuICAgIGxvYWQ6IChzYXZlRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGNvbnNvbGUuaW5mbyguLi5jbChcIkxvb2tpbmcgZm9yIEtpdHRlbiBTY2llbnRpc3RzIGVuZ2luZSBzdGF0ZSBpbiBzYXZlIGRhdGEuLi5cIikpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IFVzZXJTY3JpcHRMb2FkZXIudHJ5RW5naW5lU3RhdGVGcm9tU2F2ZURhdGEoXCJrc1wiLCBzYXZlRGF0YSkgYXNcbiAgICAgICAgfCBFbmdpbmVTdGF0ZVxuICAgICAgICB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oLi4uY2woXCJUaGUgS2l0dGVucyBHYW1lIHNhdmUgZGF0YSBkaWQgbm90IGNvbnRhaW4gYSBzY3JpcHQgc3RhdGUuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmluZm8oLi4uY2woXCJGb3VuZCBLaXR0ZW4gU2NpZW50aXN0cyBlbmdpbmUgc3RhdGUgaW4gc2F2ZSBkYXRhLlwiKSk7XG4gICAgICB0aGlzLmVuZ2luZS5zdGF0ZUxvYWQoc3RhdGUpO1xuICAgICAgdGhpcy5yZWZyZXNoRW50aXJlVXNlckludGVyZmFjZSgpO1xuICAgIH0sXG4gICAgcmVzZXRTdGF0ZTogKCkgPT4gbnVsbCxcbiAgICBzYXZlOiAoX3NhdmVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgLy8gV2UgaWdub3JlIHRoZSBtYW5hZ2VyIGludm9jYXRpb24sIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYW5kbGUgdGhlXG4gICAgICAvLyBgZ2FtZS9iZWZvcmVzYXZlYCBldmVudCwgd2hpY2ggaXMgaW50ZW5kZWQgZm9yIGV4dGVybmFsIGNvbnN1bWVycy5cbiAgICB9LFxuICB9O1xuICAvLyNlbmRyZWdpb25cbn1cbiIsImltcG9ydCB7IEtpdHRlblNjaWVudGlzdHMgfSBmcm9tIFwiLi9LaXR0ZW5TY2llbnRpc3RzLmpzXCI7XG5pbXBvcnQgeyBVc2VyU2NyaXB0TG9hZGVyIH0gZnJvbSBcIi4vVXNlclNjcmlwdExvYWRlci5qc1wiO1xuXG4oYXN5bmMgKCkgPT4ge1xuICBjb25zdCB1c2VyU2NyaXB0ID0gYXdhaXQgbmV3IFVzZXJTY3JpcHRMb2FkZXIoKS53YWl0Rm9yR2FtZShLaXR0ZW5TY2llbnRpc3RzLCBcImtzXCIpO1xuXG4gIFVzZXJTY3JpcHRMb2FkZXIud2luZG93LmtpdHRlblNjaWVudGlzdHMgPSB1c2VyU2NyaXB0O1xuXG4gIHVzZXJTY3JpcHQudmFsaWRhdGVHYW1lKCk7XG4gIHVzZXJTY3JpcHQucnVuKCk7XG59KSgpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuIl0sIm5hbWVzIjpbImlzTmlsIiwic3ViamVjdCIsImlzIiwiUHJvdG90eXBlIiwiVW5leHBlY3RlZE5pbEVycm9yIiwibWVzc2FnZSIsIm11c3RFeGlzdCIsImVycm9yTWVzc2FnZSIsImNvYWxlc2NlQXJyYXkiLCJuaWxhYmxlcyIsInRvIiwicmVzdWx0IiwibmlsYWJsZSIsInJlZGlyZWN0RXJyb3JzVG9Db25zb2xlIiwiY29uc29sZSIsImVycm9yIiwiQWJzdHJhY3RFcnJvciIsImNvZGUiLCJzdGF0dXMiLCJfX3B1YmxpY0ZpZWxkIiwiYWxsb3dGb3JlaWduTW9kdWxlIiwiZXJyb3JSZWNvcmQiLCJJbnZhbGlkT3BlcmF0aW9uRXJyb3IiLCJkZWJ1Z18xIiwiYXJncyIsIlNFTVZFUl9TUEVDX1ZFUlNJT04iLCJNQVhfTEVOR1RIIiwiTUFYX1NBRkVfSU5URUdFUiIsIk1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgiLCJNQVhfU0FGRV9CVUlMRF9MRU5HVEgiLCJjb25zdGFudHMiLCJyZXF1aXJlJCQwIiwiZGVidWciLCJyZXF1aXJlJCQxIiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlIiwic2FmZVJlIiwic3JjIiwic2FmZVNyYyIsInQiLCJSIiwiTEVUVEVSREFTSE5VTUJFUiIsInNhZmVSZWdleFJlcGxhY2VtZW50cyIsIm1ha2VTYWZlUmVnZXgiLCJ2YWx1ZSIsInRva2VuIiwibWF4IiwiY3JlYXRlVG9rZW4iLCJuYW1lIiwiaXNHbG9iYWwiLCJzYWZlIiwiaW5kZXgiLCJsb29zZU9wdGlvbiIsImVtcHR5T3B0cyIsInBhcnNlT3B0aW9uc18xIiwib3B0aW9ucyIsIm51bWVyaWMiLCJjb21wYXJlSWRlbnRpZmllcnMiLCJhIiwiYiIsImFudW0iLCJibnVtIiwiaWRlbnRpZmllcnMiLCJyZXF1aXJlJCQyIiwicGFyc2VPcHRpb25zIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJTZW1WZXIiLCJ2ZXJzaW9uIiwibSIsImlkIiwibnVtIiwib3RoZXIiLCJpIiwicmVsZWFzZSIsImlkZW50aWZpZXIiLCJpZGVudGlmaWVyQmFzZSIsIm1hdGNoIiwiYmFzZSIsInByZXJlbGVhc2UiLCJzZW12ZXIiLCJjb21wYXJlXzEiLCJsb29zZSIsImNvbXBhcmUiLCJndF8xIiwiSW50ZXJuYWxFcnJvciIsImludGVybmFsRXJyb3IiLCJVbmtub3duRXJyb3IiLCJpc0Vycm9yIiwidW5rbm93blRvRXJyb3IiLCJtZWFzdXJlIiwiY29udGV4dCIsImVudHJ5IiwibWVhc3VyZUFzeW5jIiwiZGlmZmVyZW5jZSIsIngiLCJjbCIsImFyZyIsIm1heWJlRXJyb3IiLCJvYmplY3RFbnRyaWVzIiwiY29uc3VtZUVudHJpZXNQZWRhbnRpYyIsInNvdXJjZSIsImNvbnN1bWVyIiwia2V5IiwiVW5pcXVlIiwiZWxlbSIsInVjZmlyc3QiLCJpbnB1dCIsInJvdW5kVG9Ud28iLCJuZWdhdGl2ZU9uZVRvSW5maW5pdHkiLCJCdWxrUHVyY2hhc2VIZWxwZXIiLCJob3N0Iiwid29ya3Nob3BNYW5hZ2VyIiwiYnVpbGRzIiwibWV0YURhdGEiLCJzZWN0aW9uVHJpZ2dlciIsInNvdXJjZVRhYiIsInBvdGVudGlhbEJ1aWxkcyIsImNvdW50ZXIiLCJidWlsZCIsInRyaWdnZXIiLCJFbmdpbmUiLCJidWlsZE1ldGFEYXRhIiwicHJpY2VzIiwicHJpY2VSYXRpbyIsInByaWNlIiwibWF0ZXJpYWwiLCJpdGVtUHJpY2VzIiwicHJpY2VNb2RpZmllciIsInJlc1ByaWNlTW9kaWZpZXIiLCJjdXJyZW50UmVzb3VyY2VQb29sIiwicmVzIiwiaXRlcmF0aW9ucyIsImJ1aWxkc0NvbW1pdHRlZCIsImNhbmRpZGF0ZXNUaGlzSXRlcmF0aW9uIiwiYnVpbGRUaGlzSXRlcmF0aW9uIiwiY29tbWl0dGVkVGhpc0l0ZXJhdGlvbiIsInRlbXBQb29sIiwiY29tbWl0dGVkQnVpbGQiLCJwb3RlbnRpYWxCdWlsZCIsInRhcmdldEluc3RhbmNlQ291bnQiLCJwb3NzaWJsZUluc3RhbmNlcyIsImJ1aWxkQ2FjaGVJdGVtIiwicmVzb3VyY2VzIiwiYnVpbGRzUG9zc2libGUiLCJtYXhJdGVtc0J1aWx0IiwicHJpY2VJbmRleCIsInNwYWNlT2lsIiwiY3J5b0thcm1hIiwib2lsUHJpY2UiLCJrYXJtYVByaWNlIiwib2lsUmVkdWN0aW9uUmF0aW8iLCJidXJuZWRQYXJhZ29uUmF0aW8iLCJwcmljZUluZGV4MiIsIm9pbFByaWNlUmVmdW5kIiwia2FybWFQcmljZVJlZnVuZCIsInJlZnVuZFZhbCIsIm5ld1ByaWNlVmFsdWUiLCJtb2RlbCIsImNvbnRyb2xsZXIiLCJhbW91bnQiLCJtZXRhIiwiYW1vdW50Q2FsY3VsYXRlZCIsInZzTWV0YSIsImRhdGEiLCJyYXRpbyIsInJhdGlvRGlmZiIsInJlc291cmNlUHJpY2VNb2RpZmllciIsImZpbmFsUmVzb3VyY2VQcmljZSIsIm9pbE1vZGlmaWVyIiwia2FybWFNb2RpZmllciIsIkJ1aWxkaW5ncyIsIlN0YWdlZEJ1aWxkaW5ncyIsIlNlYXNvbnMiLCJDeWNsZXMiLCJSZXNvdXJjZXNDcmFmdGFibGUiLCJSZXNvdXJjZXMiLCJKb2JzIiwiVHJhaXRzIiwiVW5pY29ybkl0ZW1WYXJpYW50IiwiUmVsaWdpb25VcGdyYWRlcyIsIlRyYW5zY2VuZGVuY2VVcGdyYWRlcyIsIlppZ2d1cmF0VXBncmFkZXMiLCJSYWNlcyIsIlBvbGljaWVzIiwiVGVjaG5vbG9naWVzSWdub3JlZCIsIlRlY2hub2xvZ2llcyIsIk1pc3Npb25zIiwiU3BhY2VCdWlsZGluZ3MiLCJDaHJvbm9Gb3JnZVVwZ3JhZGVzIiwiVm9pZFNwYWNlVXBncmFkZXMiLCJVcGdyYWRlcyIsIlRpbWVJdGVtVmFyaWFudCIsIlVuaWNvcm5JdGVtcyIsIlJlbGlnaW9uT3B0aW9ucyIsIlNldHRpbmciLCJlbmFibGVkIiwic2V0dGluZyIsIlNldHRpbmdMaW1pdGVkIiwibGltaXRlZCIsIlNldHRpbmdUcmlnZ2VyIiwiU2V0dGluZ1RocmVzaG9sZCIsInRocmVzaG9sZCIsIlNldHRpbmdNYXgiLCJTZXR0aW5nTGltaXRlZE1heCIsIlNldHRpbmdMaW1pdGVkTWF4VHJpZ2dlciIsIlNldHRpbmdMaW1pdGVkVHJpZ2dlciIsIlNldHRpbmdUcmlnZ2VyTWF4IiwiU2V0dGluZ1RocmVzaG9sZE1heCIsIlNldHRpbmdPcHRpb25zIiwic2VsZWN0ZWQiLCJfX3ByaXZhdGVBZGQiLCJfb3B0aW9ucyIsIm9wdGlvbiIsIl9fcHJpdmF0ZVNldCIsIl9fcHJpdmF0ZUdldCIsIlNldHRpbmdCdXlTZWxsVGhyZXNob2xkIiwiYnV5Iiwic2VsbCIsIkJ1aWxkaW5nVXBncmFkZVNldHRpbmciLCJ1cGdyYWRlIiwiX3VwZ3JhZGUiLCJCdWlsZGluZ1VwZ3JhZGVTZXR0aW5ncyIsIml0ZW1zIiwiaXRlbSIsInNldHRpbmdzIiwiYnVpbGRpbmciLCJCb25maXJlQnVpbGRpbmdTZXR0aW5nIiwiYmFzZVN0YWdlIiwiX2Jhc2VCdWlsZGluZyIsIl9idWlsZGluZyIsIl9zdGFnZSIsIkJvbmZpcmVTZXR0aW5ncyIsImdhdGhlckNhdG5pcCIsInR1cm5PblN0ZWFtd29ya3MiLCJ0dXJuT25NYWduZXRvcyIsInR1cm5PblJlYWN0b3JzIiwidXBncmFkZUJ1aWxkaW5ncyIsIl9hIiwiX2IiLCJfYyIsIl9kIiwiVGFiTWFuYWdlciIsInRhYiIsIkJvbmZpcmVNYW5hZ2VyIiwiYnVsa01hbmFnZXIiLCJidWlsZExpc3QiLCJwYXN0dXJlcyIsImFxdWVkdWN0cyIsInBhc3R1cmVNZXRhIiwiYnV0dG9uIiwiYXF1ZWR1Y3RNZXRhIiwibGlicmFyeU1ldGEiLCJlbmVyZ3lDb25zdW1wdGlvblJhdGUiLCJsaWJUb0RhdCIsIl9lIiwid2FyZWhvdXNlTWV0YSIsIl9mIiwiYW1waGl0aGVhdHJlTWV0YSIsIl9nIiwic3RlYW13b3JrcyIsIm1hZ25ldG9zIiwicmVhY3RvcnMiLCJjbGlja3MiLCJhbW91bnRUZW1wIiwibGFiZWwiLCJpdGVtTWV0YVJhdyIsInN0YWdlIiwibWV0YVJhdyIsImJ1aWxkaW5nTWV0YSIsIkFjdGl2aXR5U3VtbWFyeSIsInNlY3Rpb24iLCJzdW1tYXJ5U2VjdGlvbiIsInN1bW1hcnkiLCJfYW1vdW50IiwieWVhcnMiLCJkYXlzIiwiZHVyYXRpb24iLCJSZWxpZ2lvblNldHRpbmdzSXRlbSIsInZhcmlhbnQiLCJfdmFyaWFudCIsIlJlbGlnaW9uU2V0dGluZ3MiLCJiZXN0VW5pY29ybkJ1aWxkaW5nIiwic2FjcmlmaWNlQWxpY29ybnMiLCJzYWNyaWZpY2VVbmljb3JucyIsInJlZmluZVRlYXJzIiwicmVmaW5lVGltZUNyeXN0YWxzIiwiYXV0b1ByYWlzZSIsImFkb3JlIiwidHJhbnNjZW5kIiwiUmVsaWdpb25NYW5hZ2VyIiwiYm9uZmlyZU1hbmFnZXIiLCJtYXhQYXN0dXJlcyIsImJ1aWxkaW5nQnV0dG9uIiwidGVhcnNOZWVkZWQiLCJwcmljZVRlYXJzIiwidGVhcnNBdmFpbGFibGVGb3JVc2UiLCJtYXhTYWNyaWZpY2UiLCJuZWVkU2FjcmlmaWNlIiwiYnVpbGRSZXF1ZXN0IiwiYWxyZWFkeUhhbmRsZWQiLCJwYXN0dXJlQnV0dG9uIiwidmFsaWRCdWlsZGluZ3MiLCJ1bmljb3Juc1BlclNlY29uZEJhc2UiLCJnbG9iYWxSYXRpbyIsInJlbGlnaW9uUmF0aW8iLCJwYXJhZ29uUmF0aW8iLCJmYWl0aEJvbnVzIiwiY3VycmVudEN5Y2xlSW5kZXgiLCJjdXJyZW50Q3ljbGUiLCJjeWNsZUJvbnVzIiwidW5pY29ybnNQZXJTZWNvbmQiLCJ6aWdndXJhdFJhdGlvIiwiYmFzZVVuaWNvcm5zUGVyUmlmdCIsInJpZnRDaGFuY2VSYXRpbyIsInVuaWNvcm5SaWZ0Q2hhbmdlIiwiYmVzdEFtb3J0aXphdGlvbiIsImJlc3RCdWlsZGluZyIsInBhc3R1cmVQcm9kdWN0aW9uIiwicGFzdHVyZUFtb3J0aXphdGlvbiIsInVuaWNvcm5QcmljZSIsImJ1aWxkaW5nSW5mbyIsInJlbGlnaW9uQm9udXMiLCJyaWZ0Q2hhbmNlIiwiZWZmZWN0IiwidW5pY29ybnNQZXJSaWZ0IiwicmlmdEJvbnVzIiwiYnVpbGRpbmdQcm9kdWN0aW9uIiwiYW1vcnRpemF0aW9uIiwiYnVpbGRJbmZvIiwicGFuZWwiLCJidXR0b25zIiwiYXZhaWxhYmxlIiwidG90YWwiLCJwZXJjZW50YWdlSW52ZXJzZSIsImxpbmsiLCJyZXNvbHZlIiwidW5pY29ybnMiLCJhdmFpbGFibGVOb3ciLCJjb3N0IiwiYWxpY29ybnMiLCJ0ZWFycyIsInNvcnJvdyIsImF2YWlsYWJsZUZvckNvbnZlcnNpb24iLCJ0aW1lQ3J5c3RhbHMiLCJmYWl0aCIsImZhaXRoTGV2ZWwiLCJ3b3JzaGlwIiwiZXBpcGhhbnkiLCJ0cmFuc2NlbmRlbmNlVGllckN1cnJlbnQiLCJtYXhTb2xhclJldm9sdXRpb24iLCJ0cmlnZ2VyU29sYXJSZXZvbHV0aW9uIiwiZXBpcGhhbnlJbmNyZWFzZSIsImVwaXBoYW55QWZ0ZXJBZG9yZSIsIndvcnNoaXBBZnRlckFkb3JlIiwic29sYXJSZXZvbHV0aW9uQWZ0ZXJBZG9yZSIsInRyYW5zY2VuZGVuY2VSZWFjaGVkIiwiYWRvcmVJbmNyZWFzZVJhdGlvIiwibmVlZE5leHRMZXZlbCIsImsiLCJhdGhlaXNtIiwiYmxhY2tPYmVsaXNrIiwiYXBvY3J5cGhhQm9udXMiLCJ3b3JzaGlwSW5jcmVhc2UiLCJQb2xpY3lTZXR0aW5nIiwicG9saWN5IiwiX3BvbGljeSIsIlBvbGljeVNldHRpbmdzIiwiZ2FtZSIsImluU2V0dGluZ3MiLCJpbkdhbWUiLCJtaXNzaW5nSW5TZXR0aW5ncyIsInJlZHVuZGFudEluU2V0dGluZ3MiLCJUZWNoU2V0dGluZyIsInRlY2giLCJfdGVjaCIsIlRlY2hTZXR0aW5ncyIsIlNjaWVuY2VTZXR0aW5ncyIsInBvbGljaWVzIiwidGVjaHMiLCJvYnNlcnZlIiwiVXBncmFkZU1hbmFnZXIiLCJzdWNjZXNzIiwiYWN0aW9uIiwib3JpZ2luYWxDb25maXJtIiwic2xlZXAiLCJGYWxsYmFja0xvY2FsZSIsIlRJTUVPVVRfREVGQVVMVCIsIlRJTUVPVVRfT1ZFUlJJREUiLCJVc2VyU2NyaXB0TG9hZGVyIiwic2F2ZURhdGFLZXkiLCJzYXZlRGF0YSIsInNhdmVEYXRhUHJveHkiLCJrc0RhdGEiLCJzdGF0ZSIsIlVzZXJTY3JpcHQiLCJ0aW1lb3V0IiwiaTE4bkVuZ2luZSIsImdhbWVMYW5ndWFnZSIsInNpZ25hbHMiLCJzdWJHYW1lU3RhcnQiLCJzdWJTZXJ2ZXJMb2FkIiwiU2NpZW5jZU1hbmFnZXIiLCJfY29udGV4dCIsInRvVW5sb2NrIiwid29ya0xvb3AiLCJyZXNvdXJjZSIsInRhcmdldFBvbGljeSIsIk1pc3Npb25TZXR0aW5nIiwibWlzc2lvbiIsIl9taXNzaW9uIiwiTWlzc2lvblNldHRpbmdzIiwicHJvZ3JhbSIsIlNwYWNlQnVpbGRpbmdTZXR0aW5nIiwiU3BhY2VTZXR0aW5ncyIsInVubG9ja01pc3Npb25zIiwiU3BhY2VNYW5hZ2VyIiwibWlzc2lvbnMiLCJtaXNzaW9uTG9vcCIsInBhbmVscyIsImNoaWxkIiwiTG9nRmlsdGVySXRlbVZhcmlhbnQiLCJGaWx0ZXJJdGVtcyIsIkxvZ0ZpbHRlclNldHRpbmdzSXRlbSIsIkxvZ0ZpbHRlclNldHRpbmdzIiwiZGlzYWJsZUtHTG9nIiwiZmlsdGVyIiwiVXBncmFkZVNldHRpbmdzSXRlbSIsIlVwZ3JhZGVTZXR0aW5ncyIsIkNyYWZ0U2V0dGluZ3NJdGVtIiwiX3Jlc291cmNlIiwiV29ya3Nob3BTZXR0aW5ncyIsInVubG9ja1VwZ3JhZGVzIiwic2hpcE92ZXJyaWRlIiwiY3JhZnQiLCJXb3Jrc2hvcE1hbmFnZXIiLCJ1cGdyYWRlcyIsImNyYWZ0cyIsImNyYWZ0UmVxdWVzdHMiLCJjdXJyZW50IiwibWF0ZXJpYWxzIiwiYmlsbE9mTWF0ZXJpYWxzIiwicmVxdWVzdCIsIm1hdGVyaWFsQW1vdW50IiwibWF0ZXJpYWxSZXNvdXJjZSIsImF2YWlsYWJsZVNvdXJjZSIsImF2YWlsYWJsZVRhcmdldCIsInJlY2lwZVJlcXVpcmVzIiwicmVjaXBlUHJvZHVjZXMiLCJjcmFmdHNQb3NzaWJsZSIsImNyYWZ0c0RvbmUiLCJvcmRlckRvbmUiLCJjcmFmdHNNYXhMaW1pdCIsInJlc291cmNlTmFtZSIsImNhY2hlTWFuYWdlciIsInByZVRyYWRlIiwicHJvZHVjdGlvbiIsIm1pblByb2QiLCJtYXQiLCJyYXQiLCJhZGRQcm9kIiwib3V0cHV0IiwiaHVudGVyUmF0aW8iLCJzdG9jayIsInJlc1BlclRpY2siLCJjb25zdW1lIiwid29yc3RXZWF0aGVyIiwicHJvZHVjdGlvbkZpZWxkIiwicmVzb3VyY2VQcm9kdWN0aW9uIiwicHJvZHVjdGlvblZpbGxhZ2VyIiwiYmFzZVByb2QiLCJoeWRyb3BvbmljcyIsInBhcmFnb25Cb251cyIsImJhc2VEZW1hbmQiLCJ1bmljb3JuUGFzdHVyZXMiLCJoYXBweUNvbiIsImNhdG5pcERlbWFuZFdvcmtlclJhdGlvR2xvYmFsIiwicmVzb3VyY2VDZWxscyIsInJlc291cmNlQ2VsbCIsImlzQmVsb3ciLCJSZXNvdXJjZXNTZXR0aW5nc0l0ZW0iLCJSZXNvdXJjZXNTZXR0aW5ncyIsIlN0YXRlU2V0dGluZ3MiLCJub0NvbmZpcm0iLCJjb21wcmVzcyIsIkVuZ2luZVNldHRpbmdzIiwiZmlsdGVycyIsInN0YXRlcyIsImxhbmd1YWdlIiwia3NDb2x1bW4iLCJyZXRhaW5NZXRhQmVoYXZpb3IiLCJSZXNldEJvbmZpcmVCdWlsZGluZ1NldHRpbmciLCJSZXNldEJvbmZpcmVTZXR0aW5ncyIsIlJlc2V0UmVsaWdpb25CdWlsZGluZ1NldHRpbmciLCJSZXNldFJlbGlnaW9uU2V0dGluZ3MiLCJSZXNldFJlc291cmNlc1NldHRpbmdzSXRlbSIsIlJlc2V0UmVzb3VyY2VzU2V0dGluZ3MiLCJSZXNldFNwYWNlQnVpbGRpbmdTZXR0aW5nIiwiUmVzZXRTcGFjZVNldHRpbmdzIiwiUmVzZXRUaW1lQnVpbGRpbmdTZXR0aW5nIiwiUmVzZXRUaW1lU2V0dGluZ3MiLCJSZXNldFVwZ3JhZGVTZXR0aW5nc0l0ZW0iLCJSZXNldFVwZ3JhZGVTZXR0aW5ncyIsIlJlc2V0U2V0dGluZ3MiLCJib25maXJlIiwicmVsaWdpb24iLCJzcGFjZSIsInRpbWUiLCJUaW1lU2tpcEhlYXRTZXR0aW5ncyIsImFjdGl2ZUhlYXRUcmFuc2ZlclN0YXR1cyIsImN5Y2xlIiwiVGltZVNraXBTZXR0aW5ncyIsImlnbm9yZU92ZXJoZWF0IiwiYWN0aXZlSGVhdFRyYW5zZmVyIiwic2Vhc29uIiwiVGltZUNvbnRyb2xTZXR0aW5ncyIsImFjY2VsZXJhdGVUaW1lIiwicmVzZXQiLCJ0aW1lU2tpcCIsIlRpbWVTZXR0aW5nc0l0ZW0iLCJUaW1lU2V0dGluZ3MiLCJmaXhDcnlvY2hhbWJlcnMiLCJFbWJhc3N5U2V0dGluZyIsInJhY2UiLCJfcmFjZSIsIkVtYmFzc3lTZXR0aW5ncyIsIlRyYWRlU2V0dGluZ3NJdGVtIiwic3VtbWVyIiwiYXV0dW1uIiwid2ludGVyIiwic3ByaW5nIiwicmVxdWlyZSIsIl9yZXF1aXJlIiwiVHJhZGVTZXR0aW5ncyIsImJ1aWxkRW1iYXNzaWVzIiwiZmVlZExldmlhdGhhbnMiLCJ0cmFkZUJsYWNrY29pbiIsInVubG9ja1JhY2VzIiwiZGVmYXVsdFJlcXVpcmUiLCJFbGVjdExlYWRlclNldHRpbmdzIiwiam9iIiwidHJhaXQiLCJWaWxsYWdlU2V0dGluZ3MiLCJob2xkRmVzdGl2YWxzIiwiaHVudCIsInByb21vdGVLaXR0ZW5zIiwicHJvbW90ZUxlYWRlciIsImVsZWN0TGVhZGVyIiwiVGltZUNvbnRyb2xNYW5hZ2VyIiwicmVsaWdpb25NYW5hZ2VyIiwic3BhY2VNYW5hZ2VyIiwiZW5naW5lIiwiY2hlY2tlZExpc3QiLCJjaGVja0xpc3QiLCJjaGVjayIsImJsZCIsInVuaWNvcm5QYXN0dXJlIiwicGFuZWxCdXR0b24iLCJyZWplY3QiLCJjaGVja2VkIiwiY2hhbGxlbmdlSW5kZXgiLCJ0ZW1wb3JhbEZsdXgiLCJzaGF0dGVyQ29zdEluY3JlYXNlQ2hhbGxlbmdlIiwidGltZUNyeXN0YWxzQXZhaWxhYmxlIiwic2hhdHRlclZvaWRDb3N0Iiwidm9pZEF2YWlsYWJsZSIsImhlYXRNYXgiLCJoZWF0Tm93IiwiZmFjdG9yIiwibWF4U2tpcHNBY3RpdmVIZWF0VHJhbnNmZXIiLCJoZWF0UGVyVGljayIsInRpY2tzUGVyU2Vjb25kIiwidGVtcG9yYWxGbHV4UHJvZHVjdGlvbiIsImRheXNQZXJZZWFyIiwidGlja3NQZXJEYXkiLCJkYXlzUGVyVGlja3MiLCJ0aWNrc1BlclllYXIiLCJmbHV4RW5hYmxlZCIsImZsdXgiLCJtYXhTa2lwcyIsImNhblNraXAiLCJ3aWxsU2tpcCIsInllYXJzUGVyQ3ljbGUiLCJyZW1haW5pbmdZZWFyc0N1cnJlbnRDeWNsZSIsImN5Y2xlc1BlckVyYSIsInNraXBDeWNsZXMiLCJzaGF0dGVyIiwiVGltZU1hbmFnZXIiLCJidWlsZE1ldGEiLCJidWlsZEJ1dHRvbiIsImJ1aWxkaW5nTWV0YURhdGEiLCJidG4iLCJmaXhlZCIsImZpeEhhcHBlbmVkIiwiVHJhZGVNYW5hZ2VyIiwiY2F0cG93ZXIiLCJnb2xkIiwidHJhZGVzIiwidHJhZGUiLCJwcm9maXRhYmxlIiwibWF4VHJhZGVzIiwibWF4QnlSYWNlIiwidHJhZGVJbmRleCIsInRyYWRlU2V0dGluZ3MiLCJ0cmlnQ29uZGl0aW9ucyIsInRyYWRlUG9zIiwidHJhZGVzRG9uZSIsInJhbmRvbVJhY2VJbmRleCIsIm1pblRyYWRlcyIsIm1pblRyYWRlSW5kZXgiLCJ0cmFkZU5ldCIsIm1hdEFtb3VudCIsIm1lYW5PdXRwdXQiLCJvdXQiLCJvdXRWYWx1ZSIsImNvdW50IiwiY3VsdHVyZSIsImN1bHR1cmVWYWwiLCJyYWNlUGFuZWxzIiwiZW1iYXNzeUJ1bGsiLCJidWxrVHJhY2tlciIsInBhbmVsSW5kZXgiLCJyYWNlSW5kZXgiLCJlbUJ1bGsiLCJuZXh0UHJpY2UiLCJsZXZpYXRoYW5JbmZvIiwibmVjcm9jb3JucyIsIm1heFJhY2VzIiwibWFucG93ZXIiLCJ1bmxvY2tlZFJhY2UiLCJjb2luUHJpY2UiLCJyZWxpY3NJbml0aWFsIiwiY29pbnNJbml0aWFsIiwiY29pbnNFeGNoYW5nZWQiLCJyZWxpY3NFeGNoYW5nZWQiLCJjdXJyZW50Q29pbiIsInJlbGljc0N1cnJlbnQiLCJ0aWNrIiwicHJvZml0IiwicHJvZCIsInN0YW5kaW5nUmF0aW8iLCJyYWNlUmF0aW8iLCJ0cmFkZVJhdGlvIiwiZmFpbGVkUmF0aW8iLCJzdWNjZXNzUmF0aW8iLCJib251c1JhdGlvIiwibWVhbiIsInRyYWRlQ2hhbmNlIiwic2hpcENvdW50IiwidGl0YW5pdW1Qcm9iYWJpbGl0eSIsInNlYXNpb25SYXRpbyIsIm5vcm1Cb3VnaHQiLCJub3JtQm9udXMiLCJzcGljZUNoYW5jZSIsInNwaWNlVHJhZGVBbW91bnQiLCJfbGltaXRlZCIsIl90cmlnQ29uZGl0aW9ucyIsInJlcXVpcmVkIiwibWFucG93ZXJDb3N0IiwiZ29sZENvc3QiLCJoaWdoZXN0Q2FwYWNpdHkiLCJ0cmFkZU91dHB1dCIsImNhcGFjaXR5IiwicmFjZUluZm8iLCJNYXRlcmlhbHNDYWNoZSIsImNhY2hlSW5kZXgiLCJvbGREYXRhIiwib2xkTWF0ZXJpYWxzIiwiY3VycmVudFRpY2siLCJzdGFydGluZ1RpY2siLCJWaWxsYWdlTWFuYWdlciIsImZyZWVLaXR0ZW5zIiwiYXNzaWduZWRLaXR0ZW4iLCJqb2JzTm90Q2FwcGVkIiwidW5sb2NrZWQiLCJtYXhLaXR0ZW5zSW5Kb2IiLCJtYXhLaXR0ZW5zVG9Bc3NpZ24iLCJraXR0ZW5zSW5Kb2IiLCJub0Zhcm1lcnNBc3NpZ25lZCIsImpvYk5hbWUiLCJraXR0ZW5zIiwibGVhZGVyIiwibGVhZGVyQ2FuZGlkYXRlcyIsImtpdHRlbiIsImJlc3RMZWFkZXIiLCJraXR0ZW5JbmRleCIsInRpZXIiLCJlbmdpbmVlclNwZWNpYWxpdHkiLCJyYW5rIiwiZ29sZFN0b2NrIiwiaHVudENvdW50IiwiYXZlcmFnZU91dHB1dCIsInRydWVPdXRwdXQiLCJjcmFmdE1hbmFnZXIiLCJjYXRwb3dQcm9maXRhYmxlIiwiY3VsdHVyZVByb2ZpdGFibGUiLCJwYXJjaFByb2ZpdGFibGUiLCJiZWZvcmVEYXlzIiwiaTE4bkRhdGEiLCJkZURFIiwiZW5VUyIsImhlSUwiLCJ6aENOIiwibG9jYWxlIiwicmVidWlsZFVJIiwicHJldmlvdXNMb2NhbGUiLCJrc1ZlcnNpb24iLCJhdHRlbXB0TG9hZCIsImxvYWRlciIsIm1zZyIsImxvb3AiLCJ0aW1lVGFrZW4iLCJmaWx0ZXJDaGVja2JveGVzIiwiY2hlY2tib3giLCJzeW1ib2wiLCJwbGFuZXQiLCJjeWNsZUNhbmRpZGF0ZSIsImFyZ0luZGV4IiwiaTE4bkxpdGVyYWwiLCJpMThuQXJncyIsImxvZ1N0eWxlIiwidGV4dCIsImFjdGl2aXR5Q2xhc3MiLCJzdW1tYXJ5TGluZSIsImNzc0NsYXNzZXMiLCJjb2xvciIsImZpbHRlckl0ZW0iLCJzdWJTZWN0aW9uVHJpZ2dlciIsInRvWmVyb0lmSW5maW5pdHkiLCJwYXJzZU51bWJlciIsIm1pbGxpc2Vjb25kcyIsInBhcnNlQmlnaW50IiwicGFyc2VNaWxsaXNlY29uZHMiLCJpc1plcm8iLCJwbHVyYWxpemUiLCJ3b3JkIiwiU0VDT05EX1JPVU5ESU5HX0VQU0lMT04iLCJPTkVfREFZX0lOX01JTExJU0VDT05EUyIsImZvcm1hdE1pbGxpc2Vjb25kcyIsImlzQmlnSW50Iiwib3B0aW9uc0FkanVzdGVkIiwiZmxvb3JEZWNpbWFscyIsImRlY2ltYWxEaWdpdHMiLCJmbG9vcmVkSW50ZXJpbVZhbHVlIiwiYWRkIiwibG9uZyIsInNob3J0IiwidmFsdWVTdHJpbmciLCJ3aG9sZURpZ2l0cyIsIm1pbkxlbmd0aCIsInBhcnNlZCIsInNlY29uZHMiLCJtaWNyb3NlY29uZHMiLCJuYW5vc2Vjb25kcyIsIm1pbGxpc2Vjb25kc0FuZEJlbG93IiwibWlsbGlzZWNvbmRzRGVjaW1hbERpZ2l0cyIsInJvdW5kZWRNaWxsaXNlY29uZHMiLCJtaWxsaXNlY29uZHNTdHJpbmciLCJzZWNvbmRzRGVjaW1hbERpZ2l0cyIsInNlY29uZHNGaXhlZCIsInNlY29uZHNTdHJpbmciLCJzZXBhcmF0b3IiLCJJY29ucyIsIl9VaUNvbXBvbmVudCIsInBhcmVudCIsIndpdGhDaGlsZHJlbiIsImRlcHRoIiwidHJhY2UiLCJmb3JjZSIsImNoaWxkcmVuIiwiVWlDb21wb25lbnQiLCJDb250YWluZXIiLCJjbGFzc05hbWUiLCJMaXN0SXRlbSIsInN0eWxlc0RlbGltaXRlciIsIkxhYmVsTGlzdEl0ZW0iLCJzdHlsZXNMaXN0SXRlbSIsInN0eWxlcyIsImljb25FbGVtZW50IiwiU2V0dGluZ0xpc3RJdGVtIiwic3R5bGVzU2V0dGluZ0xpc3RJdGVtIiwiX2V2ZW50IiwiaXNCYXRjaFByb2Nlc3MiLCJJY29uQnV0dG9uIiwicGF0aERhdGEiLCJ0aXRsZSIsInN0eWxlc0J1dHRvbiIsIlNldHRpbmdzTGlzdCIsInRvb2xPcHRpb25zIiwiaGFzVG9vbHMiLCJ0b29scyIsImV2ZW50Iiwib25SZXNldCIsIkV4cGFuZG9CdXR0b24iLCJDb2xsYXBzaWJsZVBhbmVsIiwiaGVhZCIsImV4cGFuZG8iLCJleHBhbmQiLCJ0b2dnbGVOZXN0ZWQiLCJ2aXNpYmxlIiwidG9nZ2xlQ2hpbGRyZW4iLCJTZXR0aW5nc1BhbmVsIiwic2V0dGluZ0l0ZW0iLCJfdmFsdWUiLCJCdWlsZGluZ1VwZ3JhZGVTZXR0aW5nc1VpIiwiX2xvY2FsZSIsInNlY3Rpb25TZXR0aW5nIiwiX2lzQmF0Y2hQcm9jZXNzIiwic3R5bGVzTGFiZWxMaXN0SXRlbSIsIml0ZW1zTGlzdCIsIkJ1dHRvbiIsIkRlbGltaXRlciIsIkhlYWRlckxpc3RJdGVtIiwiSW5wdXQiLCJQYXJhZ3JhcGgiLCJEaWFsb2ciLCJzdHlsZXNUb29sYmFyTGlzdEl0ZW0iLCJpbml0aWFsVmFsdWUiLCJleHBsYWluZXIiLCJzdHlsZXNFeHBsYWluZXIiLCJNYXhCdXR0b24iLCJUcmlnZ2VyQnV0dG9uIiwidHJpZ2dlclZhbHVlIiwiU2V0dGluZ01heFRyaWdnZXJMaXN0SXRlbSIsIkJ1aWxkU2VjdGlvblRvb2xzIiwic2VjdGlvbkxhYmVsIiwib25TZXRNYXgiLCJlbGVtZW50IiwiU2V0dGluZ1RyaWdnZXJMaXN0SXRlbSIsIkJvbmZpcmVTZXR0aW5nc1VpIiwiXyIsImJ1aWxkaW5nR3JvdXAiLCJFbmdpbmVTZXR0aW5nc1VpIiwiQnV0dG9uTGlzdEl0ZW0iLCJGaWVsZHNldCIsImxlZ2VuZCIsInN0eWxlc0xhYmVsIiwiUmFkaW9JdGVtIiwiZ3JvdXBLZXkiLCJPcHRpb25zTGlzdEl0ZW0iLCJUZXh0QnV0dG9uIiwiSW50ZXJuYWxzVWkiLCJFeHBsYWluZXJMaXN0SXRlbSIsIkxvZ0ZpbHRlcnNTZXR0aW5nc1VpIiwibGlzdEZpbHRlcnMiLCJSZWxpZ2lvblNldHRpbmdzVWkiLCJidWlsZGluZ05hbWUiLCJzdHlsZXNUaW1lU2tpcEhlYXRTZXR0aW5ncyIsInVuaWNvcm5zQXJyYXkiLCJ6aWdndXJhdFVwZ3JhZGUiLCJkZWZhdWx0cyIsIkNvbnN1bWVCdXR0b24iLCJjb25zdW1lVmFsdWUiLCJTdG9ja0J1dHRvbiIsInN0b2NrVmFsdWUiLCJSZXNvdXJjZXNTZXR0aW5nc1VpIiwiaWdub3JlZFJlc291cmNlcyIsInN0b2NrRWxlbWVudCIsImNvbnN1bWVFbGVtZW50IiwiUG9saWN5U2V0dGluZ3NVaSIsImxhc3RMYWJlbCIsIlRlY2hTZXR0aW5nc1VpIiwiU2NpZW5jZVNldHRpbmdzVWkiLCJNaXNzaW9uU2V0dGluZ3NVaSIsIlNwYWNlU2V0dGluZ3NVaSIsImluZGV4UGxhbmV0IiwiYXJyYXlQbGFudCIsImluZGV4QnVpbGRpbmciLCJhcnJheUJ1aWxkaW5nIiwibGlzdEFkZGl0aW9uIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJtaW51dGVzSW5Nb250aCIsIm1pbnV0ZXNJbkRheSIsImNvbnN0cnVjdEZyb21TeW1ib2wiLCJjb25zdHJ1Y3RGcm9tIiwiZGF0ZSIsImNvbnN0cnVjdE5vdyIsImZvcm1hdERpc3RhbmNlTG9jYWxlIiwiZm9ybWF0RGlzdGFuY2UiLCJ0b2tlblZhbHVlIiwiYnVpbGRGb3JtYXRMb25nRm4iLCJ3aWR0aCIsImRhdGVGb3JtYXRzIiwidGltZUZvcm1hdHMiLCJkYXRlVGltZUZvcm1hdHMiLCJmb3JtYXRMb25nIiwiZm9ybWF0UmVsYXRpdmVMb2NhbGUiLCJmb3JtYXRSZWxhdGl2ZSIsIl9kYXRlIiwiX2Jhc2VEYXRlIiwiYnVpbGRMb2NhbGl6ZUZuIiwidmFsdWVzQXJyYXkiLCJkZWZhdWx0V2lkdGgiLCJlcmFWYWx1ZXMiLCJxdWFydGVyVmFsdWVzIiwibW9udGhWYWx1ZXMiLCJkYXlWYWx1ZXMiLCJkYXlQZXJpb2RWYWx1ZXMiLCJmb3JtYXR0aW5nRGF5UGVyaW9kVmFsdWVzIiwibG9jYWxpemUiLCJkaXJ0eU51bWJlciIsIm51bWJlciIsInJlbTEwMCIsInF1YXJ0ZXIiLCJidWlsZE1hdGNoRm4iLCJzdHJpbmciLCJtYXRjaFBhdHRlcm4iLCJtYXRjaFJlc3VsdCIsIm1hdGNoZWRTdHJpbmciLCJwYXJzZVBhdHRlcm5zIiwiZmluZEluZGV4IiwicGF0dGVybiIsImZpbmRLZXkiLCJyZXN0Iiwib2JqZWN0IiwicHJlZGljYXRlIiwiYXJyYXkiLCJidWlsZE1hdGNoUGF0dGVybkZuIiwicGFyc2VSZXN1bHQiLCJtYXRjaE9yZGluYWxOdW1iZXJQYXR0ZXJuIiwicGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiIsIm1hdGNoRXJhUGF0dGVybnMiLCJwYXJzZUVyYVBhdHRlcm5zIiwibWF0Y2hRdWFydGVyUGF0dGVybnMiLCJwYXJzZVF1YXJ0ZXJQYXR0ZXJucyIsIm1hdGNoTW9udGhQYXR0ZXJucyIsInBhcnNlTW9udGhQYXR0ZXJucyIsIm1hdGNoRGF5UGF0dGVybnMiLCJwYXJzZURheVBhdHRlcm5zIiwibWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyIsInBhcnNlRGF5UGVyaW9kUGF0dGVybnMiLCJkZWZhdWx0T3B0aW9ucyIsImdldERlZmF1bHRPcHRpb25zIiwidG9EYXRlIiwiYXJndW1lbnQiLCJnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzIiwidXRjRGF0ZSIsIm5vcm1hbGl6ZURhdGVzIiwiZGF0ZXMiLCJub3JtYWxpemUiLCJjb21wYXJlQXNjIiwiZGF0ZUxlZnQiLCJkYXRlUmlnaHQiLCJkaWZmIiwiZGlmZmVyZW5jZUluQ2FsZW5kYXJNb250aHMiLCJsYXRlckRhdGUiLCJlYXJsaWVyRGF0ZSIsImxhdGVyRGF0ZV8iLCJlYXJsaWVyRGF0ZV8iLCJ5ZWFyc0RpZmYiLCJtb250aHNEaWZmIiwiZW5kT2ZEYXkiLCJlbmRPZk1vbnRoIiwibW9udGgiLCJpc0xhc3REYXlPZk1vbnRoIiwiZGlmZmVyZW5jZUluTW9udGhzIiwid29ya2luZ0xhdGVyRGF0ZSIsInNpZ24iLCJpc0xhc3RNb250aE5vdEZ1bGwiLCJnZXRSb3VuZGluZ01ldGhvZCIsIm1ldGhvZCIsImRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyIsImRpZmZlcmVuY2VJblNlY29uZHMiLCJkZWZhdWx0TG9jYWxlIiwibWludXRlc0luQWxtb3N0VHdvRGF5cyIsImNvbXBhcmlzb24iLCJsb2NhbGl6ZU9wdGlvbnMiLCJvZmZzZXRJblNlY29uZHMiLCJtaW51dGVzIiwibW9udGhzIiwiaG91cnMiLCJuZWFyZXN0TW9udGgiLCJtb250aHNTaW5jZVN0YXJ0T2ZZZWFyIiwiZm9ybWF0RGlzdGFuY2VUb05vdyIsInN0YXJ0T2ZXZWVrIiwid2Vla1N0YXJ0c09uIiwiZGF5IiwiaXNTYW1lV2VlayIsImZvcm1hdHRpbmdNb250aFZhbHVlcyIsImRlIiwidW5pdCIsImlzRmVtYWxlIiwibWFsZSIsImZlbWFsZSIsIm9yZGluYWxOYW1lIiwiaGUiLCJjaGVja1dlZWsiLCJiYXNlRGF0ZSIsImJhc2VGb3JtYXQiLCJmb3JtYXQiLCJTYXZlZ2FtZUxvYWRlciIsImNvbXByZXNzZWQiLCJUb29sYmFyTGlzdEl0ZW0iLCJTdGF0ZU1hbmFnZW1lbnRVaSIsImdhbWVPYmplY3QiLCJzdGF0ZUluZGV4Iiwic3RhdGVPYmplY3QiLCJLaXR0ZW5TY2llbnRpc3RzIiwiZ2FtZVNsb3QiLCJzdGF0ZVNsb3QiLCJzYXZlRGF0YVN0cmluZyIsImVuY29kZWREYXRhIiwidXNlcklucHV0IiwiaW1wb3J0SWQiLCJpbXBvcnRTZXF1ZW5jZSIsIm1ha2VJbXBvcnRMYWJlbCIsImludGVybmFsSW1wb3J0Iiwic3ViamVjdERhdGEiLCJ1bmNvbXByZXNzZWQiLCJsaW5lIiwic3RhdGVMYWJlbCIsImdhbWVMYWJlbCIsImV4aXN0aW5nIiwic3RhdGVzSnNvbiIsImJsb2IiLCJ1cmwiLCJuZXdHYW1lIiwibmV3U3RhdGUiLCJJY29uU2V0dGluZ3NQYW5lbCIsIlJlc2V0Qm9uZmlyZVNldHRpbmdzVWkiLCJsaXN0QnVpbGRpbmdzIiwiZGVsaW1pdGVyIiwidXBncmFkZUluZGljYXRvciIsIlJlc2V0UmVsaWdpb25TZXR0aW5nc1VpIiwiUmVzZXRSZXNvdXJjZXNTZXR0aW5nc1VpIiwiUmVzZXRTcGFjZVNldHRpbmdzVWkiLCJwbGFudCIsIlJlc2V0VGltZVNldHRpbmdzVWkiLCJSZXNldFVwZ3JhZGVzU2V0dGluZ3NVaSIsImxhc3RFbGVtZW50IiwiUmVzZXRTZXR0aW5nc1VpIiwibGlzdCIsIkN5Y2xlc0xpc3QiLCJtYWtlQ3ljbGUiLCJjeWNsZXMiLCJTZWFzb25zTGlzdCIsIm1ha2VTZWFzb24iLCJUaW1lU2tpcEhlYXRTZXR0aW5nc1VpIiwic2VjdGlvblBhcmVudFNldHRpbmciLCJUaW1lU2tpcFNldHRpbmdzVWkiLCJUaW1lQ29udHJvbFNldHRpbmdzVWkiLCJhY2NlbGVyYXRlTGFiZWwiLCJUaW1lU2V0dGluZ3NVaSIsIkJ1eUJ1dHRvbiIsIlNlbGxCdXR0b24iLCJMaW1pdGVkQnV0dG9uIiwiU2V0dGluZ0xpbWl0ZWRMaXN0SXRlbSIsIlNldHRpbmdMaW1pdGVkVHJpZ2dlckxpc3RJdGVtIiwiU2V0dGluZ01heExpc3RJdGVtIiwiRW1iYXNzeVNldHRpbmdzVWkiLCJsaXN0UmFjZXMiLCJUcmFkZVNldHRpbmdzVWkiLCJsYWJlbFNlYXNvbiIsIlZpbGxhZ2VTZXR0aW5nc1VpIiwibGlzdEpvYnMiLCJXb3Jrc2hvcENyYWZ0TGlzdEl0ZW0iLCJVcGdyYWRlU2V0dGluZ3NVaSIsIldvcmtzaG9wU2V0dGluZ3NVaSIsImV4Y2x1ZGVDcmFmdHNBcnJheSIsInByZXBhcmVkQ3JhZnRzIiwibGlzdENyYWZ0cyIsIlVzZXJJbnRlcmZhY2UiLCJvcHRpb25zTGlzdEVsZW1lbnQiLCJzZWN0aW9uc1Zpc2libGUiLCJwYW5lbHNPcGVuIiwidXNpbmdLU0NvbHVtbiIsInJpZ2h0Iiwib3B0aW9uc1BhZ2VDb250ZW50IiwiX3dpdGhDaGlsZHJlbiIsIl90cmFjZSIsInByZWZpeCIsImVuZ2luZVN0YXRlIiwiX3NhdmVEYXRhIiwibWFuYWdlckluZGV4IiwiaGFzU3VmZml4IiwiYmFzZVZhbHVlIiwibnVtZXJpY1ZhbHVlIiwic3VmZml4IiwiZmxvYXRWYWx1ZSIsImNsZWFuZWRWYWx1ZSIsIndpdGhVbml0Iiwic2V0dGluZ3NTdHJpbmciLCJjb21wcmVzc2VkU2V0dGluZ3MiLCJuYWl2ZVBhcnNlIiwicmVxdWlyZXNVaVJlYnVpbGQiLCJlbmNvZGVkU2V0dGluZ3MiLCJ2IiwidXNlclNjcmlwdCJdLCJtYXBwaW5ncyI6InVyQkFPTyxTQUFTQSxFQUFNQyxFQUFTLENBQzNCLE9BQU9BLEdBQVksSUFDdkIsQ0FVTyxTQUFTQyxFQUFHRCxFQUFTRSxFQUFXLENBQ25DLE1BQU8sQ0FBQ0gsRUFBTUMsQ0FBTyxHQUFLQSxhQUFtQkUsQ0FDakQsQ0FJTyxNQUFNQyxVQUEyQixLQUFNLENBSzFDLFlBQVlDLEVBQVUsdUJBQXdCLENBQzFDLE1BQU1BLENBQU8sQ0FDckIsQ0FDQSxDQVNPLFNBQVNDLEVBQVVMLEVBQVNNLEVBQWMsQ0FDN0MsR0FBSVAsRUFBTUMsQ0FBTyxFQUNiLE1BQU0sSUFBSUcsRUFBbUJHLENBQVks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QUdMLE1BQUEsSUFBSSxNQUFNLDJCQUEyQixDQUFBLENBSzdDLG9CQUFxQixDQUNuQixRQUFRLEtBQUssR0FBR2dHLEVBQUcsaUNBQWlDLENBQUMsRUFDckQsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLFlBQVksQ0FBQSxDQTJCN0MsRUN4Y0MsU0FBWSxDQUNYLE1BQU0rOUIsRUFBYSxNQUFNLElBQUkxckIsRUFBbUIsRUFBQSxZQUFZZ21CLEdBQWtCLElBQUksRUFFbEZobUIsRUFBaUIsT0FBTyxpQkFBbUIwckIsRUFFM0NBLEVBQVcsYUFBYSxFQUN4QkEsRUFBVyxJQUFJLENBQ2pCLEtBQUssTUFBTSxRQUFRLEtBQUsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwzNCw2OCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTI3LDEyOCwxMjksMTMwLDEzMSwxMzIsMTMzLDEzNCwxMzUsMTM2LDEzNywxMzgsMTM5LDE0MCwxNDEsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE1NSwxNTYsMTU3LDE1OCwxNTldfQ==
23
+ (function(){"use strict";try{if(typeof document<"u"){var t=document.createElement("style");t.id="ks-styles",t.appendChild(document.createTextNode('._label_1nlev_1{align-content:center;display:inline-block;flex:0 1 fit-content;opacity:.8;white-space:nowrap;transition:.3s}._label_1nlev_1:hover{opacity:1}._splitter_1nlev_16 ._label_1nlev_1:first-letter{font-weight:700}._iconLabel_1nlev_20{display:inline-block;margin-right:4px;margin-left:2px;vertical-align:middle}._fillSpace_1nlev_26{flex:1}._delimiter_16hnh_1{margin-bottom:10px}._head_wr1pj_1{display:flex;align-items:stretch;flex-direction:row;justify-content:flex-start;width:100%;transition:.3s}._head_wr1pj_1>._headFlexItem_wr1pj_10{flex:1;margin-right:8px}._setting_1ndg5_1{border-bottom:1px solid transparent;transition:border-bottom .3s}._setting_1ndg5_1 ._checkbox_1ndg5_6{margin:1px 5px 2px 2px}._setting_1ndg5_1 ._panelContent_1ndg5_10{border-left:1px dashed grey;padding-left:16px;margin-left:8px;margin-top:1px;opacity:.5}._setting_1ndg5_1 ._panelContent_1ndg5_10._hidden_1ndg5_17{display:none}._setting_1ndg5_1._checked_1ndg5_22>._panelContent_1ndg5_10{opacity:1}._setting_1ndg5_1._expanded_1ndg5_26{margin-bottom:10px}._setting_1ndg5_1:not(._expanded_1ndg5_26):hover{border-bottom:1px dashed rgba(160,160,160,.2)}._setting_1ndg5_1._readonly_1ndg5_34{cursor:default;pointer-events:none}@keyframes _hail-rainbow_q7zpt_1{0%,to{color:red;text-shadow:0 0 10px red}33%{color:#888;text-shadow:0 0 10px yellow}66%{color:#fff;text-shadow:0 0 10px black}}._iconButton_q7zpt_17{cursor:pointer;display:block;padding-right:3px;line-height:0;opacity:.8;transition:.3s}._iconButton_q7zpt_17:hover{opacity:1}._iconButton_q7zpt_17._inactive_q7zpt_29{opacity:.4}._iconButton_q7zpt_17._inactive_q7zpt_29:hover{opacity:.6}._iconButton_q7zpt_17._ineffective_q7zpt_37{color:red;animation:_hail-rainbow_q7zpt_1 5s linear infinite}._button_q7zpt_43{align-items:end;cursor:pointer;display:flex;opacity:.8;transition:.3s}._button_q7zpt_43:hover{opacity:1}._button_q7zpt_43._inactive_q7zpt_29{opacity:.4}._button_q7zpt_43._inactive_q7zpt_29:hover{opacity:.6}._button_q7zpt_43._ineffective_q7zpt_37{color:red;animation:_hail-rainbow_q7zpt_1 5s linear infinite}._button_q7zpt_43._readonly_q7zpt_67{cursor:default;pointer-events:none}._button_q7zpt_43 ._buttonIcon_q7zpt_72{margin:0 2px 0 0;vertical-align:sub}._button_q7zpt_43._alignRight_q7zpt_77{justify-content:end}._button_q7zpt_43._large_q7zpt_81{padding:5px 10px}._button_q7zpt_43._bordered_q7zpt_85{border:1px solid rgba(180,180,180,.2)}._button_q7zpt_43._bordered_q7zpt_85:not(._large_q7zpt_81){padding:0 2px}._button_q7zpt_43._bordered_q7zpt_85:hover{border:1px solid rgba(180,180,180,1)}._button_q7zpt_43._headAction_q7zpt_97{min-width:50px}._button_q7zpt_43._lastHeadAction_q7zpt_100{padding-right:20px}._button_q7zpt_43._consumeButton_q7zpt_104,._button_q7zpt_43._stockButton_q7zpt_107{border:1px solid transparent}._button_q7zpt_43:not(._bordered_q7zpt_85)+._button_q7zpt_43:not(._bordered_q7zpt_85):before{content:"";display:inline-block;height:1em;border-left:1px solid transparent}._button_q7zpt_43:not(._bordered_q7zpt_85):not(._inactive_q7zpt_29)._alignRight_q7zpt_77+._button_q7zpt_43:not(._bordered_q7zpt_85):not(._inactive_q7zpt_29):before{content:"";display:inline-block;height:1em;border-left:1px solid rgba(180,180,180,.4)}._listContainer_1kxbq_1{margin-bottom:4px}._itemsList_1kxbq_5{-webkit-user-select:none;user-select:none}._list_1kxbq_1~._listTools_1kxbq_9{border-top:1px dotted rgba(128,128,128,.3);margin-left:0;padding-top:2px}._list_1kxbq_1~._listTools_1kxbq_9 *{display:inline-block}._expandoButton_l1ukp_1:not(._expanded_l1ukp_1) ._up_l1ukp_1{display:none}._expandoButton_l1ukp_1:not(._expanded_l1ukp_1) ._down_l1ukp_4{opacity:.6}._expandoButton_l1ukp_1:not(._expanded_l1ukp_1) ._down_l1ukp_4:hover{opacity:1}._expandoButton_l1ukp_1._expanded_l1ukp_1 ._down_l1ukp_4{display:none}#gamePageContainer .dialog.help ._dialog_1276o_1{display:flex;flex-direction:column;height:fit-content!important;box-shadow:none!important}#gamePageContainer .dialog.help ._dialog_1276o_1 ._close_1276o_7{position:absolute;top:10px;right:15px}._explainer_1idu3_1{color:#888;display:inline-block;min-width:100px;-webkit-user-select:none;user-select:none;padding:4px;white-space:break-spaces}._explainer_1idu3_1 p{margin:0}._header_19ql8_1{display:block;margin-bottom:3px;min-width:100px;border-bottom:1px dashed rgba(255,255,255,.1);font-weight:700;-webkit-user-select:none;user-select:none}._toolbar_1654f_1{display:flex;flex-direction:row;padding:0 0 2px;margin:0 0 3px}._toolbar_1654f_1>*{margin:0 3px 0 0}._maxButton_133h2_1{padding-right:5px;padding-top:2px}._fieldset_tfwil_1{border-bottom:none;border-right:none;border-top:none}._textButton_1mv97_1{display:inline-block;white-space:nowrap;opacity:.8;cursor:pointer;-webkit-user-select:none;user-select:none}._textButton_1mv97_1:hover{opacity:1}@keyframes _scale_6c09s_1{0%{scale:.5;opacity:0}50%{scale:1;opacity:1}to{scale:2;opacity:0}}._active_6c09s_16{text-shadow:rgba(128,128,128,.8) 0 0 15px;position:relative}._active_6c09s_16:after,._active_6c09s_16:before{display:inline-block;width:1em;height:100%;position:absolute;right:-1.5em;scale:0;text-align:center;transform-origin:center}._active_6c09s_16:after{content:attr(data-ks-active-from);animation:_scale_6c09s_1 8s linear infinite}._active_6c09s_16:before{content:attr(data-ks-active-to);animation:_scale_6c09s_1 8s linear infinite;animation-delay:4s}._buyButton_10eul_1,._sellButton_1tmvd_1{display:inline-block;padding-right:10px;min-width:86px}#ksColumn{min-width:250px;max-width:440px;vertical-align:top;padding-left:8px;top:20px;position:relative;overflow-y:auto}#footerLinks{display:flex;flex-direction:column;position:fixed;text-align:right;line-height:0;right:-5px!important;margin-bottom:1em}#footerLinks a{line-height:1;padding-right:10px;opacity:.5;transition:.3s;text-decoration:none;text-transform:lowercase}#footerLinks a:hover{opacity:1}#crowdjet-expand-container{position:fixed!important;bottom:10px!important;right:-10px!important;opacity:.5}#crowdjet-expand-container:hover{opacity:1}._spacer_auis8_44{display:block;margin-bottom:100px}._ui_auis8_49{margin:5px 0 10px;padding-right:10px}._ui_auis8_49 ul{list-style:none;margin:0;padding:0}._ui_auis8_49 #_toggle-list-resources_auis8_1 ._stockWarn_auis8_60 *,._ui_auis8_49 #_toggle-reset-list-resources_auis8_1 ._stockWarn_auis8_60 *{color:#dd1e00}._showActivity_auis8_66{cursor:pointer;display:inline-block;vertical-align:middle}#game #rightColumn{overflow-y:auto}#game #rightColumn #rightTabLog{overflow-y:visible}#game #rightColumn #rightTabLog #gameLog{height:auto;min-height:auto;overflow-y:visible}#game .res-row .res-cell.ks-stock-above{color:green}#game .res-row .res-cell.ks-stock-below{color:red}')),document.head.appendChild(t)}}catch(e){console.error("vite-plugin-css-injected-by-js",e)}})();