@beesolve/lambda-keep-active 1.0.2 → 1.0.4

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.
@@ -1,32 +0,0 @@
1
- import{w as ve,x as Xr}from"./chunk-dkk1zwm0.js";import{y as nu}from"./chunk-r8mj3nq7.js";import{A as fr,B as kf,D as jf,F as dr,H as _0,I as wr,J as st,K as yr,z as zs}from"./chunk-fbbbv2d4.js";import{L as ss}from"./chunk-ekwpcdh4.js";import{M as mf,N as _g,O as Qs}from"./chunk-whenq5kz.js";import{P as Le}from"./chunk-kvnavsh3.js";import{R as pw}from"./chunk-t5j8kj9p.js";import{S as wn}from"./chunk-4pkw7jk4.js";import{T as ic,U as P,W as Ss}from"./chunk-e9mt878v.js";var kh=P((Kh)=>{var Vh=ss();function Zh(s){return s}var ue=(s)=>(t)=>async(r)=>{if(!Vh.HttpRequest.isInstance(r.request))return t(r);let{request:e}=r,{handlerProtocol:i=""}=s.requestHandler.metadata||{};if(i.indexOf("h2")>=0&&!e.headers[":authority"])delete e.headers.host,e.headers[":authority"]=e.hostname+(e.port?":"+e.port:"");else if(!e.headers.host){let n=e.hostname;if(e.port!=null)n+=`:${e.port}`;e.headers.host=n}return t(r)},ge={name:"hostHeaderMiddleware",step:"build",priority:"low",tags:["HOST"],override:!0},qh=(s)=>({applyToStack:(t)=>{t.add(ue(s),ge)}});Kh.getHostHeaderPlugin=qh;Kh.hostHeaderMiddleware=ue;Kh.hostHeaderMiddlewareOptions=ge;Kh.resolveHostHeaderConfig=Zh});var ec=P((vh)=>{var Ne=()=>(s,t)=>async(r)=>{try{let e=await s(r),{clientName:i,commandName:n,logger:o,dynamoDbDocumentClientOptions:f={}}=t,{overrideInputFilterSensitiveLog:d,overrideOutputFilterSensitiveLog:w}=f,u=d??t.inputFilterSensitiveLog,A=w??t.outputFilterSensitiveLog,{$metadata:_,...U}=e.output;return o?.info?.({clientName:i,commandName:n,input:u(r.input),output:A(U),metadata:_}),e}catch(e){let{clientName:i,commandName:n,logger:o,dynamoDbDocumentClientOptions:f={}}=t,{overrideInputFilterSensitiveLog:d}=f,w=d??t.inputFilterSensitiveLog;throw o?.error?.({clientName:i,commandName:n,input:w(r.input),error:e,metadata:e.$metadata}),e}},Ae={name:"loggerMiddleware",tags:["LOGGER"],step:"initialize",override:!0},jh=(s)=>({applyToStack:(t)=>{t.add(Ne(),Ae)}});vh.getLoggerPlugin=jh;vh.loggerMiddleware=Ne;vh.loggerMiddlewareOptions=Ae});var xe=P((nc)=>{var Xs={REQUEST_ID:Symbol.for("_AWS_LAMBDA_REQUEST_ID"),X_RAY_TRACE_ID:Symbol.for("_AWS_LAMBDA_X_RAY_TRACE_ID"),TENANT_ID:Symbol.for("_AWS_LAMBDA_TENANT_ID")},Ct=["true","1"].includes(process.env?.AWS_LAMBDA_NODEJS_NO_GLOBAL_AWSLAMBDA??"");if(!Ct)globalThis.awslambda=globalThis.awslambda||{};class js{static PROTECTED_KEYS=Xs;isProtectedKey(s){return Object.values(Xs).includes(s)}getRequestId(){return this.get(Xs.REQUEST_ID)??"-"}getXRayTraceId(){return this.get(Xs.X_RAY_TRACE_ID)}getTenantId(){return this.get(Xs.TENANT_ID)}}class _e extends js{currentContext;getContext(){return this.currentContext}hasContext(){return this.currentContext!==void 0}get(s){return this.currentContext?.[s]}set(s,t){if(this.isProtectedKey(s))throw Error(`Cannot modify protected Lambda context field: ${String(s)}`);this.currentContext=this.currentContext||{},this.currentContext[s]=t}run(s,t){this.currentContext=s;try{return t()}finally{this.currentContext=void 0}}}class Pt extends js{als;static async create(){let s=new Pt,t=await import("node:async_hooks");return s.als=new t.AsyncLocalStorage,s}getContext(){return this.als.getStore()}hasContext(){return this.als.getStore()!==void 0}get(s){return this.als.getStore()?.[s]}set(s,t){if(this.isProtectedKey(s))throw Error(`Cannot modify protected Lambda context field: ${String(s)}`);let r=this.als.getStore();if(!r)throw Error("No context available");r[s]=t}run(s,t){return this.als.run(s,t)}}nc.InvokeStore=void 0;(function(s){let t=null;async function r(){if(!t)t=(async()=>{let i="AWS_LAMBDA_MAX_CONCURRENCY"in process.env?await Pt.create():new _e;if(!Ct&&globalThis.awslambda?.InvokeStore)return globalThis.awslambda.InvokeStore;else if(!Ct&&globalThis.awslambda)return globalThis.awslambda.InvokeStore=i,i;else return i})();return t}s.getInstanceAsync=r,s._testing=process.env.AWS_LAMBDA_BENCHMARK_MODE==="1"?{reset:()=>{if(t=null,globalThis.awslambda?.InvokeStore)delete globalThis.awslambda.InvokeStore;globalThis.awslambda={}}}:void 0})(nc.InvokeStore||(nc.InvokeStore={}));nc.InvokeStoreBase=js});var Ue=P((Te)=>{Object.defineProperty(Te,"__esModule",{value:!0});Te.recursionDetectionMiddleware=void 0;var hc=xe(),cc=ss(),Ht="X-Amzn-Trace-Id",fc="AWS_LAMBDA_FUNCTION_NAME",dc="_X_AMZN_TRACE_ID",wc=()=>(s)=>async(t)=>{let{request:r}=t;if(!cc.HttpRequest.isInstance(r))return s(t);let e=Object.keys(r.headers??{}).find((u)=>u.toLowerCase()===Ht.toLowerCase())??Ht;if(r.headers.hasOwnProperty(e))return s(t);let i=process.env[fc],n=process.env[dc],d=(await hc.InvokeStore.getInstanceAsync())?.getXRayTraceId()??n,w=(u)=>typeof u==="string"&&u.length>0;if(w(i)&&w(d))r.headers[Ht]=d;return s({...t,request:r})};Te.recursionDetectionMiddleware=wc});var gc=P((Ot)=>{var Gt=Ue(),lc={step:"build",tags:["RECURSION_DETECTION"],name:"recursionDetectionMiddleware",override:!0,priority:"low"},Ec=(s)=>({applyToStack:(t)=>{t.add(Gt.recursionDetectionMiddleware(),lc)}});Ot.getRecursionDetectionPlugin=Ec;Object.keys(Gt).forEach(function(s){if(s!=="default"&&!Object.prototype.hasOwnProperty.call(Ot,s))Object.defineProperty(Ot,s,{enumerable:!0,get:function(){return Gt[s]}})})});var Xt=P((_c)=>{var Nc=ss(),Ie=(s,t)=>(r,e)=>async(i)=>{let{response:n}=await r(i);try{let o=await t(n,s);return{response:n,output:o}}catch(o){if(Object.defineProperty(o,"$response",{value:n,enumerable:!1,writable:!1,configurable:!1}),!("$metadata"in o)){try{o.message+=`
2
- Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`}catch(d){if(!e.logger||e.logger?.constructor?.name==="NoOpLogger")console.warn("Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.");else e.logger?.warn?.("Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.")}if(typeof o.$responseBodyText<"u"){if(o.$response)o.$response.body=o.$responseBodyText}try{if(Nc.HttpResponse.isInstance(n)){let{headers:d={}}=n,w=Object.entries(d);o.$metadata={httpStatusCode:n.statusCode,requestId:Wt(/^x-[\w-]+-request-?id$/,w),extendedRequestId:Wt(/^x-[\w-]+-id-2$/,w),cfId:Wt(/^x-[\w-]+-cf-id$/,w)}}}catch(d){}}throw o}},Wt=(s,t)=>{return(t.find(([r])=>{return r.match(s)})||[void 0,void 0])[1]},Se=(s,t)=>(r,e)=>async(i)=>{let n=s,o=e.endpointV2?.url&&n.urlParser?async()=>n.urlParser(e.endpointV2.url):n.endpoint;if(!o)throw Error("No valid endpoint provider available.");let f=await t(i.input,{...s,endpoint:o});return r({...i,request:f})},ye={name:"deserializerMiddleware",step:"deserialize",tags:["DESERIALIZER"],override:!0},Me={name:"serializerMiddleware",step:"serialize",tags:["SERIALIZER"],override:!0};function Ac(s,t,r){return{applyToStack:(e)=>{e.add(Ie(s,r),ye),e.add(Se(s,t),Me)}}}_c.deserializerMiddleware=Ie;_c.deserializerMiddlewareOption=ye;_c.getSerdePlugin=Ac;_c.serializerMiddleware=Se;_c.serializerMiddlewareOption=Me});var tt=P((Fe)=>{var vs=Le(),De=zs(),Sc=Xt(),Ft=ss(),yc=st(),Mc=(s)=>s[vs.SMITHY_CONTEXT_KEY]||(s[vs.SMITHY_CONTEXT_KEY]={}),Lc=(s,t)=>{if(!t||t.length===0)return s;let r=[];for(let e of t)for(let i of s)if(i.schemeId.split("#")[1]===e)r.push(i);for(let e of s)if(!r.find(({schemeId:i})=>i===e.schemeId))r.push(e);return r};function Dc(s){let t=new Map;for(let r of s)t.set(r.schemeId,r);return t}var Qt=(s,t)=>(r,e)=>async(i)=>{let n=s.httpAuthSchemeProvider(await t.httpAuthSchemeParametersProvider(s,e,i.input)),o=s.authSchemePreference?await s.authSchemePreference():[],f=Lc(n,o),d=Dc(s.httpAuthSchemes),w=De.getSmithyContext(e),u=[];for(let A of f){let _=d.get(A.schemeId);if(!_){u.push(`HttpAuthScheme \`${A.schemeId}\` was not enabled for this service.`);continue}let U=_.identityProvider(await t.identityProviderConfigProvider(s));if(!U){u.push(`HttpAuthScheme \`${A.schemeId}\` did not have an IdentityProvider configured.`);continue}let{identityProperties:S={},signingProperties:y={}}=A.propertiesExtractor?.(s,e)||{};A.identityProperties=Object.assign(A.identityProperties||{},S),A.signingProperties=Object.assign(A.signingProperties||{},y),w.selectedHttpAuthScheme={httpAuthOption:A,identity:await U(A.identityProperties),signer:_.signer};break}if(!w.selectedHttpAuthScheme)throw Error(u.join(`
3
- `));return r(i)},ze={step:"serialize",tags:["HTTP_AUTH_SCHEME"],name:"httpAuthSchemeMiddleware",override:!0,relation:"before",toMiddleware:"endpointV2Middleware"},zc=(s,{httpAuthSchemeParametersProvider:t,identityProviderConfigProvider:r})=>({applyToStack:(e)=>{e.addRelativeTo(Qt(s,{httpAuthSchemeParametersProvider:t,identityProviderConfigProvider:r}),ze)}}),Re={step:"serialize",tags:["HTTP_AUTH_SCHEME"],name:"httpAuthSchemeMiddleware",override:!0,relation:"before",toMiddleware:Sc.serializerMiddlewareOption.name},Rc=(s,{httpAuthSchemeParametersProvider:t,identityProviderConfigProvider:r})=>({applyToStack:(e)=>{e.addRelativeTo(Qt(s,{httpAuthSchemeParametersProvider:t,identityProviderConfigProvider:r}),Re)}}),bc=(s)=>(t)=>{throw t},Cc=(s,t)=>{},be=(s)=>(t,r)=>async(e)=>{if(!Ft.HttpRequest.isInstance(e.request))return t(e);let n=De.getSmithyContext(r).selectedHttpAuthScheme;if(!n)throw Error("No HttpAuthScheme was selected: unable to sign request");let{httpAuthOption:{signingProperties:o={}},identity:f,signer:d}=n,w=await t({...e,request:await d.sign(e.request,f,o)}).catch((d.errorHandler||bc)(o));return(d.successHandler||Cc)(w.response,o),w},Ce={step:"finalizeRequest",tags:["HTTP_SIGNING"],name:"httpSigningMiddleware",aliases:["apiKeyMiddleware","tokenMiddleware","awsAuthMiddleware"],override:!0,relation:"after",toMiddleware:"retryMiddleware"},Bc=(s)=>({applyToStack:(t)=>{t.addRelativeTo(be(),Ce)}}),Pc=(s)=>{if(typeof s==="function")return s;let t=Promise.resolve(s);return()=>t},Hc=async(s,t,r,e=(n)=>n,...i)=>{let n=new s(r);return n=e(n)??n,await t.send(n,...i)};function Gc(s,t,r,e,i){return async function*(o,f,...d){let w=f,u=o.startingToken??w[r],A=!0,_;while(A){if(w[r]=u,i)w[i]=w[i]??o.pageSize;if(o.client instanceof s)_=await Hc(t,o.client,f,o.withCommand,...d);else throw Error(`Invalid client, expected instance of ${s.name}`);yield _;let U=u;u=Oc(_,e),A=!!(u&&(!o.stopOnSameToken||u!==U))}return}}var Oc=(s,t)=>{let r=s,e=t.split(".");for(let i of e){if(!r||typeof r!=="object")return;r=r[i]}return r};function Wc(s,t,r){if(!s.__smithy_context)s.__smithy_context={features:{}};else if(!s.__smithy_context.features)s.__smithy_context.features={};s.__smithy_context.features[t]=r}class Be{authSchemes=new Map;constructor(s){for(let[t,r]of Object.entries(s))if(r!==void 0)this.authSchemes.set(t,r)}getIdentityProvider(s){return this.authSchemes.get(s)}}class Pe{async sign(s,t,r){if(!r)throw Error("request could not be signed with `apiKey` since the `name` and `in` signer properties are missing");if(!r.name)throw Error("request could not be signed with `apiKey` since the `name` signer property is missing");if(!r.in)throw Error("request could not be signed with `apiKey` since the `in` signer property is missing");if(!t.apiKey)throw Error("request could not be signed with `apiKey` since the `apiKey` is not defined");let e=Ft.HttpRequest.clone(s);if(r.in===vs.HttpApiKeyAuthLocation.QUERY)e.query[r.name]=t.apiKey;else if(r.in===vs.HttpApiKeyAuthLocation.HEADER)e.headers[r.name]=r.scheme?`${r.scheme} ${t.apiKey}`:t.apiKey;else throw Error("request can only be signed with `apiKey` locations `query` or `header`, but found: `"+r.in+"`");return e}}class He{async sign(s,t,r){let e=Ft.HttpRequest.clone(s);if(!t.token)throw Error("request could not be signed with `token` since the `token` is not defined");return e.headers.Authorization=`Bearer ${t.token}`,e}}class Ge{async sign(s,t,r){return s}}var Oe=(s)=>function(r){return Xe(r)&&r.expiration.getTime()-Date.now()<s},We=300000,Xc=Oe(We),Xe=(s)=>s.expiration!==void 0,Fc=(s,t,r)=>{if(s===void 0)return;let e=typeof s!=="function"?async()=>Promise.resolve(s):s,i,n,o,f=!1,d=async(w)=>{if(!n)n=e(w);try{i=await n,o=!0,f=!1}finally{n=void 0}return i};if(t===void 0)return async(w)=>{if(!o||w?.forceRefresh)i=await d(w);return i};return async(w)=>{if(!o||w?.forceRefresh)i=await d(w);if(f)return i;if(!r(i))return f=!0,i;if(t(i))return await d(w),i;return i}};Object.defineProperty(Fe,"requestBuilder",{enumerable:!0,get:function(){return yc.requestBuilder}});Fe.DefaultIdentityProviderConfig=Be;Fe.EXPIRATION_MS=We;Fe.HttpApiKeyAuthSigner=Pe;Fe.HttpBearerAuthSigner=He;Fe.NoAuthSigner=Ge;Fe.createIsIdentityExpiredFunction=Oe;Fe.createPaginator=Gc;Fe.doesIdentityRequireRefresh=Xe;Fe.getHttpAuthSchemeEndpointRuleSetPlugin=zc;Fe.getHttpAuthSchemePlugin=Rc;Fe.getHttpSigningPlugin=Bc;Fe.getSmithyContext=Mc;Fe.httpAuthSchemeEndpointRuleSetMiddlewareOptions=ze;Fe.httpAuthSchemeMiddleware=Qt;Fe.httpAuthSchemeMiddlewareOptions=Re;Fe.httpSigningMiddleware=be;Fe.httpSigningMiddlewareOptions=Ce;Fe.isIdentityExpired=Xc;Fe.memoizeIdentityProvider=Fc;Fe.normalizeProvider=Pc;Fe.setFeature=Wc});var Jt=P((Df)=>{var Vt=Le();class Qe{capacity;data=new Map;parameters=[];constructor({size:s,params:t}){if(this.capacity=s??50,t)this.parameters=t}get(s,t){let r=this.hash(s);if(r===!1)return t();if(!this.data.has(r)){if(this.data.size>this.capacity+10){let e=this.data.keys(),i=0;while(!0){let{value:n,done:o}=e.next();if(this.data.delete(n),o||++i>10)break}}this.data.set(r,t())}return this.data.get(r)}size(){return this.data.size}hash(s){let t="",{parameters:r}=this;if(r.length===0)return!1;for(let e of r){let i=String(s[e]??"");if(i.includes("|;"))return!1;t+=i+"|;"}return t}}var ff=new RegExp("^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$"),pe=(s)=>ff.test(s)||s.startsWith("[")&&s.endsWith("]"),df=new RegExp("^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$"),qt=(s,t=!1)=>{if(!t)return df.test(s);let r=s.split(".");for(let e of r)if(!qt(e))return!1;return!0},Zt={},Fs="endpoints";function ls(s){if(typeof s!=="object"||s==null)return s;if("ref"in s)return`$${ls(s.ref)}`;if("fn"in s)return`${s.fn}(${(s.argv||[]).map(ls).join(", ")})`;return JSON.stringify(s,null,2)}class m extends Error{constructor(s){super(s);this.name="EndpointError"}}var wf=(s,t)=>s===t,lf=(s)=>{let t=s.split("."),r=[];for(let e of t){let i=e.indexOf("[");if(i!==-1){if(e.indexOf("]")!==e.length-1)throw new m(`Path: '${s}' does not end with ']'`);let n=e.slice(i+1,-1);if(Number.isNaN(parseInt(n)))throw new m(`Invalid array index: '${n}' in path: '${s}'`);if(i!==0)r.push(e.slice(0,i));r.push(n)}else r.push(e)}return r},Ve=(s,t)=>lf(t).reduce((r,e)=>{if(typeof r!=="object")throw new m(`Index '${e}' in '${t}' not found in '${JSON.stringify(s)}'`);else if(Array.isArray(r))return r[parseInt(e)];return r[e]},s),Ef=(s)=>s!=null,uf=(s)=>!s,pt={[Vt.EndpointURLScheme.HTTP]:80,[Vt.EndpointURLScheme.HTTPS]:443},gf=(s)=>{let t=(()=>{try{if(s instanceof URL)return s;if(typeof s==="object"&&"hostname"in s){let{hostname:_,port:U,protocol:S="",path:y="",query:G={}}=s,L=new URL(`${S}//${_}${U?`:${U}`:""}${y}`);return L.search=Object.entries(G).map(([Z,b])=>`${Z}=${b}`).join("&"),L}return new URL(s)}catch(_){return null}})();if(!t)return console.error(`Unable to parse ${JSON.stringify(s)} as a whatwg URL.`),null;let r=t.href,{host:e,hostname:i,pathname:n,protocol:o,search:f}=t;if(f)return null;let d=o.slice(0,-1);if(!Object.values(Vt.EndpointURLScheme).includes(d))return null;let w=pe(i),u=r.includes(`${e}:${pt[d]}`)||typeof s==="string"&&s.includes(`${e}:${pt[d]}`),A=`${e}${u?`:${pt[d]}`:""}`;return{scheme:d,authority:A,path:n,normalizedPath:n.endsWith("/")?n:`${n}/`,isIp:w}},Nf=(s,t)=>s===t,Af=(s,t,r,e)=>{if(t>=r||s.length<r)return null;if(!e)return s.substring(t,r);return s.substring(s.length-r,s.length-t)},_f=(s)=>encodeURIComponent(s).replace(/[!*'()]/g,(t)=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`),xf={booleanEquals:wf,getAttr:Ve,isSet:Ef,isValidHostLabel:qt,not:uf,parseURL:gf,stringEquals:Nf,substring:Af,uriEncode:_f},Ze=(s,t)=>{let r=[],e={...t.endpointParams,...t.referenceRecord},i=0;while(i<s.length){let n=s.indexOf("{",i);if(n===-1){r.push(s.slice(i));break}r.push(s.slice(i,n));let o=s.indexOf("}",n);if(o===-1){r.push(s.slice(n));break}if(s[n+1]==="{"&&s[o+1]==="}")r.push(s.slice(n+1,o)),i=o+2;let f=s.substring(n+1,o);if(f.includes("#")){let[d,w]=f.split("#");r.push(Ve(e[d],w))}else r.push(e[f]);i=o+1}return r.join("")},Tf=({ref:s},t)=>{return{...t.endpointParams,...t.referenceRecord}[s]},rt=(s,t,r)=>{if(typeof s==="string")return Ze(s,r);else if(s.fn)return Ke.callFunction(s,r);else if(s.ref)return Tf(s,r);throw new m(`'${t}': ${String(s)} is not a string, function or reference.`)},qe=({fn:s,argv:t},r)=>{let e=t.map((n)=>["boolean","number"].includes(typeof n)?n:Ke.evaluateExpression(n,"arg",r)),i=s.split(".");if(i[0]in Zt&&i[1]!=null)return Zt[i[0]][i[1]](...e);return xf[s](...e)},Ke={evaluateExpression:rt,callFunction:qe},$f=({assign:s,...t},r)=>{if(s&&s in r.referenceRecord)throw new m(`'${s}' is already defined in Reference Record.`);let e=qe(t,r);return r.logger?.debug?.(`${Fs} evaluateCondition: ${ls(t)} = ${ls(e)}`),{result:e===""?!0:!!e,...s!=null&&{toAssign:{name:s,value:e}}}},Kt=(s=[],t)=>{let r={};for(let e of s){let{result:i,toAssign:n}=$f(e,{...t,referenceRecord:{...t.referenceRecord,...r}});if(!i)return{result:i};if(n)r[n.name]=n.value,t.logger?.debug?.(`${Fs} assign: ${n.name} := ${ls(n.value)}`)}return{result:!0,referenceRecord:r}},Uf=(s,t)=>Object.entries(s).reduce((r,[e,i])=>({...r,[e]:i.map((n)=>{let o=rt(n,"Header value entry",t);if(typeof o!=="string")throw new m(`Header '${e}' value '${o}' is not a string`);return o})}),{}),Je=(s,t)=>Object.entries(s).reduce((r,[e,i])=>({...r,[e]:ae.getEndpointProperty(i,t)}),{}),Ye=(s,t)=>{if(Array.isArray(s))return s.map((r)=>Ye(r,t));switch(typeof s){case"string":return Ze(s,t);case"object":if(s===null)throw new m(`Unexpected endpoint property: ${s}`);return ae.getEndpointProperties(s,t);case"boolean":return s;default:throw new m(`Unexpected endpoint property type: ${typeof s}`)}},ae={getEndpointProperty:Ye,getEndpointProperties:Je},If=(s,t)=>{let r=rt(s,"Endpoint URL",t);if(typeof r==="string")try{return new URL(r)}catch(e){throw console.error(`Failed to construct URL with ${r}`,e),e}throw new m(`Endpoint URL must be a string, got ${typeof r}`)},Sf=(s,t)=>{let{conditions:r,endpoint:e}=s,{result:i,referenceRecord:n}=Kt(r,t);if(!i)return;let o={...t,referenceRecord:{...t.referenceRecord,...n}},{url:f,properties:d,headers:w}=e;return t.logger?.debug?.(`${Fs} Resolving endpoint from template: ${ls(e)}`),{...w!=null&&{headers:Uf(w,o)},...d!=null&&{properties:Je(d,o)},url:If(f,o)}},yf=(s,t)=>{let{conditions:r,error:e}=s,{result:i,referenceRecord:n}=Kt(r,t);if(!i)return;throw new m(rt(e,"Error",{...t,referenceRecord:{...t.referenceRecord,...n}}))},me=(s,t)=>{for(let r of s)if(r.type==="endpoint"){let e=Sf(r,t);if(e)return e}else if(r.type==="error")yf(r,t);else if(r.type==="tree"){let e=ke.evaluateTreeRule(r,t);if(e)return e}else throw new m(`Unknown endpoint rule: ${r}`);throw new m("Rules evaluation failed")},Mf=(s,t)=>{let{conditions:r,rules:e}=s,{result:i,referenceRecord:n}=Kt(r,t);if(!i)return;return ke.evaluateRules(e,{...t,referenceRecord:{...t.referenceRecord,...n}})},ke={evaluateRules:me,evaluateTreeRule:Mf},Lf=(s,t)=>{let{endpointParams:r,logger:e}=t,{parameters:i,rules:n}=s;t.logger?.debug?.(`${Fs} Initial EndpointParams: ${ls(r)}`);let o=Object.entries(i).filter(([,w])=>w.default!=null).map(([w,u])=>[w,u.default]);if(o.length>0)for(let[w,u]of o)r[w]=r[w]??u;let f=Object.entries(i).filter(([,w])=>w.required).map(([w])=>w);for(let w of f)if(r[w]==null)throw new m(`Missing required parameter: '${w}'`);let d=me(n,{endpointParams:r,logger:e,referenceRecord:{}});return t.logger?.debug?.(`${Fs} Resolved endpoint: ${ls(d)}`),d};Df.EndpointCache=Qe;Df.EndpointError=m;Df.customEndpointFunctions=Zt;Df.isIpAddress=pe;Df.isValidHostLabel=qt;Df.resolveEndpoint=Lf});var ci=P((et)=>{var Rs=Jt(),Hf=ve(),si=(s,t=!1)=>{if(t){for(let r of s.split("."))if(!si(r))return!1;return!0}if(!Rs.isValidHostLabel(s))return!1;if(s.length<3||s.length>63)return!1;if(s!==s.toLowerCase())return!1;if(Rs.isIpAddress(s))return!1;return!0},je=":",Gf="/",Of=(s)=>{let t=s.split(je);if(t.length<6)return null;let[r,e,i,n,o,...f]=t;if(r!=="arn"||e===""||i===""||f.join(je)==="")return null;let d=f.map((w)=>w.split(Gf)).flat();return{partition:e,service:i,region:n,accountId:o,resourceId:d}},Wf=[{id:"aws",outputs:{dnsSuffix:"amazonaws.com",dualStackDnsSuffix:"api.aws",implicitGlobalRegion:"us-east-1",name:"aws",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$",regions:{"af-south-1":{description:"Africa (Cape Town)"},"ap-east-1":{description:"Asia Pacific (Hong Kong)"},"ap-east-2":{description:"Asia Pacific (Taipei)"},"ap-northeast-1":{description:"Asia Pacific (Tokyo)"},"ap-northeast-2":{description:"Asia Pacific (Seoul)"},"ap-northeast-3":{description:"Asia Pacific (Osaka)"},"ap-south-1":{description:"Asia Pacific (Mumbai)"},"ap-south-2":{description:"Asia Pacific (Hyderabad)"},"ap-southeast-1":{description:"Asia Pacific (Singapore)"},"ap-southeast-2":{description:"Asia Pacific (Sydney)"},"ap-southeast-3":{description:"Asia Pacific (Jakarta)"},"ap-southeast-4":{description:"Asia Pacific (Melbourne)"},"ap-southeast-5":{description:"Asia Pacific (Malaysia)"},"ap-southeast-6":{description:"Asia Pacific (New Zealand)"},"ap-southeast-7":{description:"Asia Pacific (Thailand)"},"aws-global":{description:"aws global region"},"ca-central-1":{description:"Canada (Central)"},"ca-west-1":{description:"Canada West (Calgary)"},"eu-central-1":{description:"Europe (Frankfurt)"},"eu-central-2":{description:"Europe (Zurich)"},"eu-north-1":{description:"Europe (Stockholm)"},"eu-south-1":{description:"Europe (Milan)"},"eu-south-2":{description:"Europe (Spain)"},"eu-west-1":{description:"Europe (Ireland)"},"eu-west-2":{description:"Europe (London)"},"eu-west-3":{description:"Europe (Paris)"},"il-central-1":{description:"Israel (Tel Aviv)"},"me-central-1":{description:"Middle East (UAE)"},"me-south-1":{description:"Middle East (Bahrain)"},"mx-central-1":{description:"Mexico (Central)"},"sa-east-1":{description:"South America (Sao Paulo)"},"us-east-1":{description:"US East (N. Virginia)"},"us-east-2":{description:"US East (Ohio)"},"us-west-1":{description:"US West (N. California)"},"us-west-2":{description:"US West (Oregon)"}}},{id:"aws-cn",outputs:{dnsSuffix:"amazonaws.com.cn",dualStackDnsSuffix:"api.amazonwebservices.com.cn",implicitGlobalRegion:"cn-northwest-1",name:"aws-cn",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^cn\\-\\w+\\-\\d+$",regions:{"aws-cn-global":{description:"aws-cn global region"},"cn-north-1":{description:"China (Beijing)"},"cn-northwest-1":{description:"China (Ningxia)"}}},{id:"aws-eusc",outputs:{dnsSuffix:"amazonaws.eu",dualStackDnsSuffix:"api.amazonwebservices.eu",implicitGlobalRegion:"eusc-de-east-1",name:"aws-eusc",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^eusc\\-(de)\\-\\w+\\-\\d+$",regions:{"eusc-de-east-1":{description:"EU (Germany)"}}},{id:"aws-iso",outputs:{dnsSuffix:"c2s.ic.gov",dualStackDnsSuffix:"api.aws.ic.gov",implicitGlobalRegion:"us-iso-east-1",name:"aws-iso",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-iso\\-\\w+\\-\\d+$",regions:{"aws-iso-global":{description:"aws-iso global region"},"us-iso-east-1":{description:"US ISO East"},"us-iso-west-1":{description:"US ISO WEST"}}},{id:"aws-iso-b",outputs:{dnsSuffix:"sc2s.sgov.gov",dualStackDnsSuffix:"api.aws.scloud",implicitGlobalRegion:"us-isob-east-1",name:"aws-iso-b",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-isob\\-\\w+\\-\\d+$",regions:{"aws-iso-b-global":{description:"aws-iso-b global region"},"us-isob-east-1":{description:"US ISOB East (Ohio)"},"us-isob-west-1":{description:"US ISOB West"}}},{id:"aws-iso-e",outputs:{dnsSuffix:"cloud.adc-e.uk",dualStackDnsSuffix:"api.cloud-aws.adc-e.uk",implicitGlobalRegion:"eu-isoe-west-1",name:"aws-iso-e",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^eu\\-isoe\\-\\w+\\-\\d+$",regions:{"aws-iso-e-global":{description:"aws-iso-e global region"},"eu-isoe-west-1":{description:"EU ISOE West"}}},{id:"aws-iso-f",outputs:{dnsSuffix:"csp.hci.ic.gov",dualStackDnsSuffix:"api.aws.hci.ic.gov",implicitGlobalRegion:"us-isof-south-1",name:"aws-iso-f",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-isof\\-\\w+\\-\\d+$",regions:{"aws-iso-f-global":{description:"aws-iso-f global region"},"us-isof-east-1":{description:"US ISOF EAST"},"us-isof-south-1":{description:"US ISOF SOUTH"}}},{id:"aws-us-gov",outputs:{dnsSuffix:"amazonaws.com",dualStackDnsSuffix:"api.aws",implicitGlobalRegion:"us-gov-west-1",name:"aws-us-gov",supportsDualStack:!0,supportsFIPS:!0},regionRegex:"^us\\-gov\\-\\w+\\-\\d+$",regions:{"aws-us-gov-global":{description:"aws-us-gov global region"},"us-gov-east-1":{description:"AWS GovCloud (US-East)"},"us-gov-west-1":{description:"AWS GovCloud (US-West)"}}}],Xf="1.1",ti={partitions:Wf,version:Xf},ri=ti,ei="",ii=(s)=>{let{partitions:t}=ri;for(let e of t){let{regions:i,outputs:n}=e;for(let[o,f]of Object.entries(i))if(o===s)return{...n,...f}}for(let e of t){let{regionRegex:i,outputs:n}=e;if(new RegExp(i).test(s))return{...n}}let r=t.find((e)=>e.id==="aws");if(!r)throw Error("Provided region was not found in the partition array or regex, and default partition with id 'aws' doesn't exist.");return{...r.outputs}},ni=(s,t="")=>{ri=s,ei=t},Ff=()=>{ni(ti,"")},Qf=()=>ei,oi={isVirtualHostableS3Bucket:si,parseArn:Of,partition:ii};Rs.customEndpointFunctions.aws=oi;var pf=(s)=>{if(typeof s.endpointProvider!=="function")throw Error("@aws-sdk/util-endpoint - endpointProvider and endpoint missing in config for this client.");let{endpoint:t}=s;if(t===void 0)s.endpoint=async()=>{return hi(s.endpointProvider({Region:typeof s.region==="function"?await s.region():s.region,UseDualStack:typeof s.useDualstackEndpoint==="function"?await s.useDualstackEndpoint():s.useDualstackEndpoint,UseFIPS:typeof s.useFipsEndpoint==="function"?await s.useFipsEndpoint():s.useFipsEndpoint,Endpoint:void 0},{logger:s.logger}))};return s},hi=(s)=>Hf.parseUrl(s.url);Object.defineProperty(et,"EndpointError",{enumerable:!0,get:function(){return Rs.EndpointError}});Object.defineProperty(et,"isIpAddress",{enumerable:!0,get:function(){return Rs.isIpAddress}});Object.defineProperty(et,"resolveEndpoint",{enumerable:!0,get:function(){return Rs.resolveEndpoint}});et.awsEndpointFunctions=oi;et.getUserAgentPrefix=Qf;et.partition=ii;et.resolveDefaultAwsRegionalEndpointsConfig=pf;et.setPartitionInfo=ni;et.toEndpointV1=hi;et.useDefaultPartitionInfo=Ff});var Pi=P((fd)=>{var Es=jf(),ys=Qs(),vf=mf(),li=ss(),fi=zs(),it=kf(),Ei="X-Amz-Algorithm",ui="X-Amz-Credential",mt="X-Amz-Date",gi="X-Amz-SignedHeaders",Ni="X-Amz-Expires",kt="X-Amz-Signature",jt="X-Amz-Security-Token",sd="X-Amz-Region-Set",vt="authorization",sr=mt.toLowerCase(),Ai="date",_i=[vt,sr,Ai],xi=kt.toLowerCase(),ft="x-amz-content-sha256",Ti=jt.toLowerCase(),td="host",$i={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},Ui=/^proxy-/,Ii=/^sec-/,rd=[/^proxy-/i,/^sec-/i],nt="AWS4-HMAC-SHA256",ed="AWS4-ECDSA-P256-SHA256",Si="AWS4-HMAC-SHA256-PAYLOAD",yi="UNSIGNED-PAYLOAD",Mi=50,tr="aws4_request",Li=604800,bs={},ot=[],ht=(s,t,r)=>`${s}/${t}/${r}/${tr}`,Di=async(s,t,r,e,i)=>{let n=await di(s,t.secretAccessKey,t.accessKeyId),o=`${r}:${e}:${i}:${Es.toHex(n)}:${t.sessionToken}`;if(o in bs)return bs[o];ot.push(o);while(ot.length>Mi)delete bs[ot.shift()];let f=`AWS4${t.secretAccessKey}`;for(let d of[r,e,i,tr])f=await di(s,f,d);return bs[o]=f},id=()=>{ot.length=0,Object.keys(bs).forEach((s)=>{delete bs[s]})},di=(s,t,r)=>{let e=new s(t);return e.update(ys.toUint8Array(r)),e.digest()},Yt=({headers:s},t,r)=>{let e={};for(let i of Object.keys(s).sort()){if(s[i]==null)continue;let n=i.toLowerCase();if(n in $i||t?.has(n)||Ui.test(n)||Ii.test(n)){if(!r||r&&!r.has(n))continue}e[n]=s[i].trim().replace(/\s+/g," ")}return e},ct=async({headers:s,body:t},r)=>{for(let e of Object.keys(s))if(e.toLowerCase()===ft)return s[e];if(t==null)return"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";else if(typeof t==="string"||ArrayBuffer.isView(t)||vf.isArrayBuffer(t)){let e=new r;return e.update(ys.toUint8Array(t)),Es.toHex(await e.digest())}return yi};class zi{format(s){let t=[];for(let i of Object.keys(s)){let n=ys.fromUtf8(i);t.push(Uint8Array.from([n.byteLength]),n,this.formatHeaderValue(s[i]))}let r=new Uint8Array(t.reduce((i,n)=>i+n.byteLength,0)),e=0;for(let i of t)r.set(i,e),e+=i.byteLength;return r}formatHeaderValue(s){switch(s.type){case"boolean":return Uint8Array.from([s.value?0:1]);case"byte":return Uint8Array.from([2,s.value]);case"short":let t=new DataView(new ArrayBuffer(3));return t.setUint8(0,3),t.setInt16(1,s.value,!1),new Uint8Array(t.buffer);case"integer":let r=new DataView(new ArrayBuffer(5));return r.setUint8(0,4),r.setInt32(1,s.value,!1),new Uint8Array(r.buffer);case"long":let e=new Uint8Array(9);return e[0]=5,e.set(s.value.bytes,1),e;case"binary":let i=new DataView(new ArrayBuffer(3+s.value.byteLength));i.setUint8(0,6),i.setUint16(1,s.value.byteLength,!1);let n=new Uint8Array(i.buffer);return n.set(s.value,3),n;case"string":let o=ys.fromUtf8(s.value),f=new DataView(new ArrayBuffer(3+o.byteLength));f.setUint8(0,7),f.setUint16(1,o.byteLength,!1);let d=new Uint8Array(f.buffer);return d.set(o,3),d;case"timestamp":let w=new Uint8Array(9);return w[0]=8,w.set(rr.fromNumber(s.value.valueOf()).bytes,1),w;case"uuid":if(!nd.test(s.value))throw Error(`Invalid UUID received: ${s.value}`);let u=new Uint8Array(17);return u[0]=9,u.set(Es.fromHex(s.value.replace(/\-/g,"")),1),u}}}var nd=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;class rr{bytes;constructor(s){if(this.bytes=s,s.byteLength!==8)throw Error("Int64 buffers must be exactly 8 bytes")}static fromNumber(s){if(s>9223372036854776000||s<-9223372036854776000)throw Error(`${s} is too large (or, if negative, too small) to represent as an Int64`);let t=new Uint8Array(8);for(let r=7,e=Math.abs(Math.round(s));r>-1&&e>0;r--,e/=256)t[r]=e;if(s<0)wi(t);return new rr(t)}valueOf(){let s=this.bytes.slice(0),t=s[0]&128;if(t)wi(s);return parseInt(Es.toHex(s),16)*(t?-1:1)}toString(){return String(this.valueOf())}}function wi(s){for(let t=0;t<8;t++)s[t]^=255;for(let t=7;t>-1;t--)if(s[t]++,s[t]!==0)break}var Ri=(s,t)=>{s=s.toLowerCase();for(let r of Object.keys(t))if(s===r.toLowerCase())return!0;return!1},bi=(s,t={})=>{let{headers:r,query:e={}}=li.HttpRequest.clone(s);for(let i of Object.keys(r)){let n=i.toLowerCase();if(n.slice(0,6)==="x-amz-"&&!t.unhoistableHeaders?.has(n)||t.hoistableHeaders?.has(n))e[i]=r[i],delete r[i]}return{...s,headers:r,query:e}},at=(s)=>{s=li.HttpRequest.clone(s);for(let t of Object.keys(s.headers))if(_i.indexOf(t.toLowerCase())>-1)delete s.headers[t];return s},Ci=({query:s={}})=>{let t=[],r={};for(let e of Object.keys(s)){if(e.toLowerCase()===xi)continue;let i=it.escapeUri(e);t.push(i);let n=s[e];if(typeof n==="string")r[i]=`${i}=${it.escapeUri(n)}`;else if(Array.isArray(n))r[i]=n.slice(0).reduce((o,f)=>o.concat([`${i}=${it.escapeUri(f)}`]),[]).sort().join("&")}return t.sort().map((e)=>r[e]).filter((e)=>e).join("&")},od=(s)=>hd(s).toISOString().replace(/\.\d{3}Z$/,"Z"),hd=(s)=>{if(typeof s==="number")return new Date(s*1000);if(typeof s==="string"){if(Number(s))return new Date(Number(s)*1000);return new Date(s)}return s};class er{service;regionProvider;credentialProvider;sha256;uriEscapePath;applyChecksum;constructor({applyChecksum:s,credentials:t,region:r,service:e,sha256:i,uriEscapePath:n=!0}){this.service=e,this.sha256=i,this.uriEscapePath=n,this.applyChecksum=typeof s==="boolean"?s:!0,this.regionProvider=fi.normalizeProvider(r),this.credentialProvider=fi.normalizeProvider(t)}createCanonicalRequest(s,t,r){let e=Object.keys(t).sort();return`${s.method}
4
- ${this.getCanonicalPath(s)}
5
- ${Ci(s)}
6
- ${e.map((i)=>`${i}:${t[i]}`).join(`
7
- `)}
8
-
9
- ${e.join(";")}
10
- ${r}`}async createStringToSign(s,t,r,e){let i=new this.sha256;i.update(ys.toUint8Array(r));let n=await i.digest();return`${e}
11
- ${s}
12
- ${t}
13
- ${Es.toHex(n)}`}getCanonicalPath({path:s}){if(this.uriEscapePath){let t=[];for(let i of s.split("/")){if(i?.length===0)continue;if(i===".")continue;if(i==="..")t.pop();else t.push(i)}let r=`${s?.startsWith("/")?"/":""}${t.join("/")}${t.length>0&&s?.endsWith("/")?"/":""}`;return it.escapeUri(r).replace(/%2F/g,"/")}return s}validateResolvedCredentials(s){if(typeof s!=="object"||typeof s.accessKeyId!=="string"||typeof s.secretAccessKey!=="string")throw Error("Resolved credential object is not valid")}formatDate(s){let t=od(s).replace(/[\-:]/g,"");return{longDate:t,shortDate:t.slice(0,8)}}getCanonicalHeaderList(s){return Object.keys(s).sort().join(";")}}class Bi extends er{headerFormatter=new zi;constructor({applyChecksum:s,credentials:t,region:r,service:e,sha256:i,uriEscapePath:n=!0}){super({applyChecksum:s,credentials:t,region:r,service:e,sha256:i,uriEscapePath:n})}async presign(s,t={}){let{signingDate:r=new Date,expiresIn:e=3600,unsignableHeaders:i,unhoistableHeaders:n,signableHeaders:o,hoistableHeaders:f,signingRegion:d,signingService:w}=t,u=await this.credentialProvider();this.validateResolvedCredentials(u);let A=d??await this.regionProvider(),{longDate:_,shortDate:U}=this.formatDate(r);if(e>Li)return Promise.reject("Signature version 4 presigned URLs must have an expiration date less than one week in the future");let S=ht(U,A,w??this.service),y=bi(at(s),{unhoistableHeaders:n,hoistableHeaders:f});if(u.sessionToken)y.query[jt]=u.sessionToken;y.query[Ei]=nt,y.query[ui]=`${u.accessKeyId}/${S}`,y.query[mt]=_,y.query[Ni]=e.toString(10);let G=Yt(y,i,o);return y.query[gi]=this.getCanonicalHeaderList(G),y.query[kt]=await this.getSignature(_,S,this.getSigningKey(u,A,U,w),this.createCanonicalRequest(y,G,await ct(s,this.sha256))),y}async sign(s,t){if(typeof s==="string")return this.signString(s,t);else if(s.headers&&s.payload)return this.signEvent(s,t);else if(s.message)return this.signMessage(s,t);else return this.signRequest(s,t)}async signEvent({headers:s,payload:t},{signingDate:r=new Date,priorSignature:e,signingRegion:i,signingService:n}){let o=i??await this.regionProvider(),{shortDate:f,longDate:d}=this.formatDate(r),w=ht(f,o,n??this.service),u=await ct({headers:{},body:t},this.sha256),A=new this.sha256;A.update(s);let _=Es.toHex(await A.digest()),U=[Si,d,w,e,_,u].join(`
14
- `);return this.signString(U,{signingDate:r,signingRegion:o,signingService:n})}async signMessage(s,{signingDate:t=new Date,signingRegion:r,signingService:e}){return this.signEvent({headers:this.headerFormatter.format(s.message.headers),payload:s.message.body},{signingDate:t,signingRegion:r,signingService:e,priorSignature:s.priorSignature}).then((n)=>{return{message:s.message,signature:n}})}async signString(s,{signingDate:t=new Date,signingRegion:r,signingService:e}={}){let i=await this.credentialProvider();this.validateResolvedCredentials(i);let n=r??await this.regionProvider(),{shortDate:o}=this.formatDate(t),f=new this.sha256(await this.getSigningKey(i,n,o,e));return f.update(ys.toUint8Array(s)),Es.toHex(await f.digest())}async signRequest(s,{signingDate:t=new Date,signableHeaders:r,unsignableHeaders:e,signingRegion:i,signingService:n}={}){let o=await this.credentialProvider();this.validateResolvedCredentials(o);let f=i??await this.regionProvider(),d=at(s),{longDate:w,shortDate:u}=this.formatDate(t),A=ht(u,f,n??this.service);if(d.headers[sr]=w,o.sessionToken)d.headers[Ti]=o.sessionToken;let _=await ct(d,this.sha256);if(!Ri(ft,d.headers)&&this.applyChecksum)d.headers[ft]=_;let U=Yt(d,e,r),S=await this.getSignature(w,A,this.getSigningKey(o,f,u,n),this.createCanonicalRequest(d,U,_));return d.headers[vt]=`${nt} Credential=${o.accessKeyId}/${A}, SignedHeaders=${this.getCanonicalHeaderList(U)}, Signature=${S}`,d}async getSignature(s,t,r,e){let i=await this.createStringToSign(s,t,e,nt),n=new this.sha256(await r);return n.update(ys.toUint8Array(i)),Es.toHex(await n.digest())}getSigningKey(s,t,r,e){return Di(this.sha256,s,r,t,e||this.service)}}var cd={SignatureV4a:null};fd.ALGORITHM_IDENTIFIER=nt;fd.ALGORITHM_IDENTIFIER_V4A=ed;fd.ALGORITHM_QUERY_PARAM=Ei;fd.ALWAYS_UNSIGNABLE_HEADERS=$i;fd.AMZ_DATE_HEADER=sr;fd.AMZ_DATE_QUERY_PARAM=mt;fd.AUTH_HEADER=vt;fd.CREDENTIAL_QUERY_PARAM=ui;fd.DATE_HEADER=Ai;fd.EVENT_ALGORITHM_IDENTIFIER=Si;fd.EXPIRES_QUERY_PARAM=Ni;fd.GENERATED_HEADERS=_i;fd.HOST_HEADER=td;fd.KEY_TYPE_IDENTIFIER=tr;fd.MAX_CACHE_SIZE=Mi;fd.MAX_PRESIGNED_TTL=Li;fd.PROXY_HEADER_PATTERN=Ui;fd.REGION_SET_PARAM=sd;fd.SEC_HEADER_PATTERN=Ii;fd.SHA256_HEADER=ft;fd.SIGNATURE_HEADER=xi;fd.SIGNATURE_QUERY_PARAM=kt;fd.SIGNED_HEADERS_QUERY_PARAM=gi;fd.SignatureV4=Bi;fd.SignatureV4Base=er;fd.TOKEN_HEADER=Ti;fd.TOKEN_QUERY_PARAM=jt;fd.UNSIGNABLE_PATTERNS=rd;fd.UNSIGNED_PAYLOAD=yi;fd.clearCredentialCache=id;fd.createScope=ht;fd.getCanonicalHeaders=Yt;fd.getCanonicalQuery=Ci;fd.getPayloadHash=ct;fd.getSigningKey=Di;fd.hasHeader=Ri;fd.moveHeadersToQuery=bi;fd.prepareRequest=at;fd.signatureV4aContainer=cd});var Gi=P((md)=>{var Hi=typeof TextEncoder=="function"?new TextEncoder:null,ad=(s)=>{if(typeof s==="string"){if(Hi)return Hi.encode(s).byteLength;let t=s.length;for(let r=t-1;r>=0;r--){let e=s.charCodeAt(r);if(e>127&&e<=2047)t++;else if(e>2047&&e<=65535)t+=2;if(e>=56320&&e<=57343)r--}return t}else if(typeof s.byteLength==="number")return s.byteLength;else if(typeof s.size==="number")return s.size;throw Error(`Body Length computation failed for ${s}`)};md.calculateBodyLength=ad});var Tr=P((Tw)=>{var ut=wr(),Fi=Qs(),Vs=st(),jd=ss(),vd=Gi(),Cs=dr(),sw=zs(),Qi=fr(),lt=0,Et=1,Ms=2,us=3,ps=4,dt=5,pi=6,ir=7,Vi=20,hr=21,Zi=22,tw=23,lr=24,Ls=25,Ds=26,gs=27,Er=31;function Bs(s){return typeof Buffer<"u"?Buffer.alloc(s):new Uint8Array(s)}var ur=Symbol("@smithy/core/cbor::tagSymbol");function gr(s){return s[ur]=!0,s}var rw=typeof TextDecoder<"u",ew=typeof Buffer<"u",F=Bs(0),ns=new DataView(F.buffer,F.byteOffset,F.byteLength),Oi=rw?new TextDecoder:null,C=0;function iw(s){F=s,ns=new DataView(F.buffer,F.byteOffset,F.byteLength)}function os(s,t){if(s>=t)throw Error("unexpected end of (decode) payload.");let r=(F[s]&224)>>5,e=F[s]&31;switch(r){case lt:case Et:case pi:let i,n;if(e<24)i=e,n=1;else switch(e){case lr:case Ls:case Ds:case gs:let o=Ki[e],f=o+1;if(n=f,t-s<f)throw Error(`countLength ${o} greater than remaining buf len.`);let d=s+1;if(o===1)i=F[d];else if(o===2)i=ns.getUint16(d);else if(o===4)i=ns.getUint32(d);else i=ns.getBigUint64(d);break;default:throw Error(`unexpected minor value ${e}.`)}if(r===lt)return C=n,nr(i);else if(r===Et){let o;if(typeof i==="bigint")o=BigInt(-1)-i;else o=-1-i;return C=n,nr(o)}else if(e===2||e===3){let o=Zs(s+n,t),f=BigInt(0),d=s+n+C;for(let w=d;w<d+o;++w)f=f<<BigInt(8)|BigInt(F[w]);return C=n+C+o,e===3?-f-BigInt(1):f}else if(e===4){let o=os(s+n,t),[f,d]=o,w=d<0?-1:1,u="0".repeat(Math.abs(f)+1)+String(BigInt(w)*BigInt(d)),A,_=d<0?"-":"";if(A=f===0?u:u.slice(0,u.length+f)+"."+u.slice(f),A=A.replace(/^0+/g,""),A==="")A="0";if(A[0]===".")A="0"+A;return A=_+A,C=n+C,ut.nv(A)}else{let o=os(s+n,t);return C=n+C,gr({tag:nr(i),value:o})}case us:case dt:case ps:case Ms:if(e===Er)switch(r){case us:return cw(s,t);case dt:return Ew(s,t);case ps:return ww(s,t);case Ms:return fw(s,t)}else switch(r){case us:return hw(s,t);case dt:return lw(s,t);case ps:return dw(s,t);case Ms:return Nr(s,t)}default:return uw(s,t)}}function qi(s,t,r){if(ew&&s.constructor?.name==="Buffer")return s.toString("utf-8",t,r);if(Oi)return Oi.decode(s.subarray(t,r));return Fi.toUtf8(s.subarray(t,r))}function nw(s){let t=Number(s);if(t<Number.MIN_SAFE_INTEGER||Number.MAX_SAFE_INTEGER<t)console.warn(Error(`@smithy/core/cbor - truncating BigInt(${s}) to ${t} with loss of precision.`));return t}var Ki={[lr]:1,[Ls]:2,[Ds]:4,[gs]:8};function ow(s,t){let r=s>>7,e=(s&124)>>2,i=(s&3)<<8|t,n=r===0?1:-1,o,f;if(e===0)if(i===0)return 0;else o=Math.pow(2,-14),f=0;else if(e===31)if(i===0)return n*(1/0);else return NaN;else o=Math.pow(2,e-15),f=1;return f+=i/1024,n*(o*f)}function Zs(s,t){let r=F[s]&31;if(r<24)return C=1,r;if(r===lr||r===Ls||r===Ds||r===gs){let e=Ki[r];if(C=e+1,t-s<C)throw Error(`countLength ${e} greater than remaining buf len.`);let i=s+1;if(e===1)return F[i];else if(e===2)return ns.getUint16(i);else if(e===4)return ns.getUint32(i);return nw(ns.getBigUint64(i))}throw Error(`unexpected minor value ${r}.`)}function hw(s,t){let r=Zs(s,t),e=C;if(s+=e,t-s<r)throw Error(`string len ${r} greater than remaining buf len.`);let i=qi(F,s,s+r);return C=e+r,i}function cw(s,t){s+=1;let r=[];for(let e=s;s<t;){if(F[s]===255){let d=Bs(r.length);return d.set(r,0),C=s-e+2,qi(d,0,d.length)}let i=(F[s]&224)>>5,n=F[s]&31;if(i!==us)throw Error(`unexpected major type ${i} in indefinite string.`);if(n===Er)throw Error("nested indefinite string.");let o=Nr(s,t);s+=C;for(let d=0;d<o.length;++d)r.push(o[d])}throw Error("expected break marker.")}function Nr(s,t){let r=Zs(s,t),e=C;if(s+=e,t-s<r)throw Error(`unstructured byte string len ${r} greater than remaining buf len.`);let i=F.subarray(s,s+r);return C=e+r,i}function fw(s,t){s+=1;let r=[];for(let e=s;s<t;){if(F[s]===255){let d=Bs(r.length);return d.set(r,0),C=s-e+2,d}let i=(F[s]&224)>>5,n=F[s]&31;if(i!==Ms)throw Error(`unexpected major type ${i} in indefinite string.`);if(n===Er)throw Error("nested indefinite string.");let o=Nr(s,t);s+=C;for(let d=0;d<o.length;++d)r.push(o[d])}throw Error("expected break marker.")}function dw(s,t){let r=Zs(s,t),e=C;s+=e;let i=s,n=Array(r);for(let o=0;o<r;++o){let f=os(s,t),d=C;n[o]=f,s+=d}return C=e+(s-i),n}function ww(s,t){s+=1;let r=[];for(let e=s;s<t;){if(F[s]===255)return C=s-e+2,r;let i=os(s,t);s+=C,r.push(i)}throw Error("expected break marker.")}function lw(s,t){let r=Zs(s,t),e=C;s+=e;let i=s,n={};for(let o=0;o<r;++o){if(s>=t)throw Error("unexpected end of map payload.");let f=(F[s]&224)>>5;if(f!==us)throw Error(`unexpected major type ${f} for map key at index ${s}.`);let d=os(s,t);s+=C;let w=os(s,t);s+=C,n[d]=w}return C=e+(s-i),n}function Ew(s,t){s+=1;let r=s,e={};for(;s<t;){if(s>=t)throw Error("unexpected end of map payload.");if(F[s]===255)return C=s-r+2,e;let i=(F[s]&224)>>5;if(i!==us)throw Error(`unexpected major type ${i} for map key.`);let n=os(s,t);s+=C;let o=os(s,t);s+=C,e[n]=o}throw Error("expected break marker.")}function uw(s,t){let r=F[s]&31;switch(r){case hr:case Vi:return C=1,r===hr;case Zi:return C=1,null;case tw:return C=1,null;case Ls:if(t-s<3)throw Error("incomplete float16 at end of buf.");return C=3,ow(F[s+1],F[s+2]);case Ds:if(t-s<5)throw Error("incomplete float32 at end of buf.");return C=5,ns.getFloat32(s+1);case gs:if(t-s<9)throw Error("incomplete float64 at end of buf.");return C=9,ns.getFloat64(s+1);default:throw Error(`unexpected minor value ${r}.`)}}function nr(s){if(typeof s==="number")return s;let t=Number(s);if(Number.MIN_SAFE_INTEGER<=t&&t<=Number.MAX_SAFE_INTEGER)return t;return s}var Wi=typeof Buffer<"u",gw=2048,z=Bs(gw),is=new DataView(z.buffer,z.byteOffset,z.byteLength),M=0;function or(s){if(z.byteLength-M<s)if(M<16000000)cr(Math.max(z.byteLength*4,z.byteLength+s));else cr(z.byteLength+s+16000000)}function Xi(){let s=Bs(M);return s.set(z.subarray(0,M),0),M=0,s}function cr(s){let t=z;if(z=Bs(s),t)if(t.copy)t.copy(z,0,0,t.byteLength);else z.set(t,0);is=new DataView(z.buffer,z.byteOffset,z.byteLength)}function es(s,t){if(t<24)z[M++]=s<<5|t;else if(t<256)z[M++]=s<<5|24,z[M++]=t;else if(t<65536)z[M++]=s<<5|Ls,is.setUint16(M,t),M+=2;else if(t<4294967296)z[M++]=s<<5|Ds,is.setUint32(M,t),M+=4;else z[M++]=s<<5|gs,is.setBigUint64(M,typeof t==="bigint"?t:BigInt(t)),M+=8}function Nw(s){let t=[s];while(t.length){let r=t.pop();if(or(typeof r==="string"?r.length*4:64),typeof r==="string"){if(Wi)es(us,Buffer.byteLength(r)),M+=z.write(r,M);else{let e=Fi.fromUtf8(r);es(us,e.byteLength),z.set(e,M),M+=e.byteLength}continue}else if(typeof r==="number"){if(Number.isInteger(r)){let e=r>=0,i=e?lt:Et,n=e?r:-r-1;if(n<24)z[M++]=i<<5|n;else if(n<256)z[M++]=i<<5|24,z[M++]=n;else if(n<65536)z[M++]=i<<5|Ls,z[M++]=n>>8,z[M++]=n;else if(n<4294967296)z[M++]=i<<5|Ds,is.setUint32(M,n),M+=4;else z[M++]=i<<5|gs,is.setBigUint64(M,BigInt(n)),M+=8;continue}z[M++]=ir<<5|gs,is.setFloat64(M,r),M+=8;continue}else if(typeof r==="bigint"){let e=r>=0,i=e?lt:Et,n=e?r:-r-BigInt(1),o=Number(n);if(o<24)z[M++]=i<<5|o;else if(o<256)z[M++]=i<<5|24,z[M++]=o;else if(o<65536)z[M++]=i<<5|Ls,z[M++]=o>>8,z[M++]=o&255;else if(o<4294967296)z[M++]=i<<5|Ds,is.setUint32(M,o),M+=4;else if(n<BigInt("18446744073709551616"))z[M++]=i<<5|gs,is.setBigUint64(M,n),M+=8;else{let f=n.toString(2),d=new Uint8Array(Math.ceil(f.length/8)),w=n,u=0;while(d.byteLength-++u>=0)d[d.byteLength-u]=Number(w&BigInt(255)),w>>=BigInt(8);if(or(d.byteLength*2),z[M++]=e?194:195,Wi)es(Ms,Buffer.byteLength(d));else es(Ms,d.byteLength);z.set(d,M),M+=d.byteLength}continue}else if(r===null){z[M++]=ir<<5|Zi;continue}else if(typeof r==="boolean"){z[M++]=ir<<5|(r?hr:Vi);continue}else if(typeof r>"u")throw Error("@smithy/core/cbor: client may not serialize undefined value.");else if(Array.isArray(r)){for(let e=r.length-1;e>=0;--e)t.push(r[e]);es(ps,r.length);continue}else if(typeof r.byteLength==="number"){or(r.length*2),es(Ms,r.length),z.set(r,M),M+=r.byteLength;continue}else if(typeof r==="object"){if(r instanceof ut.NumericValue){let i=r.string.indexOf("."),n=i===-1?0:i-r.string.length+1,o=BigInt(r.string.replace(".",""));z[M++]=196,t.push(o),t.push(n),es(ps,2);continue}if(r[ur])if("tag"in r&&"value"in r){t.push(r.value),es(pi,r.tag);continue}else throw Error("tag encountered with missing fields, need 'tag' and 'value', found: "+JSON.stringify(r));let e=Object.keys(r);for(let i=e.length-1;i>=0;--i){let n=e[i];t.push(r[n]),t.push(n)}es(dt,e.length);continue}throw Error(`data type ${r?.constructor?.name??typeof r} not compatible for encoding.`)}}var gt={deserialize(s){return iw(s),os(0,s.length)},serialize(s){try{return Nw(s),Xi()}catch(t){throw Xi(),t}},resizeEncodingBuffer(s){cr(s)}},Ji=(s,t)=>{return Vs.collectBody(s,t).then(async(r)=>{if(r.length)try{return gt.deserialize(r)}catch(e){throw Object.defineProperty(e,"$responseBodyText",{value:t.utf8Encoder(r)}),e}return{}})},wt=(s)=>{return gr({tag:1,value:s.getTime()/1000})},Aw=async(s,t)=>{let r=await Ji(s,t);return r.message=r.message??r.Message,r},Yi=(s,t)=>{let r=(i)=>{let n=i;if(typeof n==="number")n=n.toString();if(n.indexOf(",")>=0)n=n.split(",")[0];if(n.indexOf(":")>=0)n=n.split(":")[0];if(n.indexOf("#")>=0)n=n.split("#")[1];return n};if(t.__type!==void 0)return r(t.__type);let e=Object.keys(t).find((i)=>i.toLowerCase()==="code");if(e&&t[e]!==void 0)return r(t[e])},_w=(s)=>{if(String(s.headers["smithy-protocol"]).toLowerCase()!=="rpc-v2-cbor")throw Error("Malformed RPCv2 CBOR response, status: "+s.statusCode)},xw=async(s,t,r,e,i)=>{let{hostname:n,protocol:o="https",port:f,path:d}=await s.endpoint(),w={protocol:o,hostname:n,port:f,method:"POST",path:d.endsWith("/")?d.slice(0,-1)+r:d+r,headers:{...t}};if(e!==void 0)w.hostname=e;if(i!==void 0){w.body=i;try{w.headers["content-length"]=String(vd.calculateBodyLength(i))}catch(u){}}return new jd.HttpRequest(w)};class Ar extends Vs.SerdeContext{createSerializer(){let s=new _r;return s.setSerdeContext(this.serdeContext),s}createDeserializer(){let s=new xr;return s.setSerdeContext(this.serdeContext),s}}class _r extends Vs.SerdeContext{value;write(s,t){this.value=this.serialize(s,t)}serialize(s,t){let r=Cs.NormalizedSchema.of(s);if(t==null){if(r.isIdempotencyToken())return ut.generateIdempotencyToken();return t}if(r.isBlobSchema()){if(typeof t==="string")return(this.serdeContext?.base64Decoder??Qi.fromBase64)(t);return t}if(r.isTimestampSchema()){if(typeof t==="number"||typeof t==="bigint")return wt(new Date(Number(t)/1000|0));return wt(t)}if(typeof t==="function"||typeof t==="object"){let e=t;if(r.isListSchema()&&Array.isArray(e)){let n=!!r.getMergedTraits().sparse,o=[],f=0;for(let d of e){let w=this.serialize(r.getValueSchema(),d);if(w!=null||n)o[f++]=w}return o}if(e instanceof Date)return wt(e);let i={};if(r.isMapSchema()){let n=!!r.getMergedTraits().sparse;for(let o of Object.keys(e)){let f=this.serialize(r.getValueSchema(),e[o]);if(f!=null||n)i[o]=f}}else if(r.isStructSchema())for(let[n,o]of r.structIterator()){let f=this.serialize(o,e[n]);if(f!=null)i[n]=f}else if(r.isDocumentSchema())for(let n of Object.keys(e))i[n]=this.serialize(r.getValueSchema(),e[n]);return i}return t}flush(){let s=gt.serialize(this.value);return this.value=void 0,s}}class xr extends Vs.SerdeContext{read(s,t){let r=gt.deserialize(t);return this.readValue(s,r)}readValue(s,t){let r=Cs.NormalizedSchema.of(s);if(r.isTimestampSchema()&&typeof t==="number")return ut._parseEpochTimestamp(t);if(r.isBlobSchema()){if(typeof t==="string")return(this.serdeContext?.base64Decoder??Qi.fromBase64)(t);return t}if(typeof t>"u"||typeof t==="boolean"||typeof t==="number"||typeof t==="string"||typeof t==="bigint"||typeof t==="symbol")return t;else if(typeof t==="function"||typeof t==="object"){if(t===null)return null;if("byteLength"in t)return t;if(t instanceof Date)return t;if(r.isDocumentSchema())return t;if(r.isListSchema()){let i=[],n=r.getValueSchema(),o=!!r.getMergedTraits().sparse;for(let f of t){let d=this.readValue(n,f);if(d!=null||o)i.push(d)}return i}let e={};if(r.isMapSchema()){let i=!!r.getMergedTraits().sparse,n=r.getValueSchema();for(let o of Object.keys(t)){let f=this.readValue(n,t[o]);if(f!=null||i)e[o]=f}}else if(r.isStructSchema())for(let[i,n]of r.structIterator()){let o=this.readValue(n,t[i]);if(o!=null)e[i]=o}return e}else return t}}class ai extends Vs.RpcProtocol{codec=new Ar;serializer=this.codec.createSerializer();deserializer=this.codec.createDeserializer();constructor({defaultNamespace:s}){super({defaultNamespace:s})}getShapeId(){return"smithy.protocols#rpcv2Cbor"}getPayloadCodec(){return this.codec}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(Object.assign(e.headers,{"content-type":this.getDefaultContentType(),"smithy-protocol":"rpc-v2-cbor",accept:this.getDefaultContentType()}),Cs.deref(s.input)==="unit")delete e.body,delete e.headers["content-type"];else{if(!e.body)this.serializer.write(15,{}),e.body=this.serializer.flush();try{e.headers["content-length"]=String(e.body.byteLength)}catch(f){}}let{service:i,operation:n}=sw.getSmithyContext(r),o=`/service/${i}/operation/${n}`;if(e.path.endsWith("/"))e.path+=o.slice(1);else e.path+=o;return e}async deserializeResponse(s,t,r){return super.deserializeResponse(s,t,r)}async handleError(s,t,r,e,i){let n=Yi(r,e)??"Unknown",o=this.options.defaultNamespace;if(n.includes("#"))[o]=n.split("#");let f={$metadata:i,$fault:r.statusCode<=500?"client":"server"},d=Cs.TypeRegistry.for(o),w;try{w=d.getSchema(n)}catch(y){if(e.Message)e.message=e.Message;let G=Cs.TypeRegistry.for("smithy.ts.sdk.synthetic."+o),L=G.getBaseException();if(L){let Z=G.getErrorCtor(L);throw Object.assign(new Z({name:n}),f,e)}throw Object.assign(Error(n),f,e)}let u=Cs.NormalizedSchema.of(w),A=d.getErrorCtor(w),_=e.message??e.Message??"Unknown",U=new A(_),S={};for(let[y,G]of u.structIterator())S[y]=this.deserializer.readValue(G,e[y]);throw Object.assign(U,f,{$fault:u.getMergedTraits().error,message:_},S)}getDefaultContentType(){return"application/cbor"}}Tw.CborCodec=Ar;Tw.CborShapeDeserializer=xr;Tw.CborShapeSerializer=_r;Tw.SmithyRpcV2CborProtocol=ai;Tw.buildHttpRpcRequest=xw;Tw.cbor=gt;Tw.checkCborResponse=_w;Tw.dateToTag=wt;Tw.loadSmithyRpcV2CborErrorCode=Yi;Tw.parseCborBody=Ji;Tw.parseCborErrorBody=Aw;Tw.tag=gr;Tw.tagSymbol=ur});var ki=P((PN,mi)=>{(()=>{var s={d:(h,c)=>{for(var l in c)s.o(c,l)&&!s.o(h,l)&&Object.defineProperty(h,l,{enumerable:!0,get:c[l]})},o:(h,c)=>Object.prototype.hasOwnProperty.call(h,c),r:(h)=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(h,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(h,"__esModule",{value:!0})}},t={};s.r(t),s.d(t,{XMLBuilder:()=>ds,XMLParser:()=>de,XMLValidator:()=>ph});let r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",e=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function i(h,c){let l=[],N=c.exec(h);for(;N;){let E=[];E.startIndex=c.lastIndex-N[0].length;let g=N.length;for(let T=0;T<g;T++)E.push(N[T]);l.push(E),N=c.exec(h)}return l}let n=function(h){return e.exec(h)!=null},o={allowBooleanAttributes:!1,unpairedTags:[]};function f(h,c){c=Object.assign({},o,c);let l=[],N=!1,E=!1;h[0]==="\uFEFF"&&(h=h.substr(1));for(let g=0;g<h.length;g++)if(h[g]==="<"&&h[g+1]==="?"){if(g+=2,g=w(h,g),g.err)return g}else{if(h[g]!=="<"){if(d(h[g]))continue;return L("InvalidChar","char '"+h[g]+"' is not expected.",b(h,g))}{let T=g;if(g++,h[g]==="!"){g=u(h,g);continue}{let x=!1;h[g]==="/"&&(x=!0,g++);let $="";for(;g<h.length&&h[g]!==">"&&h[g]!==" "&&h[g]!=="\t"&&h[g]!==`
15
- `&&h[g]!=="\r";g++)$+=h[g];if($=$.trim(),$[$.length-1]==="/"&&($=$.substring(0,$.length-1),g--),!n($)){let D;return D=$.trim().length===0?"Invalid space after '<'.":"Tag '"+$+"' is an invalid name.",L("InvalidTag",D,b(h,g))}let I=U(h,g);if(I===!1)return L("InvalidAttr","Attributes for '"+$+"' have open quote.",b(h,g));let R=I.value;if(g=I.index,R[R.length-1]==="/"){let D=g-R.length;R=R.substring(0,R.length-1);let B=y(R,c);if(B!==!0)return L(B.err.code,B.err.msg,b(h,D+B.err.line));N=!0}else if(x){if(!I.tagClosed)return L("InvalidTag","Closing tag '"+$+"' doesn't have proper closing.",b(h,g));if(R.trim().length>0)return L("InvalidTag","Closing tag '"+$+"' can't have attributes or invalid starting.",b(h,T));if(l.length===0)return L("InvalidTag","Closing tag '"+$+"' has not been opened.",b(h,T));{let D=l.pop();if($!==D.tagName){let B=b(h,D.tagStartPos);return L("InvalidTag","Expected closing tag '"+D.tagName+"' (opened in line "+B.line+", col "+B.col+") instead of closing tag '"+$+"'.",b(h,T))}l.length==0&&(E=!0)}}else{let D=y(R,c);if(D!==!0)return L(D.err.code,D.err.msg,b(h,g-R.length+D.err.line));if(E===!0)return L("InvalidXml","Multiple possible root nodes found.",b(h,g));c.unpairedTags.indexOf($)!==-1||l.push({tagName:$,tagStartPos:T}),N=!0}for(g++;g<h.length;g++)if(h[g]==="<"){if(h[g+1]==="!"){g++,g=u(h,g);continue}if(h[g+1]!=="?")break;if(g=w(h,++g),g.err)return g}else if(h[g]==="&"){let D=G(h,g);if(D==-1)return L("InvalidChar","char '&' is not expected.",b(h,g));g=D}else if(E===!0&&!d(h[g]))return L("InvalidXml","Extra text at the end",b(h,g));h[g]==="<"&&g--}}}return N?l.length==1?L("InvalidTag","Unclosed tag '"+l[0].tagName+"'.",b(h,l[0].tagStartPos)):!(l.length>0)||L("InvalidXml","Invalid '"+JSON.stringify(l.map((g)=>g.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):L("InvalidXml","Start tag expected.",1)}function d(h){return h===" "||h==="\t"||h===`
16
- `||h==="\r"}function w(h,c){let l=c;for(;c<h.length;c++)if(h[c]!="?"&&h[c]!=" ");else{let N=h.substr(l,c-l);if(c>5&&N==="xml")return L("InvalidXml","XML declaration allowed only at the start of the document.",b(h,c));if(h[c]=="?"&&h[c+1]==">"){c++;break}}return c}function u(h,c){if(h.length>c+5&&h[c+1]==="-"&&h[c+2]==="-"){for(c+=3;c<h.length;c++)if(h[c]==="-"&&h[c+1]==="-"&&h[c+2]===">"){c+=2;break}}else if(h.length>c+8&&h[c+1]==="D"&&h[c+2]==="O"&&h[c+3]==="C"&&h[c+4]==="T"&&h[c+5]==="Y"&&h[c+6]==="P"&&h[c+7]==="E"){let l=1;for(c+=8;c<h.length;c++)if(h[c]==="<")l++;else if(h[c]===">"&&(l--,l===0))break}else if(h.length>c+9&&h[c+1]==="["&&h[c+2]==="C"&&h[c+3]==="D"&&h[c+4]==="A"&&h[c+5]==="T"&&h[c+6]==="A"&&h[c+7]==="["){for(c+=8;c<h.length;c++)if(h[c]==="]"&&h[c+1]==="]"&&h[c+2]===">"){c+=2;break}}return c}let A='"',_="'";function U(h,c){let l="",N="",E=!1;for(;c<h.length;c++){if(h[c]===A||h[c]===_)N===""?N=h[c]:N!==h[c]||(N="");else if(h[c]===">"&&N===""){E=!0;break}l+=h[c]}return N===""&&{value:l,index:c,tagClosed:E}}let S=new RegExp(`(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['"])(([\\s\\S])*?)\\5)?`,"g");function y(h,c){let l=i(h,S),N={};for(let E=0;E<l.length;E++){if(l[E][1].length===0)return L("InvalidAttr","Attribute '"+l[E][2]+"' has no space in starting.",J(l[E]));if(l[E][3]!==void 0&&l[E][4]===void 0)return L("InvalidAttr","Attribute '"+l[E][2]+"' is without value.",J(l[E]));if(l[E][3]===void 0&&!c.allowBooleanAttributes)return L("InvalidAttr","boolean attribute '"+l[E][2]+"' is not allowed.",J(l[E]));let g=l[E][2];if(!Z(g))return L("InvalidAttr","Attribute '"+g+"' is an invalid name.",J(l[E]));if(N.hasOwnProperty(g))return L("InvalidAttr","Attribute '"+g+"' is repeated.",J(l[E]));N[g]=1}return!0}function G(h,c){if(h[++c]===";")return-1;if(h[c]==="#")return function(N,E){let g=/\d/;for(N[E]==="x"&&(E++,g=/[\da-fA-F]/);E<N.length;E++){if(N[E]===";")return E;if(!N[E].match(g))break}return-1}(h,++c);let l=0;for(;c<h.length;c++,l++)if(!(h[c].match(/\w/)&&l<20)){if(h[c]===";")break;return-1}return c}function L(h,c,l){return{err:{code:h,msg:c,line:l.line||l,col:l.col}}}function Z(h){return n(h)}function b(h,c){let l=h.substring(0,c).split(/\r?\n/);return{line:l.length,col:l[l.length-1].length+1}}function J(h){return h.startIndex+h[1].length}let Ws={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(h,c){return c},attributeValueProcessor:function(h,c){return c},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(h,c,l){return h},captureMetaData:!1},rs;rs=typeof Symbol!="function"?"@@xmlMetadata":Symbol("XML Node Metadata");class p{constructor(h){this.tagname=h,this.child=[],this[":@"]={}}add(h,c){h==="__proto__"&&(h="#__proto__"),this.child.push({[h]:c})}addChild(h,c){h.tagname==="__proto__"&&(h.tagname="#__proto__"),h[":@"]&&Object.keys(h[":@"]).length>0?this.child.push({[h.tagname]:h.child,":@":h[":@"]}):this.child.push({[h.tagname]:h.child}),c!==void 0&&(this.child[this.child.length-1][rs]={startIndex:c})}static getMetaDataSymbol(){return rs}}function lh(h,c){let l={};if(h[c+3]!=="O"||h[c+4]!=="C"||h[c+5]!=="T"||h[c+6]!=="Y"||h[c+7]!=="P"||h[c+8]!=="E")throw Error("Invalid Tag instead of DOCTYPE");{c+=9;let N=1,E=!1,g=!1,T="";for(;c<h.length;c++)if(h[c]!=="<"||g)if(h[c]===">"){if(g?h[c-1]==="-"&&h[c-2]==="-"&&(g=!1,N--):N--,N===0)break}else h[c]==="["?E=!0:T+=h[c];else{if(E&&Us(h,"!ENTITY",c)){let x,$;c+=7,[x,$,c]=Eh(h,c+1),$.indexOf("&")===-1&&(l[x]={regx:RegExp(`&${x};`,"g"),val:$})}else if(E&&Us(h,"!ELEMENT",c)){c+=8;let{index:x}=gh(h,c+1);c=x}else if(E&&Us(h,"!ATTLIST",c))c+=8;else if(E&&Us(h,"!NOTATION",c)){c+=9;let{index:x}=uh(h,c+1);c=x}else{if(!Us(h,"!--",c))throw Error("Invalid DOCTYPE");g=!0}N++,T=""}if(N!==0)throw Error("Unclosed DOCTYPE")}return{entities:l,i:c}}let fs=(h,c)=>{for(;c<h.length&&/\s/.test(h[c]);)c++;return c};function Eh(h,c){c=fs(h,c);let l="";for(;c<h.length&&!/\s/.test(h[c])&&h[c]!=='"'&&h[c]!=="'";)l+=h[c],c++;if(zt(l),c=fs(h,c),h.substring(c,c+6).toUpperCase()==="SYSTEM")throw Error("External entities are not supported");if(h[c]==="%")throw Error("Parameter entities are not supported");let N="";return[c,N]=ks(h,c,"entity"),[l,N,--c]}function uh(h,c){c=fs(h,c);let l="";for(;c<h.length&&!/\s/.test(h[c]);)l+=h[c],c++;zt(l),c=fs(h,c);let N=h.substring(c,c+6).toUpperCase();if(N!=="SYSTEM"&&N!=="PUBLIC")throw Error(`Expected SYSTEM or PUBLIC, found "${N}"`);c+=N.length,c=fs(h,c);let E=null,g=null;if(N==="PUBLIC")[c,E]=ks(h,c,"publicIdentifier"),h[c=fs(h,c)]!=='"'&&h[c]!=="'"||([c,g]=ks(h,c,"systemIdentifier"));else if(N==="SYSTEM"&&([c,g]=ks(h,c,"systemIdentifier"),!g))throw Error("Missing mandatory system identifier for SYSTEM notation");return{notationName:l,publicIdentifier:E,systemIdentifier:g,index:--c}}function ks(h,c,l){let N="",E=h[c];if(E!=='"'&&E!=="'")throw Error(`Expected quoted string, found "${E}"`);for(c++;c<h.length&&h[c]!==E;)N+=h[c],c++;if(h[c]!==E)throw Error(`Unterminated ${l} value`);return[++c,N]}function gh(h,c){c=fs(h,c);let l="";for(;c<h.length&&!/\s/.test(h[c]);)l+=h[c],c++;if(!zt(l))throw Error(`Invalid element name: "${l}"`);let N="";if(h[c=fs(h,c)]==="E"&&Us(h,"MPTY",c))c+=4;else if(h[c]==="A"&&Us(h,"NY",c))c+=2;else{if(h[c]!=="(")throw Error(`Invalid Element Expression, found "${h[c]}"`);for(c++;c<h.length&&h[c]!==")";)N+=h[c],c++;if(h[c]!==")")throw Error("Unterminated content model")}return{elementName:l,contentModel:N.trim(),index:c}}function Us(h,c,l){for(let N=0;N<c.length;N++)if(c[N]!==h[l+N+1])return!1;return!0}function zt(h){if(n(h))return h;throw Error(`Invalid entity name ${h}`)}let Nh=/^[-+]?0x[a-fA-F0-9]+$/,Ah=/^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/,_h={hex:!0,leadingZeros:!0,decimalPoint:".",eNotation:!0},xh=/^([-+])?(0*)(\d*(\.\d*)?[eE][-\+]?\d+)$/;function oe(h){return typeof h=="function"?h:Array.isArray(h)?(c)=>{for(let l of h){if(typeof l=="string"&&c===l)return!0;if(l instanceof RegExp&&l.test(c))return!0}}:()=>!1}class he{constructor(h){this.options=h,this.currentNode=null,this.tagsNodeStack=[],this.docTypeEntities={},this.lastEntities={apos:{regex:/&(apos|#39|#x27);/g,val:"'"},gt:{regex:/&(gt|#62|#x3E);/g,val:">"},lt:{regex:/&(lt|#60|#x3C);/g,val:"<"},quot:{regex:/&(quot|#34|#x22);/g,val:'"'}},this.ampEntity={regex:/&(amp|#38|#x26);/g,val:"&"},this.htmlEntities={space:{regex:/&(nbsp|#160);/g,val:" "},cent:{regex:/&(cent|#162);/g,val:"¢"},pound:{regex:/&(pound|#163);/g,val:"£"},yen:{regex:/&(yen|#165);/g,val:"¥"},euro:{regex:/&(euro|#8364);/g,val:"€"},copyright:{regex:/&(copy|#169);/g,val:"©"},reg:{regex:/&(reg|#174);/g,val:"®"},inr:{regex:/&(inr|#8377);/g,val:"₹"},num_dec:{regex:/&#([0-9]{1,7});/g,val:(c,l)=>String.fromCodePoint(Number.parseInt(l,10))},num_hex:{regex:/&#x([0-9a-fA-F]{1,6});/g,val:(c,l)=>String.fromCodePoint(Number.parseInt(l,16))}},this.addExternalEntities=Th,this.parseXml=yh,this.parseTextData=$h,this.resolveNameSpace=Uh,this.buildAttributesMap=Sh,this.isItStopNode=zh,this.replaceEntitiesValue=Lh,this.readStopNodeData=Rh,this.saveTextToParentTag=Dh,this.addChild=Mh,this.ignoreAttributesFn=oe(this.options.ignoreAttributes)}}function Th(h){let c=Object.keys(h);for(let l=0;l<c.length;l++){let N=c[l];this.lastEntities[N]={regex:new RegExp("&"+N+";","g"),val:h[N]}}}function $h(h,c,l,N,E,g,T){if(h!==void 0&&(this.options.trimValues&&!N&&(h=h.trim()),h.length>0)){T||(h=this.replaceEntitiesValue(h));let x=this.options.tagValueProcessor(c,h,l,E,g);return x==null?h:typeof x!=typeof h||x!==h?x:this.options.trimValues||h.trim()===h?ce(h,this.options.parseTagValue,this.options.numberParseOptions):h}}function Uh(h){if(this.options.removeNSPrefix){let c=h.split(":"),l=h.charAt(0)==="/"?"/":"";if(c[0]==="xmlns")return"";c.length===2&&(h=l+c[1])}return h}let Ih=new RegExp(`([^\\s=]+)\\s*(=\\s*(['"])([\\s\\S]*?)\\3)?`,"gm");function Sh(h,c,l){if(this.options.ignoreAttributes!==!0&&typeof h=="string"){let N=i(h,Ih),E=N.length,g={};for(let T=0;T<E;T++){let x=this.resolveNameSpace(N[T][1]);if(this.ignoreAttributesFn(x,c))continue;let $=N[T][4],I=this.options.attributeNamePrefix+x;if(x.length)if(this.options.transformAttributeName&&(I=this.options.transformAttributeName(I)),I==="__proto__"&&(I="#__proto__"),$!==void 0){this.options.trimValues&&($=$.trim()),$=this.replaceEntitiesValue($);let R=this.options.attributeValueProcessor(x,$,c);g[I]=R==null?$:typeof R!=typeof $||R!==$?R:ce($,this.options.parseAttributeValue,this.options.numberParseOptions)}else this.options.allowBooleanAttributes&&(g[I]=!0)}if(!Object.keys(g).length)return;if(this.options.attributesGroupName){let T={};return T[this.options.attributesGroupName]=g,T}return g}}let yh=function(h){h=h.replace(/\r\n?/g,`
17
- `);let c=new p("!xml"),l=c,N="",E="";for(let g=0;g<h.length;g++)if(h[g]==="<")if(h[g+1]==="/"){let T=Is(h,">",g,"Closing Tag is not closed."),x=h.substring(g+2,T).trim();if(this.options.removeNSPrefix){let R=x.indexOf(":");R!==-1&&(x=x.substr(R+1))}this.options.transformTagName&&(x=this.options.transformTagName(x)),l&&(N=this.saveTextToParentTag(N,l,E));let $=E.substring(E.lastIndexOf(".")+1);if(x&&this.options.unpairedTags.indexOf(x)!==-1)throw Error(`Unpaired tag can not be used as closing tag: </${x}>`);let I=0;$&&this.options.unpairedTags.indexOf($)!==-1?(I=E.lastIndexOf(".",E.lastIndexOf(".")-1),this.tagsNodeStack.pop()):I=E.lastIndexOf("."),E=E.substring(0,I),l=this.tagsNodeStack.pop(),N="",g=T}else if(h[g+1]==="?"){let T=Rt(h,g,!1,"?>");if(!T)throw Error("Pi Tag is not closed.");if(N=this.saveTextToParentTag(N,l,E),this.options.ignoreDeclaration&&T.tagName==="?xml"||this.options.ignorePiTags);else{let x=new p(T.tagName);x.add(this.options.textNodeName,""),T.tagName!==T.tagExp&&T.attrExpPresent&&(x[":@"]=this.buildAttributesMap(T.tagExp,E,T.tagName)),this.addChild(l,x,E,g)}g=T.closeIndex+1}else if(h.substr(g+1,3)==="!--"){let T=Is(h,"-->",g+4,"Comment is not closed.");if(this.options.commentPropName){let x=h.substring(g+4,T-2);N=this.saveTextToParentTag(N,l,E),l.add(this.options.commentPropName,[{[this.options.textNodeName]:x}])}g=T}else if(h.substr(g+1,2)==="!D"){let T=lh(h,g);this.docTypeEntities=T.entities,g=T.i}else if(h.substr(g+1,2)==="!["){let T=Is(h,"]]>",g,"CDATA is not closed.")-2,x=h.substring(g+9,T);N=this.saveTextToParentTag(N,l,E);let $=this.parseTextData(x,l.tagname,E,!0,!1,!0,!0);$==null&&($=""),this.options.cdataPropName?l.add(this.options.cdataPropName,[{[this.options.textNodeName]:x}]):l.add(this.options.textNodeName,$),g=T+2}else{let T=Rt(h,g,this.options.removeNSPrefix),x=T.tagName,$=T.rawTagName,I=T.tagExp,R=T.attrExpPresent,D=T.closeIndex;this.options.transformTagName&&(x=this.options.transformTagName(x)),l&&N&&l.tagname!=="!xml"&&(N=this.saveTextToParentTag(N,l,E,!1));let B=l;B&&this.options.unpairedTags.indexOf(B.tagname)!==-1&&(l=this.tagsNodeStack.pop(),E=E.substring(0,E.lastIndexOf("."))),x!==c.tagname&&(E+=E?"."+x:x);let O=g;if(this.isItStopNode(this.options.stopNodes,E,x)){let H="";if(I.length>0&&I.lastIndexOf("/")===I.length-1)x[x.length-1]==="/"?(x=x.substr(0,x.length-1),E=E.substr(0,E.length-1),I=x):I=I.substr(0,I.length-1),g=T.closeIndex;else if(this.options.unpairedTags.indexOf(x)!==-1)g=T.closeIndex;else{let v=this.readStopNodeData(h,$,D+1);if(!v)throw Error(`Unexpected end of ${$}`);g=v.i,H=v.tagContent}let V=new p(x);x!==I&&R&&(V[":@"]=this.buildAttributesMap(I,E,x)),H&&(H=this.parseTextData(H,x,E,!0,R,!0,!0)),E=E.substr(0,E.lastIndexOf(".")),V.add(this.options.textNodeName,H),this.addChild(l,V,E,O)}else{if(I.length>0&&I.lastIndexOf("/")===I.length-1){x[x.length-1]==="/"?(x=x.substr(0,x.length-1),E=E.substr(0,E.length-1),I=x):I=I.substr(0,I.length-1),this.options.transformTagName&&(x=this.options.transformTagName(x));let H=new p(x);x!==I&&R&&(H[":@"]=this.buildAttributesMap(I,E,x)),this.addChild(l,H,E,O),E=E.substr(0,E.lastIndexOf("."))}else{let H=new p(x);this.tagsNodeStack.push(l),x!==I&&R&&(H[":@"]=this.buildAttributesMap(I,E,x)),this.addChild(l,H,E,O),l=H}N="",g=D}}else N+=h[g];return c.child};function Mh(h,c,l,N){this.options.captureMetaData||(N=void 0);let E=this.options.updateTag(c.tagname,l,c[":@"]);E===!1||(typeof E=="string"?(c.tagname=E,h.addChild(c,N)):h.addChild(c,N))}let Lh=function(h){if(this.options.processEntities){for(let c in this.docTypeEntities){let l=this.docTypeEntities[c];h=h.replace(l.regx,l.val)}for(let c in this.lastEntities){let l=this.lastEntities[c];h=h.replace(l.regex,l.val)}if(this.options.htmlEntities)for(let c in this.htmlEntities){let l=this.htmlEntities[c];h=h.replace(l.regex,l.val)}h=h.replace(this.ampEntity.regex,this.ampEntity.val)}return h};function Dh(h,c,l,N){return h&&(N===void 0&&(N=c.child.length===0),(h=this.parseTextData(h,c.tagname,l,!1,!!c[":@"]&&Object.keys(c[":@"]).length!==0,N))!==void 0&&h!==""&&c.add(this.options.textNodeName,h),h=""),h}function zh(h,c,l){let N="*."+l;for(let E in h){let g=h[E];if(N===g||c===g)return!0}return!1}function Is(h,c,l,N){let E=h.indexOf(c,l);if(E===-1)throw Error(N);return E+c.length-1}function Rt(h,c,l,N=">"){let E=function(D,B,O=">"){let H,V="";for(let v=B;v<D.length;v++){let ws=D[v];if(H)ws===H&&(H="");else if(ws==='"'||ws==="'")H=ws;else if(ws===O[0]){if(!O[1])return{data:V,index:v};if(D[v+1]===O[1])return{data:V,index:v}}else ws==="\t"&&(ws=" ");V+=ws}}(h,c+1,N);if(!E)return;let{data:g,index:T}=E,x=g.search(/\s/),$=g,I=!0;x!==-1&&($=g.substring(0,x),g=g.substring(x+1).trimStart());let R=$;if(l){let D=$.indexOf(":");D!==-1&&($=$.substr(D+1),I=$!==E.data.substr(D+1))}return{tagName:$,tagExp:g,closeIndex:T,attrExpPresent:I,rawTagName:R}}function Rh(h,c,l){let N=l,E=1;for(;l<h.length;l++)if(h[l]==="<")if(h[l+1]==="/"){let g=Is(h,">",l,`${c} is not closed`);if(h.substring(l+2,g).trim()===c&&(E--,E===0))return{tagContent:h.substring(N,l),i:g};l=g}else if(h[l+1]==="?")l=Is(h,"?>",l+1,"StopNode is not closed.");else if(h.substr(l+1,3)==="!--")l=Is(h,"-->",l+3,"StopNode is not closed.");else if(h.substr(l+1,2)==="![")l=Is(h,"]]>",l,"StopNode is not closed.")-2;else{let g=Rt(h,l,">");g&&((g&&g.tagName)===c&&g.tagExp[g.tagExp.length-1]!=="/"&&E++,l=g.closeIndex)}}function ce(h,c,l){if(c&&typeof h=="string"){let N=h.trim();return N==="true"||N!=="false"&&function(E,g={}){if(g=Object.assign({},_h,g),!E||typeof E!="string")return E;let T=E.trim();if(g.skipLike!==void 0&&g.skipLike.test(T))return E;if(E==="0")return 0;if(g.hex&&Nh.test(T))return function($){if(parseInt)return parseInt($,16);if(Number.parseInt)return Number.parseInt($,16);if(window&&window.parseInt)return window.parseInt($,16);throw Error("parseInt, Number.parseInt, window.parseInt are not supported")}(T);if(T.search(/.+[eE].+/)!==-1)return function($,I,R){if(!R.eNotation)return $;let D=I.match(xh);if(D){let B=D[1]||"",O=D[3].indexOf("e")===-1?"E":"e",H=D[2],V=B?$[H.length+1]===O:$[H.length]===O;return H.length>1&&V?$:H.length!==1||!D[3].startsWith(`.${O}`)&&D[3][0]!==O?R.leadingZeros&&!V?(I=(D[1]||"")+D[3],Number(I)):$:Number(I)}return $}(E,T,g);{let $=Ah.exec(T);if($){let I=$[1]||"",R=$[2],D=(x=$[3])&&x.indexOf(".")!==-1?((x=x.replace(/0+$/,""))==="."?x="0":x[0]==="."?x="0"+x:x[x.length-1]==="."&&(x=x.substring(0,x.length-1)),x):x,B=I?E[R.length+1]===".":E[R.length]===".";if(!g.leadingZeros&&(R.length>1||R.length===1&&!B))return E;{let O=Number(T),H=String(O);if(O===0||O===-0)return O;if(H.search(/[eE]/)!==-1)return g.eNotation?O:E;if(T.indexOf(".")!==-1)return H==="0"||H===D||H===`${I}${D}`?O:E;let V=R?D:T;return R?V===H||I+V===H?O:E:V===H||V===I+H?O:E}}return E}var x}(h,l)}return h!==void 0?h:""}let bt=p.getMetaDataSymbol();function bh(h,c){return fe(h,c)}function fe(h,c,l){let N,E={};for(let g=0;g<h.length;g++){let T=h[g],x=Ch(T),$="";if($=l===void 0?x:l+"."+x,x===c.textNodeName)N===void 0?N=T[x]:N+=""+T[x];else{if(x===void 0)continue;if(T[x]){let I=fe(T[x],c,$),R=Ph(I,c);T[bt]!==void 0&&(I[bt]=T[bt]),T[":@"]?Bh(I,T[":@"],$,c):Object.keys(I).length!==1||I[c.textNodeName]===void 0||c.alwaysCreateTextNode?Object.keys(I).length===0&&(c.alwaysCreateTextNode?I[c.textNodeName]="":I=""):I=I[c.textNodeName],E[x]!==void 0&&E.hasOwnProperty(x)?(Array.isArray(E[x])||(E[x]=[E[x]]),E[x].push(I)):c.isArray(x,$,R)?E[x]=[I]:E[x]=I}}}return typeof N=="string"?N.length>0&&(E[c.textNodeName]=N):N!==void 0&&(E[c.textNodeName]=N),E}function Ch(h){let c=Object.keys(h);for(let l=0;l<c.length;l++){let N=c[l];if(N!==":@")return N}}function Bh(h,c,l,N){if(c){let E=Object.keys(c),g=E.length;for(let T=0;T<g;T++){let x=E[T];N.isArray(x,l+"."+x,!0,!0)?h[x]=[c[x]]:h[x]=c[x]}}}function Ph(h,c){let{textNodeName:l}=c,N=Object.keys(h).length;return N===0||!(N!==1||!h[l]&&typeof h[l]!="boolean"&&h[l]!==0)}class de{constructor(h){this.externalEntities={},this.options=function(c){return Object.assign({},Ws,c)}(h)}parse(h,c){if(typeof h=="string");else{if(!h.toString)throw Error("XML data is accepted in String or Bytes[] form.");h=h.toString()}if(c){c===!0&&(c={});let E=f(h,c);if(E!==!0)throw Error(`${E.err.msg}:${E.err.line}:${E.err.col}`)}let l=new he(this.options);l.addExternalEntities(this.externalEntities);let N=l.parseXml(h);return this.options.preserveOrder||N===void 0?N:bh(N,this.options)}addEntity(h,c){if(c.indexOf("&")!==-1)throw Error("Entity value can't have '&'");if(h.indexOf("&")!==-1||h.indexOf(";")!==-1)throw Error("An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'");if(c==="&")throw Error("An entity with value '&' is not permitted");this.externalEntities[h]=c}static getMetaDataSymbol(){return p.getMetaDataSymbol()}}function Hh(h,c){let l="";return c.format&&c.indentBy.length>0&&(l=`
18
- `),we(h,c,"",l)}function we(h,c,l,N){let E="",g=!1;for(let T=0;T<h.length;T++){let x=h[T],$=Gh(x);if($===void 0)continue;let I="";if(I=l.length===0?$:`${l}.${$}`,$===c.textNodeName){let O=x[$];Oh(I,c)||(O=c.tagValueProcessor($,O),O=Ee(O,c)),g&&(E+=N),E+=O,g=!1;continue}if($===c.cdataPropName){g&&(E+=N),E+=`<![CDATA[${x[$][0][c.textNodeName]}]]>`,g=!1;continue}if($===c.commentPropName){E+=N+`<!--${x[$][0][c.textNodeName]}-->`,g=!0;continue}if($[0]==="?"){let O=le(x[":@"],c),H=$==="?xml"?"":N,V=x[$][0][c.textNodeName];V=V.length!==0?" "+V:"",E+=H+`<${$}${V}${O}?>`,g=!0;continue}let R=N;R!==""&&(R+=c.indentBy);let D=N+`<${$}${le(x[":@"],c)}`,B=we(x[$],c,I,R);c.unpairedTags.indexOf($)!==-1?c.suppressUnpairedNode?E+=D+">":E+=D+"/>":B&&B.length!==0||!c.suppressEmptyNode?B&&B.endsWith(">")?E+=D+`>${B}${N}</${$}>`:(E+=D+">",B&&N!==""&&(B.includes("/>")||B.includes("</"))?E+=N+c.indentBy+B+N:E+=B,E+=`</${$}>`):E+=D+"/>",g=!0}return E}function Gh(h){let c=Object.keys(h);for(let l=0;l<c.length;l++){let N=c[l];if(h.hasOwnProperty(N)&&N!==":@")return N}}function le(h,c){let l="";if(h&&!c.ignoreAttributes)for(let N in h){if(!h.hasOwnProperty(N))continue;let E=c.attributeValueProcessor(N,h[N]);E=Ee(E,c),E===!0&&c.suppressBooleanAttributes?l+=` ${N.substr(c.attributeNamePrefix.length)}`:l+=` ${N.substr(c.attributeNamePrefix.length)}="${E}"`}return l}function Oh(h,c){let l=(h=h.substr(0,h.length-c.textNodeName.length-1)).substr(h.lastIndexOf(".")+1);for(let N in c.stopNodes)if(c.stopNodes[N]===h||c.stopNodes[N]==="*."+l)return!0;return!1}function Ee(h,c){if(h&&h.length>0&&c.processEntities)for(let l=0;l<c.entities.length;l++){let N=c.entities[l];h=h.replace(N.regex,N.val)}return h}let Wh={attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,cdataPropName:!1,format:!1,indentBy:" ",suppressEmptyNode:!1,suppressUnpairedNode:!0,suppressBooleanAttributes:!0,tagValueProcessor:function(h,c){return c},attributeValueProcessor:function(h,c){return c},preserveOrder:!1,commentPropName:!1,unpairedTags:[],entities:[{regex:new RegExp("&","g"),val:"&amp;"},{regex:new RegExp(">","g"),val:"&gt;"},{regex:new RegExp("<","g"),val:"&lt;"},{regex:new RegExp("'","g"),val:"&apos;"},{regex:new RegExp('"',"g"),val:"&quot;"}],processEntities:!0,stopNodes:[],oneListGroup:!1};function ds(h){this.options=Object.assign({},Wh,h),this.options.ignoreAttributes===!0||this.options.attributesGroupName?this.isAttribute=function(){return!1}:(this.ignoreAttributesFn=oe(this.options.ignoreAttributes),this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=Qh),this.processTextOrObjNode=Xh,this.options.format?(this.indentate=Fh,this.tagEndChar=`>
19
- `,this.newLine=`
20
- `):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Xh(h,c,l,N){let E=this.j2x(h,l+1,N.concat(c));return h[this.options.textNodeName]!==void 0&&Object.keys(h).length===1?this.buildTextValNode(h[this.options.textNodeName],c,E.attrStr,l):this.buildObjectNode(E.val,c,E.attrStr,l)}function Fh(h){return this.options.indentBy.repeat(h)}function Qh(h){return!(!h.startsWith(this.options.attributeNamePrefix)||h===this.options.textNodeName)&&h.substr(this.attrPrefixLen)}ds.prototype.build=function(h){return this.options.preserveOrder?Hh(h,this.options):(Array.isArray(h)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(h={[this.options.arrayNodeName]:h}),this.j2x(h,0,[]).val)},ds.prototype.j2x=function(h,c,l){let N="",E="",g=l.join(".");for(let T in h)if(Object.prototype.hasOwnProperty.call(h,T))if(h[T]===void 0)this.isAttribute(T)&&(E+="");else if(h[T]===null)this.isAttribute(T)||T===this.options.cdataPropName?E+="":T[0]==="?"?E+=this.indentate(c)+"<"+T+"?"+this.tagEndChar:E+=this.indentate(c)+"<"+T+"/"+this.tagEndChar;else if(h[T]instanceof Date)E+=this.buildTextValNode(h[T],T,"",c);else if(typeof h[T]!="object"){let x=this.isAttribute(T);if(x&&!this.ignoreAttributesFn(x,g))N+=this.buildAttrPairStr(x,""+h[T]);else if(!x)if(T===this.options.textNodeName){let $=this.options.tagValueProcessor(T,""+h[T]);E+=this.replaceEntitiesValue($)}else E+=this.buildTextValNode(h[T],T,"",c)}else if(Array.isArray(h[T])){let x=h[T].length,$="",I="";for(let R=0;R<x;R++){let D=h[T][R];if(D===void 0);else if(D===null)T[0]==="?"?E+=this.indentate(c)+"<"+T+"?"+this.tagEndChar:E+=this.indentate(c)+"<"+T+"/"+this.tagEndChar;else if(typeof D=="object")if(this.options.oneListGroup){let B=this.j2x(D,c+1,l.concat(T));$+=B.val,this.options.attributesGroupName&&D.hasOwnProperty(this.options.attributesGroupName)&&(I+=B.attrStr)}else $+=this.processTextOrObjNode(D,T,c,l);else if(this.options.oneListGroup){let B=this.options.tagValueProcessor(T,D);B=this.replaceEntitiesValue(B),$+=B}else $+=this.buildTextValNode(D,T,"",c)}this.options.oneListGroup&&($=this.buildObjectNode($,T,I,c)),E+=$}else if(this.options.attributesGroupName&&T===this.options.attributesGroupName){let x=Object.keys(h[T]),$=x.length;for(let I=0;I<$;I++)N+=this.buildAttrPairStr(x[I],""+h[T][x[I]])}else E+=this.processTextOrObjNode(h[T],T,c,l);return{attrStr:N,val:E}},ds.prototype.buildAttrPairStr=function(h,c){return c=this.options.attributeValueProcessor(h,""+c),c=this.replaceEntitiesValue(c),this.options.suppressBooleanAttributes&&c==="true"?" "+h:" "+h+'="'+c+'"'},ds.prototype.buildObjectNode=function(h,c,l,N){if(h==="")return c[0]==="?"?this.indentate(N)+"<"+c+l+"?"+this.tagEndChar:this.indentate(N)+"<"+c+l+this.closeTag(c)+this.tagEndChar;{let E="</"+c+this.tagEndChar,g="";return c[0]==="?"&&(g="?",E=""),!l&&l!==""||h.indexOf("<")!==-1?this.options.commentPropName!==!1&&c===this.options.commentPropName&&g.length===0?this.indentate(N)+`<!--${h}-->`+this.newLine:this.indentate(N)+"<"+c+l+g+this.tagEndChar+h+this.indentate(N)+E:this.indentate(N)+"<"+c+l+g+">"+h+E}},ds.prototype.closeTag=function(h){let c="";return this.options.unpairedTags.indexOf(h)!==-1?this.options.suppressUnpairedNode||(c="/"):c=this.options.suppressEmptyNode?"/":`></${h}`,c},ds.prototype.buildTextValNode=function(h,c,l,N){if(this.options.cdataPropName!==!1&&c===this.options.cdataPropName)return this.indentate(N)+`<![CDATA[${h}]]>`+this.newLine;if(this.options.commentPropName!==!1&&c===this.options.commentPropName)return this.indentate(N)+`<!--${h}-->`+this.newLine;if(c[0]==="?")return this.indentate(N)+"<"+c+l+"?"+this.tagEndChar;{let E=this.options.tagValueProcessor(c,h);return E=this.replaceEntitiesValue(E),E===""?this.indentate(N)+"<"+c+l+this.closeTag(c)+this.tagEndChar:this.indentate(N)+"<"+c+l+">"+E+"</"+c+this.tagEndChar}},ds.prototype.replaceEntitiesValue=function(h){if(h&&h.length>0&&this.options.processEntities)for(let c=0;c<this.options.entities.length;c++){let l=this.options.entities[c];h=h.replace(l.regex,l.val)}return h};let ph={validate:f};mi.exports=t})()});var vi=P((ji)=>{Object.defineProperty(ji,"__esModule",{value:!0});ji.parseXML=Hw;var Pw=ki(),$r=new Pw.XMLParser({attributeNamePrefix:"",htmlEntities:!0,ignoreAttributes:!1,ignoreDeclaration:!0,parseTagValue:!1,trimValues:!1,tagValueProcessor:(s,t)=>t.trim()===""&&t.includes(`
21
- `)?"":void 0});$r.addEntity("#xD","\r");$r.addEntity("#10",`
22
- `);function Hw(s){return $r.parse(s,!0)}});var Ir=P((sn)=>{var Ow=vi();function Ww(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function Xw(s){return s.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\r/g,"&#x0D;").replace(/\n/g,"&#x0A;").replace(/\u0085/g,"&#x85;").replace(/\u2028/,"&#x2028;")}class Ur{value;constructor(s){this.value=s}toString(){return Xw(""+this.value)}}class qs{name;children;attributes={};static of(s,t,r){let e=new qs(s);if(t!==void 0)e.addChildNode(new Ur(t));if(r!==void 0)e.withName(r);return e}constructor(s,t=[]){this.name=s,this.children=t}withName(s){return this.name=s,this}addAttribute(s,t){return this.attributes[s]=t,this}addChildNode(s){return this.children.push(s),this}removeAttribute(s){return delete this.attributes[s],this}n(s){return this.name=s,this}c(s){return this.children.push(s),this}a(s,t){if(t!=null)this.attributes[s]=t;return this}cc(s,t,r=t){if(s[t]!=null){let e=qs.of(t,s[t]).withName(r);this.c(e)}}l(s,t,r,e){if(s[t]!=null)e().map((n)=>{n.withName(r),this.c(n)})}lc(s,t,r,e){if(s[t]!=null){let i=e(),n=new qs(r);i.map((o)=>{n.c(o)}),this.c(n)}}toString(){let s=Boolean(this.children.length),t=`<${this.name}`,r=this.attributes;for(let e of Object.keys(r)){let i=r[e];if(i!=null)t+=` ${e}="${Ww(""+i)}"`}return t+=!s?"/>":`>${this.children.map((e)=>e.toString()).join("")}</${this.name}>`}}Object.defineProperty(sn,"parseXML",{enumerable:!0,get:function(){return Ow.parseXML}});sn.XmlNode=qs;sn.XmlText=Ur});var Ln=P((fl)=>{var Mr=ss(),Ns=tt(),tn=wn(),Vw=pw(),rn=Pi(),en=Tr(),W=dr(),hs=yr(),Y=st(),q=wr(),Js=fr(),ln=Qs(),k=Ir(),Sr={warningEmitted:!1},Zw=(s)=>{if(s&&!Sr.warningEmitted&&parseInt(s.substring(1,s.indexOf(".")))<18)Sr.warningEmitted=!0,process.emitWarning(`NodeDeprecationWarning: The AWS SDK for JavaScript (v3) will
23
- no longer support Node.js 16.x on January 6, 2025.
24
-
25
- To continue receiving updates to AWS services, bug fixes, and security
26
- updates please upgrade to a supported Node.js LTS version.
27
-
28
- More information can be found at: https://a.co/74kJMmI`)};function qw(s,t,r){if(!s.$source)s.$source={};return s.$source[t]=r,s}function Kw(s,t,r){if(!s.__aws_sdk_context)s.__aws_sdk_context={features:{}};else if(!s.__aws_sdk_context.features)s.__aws_sdk_context.features={};s.__aws_sdk_context.features[t]=r}function Jw(s,t,r){if(!s.$source)s.$source={};return s.$source[t]=r,s}var nn=(s)=>Mr.HttpResponse.isInstance(s)?s.headers?.date??s.headers?.Date:void 0,Lr=(s)=>new Date(Date.now()+s),Yw=(s,t)=>Math.abs(Lr(t).getTime()-s)>=300000,on=(s,t)=>{let r=Date.parse(s);if(Yw(r,t))return r-Date.now();return t},Ks=(s,t)=>{if(!t)throw Error(`Property \`${s}\` is not resolved for AWS SDK SigV4Auth`);return t},Dr=async(s)=>{let t=Ks("context",s.context),r=Ks("config",s.config),e=t.endpointV2?.properties?.authSchemes?.[0],n=await Ks("signer",r.signer)(e),o=s?.signingRegion,f=s?.signingRegionSet,d=s?.signingName;return{config:r,signer:n,signingRegion:o,signingRegionSet:f,signingName:d}};class Nt{async sign(s,t,r){if(!Mr.HttpRequest.isInstance(s))throw Error("The request is not an instance of `HttpRequest` and cannot be signed");let e=await Dr(r),{config:i,signer:n}=e,{signingRegion:o,signingName:f}=e,d=r.context;if(d?.authSchemes?.length??!1){let[u,A]=d.authSchemes;if(u?.name==="sigv4a"&&A?.name==="sigv4")o=A?.signingRegion??o,f=A?.signingName??f}return await n.sign(s,{signingDate:Lr(i.systemClockOffset),signingRegion:o,signingService:f})}errorHandler(s){return(t)=>{let r=t.ServerTime??nn(t.$response);if(r){let e=Ks("config",s.config),i=e.systemClockOffset;if(e.systemClockOffset=on(r,e.systemClockOffset),e.systemClockOffset!==i&&t.$metadata)t.$metadata.clockSkewCorrected=!0}throw t}}successHandler(s,t){let r=nn(s);if(r){let e=Ks("config",t.config);e.systemClockOffset=on(r,e.systemClockOffset)}}}var aw=Nt;class En extends Nt{async sign(s,t,r){if(!Mr.HttpRequest.isInstance(s))throw Error("The request is not an instance of `HttpRequest` and cannot be signed");let{config:e,signer:i,signingRegion:n,signingRegionSet:o,signingName:f}=await Dr(r),w=(await e.sigv4aSigningRegionSet?.()??o??[n]).join(",");return await i.sign(s,{signingDate:Lr(e.systemClockOffset),signingRegion:w,signingService:f})}}var hn=(s)=>typeof s==="string"&&s.length>0?s.split(",").map((t)=>t.trim()):[],un=(s)=>`AWS_BEARER_TOKEN_${s.replace(/[\s-]/g,"_").toUpperCase()}`,cn="AWS_AUTH_SCHEME_PREFERENCE",fn="auth_scheme_preference",mw={environmentVariableSelector:(s,t)=>{if(t?.signingName){if(un(t.signingName)in s)return["httpBearerAuth"]}if(!(cn in s))return;return hn(s[cn])},configFileSelector:(s)=>{if(!(fn in s))return;return hn(s[fn])},default:[]},kw=(s)=>{return s.sigv4aSigningRegionSet=Ns.normalizeProvider(s.sigv4aSigningRegionSet),s},jw={environmentVariableSelector(s){if(s.AWS_SIGV4A_SIGNING_REGION_SET)return s.AWS_SIGV4A_SIGNING_REGION_SET.split(",").map((t)=>t.trim());throw new tn.ProviderError("AWS_SIGV4A_SIGNING_REGION_SET not set in env.",{tryNextLink:!0})},configFileSelector(s){if(s.sigv4a_signing_region_set)return(s.sigv4a_signing_region_set??"").split(",").map((t)=>t.trim());throw new tn.ProviderError("sigv4a_signing_region_set not set in profile.",{tryNextLink:!0})},default:void 0},gn=(s)=>{let t=s.credentials,r=!!s.credentials,e=void 0;Object.defineProperty(s,"credentials",{set(w){if(w&&w!==t&&w!==e)r=!0;t=w;let u=sl(s,{credentials:t,credentialDefaultProvider:s.credentialDefaultProvider}),A=tl(s,u);if(r&&!A.attributed)e=async(_)=>A(_).then((U)=>Vw.setCredentialFeature(U,"CREDENTIALS_CODE","e")),e.memoized=A.memoized,e.configBound=A.configBound,e.attributed=!0;else e=A},get(){return e},enumerable:!0,configurable:!0}),s.credentials=t;let{signingEscapePath:i=!0,systemClockOffset:n=s.systemClockOffset||0,sha256:o}=s,f;if(s.signer)f=Ns.normalizeProvider(s.signer);else if(s.regionInfoProvider)f=()=>Ns.normalizeProvider(s.region)().then(async(w)=>[await s.regionInfoProvider(w,{useFipsEndpoint:await s.useFipsEndpoint(),useDualstackEndpoint:await s.useDualstackEndpoint()})||{},w]).then(([w,u])=>{let{signingRegion:A,signingService:_}=w;s.signingRegion=s.signingRegion||A||u,s.signingName=s.signingName||_||s.serviceId;let U={...s,credentials:s.credentials,region:s.signingRegion,service:s.signingName,sha256:o,uriEscapePath:i};return new(s.signerConstructor||rn.SignatureV4)(U)});else f=async(w)=>{w=Object.assign({},{name:"sigv4",signingName:s.signingName||s.defaultSigningName,signingRegion:await Ns.normalizeProvider(s.region)(),properties:{}},w);let{signingRegion:u,signingName:A}=w;s.signingRegion=s.signingRegion||u,s.signingName=s.signingName||A||s.serviceId;let _={...s,credentials:s.credentials,region:s.signingRegion,service:s.signingName,sha256:o,uriEscapePath:i};return new(s.signerConstructor||rn.SignatureV4)(_)};return Object.assign(s,{systemClockOffset:n,signingEscapePath:i,signer:f})},vw=gn;function sl(s,{credentials:t,credentialDefaultProvider:r}){let e;if(t)if(!t?.memoized)e=Ns.memoizeIdentityProvider(t,Ns.isIdentityExpired,Ns.doesIdentityRequireRefresh);else e=t;else if(r)e=Ns.normalizeProvider(r(Object.assign({},s,{parentClientConfig:s})));else e=async()=>{throw Error("@aws-sdk/core::resolveAwsSdkSigV4Config - `credentials` not provided and no credentialDefaultProvider was configured.")};return e.memoized=!0,e}function tl(s,t){if(t.configBound)return t;let r=async(e)=>t({...e,callerClientConfig:s});return r.memoized=t.memoized,r.configBound=!0,r}class Ps{queryCompat;constructor(s=!1){this.queryCompat=s}resolveRestContentType(s,t){let r=t.getMemberSchemas(),e=Object.values(r).find((i)=>{return!!i.getMergedTraits().httpPayload});if(e){let i=e.getMergedTraits().mediaType;if(i)return i;else if(e.isStringSchema())return"text/plain";else if(e.isBlobSchema())return"application/octet-stream";else return s}else if(!t.isUnitSchema()){if(Object.values(r).find((n)=>{let{httpQuery:o,httpQueryParams:f,httpHeader:d,httpLabel:w,httpPrefixHeaders:u}=n.getMergedTraits();return!o&&!f&&!d&&!w&&u===void 0}))return s}}async getErrorSchemaOrThrowBaseException(s,t,r,e,i,n){let o=t,f=s;if(s.includes("#"))[o,f]=s.split("#");let d={$metadata:i,$fault:r.statusCode<500?"client":"server"},w=W.TypeRegistry.for(o);try{return{errorSchema:n?.(w,f)??w.getSchema(s),errorMetadata:d}}catch(u){e.message=e.message??e.Message??"UnknownError";let A=W.TypeRegistry.for("smithy.ts.sdk.synthetic."+o),_=A.getBaseException();if(_){let U=A.getErrorCtor(_)??Error;throw this.decorateServiceException(Object.assign(new U({name:f}),d),e)}throw this.decorateServiceException(Object.assign(Error(f),d),e)}}decorateServiceException(s,t={}){if(this.queryCompat){let r=s.Message??t.Message,e=hs.decorateServiceException(s,t);if(r)e.Message=r,e.message=r;return e}return hs.decorateServiceException(s,t)}setQueryCompatError(s,t){let r=t.headers?.["x-amzn-query-error"];if(s!==void 0&&r!=null){let[e,i]=r.split(";"),n=Object.entries(s),o={Code:e,Type:i};Object.assign(s,o);for(let[f,d]of n)o[f]=d;delete o.__type,s.Error=o}}queryCompatOutput(s,t){if(s.Error)t.Error=s.Error;if(s.Type)t.Type=s.Type;if(s.Code)t.Code=s.Code}}class Nn extends en.SmithyRpcV2CborProtocol{awsQueryCompatible;mixin;constructor({defaultNamespace:s,awsQueryCompatible:t}){super({defaultNamespace:s});this.awsQueryCompatible=!!t,this.mixin=new Ps(this.awsQueryCompatible)}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(this.awsQueryCompatible)e.headers["x-amzn-query-mode"]="true";return e}async handleError(s,t,r,e,i){if(this.awsQueryCompatible)this.mixin.setQueryCompatError(e,r);let n=en.loadSmithyRpcV2CborErrorCode(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=W.NormalizedSchema.of(o),w=e.message??e.Message??"Unknown",A=new(W.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w),_={};for(let[U,S]of d.structIterator())_[U]=this.deserializer.readValue(S,e[U]);if(this.awsQueryCompatible)this.mixin.queryCompatOutput(e,_);throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}}var rl=(s)=>{if(s==null)return s;if(typeof s==="number"||typeof s==="bigint"){let t=Error(`Received number ${s} where a string was expected.`);return t.name="Warning",console.warn(t),String(s)}if(typeof s==="boolean"){let t=Error(`Received boolean ${s} where a string was expected.`);return t.name="Warning",console.warn(t),String(s)}return s},el=(s)=>{if(s==null)return s;if(typeof s==="string"){let t=s.toLowerCase();if(s!==""&&t!=="false"&&t!=="true"){let r=Error(`Received string "${s}" where a boolean was expected.`);r.name="Warning",console.warn(r)}return s!==""&&t!=="false"}return s},il=(s)=>{if(s==null)return s;if(typeof s==="string"){let t=Number(s);if(t.toString()!==s){let r=Error(`Received string "${s}" where a number was expected.`);return r.name="Warning",console.warn(r),s}return t}return s};class As{serdeContext;setSerdeContext(s){this.serdeContext=s}}function nl(s,t,r){if(r?.source){let e=r.source;if(typeof t==="number"){if(t>Number.MAX_SAFE_INTEGER||t<Number.MIN_SAFE_INTEGER||e!==String(t))if(e.includes("."))return new q.NumericValue(e,"bigDecimal");else return BigInt(e)}}return t}var An=(s,t)=>hs.collectBody(s,t).then((r)=>(t?.utf8Encoder??ln.toUtf8)(r)),zr=(s,t)=>An(s,t).then((r)=>{if(r.length)try{return JSON.parse(r)}catch(e){if(e?.name==="SyntaxError")Object.defineProperty(e,"$responseBodyText",{value:r});throw e}return{}}),ol=async(s,t)=>{let r=await zr(s,t);return r.message=r.message??r.Message,r},Rr=(s,t)=>{let r=(n,o)=>Object.keys(n).find((f)=>f.toLowerCase()===o.toLowerCase()),e=(n)=>{let o=n;if(typeof o==="number")o=o.toString();if(o.indexOf(",")>=0)o=o.split(",")[0];if(o.indexOf(":")>=0)o=o.split(":")[0];if(o.indexOf("#")>=0)o=o.split("#")[1];return o},i=r(s.headers,"x-amzn-errortype");if(i!==void 0)return e(s.headers[i]);if(t&&typeof t==="object"){let n=r(t,"code");if(n&&t[n]!==void 0)return e(t[n]);if(t.__type!==void 0)return e(t.__type)}};class br extends As{settings;constructor(s){super();this.settings=s}async read(s,t){return this._read(s,typeof t==="string"?JSON.parse(t,nl):await zr(t,this.serdeContext))}readObject(s,t){return this._read(s,t)}_read(s,t){let r=t!==null&&typeof t==="object",e=W.NormalizedSchema.of(s);if(e.isListSchema()&&Array.isArray(t)){let n=e.getValueSchema(),o=[],f=!!e.getMergedTraits().sparse;for(let d of t)if(f||d!=null)o.push(this._read(n,d));return o}else if(e.isMapSchema()&&r){let n=e.getValueSchema(),o={},f=!!e.getMergedTraits().sparse;for(let[d,w]of Object.entries(t))if(f||w!=null)o[d]=this._read(n,w);return o}else if(e.isStructSchema()&&r){let n={};for(let[o,f]of e.structIterator()){let d=this.settings.jsonName?f.getMergedTraits().jsonName??o:o,w=this._read(f,t[d]);if(w!=null)n[o]=w}return n}if(e.isBlobSchema()&&typeof t==="string")return Js.fromBase64(t);let i=e.getMergedTraits().mediaType;if(e.isStringSchema()&&typeof t==="string"&&i){if(i==="application/json"||i.endsWith("+json"))return q.LazyJsonString.from(t)}if(e.isTimestampSchema()&&t!=null)switch(Y.determineTimestampFormat(e,this.settings)){case 5:return q.parseRfc3339DateTimeWithOffset(t);case 6:return q.parseRfc7231DateTime(t);case 7:return q.parseEpochTimestamp(t);default:return console.warn("Missing timestamp format, parsing value with Date constructor:",t),new Date(t)}if(e.isBigIntegerSchema()&&(typeof t==="number"||typeof t==="string"))return BigInt(t);if(e.isBigDecimalSchema()&&t!=null){if(t instanceof q.NumericValue)return t;let n=t;if(n.type==="bigDecimal"&&"string"in n)return new q.NumericValue(n.string,n.type);return new q.NumericValue(String(t),"bigDecimal")}if(e.isNumericSchema()&&typeof t==="string")switch(t){case"Infinity":return 1/0;case"-Infinity":return-1/0;case"NaN":return NaN}if(e.isDocumentSchema())if(r){let n=Array.isArray(t)?[]:{};for(let[o,f]of Object.entries(t))if(f instanceof q.NumericValue)n[o]=f;else n[o]=this._read(e,f);return n}else return structuredClone(t);return t}}var dn=String.fromCharCode(925);class _n{values=new Map;counter=0;stage=0;createReplacer(){if(this.stage===1)throw Error("@aws-sdk/core/protocols - JsonReplacer already created.");if(this.stage===2)throw Error("@aws-sdk/core/protocols - JsonReplacer exhausted.");return this.stage=1,(s,t)=>{if(t instanceof q.NumericValue){let r=`${dn+"nv"+this.counter++}_`+t.string;return this.values.set(`"${r}"`,t.string),r}if(typeof t==="bigint"){let r=t.toString(),e=`${dn+"b"+this.counter++}_`+r;return this.values.set(`"${e}"`,r),e}return t}}replaceInJson(s){if(this.stage===0)throw Error("@aws-sdk/core/protocols - JsonReplacer not created yet.");if(this.stage===2)throw Error("@aws-sdk/core/protocols - JsonReplacer exhausted.");if(this.stage=2,this.counter===0)return s;for(let[t,r]of this.values)s=s.replace(t,r);return s}}class Cr extends As{settings;buffer;rootSchema;constructor(s){super();this.settings=s}write(s,t){this.rootSchema=W.NormalizedSchema.of(s),this.buffer=this._write(this.rootSchema,t)}writeDiscriminatedDocument(s,t){if(this.write(s,t),typeof this.buffer==="object")this.buffer.__type=W.NormalizedSchema.of(s).getName(!0)}flush(){let{rootSchema:s}=this;if(this.rootSchema=void 0,s?.isStructSchema()||s?.isDocumentSchema()){let t=new _n;return t.replaceInJson(JSON.stringify(this.buffer,t.createReplacer(),0))}return this.buffer}_write(s,t,r){let e=t!==null&&typeof t==="object",i=W.NormalizedSchema.of(s);if(i.isListSchema()&&Array.isArray(t)){let n=i.getValueSchema(),o=[],f=!!i.getMergedTraits().sparse;for(let d of t)if(f||d!=null)o.push(this._write(n,d));return o}else if(i.isMapSchema()&&e){let n=i.getValueSchema(),o={},f=!!i.getMergedTraits().sparse;for(let[d,w]of Object.entries(t))if(f||w!=null)o[d]=this._write(n,w);return o}else if(i.isStructSchema()&&e){let n={};for(let[o,f]of i.structIterator()){let d=this.settings.jsonName?f.getMergedTraits().jsonName??o:o,w=this._write(f,t[o],i);if(w!==void 0)n[d]=w}return n}if(t===null&&r?.isStructSchema())return;if(i.isBlobSchema()&&(t instanceof Uint8Array||typeof t==="string")||i.isDocumentSchema()&&t instanceof Uint8Array){if(i===this.rootSchema)return t;return(this.serdeContext?.base64Encoder??Js.toBase64)(t)}if((i.isTimestampSchema()||i.isDocumentSchema())&&t instanceof Date)switch(Y.determineTimestampFormat(i,this.settings)){case 5:return t.toISOString().replace(".000Z","Z");case 6:return q.dateToUtcString(t);case 7:return t.getTime()/1000;default:return console.warn("Missing timestamp format, using epoch seconds",t),t.getTime()/1000}if(i.isNumericSchema()&&typeof t==="number"){if(Math.abs(t)===1/0||isNaN(t))return String(t)}if(i.isStringSchema()){if(typeof t>"u"&&i.isIdempotencyToken())return q.generateIdempotencyToken();let n=i.getMergedTraits().mediaType;if(t!=null&&n){if(n==="application/json"||n.endsWith("+json"))return q.LazyJsonString.from(t)}}if(i.isDocumentSchema())if(e){let n=Array.isArray(t)?[]:{};for(let[o,f]of Object.entries(t))if(f instanceof q.NumericValue)n[o]=f;else n[o]=this._write(i,f);return n}else return structuredClone(t);return t}}class At extends As{settings;constructor(s){super();this.settings=s}createSerializer(){let s=new Cr(this.settings);return s.setSerdeContext(this.serdeContext),s}createDeserializer(){let s=new br(this.settings);return s.setSerdeContext(this.serdeContext),s}}class _t extends Y.RpcProtocol{serializer;deserializer;serviceTarget;codec;mixin;awsQueryCompatible;constructor({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r}){super({defaultNamespace:s});this.serviceTarget=t,this.codec=new At({timestampFormat:{useTrait:!0,default:7},jsonName:!1}),this.serializer=this.codec.createSerializer(),this.deserializer=this.codec.createDeserializer(),this.awsQueryCompatible=!!r,this.mixin=new Ps(this.awsQueryCompatible)}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(!e.path.endsWith("/"))e.path+="/";if(Object.assign(e.headers,{"content-type":`application/x-amz-json-${this.getJsonRpcVersion()}`,"x-amz-target":`${this.serviceTarget}.${s.name}`}),this.awsQueryCompatible)e.headers["x-amzn-query-mode"]="true";if(W.deref(s.input)==="unit"||!e.body)e.body="{}";return e}getPayloadCodec(){return this.codec}async handleError(s,t,r,e,i){if(this.awsQueryCompatible)this.mixin.setQueryCompatError(e,r);let n=Rr(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=W.NormalizedSchema.of(o),w=e.message??e.Message??"Unknown",A=new(W.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w),_={};for(let[U,S]of d.structIterator()){let y=S.getMergedTraits().jsonName??U;_[U]=this.codec.createDeserializer().readObject(S,e[y])}if(this.awsQueryCompatible)this.mixin.queryCompatOutput(e,_);throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}}class xn extends _t{constructor({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r}){super({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r})}getShapeId(){return"aws.protocols#awsJson1_0"}getJsonRpcVersion(){return"1.0"}getDefaultContentType(){return"application/x-amz-json-1.0"}}class Tn extends _t{constructor({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r}){super({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r})}getShapeId(){return"aws.protocols#awsJson1_1"}getJsonRpcVersion(){return"1.1"}getDefaultContentType(){return"application/x-amz-json-1.1"}}class $n extends Y.HttpBindingProtocol{serializer;deserializer;codec;mixin=new Ps;constructor({defaultNamespace:s}){super({defaultNamespace:s});let t={timestampFormat:{useTrait:!0,default:7},httpBindings:!0,jsonName:!0};this.codec=new At(t),this.serializer=new Y.HttpInterceptingShapeSerializer(this.codec.createSerializer(),t),this.deserializer=new Y.HttpInterceptingShapeDeserializer(this.codec.createDeserializer(),t)}getShapeId(){return"aws.protocols#restJson1"}getPayloadCodec(){return this.codec}setSerdeContext(s){this.codec.setSerdeContext(s),super.setSerdeContext(s)}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r),i=W.NormalizedSchema.of(s.input);if(!e.headers["content-type"]){let n=this.mixin.resolveRestContentType(this.getDefaultContentType(),i);if(n)e.headers["content-type"]=n}if(e.body==null&&e.headers["content-type"]===this.getDefaultContentType())e.body="{}";return e}async deserializeResponse(s,t,r){let e=await super.deserializeResponse(s,t,r),i=W.NormalizedSchema.of(s.output);for(let[n,o]of i.structIterator())if(o.getMemberTraits().httpPayload&&!(n in e))e[n]=null;return e}async handleError(s,t,r,e,i){let n=Rr(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=W.NormalizedSchema.of(o),w=e.message??e.Message??"Unknown",A=new(W.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w);await this.deserializeHttpMessage(o,t,r,e);let _={};for(let[U,S]of d.structIterator()){let y=S.getMergedTraits().jsonName??U;_[U]=this.codec.createDeserializer().readObject(S,e[y])}throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}getDefaultContentType(){return"application/json"}}var hl=(s)=>{if(s==null)return;if(typeof s==="object"&&"__type"in s)delete s.__type;return hs.expectUnion(s)};class xt extends As{settings;stringDeserializer;constructor(s){super();this.settings=s,this.stringDeserializer=new Y.FromStringShapeDeserializer(s)}setSerdeContext(s){this.serdeContext=s,this.stringDeserializer.setSerdeContext(s)}read(s,t,r){let e=W.NormalizedSchema.of(s),i=e.getMemberSchemas();if(e.isStructSchema()&&e.isMemberSchema()&&!!Object.values(i).find((d)=>{return!!d.getMemberTraits().eventPayload})){let d={},w=Object.keys(i)[0];if(i[w].isBlobSchema())d[w]=t;else d[w]=this.read(i[w],t);return d}let o=(this.serdeContext?.utf8Encoder??ln.toUtf8)(t),f=this.parseXml(o);return this.readSchema(s,r?f[r]:f)}readSchema(s,t){let r=W.NormalizedSchema.of(s);if(r.isUnitSchema())return;let e=r.getMergedTraits();if(r.isListSchema()&&!Array.isArray(t))return this.readSchema(r,[t]);if(t==null)return t;if(typeof t==="object"){let i=!!e.sparse,n=!!e.xmlFlattened;if(r.isListSchema()){let f=r.getValueSchema(),d=[],w=f.getMergedTraits().xmlName??"member",u=n?t:(t[0]??t)[w],A=Array.isArray(u)?u:[u];for(let _ of A)if(_!=null||i)d.push(this.readSchema(f,_));return d}let o={};if(r.isMapSchema()){let f=r.getKeySchema(),d=r.getValueSchema(),w;if(n)w=Array.isArray(t)?t:[t];else w=Array.isArray(t.entry)?t.entry:[t.entry];let u=f.getMergedTraits().xmlName??"key",A=d.getMergedTraits().xmlName??"value";for(let _ of w){let U=_[u],S=_[A];if(S!=null||i)o[U]=this.readSchema(d,S)}return o}if(r.isStructSchema()){for(let[f,d]of r.structIterator()){let w=d.getMergedTraits(),u=!w.httpPayload?d.getMemberTraits().xmlName??f:w.xmlName??d.getName();if(t[u]!=null)o[f]=this.readSchema(d,t[u])}return o}if(r.isDocumentSchema())return t;throw Error(`@aws-sdk/core/protocols - xml deserializer unhandled schema type for ${r.getName(!0)}`)}if(r.isListSchema())return[];if(r.isMapSchema()||r.isStructSchema())return{};return this.stringDeserializer.read(r,t)}parseXml(s){if(s.length){let t;try{t=k.parseXML(s)}catch(n){if(n&&typeof n==="object")Object.defineProperty(n,"$responseBodyText",{value:s});throw n}let r="#text",e=Object.keys(t)[0],i=t[e];if(i[r])i[e]=i[r],delete i[r];return hs.getValueFromTextNode(i)}return{}}}class Un extends As{settings;buffer;constructor(s){super();this.settings=s}write(s,t,r=""){if(this.buffer===void 0)this.buffer="";let e=W.NormalizedSchema.of(s);if(r&&!r.endsWith("."))r+=".";if(e.isBlobSchema()){if(typeof t==="string"||t instanceof Uint8Array)this.writeKey(r),this.writeValue((this.serdeContext?.base64Encoder??Js.toBase64)(t))}else if(e.isBooleanSchema()||e.isNumericSchema()||e.isStringSchema()){if(t!=null)this.writeKey(r),this.writeValue(String(t));else if(e.isIdempotencyToken())this.writeKey(r),this.writeValue(q.generateIdempotencyToken())}else if(e.isBigIntegerSchema()){if(t!=null)this.writeKey(r),this.writeValue(String(t))}else if(e.isBigDecimalSchema()){if(t!=null)this.writeKey(r),this.writeValue(t instanceof q.NumericValue?t.string:String(t))}else if(e.isTimestampSchema()){if(t instanceof Date)switch(this.writeKey(r),Y.determineTimestampFormat(e,this.settings)){case 5:this.writeValue(t.toISOString().replace(".000Z","Z"));break;case 6:this.writeValue(hs.dateToUtcString(t));break;case 7:this.writeValue(String(t.getTime()/1000));break}}else if(e.isDocumentSchema())throw Error(`@aws-sdk/core/protocols - QuerySerializer unsupported document type ${e.getName(!0)}`);else if(e.isListSchema()){if(Array.isArray(t))if(t.length===0){if(this.settings.serializeEmptyLists)this.writeKey(r),this.writeValue("")}else{let i=e.getValueSchema(),n=this.settings.flattenLists||e.getMergedTraits().xmlFlattened,o=1;for(let f of t){if(f==null)continue;let d=this.getKey("member",i.getMergedTraits().xmlName),w=n?`${r}${o}`:`${r}${d}.${o}`;this.write(i,f,w),++o}}}else if(e.isMapSchema()){if(t&&typeof t==="object"){let i=e.getKeySchema(),n=e.getValueSchema(),o=e.getMergedTraits().xmlFlattened,f=1;for(let[d,w]of Object.entries(t)){if(w==null)continue;let u=this.getKey("key",i.getMergedTraits().xmlName),A=o?`${r}${f}.${u}`:`${r}entry.${f}.${u}`,_=this.getKey("value",n.getMergedTraits().xmlName),U=o?`${r}${f}.${_}`:`${r}entry.${f}.${_}`;this.write(i,d,A),this.write(n,w,U),++f}}}else if(e.isStructSchema()){if(t&&typeof t==="object")for(let[i,n]of e.structIterator()){if(t[i]==null&&!n.isIdempotencyToken())continue;let o=this.getKey(i,n.getMergedTraits().xmlName),f=`${r}${o}`;this.write(n,t[i],f)}}else if(e.isUnitSchema());else throw Error(`@aws-sdk/core/protocols - QuerySerializer unrecognized schema type ${e.getName(!0)}`)}flush(){if(this.buffer===void 0)throw Error("@aws-sdk/core/protocols - QuerySerializer cannot flush with nothing written to buffer.");let s=this.buffer;return delete this.buffer,s}getKey(s,t){let r=t??s;if(this.settings.capitalizeKeys)return r[0].toUpperCase()+r.slice(1);return r}writeKey(s){if(s.endsWith("."))s=s.slice(0,s.length-1);this.buffer+=`&${Y.extendedEncodeURIComponent(s)}=`}writeValue(s){this.buffer+=Y.extendedEncodeURIComponent(s)}}class Br extends Y.RpcProtocol{options;serializer;deserializer;mixin=new Ps;constructor(s){super({defaultNamespace:s.defaultNamespace});this.options=s;let t={timestampFormat:{useTrait:!0,default:5},httpBindings:!1,xmlNamespace:s.xmlNamespace,serviceNamespace:s.defaultNamespace,serializeEmptyLists:!0};this.serializer=new Un(t),this.deserializer=new xt(t)}getShapeId(){return"aws.protocols#awsQuery"}setSerdeContext(s){this.serializer.setSerdeContext(s),this.deserializer.setSerdeContext(s)}getPayloadCodec(){throw Error("AWSQuery protocol has no payload codec.")}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(!e.path.endsWith("/"))e.path+="/";if(Object.assign(e.headers,{"content-type":"application/x-www-form-urlencoded"}),W.deref(s.input)==="unit"||!e.body)e.body="";let i=s.name.split("#")[1]??s.name;if(e.body=`Action=${i}&Version=${this.options.version}`+e.body,e.body.endsWith("&"))e.body=e.body.slice(-1);return e}async deserializeResponse(s,t,r){let e=this.deserializer,i=W.NormalizedSchema.of(s.output),n={};if(r.statusCode>=300){let u=await Y.collectBody(r.body,t);if(u.byteLength>0)Object.assign(n,await e.read(15,u));await this.handleError(s,t,r,n,this.deserializeMetadata(r))}for(let u in r.headers){let A=r.headers[u];delete r.headers[u],r.headers[u.toLowerCase()]=A}let o=s.name.split("#")[1]??s.name,f=i.isStructSchema()&&this.useNestedResult()?o+"Result":void 0,d=await Y.collectBody(r.body,t);if(d.byteLength>0)Object.assign(n,await e.read(i,d,f));return{$metadata:this.deserializeMetadata(r),...n}}useNestedResult(){return!0}async handleError(s,t,r,e,i){let n=this.loadQueryErrorCode(r,e)??"Unknown",o=this.loadQueryError(e),f=this.loadQueryErrorMessage(e);o.message=f,o.Error={Type:o.Type,Code:o.Code,Message:f};let{errorSchema:d,errorMetadata:w}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,o,i,(S,y)=>{try{return S.getSchema(y)}catch(G){return S.find((L)=>W.NormalizedSchema.of(L).getMergedTraits().awsQueryError?.[0]===y)}}),u=W.NormalizedSchema.of(d),_=new(W.TypeRegistry.for(d[1]).getErrorCtor(d)??Error)(f),U={Error:o.Error};for(let[S,y]of u.structIterator()){let G=y.getMergedTraits().xmlName??S,L=o[G]??e[G];U[S]=this.deserializer.readSchema(y,L)}throw this.mixin.decorateServiceException(Object.assign(_,w,{$fault:u.getMergedTraits().error,message:f},U),e)}loadQueryErrorCode(s,t){let r=(t.Errors?.[0]?.Error??t.Errors?.Error??t.Error)?.Code;if(r!==void 0)return r;if(s.statusCode==404)return"NotFound"}loadQueryError(s){return s.Errors?.[0]?.Error??s.Errors?.Error??s.Error}loadQueryErrorMessage(s){let t=this.loadQueryError(s);return t?.message??t?.Message??s.message??s.Message??"Unknown"}getDefaultContentType(){return"application/x-www-form-urlencoded"}}class In extends Br{options;constructor(s){super(s);this.options=s;let t={capitalizeKeys:!0,flattenLists:!0,serializeEmptyLists:!1};Object.assign(this.serializer.settings,t)}useNestedResult(){return!1}}var Sn=(s,t)=>An(s,t).then((r)=>{if(r.length){let e;try{e=k.parseXML(r)}catch(f){if(f&&typeof f==="object")Object.defineProperty(f,"$responseBodyText",{value:r});throw f}let i="#text",n=Object.keys(e)[0],o=e[n];if(o[i])o[n]=o[i],delete o[i];return hs.getValueFromTextNode(o)}return{}}),cl=async(s,t)=>{let r=await Sn(s,t);if(r.Error)r.Error.message=r.Error.message??r.Error.Message;return r},yn=(s,t)=>{if(t?.Error?.Code!==void 0)return t.Error.Code;if(t?.Code!==void 0)return t.Code;if(s.statusCode==404)return"NotFound"};class Pr extends As{settings;stringBuffer;byteBuffer;buffer;constructor(s){super();this.settings=s}write(s,t){let r=W.NormalizedSchema.of(s);if(r.isStringSchema()&&typeof t==="string")this.stringBuffer=t;else if(r.isBlobSchema())this.byteBuffer="byteLength"in t?t:(this.serdeContext?.base64Decoder??Js.fromBase64)(t);else{this.buffer=this.writeStruct(r,t,void 0);let e=r.getMergedTraits();if(e.httpPayload&&!e.xmlName)this.buffer.withName(r.getName())}}flush(){if(this.byteBuffer!==void 0){let t=this.byteBuffer;return delete this.byteBuffer,t}if(this.stringBuffer!==void 0){let t=this.stringBuffer;return delete this.stringBuffer,t}let s=this.buffer;if(this.settings.xmlNamespace){if(!s?.attributes?.xmlns)s.addAttribute("xmlns",this.settings.xmlNamespace)}return delete this.buffer,s.toString()}writeStruct(s,t,r){let e=s.getMergedTraits(),i=s.isMemberSchema()&&!e.httpPayload?s.getMemberTraits().xmlName??s.getMemberName():e.xmlName??s.getName();if(!i||!s.isStructSchema())throw Error(`@aws-sdk/core/protocols - xml serializer, cannot write struct with empty name or non-struct, schema=${s.getName(!0)}.`);let n=k.XmlNode.of(i),[o,f]=this.getXmlnsAttribute(s,r);for(let[d,w]of s.structIterator()){let u=t[d];if(u!=null||w.isIdempotencyToken()){if(w.getMergedTraits().xmlAttribute){n.addAttribute(w.getMergedTraits().xmlName??d,this.writeSimple(w,u));continue}if(w.isListSchema())this.writeList(w,u,n,f);else if(w.isMapSchema())this.writeMap(w,u,n,f);else if(w.isStructSchema())n.addChildNode(this.writeStruct(w,u,f));else{let A=k.XmlNode.of(w.getMergedTraits().xmlName??w.getMemberName());this.writeSimpleInto(w,u,A,f),n.addChildNode(A)}}}if(f)n.addAttribute(o,f);return n}writeList(s,t,r,e){if(!s.isMemberSchema())throw Error(`@aws-sdk/core/protocols - xml serializer, cannot write non-member list: ${s.getName(!0)}`);let i=s.getMergedTraits(),n=s.getValueSchema(),o=n.getMergedTraits(),f=!!o.sparse,d=!!i.xmlFlattened,[w,u]=this.getXmlnsAttribute(s,e),A=(_,U)=>{if(n.isListSchema())this.writeList(n,Array.isArray(U)?U:[U],_,u);else if(n.isMapSchema())this.writeMap(n,U,_,u);else if(n.isStructSchema()){let S=this.writeStruct(n,U,u);_.addChildNode(S.withName(d?i.xmlName??s.getMemberName():o.xmlName??"member"))}else{let S=k.XmlNode.of(d?i.xmlName??s.getMemberName():o.xmlName??"member");this.writeSimpleInto(n,U,S,u),_.addChildNode(S)}};if(d){for(let _ of t)if(f||_!=null)A(r,_)}else{let _=k.XmlNode.of(i.xmlName??s.getMemberName());if(u)_.addAttribute(w,u);for(let U of t)if(f||U!=null)A(_,U);r.addChildNode(_)}}writeMap(s,t,r,e,i=!1){if(!s.isMemberSchema())throw Error(`@aws-sdk/core/protocols - xml serializer, cannot write non-member map: ${s.getName(!0)}`);let n=s.getMergedTraits(),o=s.getKeySchema(),d=o.getMergedTraits().xmlName??"key",w=s.getValueSchema(),u=w.getMergedTraits(),A=u.xmlName??"value",_=!!u.sparse,U=!!n.xmlFlattened,[S,y]=this.getXmlnsAttribute(s,e),G=(L,Z,b)=>{let J=k.XmlNode.of(d,Z),[Ws,rs]=this.getXmlnsAttribute(o,y);if(rs)J.addAttribute(Ws,rs);L.addChildNode(J);let p=k.XmlNode.of(A);if(w.isListSchema())this.writeList(w,b,p,y);else if(w.isMapSchema())this.writeMap(w,b,p,y,!0);else if(w.isStructSchema())p=this.writeStruct(w,b,y);else this.writeSimpleInto(w,b,p,y);L.addChildNode(p)};if(U){for(let[L,Z]of Object.entries(t))if(_||Z!=null){let b=k.XmlNode.of(n.xmlName??s.getMemberName());G(b,L,Z),r.addChildNode(b)}}else{let L;if(!i){if(L=k.XmlNode.of(n.xmlName??s.getMemberName()),y)L.addAttribute(S,y);r.addChildNode(L)}for(let[Z,b]of Object.entries(t))if(_||b!=null){let J=k.XmlNode.of("entry");G(J,Z,b),(i?r:L).addChildNode(J)}}}writeSimple(s,t){if(t===null)throw Error("@aws-sdk/core/protocols - (XML serializer) cannot write null value.");let r=W.NormalizedSchema.of(s),e=null;if(t&&typeof t==="object")if(r.isBlobSchema())e=(this.serdeContext?.base64Encoder??Js.toBase64)(t);else if(r.isTimestampSchema()&&t instanceof Date)switch(Y.determineTimestampFormat(r,this.settings)){case 5:e=t.toISOString().replace(".000Z","Z");break;case 6:e=hs.dateToUtcString(t);break;case 7:e=String(t.getTime()/1000);break;default:console.warn("Missing timestamp format, using http date",t),e=hs.dateToUtcString(t);break}else if(r.isBigDecimalSchema()&&t){if(t instanceof q.NumericValue)return t.string;return String(t)}else if(r.isMapSchema()||r.isListSchema())throw Error("@aws-sdk/core/protocols - xml serializer, cannot call _write() on List/Map schema, call writeList or writeMap() instead.");else throw Error(`@aws-sdk/core/protocols - xml serializer, unhandled schema type for object value and schema: ${r.getName(!0)}`);if(r.isBooleanSchema()||r.isNumericSchema()||r.isBigIntegerSchema()||r.isBigDecimalSchema())e=String(t);if(r.isStringSchema())if(t===void 0&&r.isIdempotencyToken())e=q.generateIdempotencyToken();else e=String(t);if(e===null)throw Error(`Unhandled schema-value pair ${r.getName(!0)}=${t}`);return e}writeSimpleInto(s,t,r,e){let i=this.writeSimple(s,t),n=W.NormalizedSchema.of(s),o=new k.XmlText(i),[f,d]=this.getXmlnsAttribute(n,e);if(d)r.addAttribute(f,d);r.addChildNode(o)}getXmlnsAttribute(s,t){let r=s.getMergedTraits(),[e,i]=r.xmlNamespace??[];if(i&&i!==t)return[e?`xmlns:${e}`:"xmlns",i];return[void 0,void 0]}}class Hr extends As{settings;constructor(s){super();this.settings=s}createSerializer(){let s=new Pr(this.settings);return s.setSerdeContext(this.serdeContext),s}createDeserializer(){let s=new xt(this.settings);return s.setSerdeContext(this.serdeContext),s}}class Mn extends Y.HttpBindingProtocol{codec;serializer;deserializer;mixin=new Ps;constructor(s){super(s);let t={timestampFormat:{useTrait:!0,default:5},httpBindings:!0,xmlNamespace:s.xmlNamespace,serviceNamespace:s.defaultNamespace};this.codec=new Hr(t),this.serializer=new Y.HttpInterceptingShapeSerializer(this.codec.createSerializer(),t),this.deserializer=new Y.HttpInterceptingShapeDeserializer(this.codec.createDeserializer(),t)}getPayloadCodec(){return this.codec}getShapeId(){return"aws.protocols#restXml"}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r),i=W.NormalizedSchema.of(s.input);if(!e.headers["content-type"]){let n=this.mixin.resolveRestContentType(this.getDefaultContentType(),i);if(n)e.headers["content-type"]=n}if(e.headers["content-type"]===this.getDefaultContentType()){if(typeof e.body==="string")e.body='<?xml version="1.0" encoding="UTF-8"?>'+e.body}return e}async deserializeResponse(s,t,r){return super.deserializeResponse(s,t,r)}async handleError(s,t,r,e,i){let n=yn(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=W.NormalizedSchema.of(o),w=e.Error?.message??e.Error?.Message??e.message??e.Message??"Unknown",A=new(W.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w);await this.deserializeHttpMessage(o,t,r,e);let _={};for(let[U,S]of d.structIterator()){let y=S.getMergedTraits().xmlName??U,G=e.Error?.[y]??e[y];_[U]=this.codec.createDeserializer().readSchema(S,G)}throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}getDefaultContentType(){return"application/xml"}}fl.AWSSDKSigV4Signer=aw;fl.AwsEc2QueryProtocol=In;fl.AwsJson1_0Protocol=xn;fl.AwsJson1_1Protocol=Tn;fl.AwsJsonRpcProtocol=_t;fl.AwsQueryProtocol=Br;fl.AwsRestJsonProtocol=$n;fl.AwsRestXmlProtocol=Mn;fl.AwsSdkSigV4ASigner=En;fl.AwsSdkSigV4Signer=Nt;fl.AwsSmithyRpcV2CborProtocol=Nn;fl.JsonCodec=At;fl.JsonShapeDeserializer=br;fl.JsonShapeSerializer=Cr;fl.NODE_AUTH_SCHEME_PREFERENCE_OPTIONS=mw;fl.NODE_SIGV4A_CONFIG_OPTIONS=jw;fl.XmlCodec=Hr;fl.XmlShapeDeserializer=xt;fl.XmlShapeSerializer=Pr;fl._toBool=el;fl._toNum=il;fl._toStr=rl;fl.awsExpectUnion=hl;fl.emitWarningIfUnsupportedVersion=Zw;fl.getBearerTokenEnvKey=un;fl.loadRestJsonErrorCode=Rr;fl.loadRestXmlErrorCode=yn;fl.parseJsonBody=zr;fl.parseJsonErrorBody=ol;fl.parseXmlBody=Sn;fl.parseXmlErrorBody=cl;fl.resolveAWSSDKSigV4Config=vw;fl.resolveAwsSdkSigV4AConfig=kw;fl.resolveAwsSdkSigV4Config=gn;fl.setCredentialFeature=qw;fl.setFeature=Kw;fl.setTokenFeature=Jw;fl.state=Sr;fl.validateSigningProperties=Dr});var Pn=P((hE)=>{var al=tt(),ml=ci(),kl=ss(),ts=Ln(),bn=void 0;function jl(s){if(s===void 0)return!0;return typeof s==="string"&&s.length<=50}function vl(s){let t=al.normalizeProvider(s.userAgentAppId??bn),{customUserAgent:r}=s;return Object.assign(s,{customUserAgent:typeof r==="string"?[[r]]:r,userAgentAppId:async()=>{let e=await t();if(!jl(e)){let i=s.logger?.constructor?.name==="NoOpLogger"||!s.logger?console:s.logger;if(typeof e!=="string")i?.warn("userAgentAppId must be a string or undefined.");else if(e.length>50)i?.warn("The provided userAgentAppId exceeds the maximum length of 50 characters.")}return e}})}var sE=/\d{12}\.ddb/;async function tE(s,t,r){if(r.request?.headers?.["smithy-protocol"]==="rpc-v2-cbor")ts.setFeature(s,"PROTOCOL_RPC_V2_CBOR","M");if(typeof t.retryStrategy==="function"){let n=await t.retryStrategy();if(typeof n.acquireInitialRetryToken==="function")if(n.constructor?.name?.includes("Adaptive"))ts.setFeature(s,"RETRY_MODE_ADAPTIVE","F");else ts.setFeature(s,"RETRY_MODE_STANDARD","E");else ts.setFeature(s,"RETRY_MODE_LEGACY","D")}if(typeof t.accountIdEndpointMode==="function"){let n=s.endpointV2;if(String(n?.url?.hostname).match(sE))ts.setFeature(s,"ACCOUNT_ID_ENDPOINT","O");switch(await t.accountIdEndpointMode?.()){case"disabled":ts.setFeature(s,"ACCOUNT_ID_MODE_DISABLED","Q");break;case"preferred":ts.setFeature(s,"ACCOUNT_ID_MODE_PREFERRED","P");break;case"required":ts.setFeature(s,"ACCOUNT_ID_MODE_REQUIRED","R");break}}let i=s.__smithy_context?.selectedHttpAuthScheme?.identity;if(i?.$source){let n=i;if(n.accountId)ts.setFeature(s,"RESOLVED_ACCOUNT_ID","T");for(let[o,f]of Object.entries(n.$source??{}))ts.setFeature(s,o,f)}}var Dn="user-agent",Gr="x-amz-user-agent",zn=" ",Or="/",rE=/[^!$%&'*+\-.^_`|~\w]/g,eE=/[^!$%&'*+\-.^_`|~\w#]/g,Rn="-",iE=1024;function nE(s){let t="";for(let r in s){let e=s[r];if(t.length+e.length+1<=iE){if(t.length)t+=","+e;else t+=e;continue}break}return t}var Cn=(s)=>(t,r)=>async(e)=>{let{request:i}=e;if(!kl.HttpRequest.isInstance(i))return t(e);let{headers:n}=i,o=r?.userAgent?.map(Tt)||[],f=(await s.defaultUserAgentProvider()).map(Tt);await tE(r,s,e);let d=r;f.push(`m/${nE(Object.assign({},r.__smithy_context?.features,d.__aws_sdk_context?.features))}`);let w=s?.customUserAgent?.map(Tt)||[],u=await s.userAgentAppId();if(u)f.push(Tt(["app",`${u}`]));let A=ml.getUserAgentPrefix(),_=(A?[A]:[]).concat([...f,...o,...w]).join(zn),U=[...f.filter((S)=>S.startsWith("aws-sdk-")),...w].join(zn);if(s.runtime!=="browser"){if(U)n[Gr]=n[Gr]?`${n[Dn]} ${U}`:U;n[Dn]=_}else n[Gr]=_;return t({...e,request:i})},Tt=(s)=>{let t=s[0].split(Or).map((o)=>o.replace(rE,Rn)).join(Or),r=s[1]?.replace(eE,Rn),e=t.indexOf(Or),i=t.substring(0,e),n=t.substring(e+1);if(i==="api")n=n.toLowerCase();return[i,n,r].filter((o)=>o&&o.length>0).reduce((o,f,d)=>{switch(d){case 0:return f;case 1:return`${o}/${f}`;default:return`${o}#${f}`}},"")},Bn={name:"getUserAgentMiddleware",step:"build",priority:"low",tags:["SET_USER_AGENT","USER_AGENT"],override:!0},oE=(s)=>({applyToStack:(t)=>{t.add(Cn(s),Bn)}});hE.DEFAULT_UA_APP_ID=bn;hE.getUserAgentMiddlewareOptions=Bn;hE.getUserAgentPlugin=oE;hE.resolveUserAgentConfig=vl;hE.userAgentMiddleware=Cn});var Hn=P((gE)=>{var EE=(s,t,r)=>{if(!(t in s))return;if(s[t]==="true")return!0;if(s[t]==="false")return!1;throw Error(`Cannot load ${r} "${t}". Expected "true" or "false", got ${s[t]}.`)},uE=(s,t,r)=>{if(!(t in s))return;let e=parseInt(s[t],10);if(Number.isNaN(e))throw TypeError(`Cannot load ${r} '${t}'. Expected number, got '${s[t]}'.`);return e};gE.SelectorType=void 0;(function(s){s.ENV="env",s.CONFIG="shared config entry"})(gE.SelectorType||(gE.SelectorType={}));gE.booleanSelector=EE;gE.numberSelector=uE});var Ut=P((HE)=>{var _s=Hn(),$t=zs(),_E=Jt(),Wn="AWS_USE_DUALSTACK_ENDPOINT",Xn="use_dualstack_endpoint",xE=!1,TE={environmentVariableSelector:(s)=>_s.booleanSelector(s,Wn,_s.SelectorType.ENV),configFileSelector:(s)=>_s.booleanSelector(s,Xn,_s.SelectorType.CONFIG),default:!1},Fn="AWS_USE_FIPS_ENDPOINT",Qn="use_fips_endpoint",$E=!1,UE={environmentVariableSelector:(s)=>_s.booleanSelector(s,Fn,_s.SelectorType.ENV),configFileSelector:(s)=>_s.booleanSelector(s,Qn,_s.SelectorType.CONFIG),default:!1},IE=(s)=>{let{tls:t,endpoint:r,urlParser:e,useDualstackEndpoint:i}=s;return Object.assign(s,{tls:t??!0,endpoint:$t.normalizeProvider(typeof r==="string"?e(r):r),isCustomEndpoint:!0,useDualstackEndpoint:$t.normalizeProvider(i??!1)})},SE=async(s)=>{let{tls:t=!0}=s,r=await s.region();if(!new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/).test(r))throw Error("Invalid region in client config");let i=await s.useDualstackEndpoint(),n=await s.useFipsEndpoint(),{hostname:o}=await s.regionInfoProvider(r,{useDualstackEndpoint:i,useFipsEndpoint:n})??{};if(!o)throw Error("Cannot resolve hostname from client config");return s.urlParser(`${t?"https:":"http:"}//${o}`)},yE=(s)=>{let t=$t.normalizeProvider(s.useDualstackEndpoint??!1),{endpoint:r,useFipsEndpoint:e,urlParser:i,tls:n}=s;return Object.assign(s,{tls:n??!0,endpoint:r?$t.normalizeProvider(typeof r==="string"?i(r):r):()=>SE({...s,useDualstackEndpoint:t,useFipsEndpoint:e}),isCustomEndpoint:!!r,useDualstackEndpoint:t})},pn="AWS_REGION",Vn="region",ME={environmentVariableSelector:(s)=>s[pn],configFileSelector:(s)=>s[Vn],default:()=>{throw Error("Region is missing")}},LE={preferredFile:"credentials"},Gn=new Set,DE=(s,t=_E.isValidHostLabel)=>{if(!Gn.has(s)&&!t(s))if(s==="*")console.warn('@smithy/config-resolver WARN - Please use the caller region instead of "*". See "sigv4a" in https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/CLIENTS.md.');else throw Error(`Region not accepted: region="${s}" is not a valid hostname component.`);else Gn.add(s)},Zn=(s)=>typeof s==="string"&&(s.startsWith("fips-")||s.endsWith("-fips")),zE=(s)=>Zn(s)?["fips-aws-global","aws-fips"].includes(s)?"us-east-1":s.replace(/fips-(dkr-|prod-)?|-fips/,""):s,RE=(s)=>{let{region:t,useFipsEndpoint:r}=s;if(!t)throw Error("Region is missing");return Object.assign(s,{region:async()=>{let e=typeof t==="function"?await t():t,i=zE(e);return DE(i),i},useFipsEndpoint:async()=>{let e=typeof t==="string"?t:await t();if(Zn(e))return!0;return typeof r!=="function"?Promise.resolve(!!r):r()}})},On=(s=[],{useFipsEndpoint:t,useDualstackEndpoint:r})=>s.find(({tags:e})=>t===e.includes("fips")&&r===e.includes("dualstack"))?.hostname,bE=(s,{regionHostname:t,partitionHostname:r})=>t?t:r?r.replace("{region}",s):void 0,CE=(s,{partitionHash:t})=>Object.keys(t||{}).find((r)=>t[r].regions.includes(s))??"aws",BE=(s,{signingRegion:t,regionRegex:r,useFipsEndpoint:e})=>{if(t)return t;else if(e){let i=r.replace("\\\\","\\").replace(/^\^/g,"\\.").replace(/\$$/g,"\\."),n=s.match(i);if(n)return n[0].slice(1,-1)}},PE=(s,{useFipsEndpoint:t=!1,useDualstackEndpoint:r=!1,signingService:e,regionHash:i,partitionHash:n})=>{let o=CE(s,{partitionHash:n}),f=s in i?s:n[o]?.endpoint??s,d={useFipsEndpoint:t,useDualstackEndpoint:r},w=On(i[f]?.variants,d),u=On(n[o]?.variants,d),A=bE(f,{regionHostname:w,partitionHostname:u});if(A===void 0)throw Error(`Endpoint resolution failed for: ${{resolvedRegion:f,useFipsEndpoint:t,useDualstackEndpoint:r}}`);let _=BE(A,{signingRegion:i[f]?.signingRegion,regionRegex:n[o].regionRegex,useFipsEndpoint:t});return{partition:o,signingService:e,hostname:A,..._&&{signingRegion:_},...i[f]?.signingService&&{signingService:i[f].signingService}}};HE.CONFIG_USE_DUALSTACK_ENDPOINT=Xn;HE.CONFIG_USE_FIPS_ENDPOINT=Qn;HE.DEFAULT_USE_DUALSTACK_ENDPOINT=xE;HE.DEFAULT_USE_FIPS_ENDPOINT=$E;HE.ENV_USE_DUALSTACK_ENDPOINT=Wn;HE.ENV_USE_FIPS_ENDPOINT=Fn;HE.NODE_REGION_CONFIG_FILE_OPTIONS=LE;HE.NODE_REGION_CONFIG_OPTIONS=ME;HE.NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS=TE;HE.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS=UE;HE.REGION_ENV_NAME=pn;HE.REGION_INI_NAME=Vn;HE.getRegionInfo=PE;HE.resolveCustomEndpointsConfig=IE;HE.resolveEndpointsConfig=yE;HE.resolveRegionConfig=RE});var iu=P((su)=>{var jE=ss(),qn="content-length";function Kn(s){return(t)=>async(r)=>{let e=r.request;if(jE.HttpRequest.isInstance(e)){let{body:i,headers:n}=e;if(i&&Object.keys(n).map((o)=>o.toLowerCase()).indexOf(qn)===-1)try{let o=s(i);e.headers={...e.headers,[qn]:String(o)}}catch(o){}}return t({...r,request:e})}}var Jn={step:"build",tags:["SET_CONTENT_LENGTH","CONTENT_LENGTH"],name:"contentLengthMiddleware",override:!0},vE=(s)=>({applyToStack:(t)=>{t.add(Kn(s.bodyLengthChecker),Jn)}});su.contentLengthMiddleware=Kn;su.contentLengthMiddlewareOptions=Jn;su.getContentLengthPlugin=vE});var vn=P((kn)=>{Object.defineProperty(kn,"__esModule",{value:!0});kn.getEndpointUrlConfig=void 0;var Yn=nu(),an="AWS_ENDPOINT_URL",mn="endpoint_url",ou=(s)=>({environmentVariableSelector:(t)=>{let r=s.split(" ").map((n)=>n.toUpperCase()),e=t[[an,...r].join("_")];if(e)return e;let i=t[an];if(i)return i;return},configFileSelector:(t,r)=>{if(r&&t.services){let i=r[["services",t.services].join(Yn.CONFIG_PREFIX_SEPARATOR)];if(i){let n=s.split(" ").map((f)=>f.toLowerCase()),o=i[[n.join("_"),mn].join(Yn.CONFIG_PREFIX_SEPARATOR)];if(o)return o}}let e=t[mn];if(e)return e;return},default:void 0});kn.getEndpointUrlConfig=ou});var ro=P((so)=>{Object.defineProperty(so,"__esModule",{value:!0});so.getEndpointFromConfig=void 0;var hu=Xr(),cu=vn(),fu=async(s)=>(0,hu.loadConfig)((0,cu.getEndpointUrlConfig)(s??""))();so.getEndpointFromConfig=fu});var bu=P((Uu)=>{var io=ro(),eo=ve(),du=tt(),It=zs(),wu=Xt(),lu=async(s)=>{let t=s?.Bucket||"";if(typeof s.Bucket==="string")s.Bucket=t.replace(/#/g,encodeURIComponent("#")).replace(/\?/g,encodeURIComponent("?"));if(Au(t)){if(s.ForcePathStyle===!0)throw Error("Path-style addressing cannot be used with ARN buckets")}else if(!Nu(t)||t.indexOf(".")!==-1&&!String(s.Endpoint).startsWith("http:")||t.toLowerCase()!==t||t.length<3)s.ForcePathStyle=!0;if(s.DisableMultiRegionAccessPoints)s.disableMultiRegionAccessPoints=!0,s.DisableMRAP=!0;return s},Eu=/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/,uu=/(\d+\.){3}\d+/,gu=/\.\./,Nu=(s)=>Eu.test(s)&&!uu.test(s)&&!gu.test(s),Au=(s)=>{let[t,r,e,,,i]=s.split(":"),n=t==="arn"&&s.split(":").length>=6,o=Boolean(n&&r&&e&&i);if(n&&!o)throw Error(`Invalid ARN: ${s} was an invalid ARN.`);return o},_u=(s,t,r)=>{let e=async()=>{let i=r[s]??r[t];if(typeof i==="function")return i();return i};if(s==="credentialScope"||t==="CredentialScope")return async()=>{let i=typeof r.credentials==="function"?await r.credentials():r.credentials;return i?.credentialScope??i?.CredentialScope};if(s==="accountId"||t==="AccountId")return async()=>{let i=typeof r.credentials==="function"?await r.credentials():r.credentials;return i?.accountId??i?.AccountId};if(s==="endpoint"||t==="endpoint")return async()=>{if(r.isCustomEndpoint===!1)return;let i=await e();if(i&&typeof i==="object"){if("url"in i)return i.url.href;if("hostname"in i){let{protocol:n,hostname:o,port:f,path:d}=i;return`${n}//${o}${f?":"+f:""}${d}`}}return i};return e},Fr=(s)=>{if(typeof s==="object"){if("url"in s)return eo.parseUrl(s.url);return s}return eo.parseUrl(s)},no=async(s,t,r,e)=>{if(!r.isCustomEndpoint){let o;if(r.serviceConfiguredEndpoint)o=await r.serviceConfiguredEndpoint();else o=await io.getEndpointFromConfig(r.serviceId);if(o)r.endpoint=()=>Promise.resolve(Fr(o)),r.isCustomEndpoint=!0}let i=await oo(s,t,r);if(typeof r.endpointProvider!=="function")throw Error("config.endpointProvider is not set.");return r.endpointProvider(i,e)},oo=async(s,t,r)=>{let e={},i=t?.getEndpointParameterInstructions?.()||{};for(let[n,o]of Object.entries(i))switch(o.type){case"staticContextParams":e[n]=o.value;break;case"contextParams":e[n]=s[o.name];break;case"clientContextParams":case"builtInParams":e[n]=await _u(o.name,n,r)();break;case"operationContextParams":e[n]=o.get(s);break;default:throw Error("Unrecognized endpoint parameter instruction: "+JSON.stringify(o))}if(Object.keys(i).length===0)Object.assign(e,r);if(String(r.serviceId).toLowerCase()==="s3")await lu(e);return e},ho=({config:s,instructions:t})=>{return(r,e)=>async(i)=>{if(s.isCustomEndpoint)du.setFeature(e,"ENDPOINT_OVERRIDE","N");let n=await no(i.input,{getEndpointParameterInstructions(){return t}},{...s},e);e.endpointV2=n,e.authSchemes=n.properties?.authSchemes;let o=e.authSchemes?.[0];if(o){e.signing_region=o.signingRegion,e.signing_service=o.signingName;let d=It.getSmithyContext(e)?.selectedHttpAuthScheme?.httpAuthOption;if(d)d.signingProperties=Object.assign(d.signingProperties||{},{signing_region:o.signingRegion,signingRegion:o.signingRegion,signing_service:o.signingName,signingName:o.signingName,signingRegionSet:o.signingRegionSet},o.properties)}return r({...i})}},co={step:"serialize",tags:["ENDPOINT_PARAMETERS","ENDPOINT_V2","ENDPOINT"],name:"endpointV2Middleware",override:!0,relation:"before",toMiddleware:wu.serializerMiddlewareOption.name},xu=(s,t)=>({applyToStack:(r)=>{r.addRelativeTo(ho({config:s,instructions:t}),co)}}),Tu=(s)=>{let t=s.tls??!0,{endpoint:r,useDualstackEndpoint:e,useFipsEndpoint:i}=s,n=r!=null?async()=>Fr(await It.normalizeProvider(r)()):void 0,f=Object.assign(s,{endpoint:n,tls:t,isCustomEndpoint:!!r,useDualstackEndpoint:It.normalizeProvider(e??!1),useFipsEndpoint:It.normalizeProvider(i??!1)}),d=void 0;return f.serviceConfiguredEndpoint=async()=>{if(s.serviceId&&!d)d=io.getEndpointFromConfig(s.serviceId);return d},f},$u=(s)=>{let{endpoint:t}=s;if(t===void 0)s.endpoint=async()=>{throw Error("@smithy/middleware-endpoint: (default endpointRuleSet) endpoint is not set - you must configure an endpoint.")};return s};Uu.endpointMiddleware=ho;Uu.endpointMiddlewareOptions=co;Uu.getEndpointFromInstructions=no;Uu.getEndpointPlugin=xu;Uu.resolveEndpointConfig=Tu;Uu.resolveEndpointRequiredConfig=$u;Uu.resolveParams=oo;Uu.toEndpointV1=Fr});var pr=P((Qu)=>{var Cu=["AuthFailure","InvalidSignatureException","RequestExpired","RequestInTheFuture","RequestTimeTooSkewed","SignatureDoesNotMatch"],Bu=["BandwidthLimitExceeded","EC2ThrottledException","LimitExceededException","PriorRequestNotComplete","ProvisionedThroughputExceededException","RequestLimitExceeded","RequestThrottled","RequestThrottledException","SlowDown","ThrottledException","Throttling","ThrottlingException","TooManyRequestsException","TransactionInProgressException"],Pu=["TimeoutError","RequestTimeout","RequestTimeoutException"],Hu=[500,502,503,504],Gu=["ECONNRESET","ECONNREFUSED","EPIPE","ETIMEDOUT"],Ou=["EHOSTUNREACH","ENETUNREACH","ENOTFOUND"],fo=(s)=>s?.$retryable!==void 0,Wu=(s)=>Cu.includes(s.name),wo=(s)=>s.$metadata?.clockSkewCorrected,lo=(s)=>{let t=new Set(["Failed to fetch","NetworkError when attempting to fetch resource","The Internet connection appears to be offline","Load failed","Network request failed"]);if(!(s&&s instanceof TypeError))return!1;return t.has(s.message)},Xu=(s)=>s.$metadata?.httpStatusCode===429||Bu.includes(s.name)||s.$retryable?.throttling==!0,Qr=(s,t=0)=>fo(s)||wo(s)||Pu.includes(s.name)||Gu.includes(s?.code||"")||Ou.includes(s?.code||"")||Hu.includes(s.$metadata?.httpStatusCode||0)||lo(s)||s.cause!==void 0&&t<=10&&Qr(s.cause,t+1),Fu=(s)=>{if(s.$metadata?.httpStatusCode!==void 0){let t=s.$metadata.httpStatusCode;if(500<=t&&t<=599&&!Qr(s))return!0;return!1}return!1};Qu.isBrowserNetworkError=lo;Qu.isClockSkewCorrectedError=wo;Qu.isClockSkewError=Wu;Qu.isRetryableByTrait=fo;Qu.isServerError=Fu;Qu.isThrottlingError=Xu;Qu.isTransientError=Qr});var To=P((s0)=>{var au=pr();s0.RETRY_MODES=void 0;(function(s){s.STANDARD="standard",s.ADAPTIVE="adaptive"})(s0.RETRY_MODES||(s0.RETRY_MODES={}));var Vr=3,mu=s0.RETRY_MODES.STANDARD;class St{static setTimeoutFn=setTimeout;beta;minCapacity;minFillRate;scaleConstant;smooth;currentCapacity=0;enabled=!1;lastMaxRate=0;measuredTxRate=0;requestCount=0;fillRate;lastThrottleTime;lastTimestamp=0;lastTxRateBucket;maxCapacity;timeWindow=0;constructor(s){this.beta=s?.beta??0.7,this.minCapacity=s?.minCapacity??1,this.minFillRate=s?.minFillRate??0.5,this.scaleConstant=s?.scaleConstant??0.4,this.smooth=s?.smooth??0.8;let t=this.getCurrentTimeInSeconds();this.lastThrottleTime=t,this.lastTxRateBucket=Math.floor(this.getCurrentTimeInSeconds()),this.fillRate=this.minFillRate,this.maxCapacity=this.minCapacity}getCurrentTimeInSeconds(){return Date.now()/1000}async getSendToken(){return this.acquireTokenBucket(1)}async acquireTokenBucket(s){if(!this.enabled)return;if(this.refillTokenBucket(),s>this.currentCapacity){let t=(s-this.currentCapacity)/this.fillRate*1000;await new Promise((r)=>St.setTimeoutFn(r,t))}this.currentCapacity=this.currentCapacity-s}refillTokenBucket(){let s=this.getCurrentTimeInSeconds();if(!this.lastTimestamp){this.lastTimestamp=s;return}let t=(s-this.lastTimestamp)*this.fillRate;this.currentCapacity=Math.min(this.maxCapacity,this.currentCapacity+t),this.lastTimestamp=s}updateClientSendingRate(s){let t;if(this.updateMeasuredRate(),au.isThrottlingError(s)){let e=!this.enabled?this.measuredTxRate:Math.min(this.measuredTxRate,this.fillRate);this.lastMaxRate=e,this.calculateTimeWindow(),this.lastThrottleTime=this.getCurrentTimeInSeconds(),t=this.cubicThrottle(e),this.enableTokenBucket()}else this.calculateTimeWindow(),t=this.cubicSuccess(this.getCurrentTimeInSeconds());let r=Math.min(t,2*this.measuredTxRate);this.updateTokenBucketRate(r)}calculateTimeWindow(){this.timeWindow=this.getPrecise(Math.pow(this.lastMaxRate*(1-this.beta)/this.scaleConstant,0.3333333333333333))}cubicThrottle(s){return this.getPrecise(s*this.beta)}cubicSuccess(s){return this.getPrecise(this.scaleConstant*Math.pow(s-this.lastThrottleTime-this.timeWindow,3)+this.lastMaxRate)}enableTokenBucket(){this.enabled=!0}updateTokenBucketRate(s){this.refillTokenBucket(),this.fillRate=Math.max(s,this.minFillRate),this.maxCapacity=Math.max(s,this.minCapacity),this.currentCapacity=Math.min(this.currentCapacity,this.maxCapacity)}updateMeasuredRate(){let s=this.getCurrentTimeInSeconds(),t=Math.floor(s*2)/2;if(this.requestCount++,t>this.lastTxRateBucket){let r=this.requestCount/(t-this.lastTxRateBucket);this.measuredTxRate=this.getPrecise(r*this.smooth+this.measuredTxRate*(1-this.smooth)),this.requestCount=0,this.lastTxRateBucket=t}}getPrecise(s){return parseFloat(s.toFixed(8))}}var Ys=100,qr=20000,uo=500,Zr=500,go=5,No=10,Ao=1,ku="amz-sdk-invocation-id",ju="amz-sdk-request",vu=()=>{let s=Ys;return{computeNextBackoffDelay:(e)=>{return Math.floor(Math.min(qr,Math.random()*2**e*s))},setDelayBase:(e)=>{s=e}}},Eo=({retryDelay:s,retryCount:t,retryCost:r})=>{return{getRetryCount:()=>t,getRetryDelay:()=>Math.min(qr,s),getRetryCost:()=>r}};class yt{maxAttempts;mode=s0.RETRY_MODES.STANDARD;capacity=Zr;retryBackoffStrategy=vu();maxAttemptsProvider;constructor(s){this.maxAttempts=s,this.maxAttemptsProvider=typeof s==="function"?s:async()=>s}async acquireInitialRetryToken(s){return Eo({retryDelay:Ys,retryCount:0})}async refreshRetryTokenForRetry(s,t){let r=await this.getMaxAttempts();if(this.shouldRetry(s,t,r)){let e=t.errorType;this.retryBackoffStrategy.setDelayBase(e==="THROTTLING"?uo:Ys);let i=this.retryBackoffStrategy.computeNextBackoffDelay(s.getRetryCount()),n=t.retryAfterHint?Math.max(t.retryAfterHint.getTime()-Date.now()||0,i):i,o=this.getCapacityCost(e);return this.capacity-=o,Eo({retryDelay:n,retryCount:s.getRetryCount()+1,retryCost:o})}throw Error("No retry token available")}recordSuccess(s){this.capacity=Math.max(Zr,this.capacity+(s.getRetryCost()??Ao))}getCapacity(){return this.capacity}async getMaxAttempts(){try{return await this.maxAttemptsProvider()}catch(s){return console.warn(`Max attempts provider could not resolve. Using default of ${Vr}`),Vr}}shouldRetry(s,t,r){return s.getRetryCount()+1<r&&this.capacity>=this.getCapacityCost(t.errorType)&&this.isRetryableError(t.errorType)}getCapacityCost(s){return s==="TRANSIENT"?No:go}isRetryableError(s){return s==="THROTTLING"||s==="TRANSIENT"}}class _o{maxAttemptsProvider;rateLimiter;standardRetryStrategy;mode=s0.RETRY_MODES.ADAPTIVE;constructor(s,t){this.maxAttemptsProvider=s;let{rateLimiter:r}=t??{};this.rateLimiter=r??new St,this.standardRetryStrategy=new yt(s)}async acquireInitialRetryToken(s){return await this.rateLimiter.getSendToken(),this.standardRetryStrategy.acquireInitialRetryToken(s)}async refreshRetryTokenForRetry(s,t){return this.rateLimiter.updateClientSendingRate(t),this.standardRetryStrategy.refreshRetryTokenForRetry(s,t)}recordSuccess(s){this.rateLimiter.updateClientSendingRate({}),this.standardRetryStrategy.recordSuccess(s)}}class xo extends yt{computeNextBackoffDelay;constructor(s,t=Ys){super(typeof s==="function"?s:async()=>s);if(typeof t==="number")this.computeNextBackoffDelay=()=>t;else this.computeNextBackoffDelay=t}async refreshRetryTokenForRetry(s,t){let r=await super.refreshRetryTokenForRetry(s,t);return r.getRetryDelay=()=>this.computeNextBackoffDelay(r.getRetryCount()),r}}s0.AdaptiveRetryStrategy=_o;s0.ConfiguredRetryStrategy=xo;s0.DEFAULT_MAX_ATTEMPTS=Vr;s0.DEFAULT_RETRY_DELAY_BASE=Ys;s0.DEFAULT_RETRY_MODE=mu;s0.DefaultRateLimiter=St;s0.INITIAL_RETRY_TOKENS=Zr;s0.INVOCATION_ID_HEADER=ku;s0.MAXIMUM_RETRY_DELAY=qr;s0.NO_RETRY_INCREMENT=Ao;s0.REQUEST_HEADER=ju;s0.RETRY_COST=go;s0.StandardRetryStrategy=yt;s0.THROTTLING_RETRY_DELAY_BASE=uo;s0.TIMEOUT_RETRY_COST=No});var Io=P(($o)=>{Object.defineProperty($o,"__esModule",{value:!0});$o.isStreamingPayload=void 0;var N0=Ss("stream"),A0=(s)=>s?.body instanceof N0.Readable||typeof ReadableStream<"u"&&s?.body instanceof ReadableStream;$o.isStreamingPayload=A0});var m0=P((b0)=>{var Q=To(),Gs=ss(),xs=pr(),yo=_0(),So=zs(),x0=yr(),T0=Io(),$0=(s,t)=>{let r=s,e=Q.NO_RETRY_INCREMENT,i=Q.RETRY_COST,n=Q.TIMEOUT_RETRY_COST,o=s,f=(A)=>A.name==="TimeoutError"?n:i,d=(A)=>f(A)<=o;return Object.freeze({hasRetryTokens:d,retrieveRetryTokens:(A)=>{if(!d(A))throw Error("No retry token available");let _=f(A);return o-=_,_},releaseRetryTokens:(A)=>{o+=A??e,o=Math.min(o,r)}})},Mo=(s,t)=>Math.floor(Math.min(Q.MAXIMUM_RETRY_DELAY,Math.random()*2**t*s)),Lo=(s)=>{if(!s)return!1;return xs.isRetryableByTrait(s)||xs.isClockSkewError(s)||xs.isThrottlingError(s)||xs.isTransientError(s)},Do=(s)=>{if(s instanceof Error)return s;if(s instanceof Object)return Object.assign(Error(),s);if(typeof s==="string")return Error(s);return Error(`AWS SDK error wrapper for ${s}`)};class Yr{maxAttemptsProvider;retryDecider;delayDecider;retryQuota;mode=Q.RETRY_MODES.STANDARD;constructor(s,t){this.maxAttemptsProvider=s,this.retryDecider=t?.retryDecider??Lo,this.delayDecider=t?.delayDecider??Mo,this.retryQuota=t?.retryQuota??$0(Q.INITIAL_RETRY_TOKENS)}shouldRetry(s,t,r){return t<r&&this.retryDecider(s)&&this.retryQuota.hasRetryTokens(s)}async getMaxAttempts(){let s;try{s=await this.maxAttemptsProvider()}catch(t){s=Q.DEFAULT_MAX_ATTEMPTS}return s}async retry(s,t,r){let e,i=0,n=0,o=await this.getMaxAttempts(),{request:f}=t;if(Gs.HttpRequest.isInstance(f))f.headers[Q.INVOCATION_ID_HEADER]=yo.v4();while(!0)try{if(Gs.HttpRequest.isInstance(f))f.headers[Q.REQUEST_HEADER]=`attempt=${i+1}; max=${o}`;if(r?.beforeRequest)await r.beforeRequest();let{response:d,output:w}=await s(t);if(r?.afterRequest)r.afterRequest(d);return this.retryQuota.releaseRetryTokens(e),w.$metadata.attempts=i+1,w.$metadata.totalRetryDelay=n,{response:d,output:w}}catch(d){let w=Do(d);if(i++,this.shouldRetry(w,i,o)){e=this.retryQuota.retrieveRetryTokens(w);let u=this.delayDecider(xs.isThrottlingError(w)?Q.THROTTLING_RETRY_DELAY_BASE:Q.DEFAULT_RETRY_DELAY_BASE,i),A=U0(w.$response),_=Math.max(A||0,u);n+=_,await new Promise((U)=>setTimeout(U,_));continue}if(!w.$metadata)w.$metadata={};throw w.$metadata.attempts=i,w.$metadata.totalRetryDelay=n,w}}}var U0=(s)=>{if(!Gs.HttpResponse.isInstance(s))return;let t=Object.keys(s.headers).find((n)=>n.toLowerCase()==="retry-after");if(!t)return;let r=s.headers[t],e=Number(r);if(!Number.isNaN(e))return e*1000;return new Date(r).getTime()-Date.now()};class zo extends Yr{rateLimiter;constructor(s,t){let{rateLimiter:r,...e}=t??{};super(s,e);this.rateLimiter=r??new Q.DefaultRateLimiter,this.mode=Q.RETRY_MODES.ADAPTIVE}async retry(s,t){return super.retry(s,t,{beforeRequest:async()=>{return this.rateLimiter.getSendToken()},afterRequest:(r)=>{this.rateLimiter.updateClientSendingRate(r)}})}}var Kr="AWS_MAX_ATTEMPTS",Jr="max_attempts",I0={environmentVariableSelector:(s)=>{let t=s[Kr];if(!t)return;let r=parseInt(t);if(Number.isNaN(r))throw Error(`Environment variable ${Kr} mast be a number, got "${t}"`);return r},configFileSelector:(s)=>{let t=s[Jr];if(!t)return;let r=parseInt(t);if(Number.isNaN(r))throw Error(`Shared config file entry ${Jr} mast be a number, got "${t}"`);return r},default:Q.DEFAULT_MAX_ATTEMPTS},S0=(s)=>{let{retryStrategy:t,retryMode:r,maxAttempts:e}=s,i=So.normalizeProvider(e??Q.DEFAULT_MAX_ATTEMPTS);return Object.assign(s,{maxAttempts:i,retryStrategy:async()=>{if(t)return t;if(await So.normalizeProvider(r)()===Q.RETRY_MODES.ADAPTIVE)return new Q.AdaptiveRetryStrategy(i);return new Q.StandardRetryStrategy(i)}})},Ro="AWS_RETRY_MODE",bo="retry_mode",y0={environmentVariableSelector:(s)=>s[Ro],configFileSelector:(s)=>s[bo],default:Q.DEFAULT_RETRY_MODE},Co=()=>(s)=>async(t)=>{let{request:r}=t;if(Gs.HttpRequest.isInstance(r))delete r.headers[Q.INVOCATION_ID_HEADER],delete r.headers[Q.REQUEST_HEADER];return s(t)},Bo={name:"omitRetryHeadersMiddleware",tags:["RETRY","HEADERS","OMIT_RETRY_HEADERS"],relation:"before",toMiddleware:"awsAuthMiddleware",override:!0},M0=(s)=>({applyToStack:(t)=>{t.addRelativeTo(Co(),Bo)}}),Po=(s)=>(t,r)=>async(e)=>{let i=await s.retryStrategy(),n=await s.maxAttempts();if(L0(i)){i=i;let o=await i.acquireInitialRetryToken(r.partition_id),f=Error(),d=0,w=0,{request:u}=e,A=Gs.HttpRequest.isInstance(u);if(A)u.headers[Q.INVOCATION_ID_HEADER]=yo.v4();while(!0)try{if(A)u.headers[Q.REQUEST_HEADER]=`attempt=${d+1}; max=${n}`;let{response:_,output:U}=await t(e);return i.recordSuccess(o),U.$metadata.attempts=d+1,U.$metadata.totalRetryDelay=w,{response:_,output:U}}catch(_){let U=D0(_);if(f=Do(_),A&&T0.isStreamingPayload(u))throw(r.logger instanceof x0.NoOpLogger?console:r.logger)?.warn("An error was encountered in a non-retryable streaming request."),f;try{o=await i.refreshRetryTokenForRetry(o,U)}catch(y){if(!f.$metadata)f.$metadata={};throw f.$metadata.attempts=d+1,f.$metadata.totalRetryDelay=w,f}d=o.getRetryCount();let S=o.getRetryDelay();w+=S,await new Promise((y)=>setTimeout(y,S))}}else{if(i=i,i?.mode)r.userAgent=[...r.userAgent||[],["cfg/retry-mode",i.mode]];return i.retry(t,e)}},L0=(s)=>typeof s.acquireInitialRetryToken<"u"&&typeof s.refreshRetryTokenForRetry<"u"&&typeof s.recordSuccess<"u",D0=(s)=>{let t={error:s,errorType:z0(s)},r=Go(s.$response);if(r)t.retryAfterHint=r;return t},z0=(s)=>{if(xs.isThrottlingError(s))return"THROTTLING";if(xs.isTransientError(s))return"TRANSIENT";if(xs.isServerError(s))return"SERVER_ERROR";return"CLIENT_ERROR"},Ho={name:"retryMiddleware",tags:["RETRY"],step:"finalizeRequest",priority:"high",override:!0},R0=(s)=>({applyToStack:(t)=>{t.add(Po(s),Ho)}}),Go=(s)=>{if(!Gs.HttpResponse.isInstance(s))return;let t=Object.keys(s.headers).find((n)=>n.toLowerCase()==="retry-after");if(!t)return;let r=s.headers[t],e=Number(r);if(!Number.isNaN(e))return new Date(e*1000);return new Date(r)};b0.AdaptiveRetryStrategy=zo;b0.CONFIG_MAX_ATTEMPTS=Jr;b0.CONFIG_RETRY_MODE=bo;b0.ENV_MAX_ATTEMPTS=Kr;b0.ENV_RETRY_MODE=Ro;b0.NODE_MAX_ATTEMPT_CONFIG_OPTIONS=I0;b0.NODE_RETRY_MODE_CONFIG_OPTIONS=y0;b0.StandardRetryStrategy=Yr;b0.defaultDelayDecider=Mo;b0.defaultRetryDecider=Lo;b0.getOmitRetryHeadersPlugin=M0;b0.getRetryAfterHint=Go;b0.getRetryPlugin=R0;b0.omitRetryHeadersMiddleware=Co;b0.omitRetryHeadersMiddlewareOptions=Bo;b0.resolveRetryConfig=S0;b0.retryMiddleware=Po;b0.retryMiddlewareOptions=Ho});var Xo=P((Wo)=>{Object.defineProperty(Wo,"__esModule",{value:!0});Wo.warning=void 0;Wo.stsRegionDefaultResolver=j0;var Oo=Ut(),k0=Xr();function j0(s={}){return(0,k0.loadConfig)({...Oo.NODE_REGION_CONFIG_OPTIONS,async default(){if(!Wo.warning.silence)console.warn("@aws-sdk - WARN - default STS region of us-east-1 used. See @aws-sdk/credential-providers README and set a region explicitly.");return"us-east-1"}},{...Oo.NODE_REGION_CONFIG_FILE_OPTIONS,...s})}Wo.warning={silence:!1}});var ig=P((Ts)=>{var as=Ut(),Fo=Xo(),sg=(s)=>{return{setRegion(t){s.region=t},region(){return s.region}}},tg=(s)=>{return{region:s.region()}};Object.defineProperty(Ts,"NODE_REGION_CONFIG_FILE_OPTIONS",{enumerable:!0,get:function(){return as.NODE_REGION_CONFIG_FILE_OPTIONS}});Object.defineProperty(Ts,"NODE_REGION_CONFIG_OPTIONS",{enumerable:!0,get:function(){return as.NODE_REGION_CONFIG_OPTIONS}});Object.defineProperty(Ts,"REGION_ENV_NAME",{enumerable:!0,get:function(){return as.REGION_ENV_NAME}});Object.defineProperty(Ts,"REGION_INI_NAME",{enumerable:!0,get:function(){return as.REGION_INI_NAME}});Object.defineProperty(Ts,"resolveRegionConfig",{enumerable:!0,get:function(){return as.resolveRegionConfig}});Ts.getAwsRegionExtensionConfiguration=sg;Ts.resolveAwsRegionExtensionConfiguration=tg;Object.keys(Fo).forEach(function(s){if(s!=="default"&&!Object.prototype.hasOwnProperty.call(Ts,s))Object.defineProperty(Ts,s,{enumerable:!0,get:function(){return Fo[s]}})})});var Ag=P((dg)=>{var Qo=Ss("os"),mr=Ss("process"),ng=Pn(),po={isCrtAvailable:!1},og=()=>{if(po.isCrtAvailable)return["md/crt-avail"];return null},Vo=({serviceId:s,clientVersion:t})=>{return async(r)=>{let e=[["aws-sdk-js",t],["ua","2.1"],[`os/${Qo.platform()}`,Qo.release()],["lang/js"],["md/nodejs",`${mr.versions.node}`]],i=og();if(i)e.push(i);if(s)e.push([`api/${s}`,t]);if(mr.env.AWS_EXECUTION_ENV)e.push([`exec-env/${mr.env.AWS_EXECUTION_ENV}`]);let n=await r?.userAgentAppId?.();return n?[...e,[`app/${n}`]]:[...e]}},hg=Vo,Zo="AWS_SDK_UA_APP_ID",qo="sdk_ua_app_id",cg="sdk-ua-app-id",fg={environmentVariableSelector:(s)=>s[Zo],configFileSelector:(s)=>s[qo]??s[cg],default:ng.DEFAULT_UA_APP_ID};dg.NODE_APP_ID_CONFIG_OPTIONS=fg;dg.UA_APP_ID_ENV_NAME=Zo;dg.UA_APP_ID_INI_NAME=qo;dg.createDefaultUserAgentProvider=Vo;dg.crtAvailability=po;dg.defaultUserAgent=hg});var Ig=P(($g)=>{var kr=_g(),xg=Qs(),Tg=Ss("buffer"),Ko=Ss("crypto");class Yo{algorithmIdentifier;secret;hash;constructor(s,t){this.algorithmIdentifier=s,this.secret=t,this.reset()}update(s,t){this.hash.update(xg.toUint8Array(Jo(s,t)))}digest(){return Promise.resolve(this.hash.digest())}reset(){this.hash=this.secret?Ko.createHmac(this.algorithmIdentifier,Jo(this.secret)):Ko.createHash(this.algorithmIdentifier)}}function Jo(s,t){if(Tg.Buffer.isBuffer(s))return s;if(typeof s==="string")return kr.fromString(s,t);if(ArrayBuffer.isView(s))return kr.fromArrayBuffer(s.buffer,s.byteOffset,s.byteLength);return kr.fromArrayBuffer(s)}$g.Hash=Yo});var Lg=P((yg)=>{var jr=Ss("node:fs"),Sg=(s)=>{if(!s)return 0;if(typeof s==="string")return Buffer.byteLength(s);else if(typeof s.byteLength==="number")return s.byteLength;else if(typeof s.size==="number")return s.size;else if(typeof s.start==="number"&&typeof s.end==="number")return s.end+1-s.start;else if(s instanceof jr.ReadStream){if(s.path!=null)return jr.lstatSync(s.path).size;else if(typeof s.fd==="number")return jr.fstatSync(s.fd).size}throw Error(`Body Length computation failed for ${s}`)};yg.calculateBodyLength=Sg});var pg=P((Fg)=>{var Dg=Ut(),ao=Xr(),zg=wn(),Rg="AWS_EXECUTION_ENV",mo="AWS_REGION",ko="AWS_DEFAULT_REGION",bg="AWS_EC2_METADATA_DISABLED",Cg=["in-region","cross-region","mobile","standard","legacy"],Bg="/latest/meta-data/placement/region",Pg="AWS_DEFAULTS_MODE",Hg="defaults_mode",Gg={environmentVariableSelector:(s)=>{return s[Pg]},configFileSelector:(s)=>{return s[Hg]},default:"legacy"},Og=({region:s=ao.loadConfig(Dg.NODE_REGION_CONFIG_OPTIONS),defaultsMode:t=ao.loadConfig(Gg)}={})=>zg.memoize(async()=>{let r=typeof t==="function"?await t():t;switch(r?.toLowerCase()){case"auto":return Wg(s);case"in-region":case"cross-region":case"mobile":case"standard":case"legacy":return Promise.resolve(r?.toLocaleLowerCase());case void 0:return Promise.resolve("legacy");default:throw Error(`Invalid parameter for "defaultsMode", expect ${Cg.join(", ")}, got ${r}`)}}),Wg=async(s)=>{if(s){let t=typeof s==="function"?await s():s,r=await Xg();if(!r)return"standard";if(t===r)return"in-region";else return"cross-region"}return"standard"},Xg=async()=>{if(process.env[Rg]&&(process.env[mo]||process.env[ko]))return process.env[mo]??process.env[ko];if(!process.env[bg])try{let{getInstanceMetadataEndpoint:s,httpRequest:t}=await import("./chunk-7bag664c.js"),r=await s();return(await t({...r,path:Bg})).toString()}catch(s){}};Fg.resolveDefaultsModeConfig=Og});var $N=P((mg)=>{var jo=Tr(),X=dr(),cs=yr(),a=st(),K=wr(),ms=fr(),sh=Qs(),j=Ir();class Os{queryCompat;constructor(s=!1){this.queryCompat=s}resolveRestContentType(s,t){let r=t.getMemberSchemas(),e=Object.values(r).find((i)=>{return!!i.getMergedTraits().httpPayload});if(e){let i=e.getMergedTraits().mediaType;if(i)return i;else if(e.isStringSchema())return"text/plain";else if(e.isBlobSchema())return"application/octet-stream";else return s}else if(!t.isUnitSchema()){if(Object.values(r).find((n)=>{let{httpQuery:o,httpQueryParams:f,httpHeader:d,httpLabel:w,httpPrefixHeaders:u}=n.getMergedTraits();return!o&&!f&&!d&&!w&&u===void 0}))return s}}async getErrorSchemaOrThrowBaseException(s,t,r,e,i,n){let o=t,f=s;if(s.includes("#"))[o,f]=s.split("#");let d={$metadata:i,$fault:r.statusCode<500?"client":"server"},w=X.TypeRegistry.for(o);try{return{errorSchema:n?.(w,f)??w.getSchema(s),errorMetadata:d}}catch(u){e.message=e.message??e.Message??"UnknownError";let A=X.TypeRegistry.for("smithy.ts.sdk.synthetic."+o),_=A.getBaseException();if(_){let U=A.getErrorCtor(_)??Error;throw this.decorateServiceException(Object.assign(new U({name:f}),d),e)}throw this.decorateServiceException(Object.assign(Error(f),d),e)}}decorateServiceException(s,t={}){if(this.queryCompat){let r=s.Message??t.Message,e=cs.decorateServiceException(s,t);if(r)e.Message=r,e.message=r;return e}return cs.decorateServiceException(s,t)}setQueryCompatError(s,t){let r=t.headers?.["x-amzn-query-error"];if(s!==void 0&&r!=null){let[e,i]=r.split(";"),n=Object.entries(s),o={Code:e,Type:i};Object.assign(s,o);for(let[f,d]of n)o[f]=d;delete o.__type,s.Error=o}}queryCompatOutput(s,t){if(s.Error)t.Error=s.Error;if(s.Type)t.Type=s.Type;if(s.Code)t.Code=s.Code}}class th extends jo.SmithyRpcV2CborProtocol{awsQueryCompatible;mixin;constructor({defaultNamespace:s,awsQueryCompatible:t}){super({defaultNamespace:s});this.awsQueryCompatible=!!t,this.mixin=new Os(this.awsQueryCompatible)}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(this.awsQueryCompatible)e.headers["x-amzn-query-mode"]="true";return e}async handleError(s,t,r,e,i){if(this.awsQueryCompatible)this.mixin.setQueryCompatError(e,r);let n=jo.loadSmithyRpcV2CborErrorCode(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=X.NormalizedSchema.of(o),w=e.message??e.Message??"Unknown",A=new(X.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w),_={};for(let[U,S]of d.structIterator())_[U]=this.deserializer.readValue(S,e[U]);if(this.awsQueryCompatible)this.mixin.queryCompatOutput(e,_);throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}}var Vg=(s)=>{if(s==null)return s;if(typeof s==="number"||typeof s==="bigint"){let t=Error(`Received number ${s} where a string was expected.`);return t.name="Warning",console.warn(t),String(s)}if(typeof s==="boolean"){let t=Error(`Received boolean ${s} where a string was expected.`);return t.name="Warning",console.warn(t),String(s)}return s},Zg=(s)=>{if(s==null)return s;if(typeof s==="string"){let t=s.toLowerCase();if(s!==""&&t!=="false"&&t!=="true"){let r=Error(`Received string "${s}" where a boolean was expected.`);r.name="Warning",console.warn(r)}return s!==""&&t!=="false"}return s},qg=(s)=>{if(s==null)return s;if(typeof s==="string"){let t=Number(s);if(t.toString()!==s){let r=Error(`Received string "${s}" where a number was expected.`);return r.name="Warning",console.warn(r),s}return t}return s};class $s{serdeContext;setSerdeContext(s){this.serdeContext=s}}function Kg(s,t,r){if(r?.source){let e=r.source;if(typeof t==="number"){if(t>Number.MAX_SAFE_INTEGER||t<Number.MIN_SAFE_INTEGER||e!==String(t))if(e.includes("."))return new K.NumericValue(e,"bigDecimal");else return BigInt(e)}}return t}var rh=(s,t)=>cs.collectBody(s,t).then((r)=>(t?.utf8Encoder??sh.toUtf8)(r)),vr=(s,t)=>rh(s,t).then((r)=>{if(r.length)try{return JSON.parse(r)}catch(e){if(e?.name==="SyntaxError")Object.defineProperty(e,"$responseBodyText",{value:r});throw e}return{}}),Jg=async(s,t)=>{let r=await vr(s,t);return r.message=r.message??r.Message,r},se=(s,t)=>{let r=(n,o)=>Object.keys(n).find((f)=>f.toLowerCase()===o.toLowerCase()),e=(n)=>{let o=n;if(typeof o==="number")o=o.toString();if(o.indexOf(",")>=0)o=o.split(",")[0];if(o.indexOf(":")>=0)o=o.split(":")[0];if(o.indexOf("#")>=0)o=o.split("#")[1];return o},i=r(s.headers,"x-amzn-errortype");if(i!==void 0)return e(s.headers[i]);if(t&&typeof t==="object"){let n=r(t,"code");if(n&&t[n]!==void 0)return e(t[n]);if(t.__type!==void 0)return e(t.__type)}};class te extends $s{settings;constructor(s){super();this.settings=s}async read(s,t){return this._read(s,typeof t==="string"?JSON.parse(t,Kg):await vr(t,this.serdeContext))}readObject(s,t){return this._read(s,t)}_read(s,t){let r=t!==null&&typeof t==="object",e=X.NormalizedSchema.of(s);if(e.isListSchema()&&Array.isArray(t)){let n=e.getValueSchema(),o=[],f=!!e.getMergedTraits().sparse;for(let d of t)if(f||d!=null)o.push(this._read(n,d));return o}else if(e.isMapSchema()&&r){let n=e.getValueSchema(),o={},f=!!e.getMergedTraits().sparse;for(let[d,w]of Object.entries(t))if(f||w!=null)o[d]=this._read(n,w);return o}else if(e.isStructSchema()&&r){let n={};for(let[o,f]of e.structIterator()){let d=this.settings.jsonName?f.getMergedTraits().jsonName??o:o,w=this._read(f,t[d]);if(w!=null)n[o]=w}return n}if(e.isBlobSchema()&&typeof t==="string")return ms.fromBase64(t);let i=e.getMergedTraits().mediaType;if(e.isStringSchema()&&typeof t==="string"&&i){if(i==="application/json"||i.endsWith("+json"))return K.LazyJsonString.from(t)}if(e.isTimestampSchema()&&t!=null)switch(a.determineTimestampFormat(e,this.settings)){case 5:return K.parseRfc3339DateTimeWithOffset(t);case 6:return K.parseRfc7231DateTime(t);case 7:return K.parseEpochTimestamp(t);default:return console.warn("Missing timestamp format, parsing value with Date constructor:",t),new Date(t)}if(e.isBigIntegerSchema()&&(typeof t==="number"||typeof t==="string"))return BigInt(t);if(e.isBigDecimalSchema()&&t!=null){if(t instanceof K.NumericValue)return t;let n=t;if(n.type==="bigDecimal"&&"string"in n)return new K.NumericValue(n.string,n.type);return new K.NumericValue(String(t),"bigDecimal")}if(e.isNumericSchema()&&typeof t==="string")switch(t){case"Infinity":return 1/0;case"-Infinity":return-1/0;case"NaN":return NaN}if(e.isDocumentSchema())if(r){let n=Array.isArray(t)?[]:{};for(let[o,f]of Object.entries(t))if(f instanceof K.NumericValue)n[o]=f;else n[o]=this._read(e,f);return n}else return structuredClone(t);return t}}var vo=String.fromCharCode(925);class eh{values=new Map;counter=0;stage=0;createReplacer(){if(this.stage===1)throw Error("@aws-sdk/core/protocols - JsonReplacer already created.");if(this.stage===2)throw Error("@aws-sdk/core/protocols - JsonReplacer exhausted.");return this.stage=1,(s,t)=>{if(t instanceof K.NumericValue){let r=`${vo+"nv"+this.counter++}_`+t.string;return this.values.set(`"${r}"`,t.string),r}if(typeof t==="bigint"){let r=t.toString(),e=`${vo+"b"+this.counter++}_`+r;return this.values.set(`"${e}"`,r),e}return t}}replaceInJson(s){if(this.stage===0)throw Error("@aws-sdk/core/protocols - JsonReplacer not created yet.");if(this.stage===2)throw Error("@aws-sdk/core/protocols - JsonReplacer exhausted.");if(this.stage=2,this.counter===0)return s;for(let[t,r]of this.values)s=s.replace(t,r);return s}}class re extends $s{settings;buffer;rootSchema;constructor(s){super();this.settings=s}write(s,t){this.rootSchema=X.NormalizedSchema.of(s),this.buffer=this._write(this.rootSchema,t)}writeDiscriminatedDocument(s,t){if(this.write(s,t),typeof this.buffer==="object")this.buffer.__type=X.NormalizedSchema.of(s).getName(!0)}flush(){let{rootSchema:s}=this;if(this.rootSchema=void 0,s?.isStructSchema()||s?.isDocumentSchema()){let t=new eh;return t.replaceInJson(JSON.stringify(this.buffer,t.createReplacer(),0))}return this.buffer}_write(s,t,r){let e=t!==null&&typeof t==="object",i=X.NormalizedSchema.of(s);if(i.isListSchema()&&Array.isArray(t)){let n=i.getValueSchema(),o=[],f=!!i.getMergedTraits().sparse;for(let d of t)if(f||d!=null)o.push(this._write(n,d));return o}else if(i.isMapSchema()&&e){let n=i.getValueSchema(),o={},f=!!i.getMergedTraits().sparse;for(let[d,w]of Object.entries(t))if(f||w!=null)o[d]=this._write(n,w);return o}else if(i.isStructSchema()&&e){let n={};for(let[o,f]of i.structIterator()){let d=this.settings.jsonName?f.getMergedTraits().jsonName??o:o,w=this._write(f,t[o],i);if(w!==void 0)n[d]=w}return n}if(t===null&&r?.isStructSchema())return;if(i.isBlobSchema()&&(t instanceof Uint8Array||typeof t==="string")||i.isDocumentSchema()&&t instanceof Uint8Array){if(i===this.rootSchema)return t;return(this.serdeContext?.base64Encoder??ms.toBase64)(t)}if((i.isTimestampSchema()||i.isDocumentSchema())&&t instanceof Date)switch(a.determineTimestampFormat(i,this.settings)){case 5:return t.toISOString().replace(".000Z","Z");case 6:return K.dateToUtcString(t);case 7:return t.getTime()/1000;default:return console.warn("Missing timestamp format, using epoch seconds",t),t.getTime()/1000}if(i.isNumericSchema()&&typeof t==="number"){if(Math.abs(t)===1/0||isNaN(t))return String(t)}if(i.isStringSchema()){if(typeof t>"u"&&i.isIdempotencyToken())return K.generateIdempotencyToken();let n=i.getMergedTraits().mediaType;if(t!=null&&n){if(n==="application/json"||n.endsWith("+json"))return K.LazyJsonString.from(t)}}if(i.isDocumentSchema())if(e){let n=Array.isArray(t)?[]:{};for(let[o,f]of Object.entries(t))if(f instanceof K.NumericValue)n[o]=f;else n[o]=this._write(i,f);return n}else return structuredClone(t);return t}}class Mt extends $s{settings;constructor(s){super();this.settings=s}createSerializer(){let s=new re(this.settings);return s.setSerdeContext(this.serdeContext),s}createDeserializer(){let s=new te(this.settings);return s.setSerdeContext(this.serdeContext),s}}class Lt extends a.RpcProtocol{serializer;deserializer;serviceTarget;codec;mixin;awsQueryCompatible;constructor({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r}){super({defaultNamespace:s});this.serviceTarget=t,this.codec=new Mt({timestampFormat:{useTrait:!0,default:7},jsonName:!1}),this.serializer=this.codec.createSerializer(),this.deserializer=this.codec.createDeserializer(),this.awsQueryCompatible=!!r,this.mixin=new Os(this.awsQueryCompatible)}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(!e.path.endsWith("/"))e.path+="/";if(Object.assign(e.headers,{"content-type":`application/x-amz-json-${this.getJsonRpcVersion()}`,"x-amz-target":`${this.serviceTarget}.${s.name}`}),this.awsQueryCompatible)e.headers["x-amzn-query-mode"]="true";if(X.deref(s.input)==="unit"||!e.body)e.body="{}";return e}getPayloadCodec(){return this.codec}async handleError(s,t,r,e,i){if(this.awsQueryCompatible)this.mixin.setQueryCompatError(e,r);let n=se(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=X.NormalizedSchema.of(o),w=e.message??e.Message??"Unknown",A=new(X.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w),_={};for(let[U,S]of d.structIterator()){let y=S.getMergedTraits().jsonName??U;_[U]=this.codec.createDeserializer().readObject(S,e[y])}if(this.awsQueryCompatible)this.mixin.queryCompatOutput(e,_);throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}}class ih extends Lt{constructor({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r}){super({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r})}getShapeId(){return"aws.protocols#awsJson1_0"}getJsonRpcVersion(){return"1.0"}getDefaultContentType(){return"application/x-amz-json-1.0"}}class nh extends Lt{constructor({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r}){super({defaultNamespace:s,serviceTarget:t,awsQueryCompatible:r})}getShapeId(){return"aws.protocols#awsJson1_1"}getJsonRpcVersion(){return"1.1"}getDefaultContentType(){return"application/x-amz-json-1.1"}}class oh extends a.HttpBindingProtocol{serializer;deserializer;codec;mixin=new Os;constructor({defaultNamespace:s}){super({defaultNamespace:s});let t={timestampFormat:{useTrait:!0,default:7},httpBindings:!0,jsonName:!0};this.codec=new Mt(t),this.serializer=new a.HttpInterceptingShapeSerializer(this.codec.createSerializer(),t),this.deserializer=new a.HttpInterceptingShapeDeserializer(this.codec.createDeserializer(),t)}getShapeId(){return"aws.protocols#restJson1"}getPayloadCodec(){return this.codec}setSerdeContext(s){this.codec.setSerdeContext(s),super.setSerdeContext(s)}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r),i=X.NormalizedSchema.of(s.input);if(!e.headers["content-type"]){let n=this.mixin.resolveRestContentType(this.getDefaultContentType(),i);if(n)e.headers["content-type"]=n}if(e.body==null&&e.headers["content-type"]===this.getDefaultContentType())e.body="{}";return e}async deserializeResponse(s,t,r){let e=await super.deserializeResponse(s,t,r),i=X.NormalizedSchema.of(s.output);for(let[n,o]of i.structIterator())if(o.getMemberTraits().httpPayload&&!(n in e))e[n]=null;return e}async handleError(s,t,r,e,i){let n=se(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=X.NormalizedSchema.of(o),w=e.message??e.Message??"Unknown",A=new(X.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w);await this.deserializeHttpMessage(o,t,r,e);let _={};for(let[U,S]of d.structIterator()){let y=S.getMergedTraits().jsonName??U;_[U]=this.codec.createDeserializer().readObject(S,e[y])}throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}getDefaultContentType(){return"application/json"}}var Yg=(s)=>{if(s==null)return;if(typeof s==="object"&&"__type"in s)delete s.__type;return cs.expectUnion(s)};class Dt extends $s{settings;stringDeserializer;constructor(s){super();this.settings=s,this.stringDeserializer=new a.FromStringShapeDeserializer(s)}setSerdeContext(s){this.serdeContext=s,this.stringDeserializer.setSerdeContext(s)}read(s,t,r){let e=X.NormalizedSchema.of(s),i=e.getMemberSchemas();if(e.isStructSchema()&&e.isMemberSchema()&&!!Object.values(i).find((d)=>{return!!d.getMemberTraits().eventPayload})){let d={},w=Object.keys(i)[0];if(i[w].isBlobSchema())d[w]=t;else d[w]=this.read(i[w],t);return d}let o=(this.serdeContext?.utf8Encoder??sh.toUtf8)(t),f=this.parseXml(o);return this.readSchema(s,r?f[r]:f)}readSchema(s,t){let r=X.NormalizedSchema.of(s);if(r.isUnitSchema())return;let e=r.getMergedTraits();if(r.isListSchema()&&!Array.isArray(t))return this.readSchema(r,[t]);if(t==null)return t;if(typeof t==="object"){let i=!!e.sparse,n=!!e.xmlFlattened;if(r.isListSchema()){let f=r.getValueSchema(),d=[],w=f.getMergedTraits().xmlName??"member",u=n?t:(t[0]??t)[w],A=Array.isArray(u)?u:[u];for(let _ of A)if(_!=null||i)d.push(this.readSchema(f,_));return d}let o={};if(r.isMapSchema()){let f=r.getKeySchema(),d=r.getValueSchema(),w;if(n)w=Array.isArray(t)?t:[t];else w=Array.isArray(t.entry)?t.entry:[t.entry];let u=f.getMergedTraits().xmlName??"key",A=d.getMergedTraits().xmlName??"value";for(let _ of w){let U=_[u],S=_[A];if(S!=null||i)o[U]=this.readSchema(d,S)}return o}if(r.isStructSchema()){for(let[f,d]of r.structIterator()){let w=d.getMergedTraits(),u=!w.httpPayload?d.getMemberTraits().xmlName??f:w.xmlName??d.getName();if(t[u]!=null)o[f]=this.readSchema(d,t[u])}return o}if(r.isDocumentSchema())return t;throw Error(`@aws-sdk/core/protocols - xml deserializer unhandled schema type for ${r.getName(!0)}`)}if(r.isListSchema())return[];if(r.isMapSchema()||r.isStructSchema())return{};return this.stringDeserializer.read(r,t)}parseXml(s){if(s.length){let t;try{t=j.parseXML(s)}catch(n){if(n&&typeof n==="object")Object.defineProperty(n,"$responseBodyText",{value:s});throw n}let r="#text",e=Object.keys(t)[0],i=t[e];if(i[r])i[e]=i[r],delete i[r];return cs.getValueFromTextNode(i)}return{}}}class hh extends $s{settings;buffer;constructor(s){super();this.settings=s}write(s,t,r=""){if(this.buffer===void 0)this.buffer="";let e=X.NormalizedSchema.of(s);if(r&&!r.endsWith("."))r+=".";if(e.isBlobSchema()){if(typeof t==="string"||t instanceof Uint8Array)this.writeKey(r),this.writeValue((this.serdeContext?.base64Encoder??ms.toBase64)(t))}else if(e.isBooleanSchema()||e.isNumericSchema()||e.isStringSchema()){if(t!=null)this.writeKey(r),this.writeValue(String(t));else if(e.isIdempotencyToken())this.writeKey(r),this.writeValue(K.generateIdempotencyToken())}else if(e.isBigIntegerSchema()){if(t!=null)this.writeKey(r),this.writeValue(String(t))}else if(e.isBigDecimalSchema()){if(t!=null)this.writeKey(r),this.writeValue(t instanceof K.NumericValue?t.string:String(t))}else if(e.isTimestampSchema()){if(t instanceof Date)switch(this.writeKey(r),a.determineTimestampFormat(e,this.settings)){case 5:this.writeValue(t.toISOString().replace(".000Z","Z"));break;case 6:this.writeValue(cs.dateToUtcString(t));break;case 7:this.writeValue(String(t.getTime()/1000));break}}else if(e.isDocumentSchema())throw Error(`@aws-sdk/core/protocols - QuerySerializer unsupported document type ${e.getName(!0)}`);else if(e.isListSchema()){if(Array.isArray(t))if(t.length===0){if(this.settings.serializeEmptyLists)this.writeKey(r),this.writeValue("")}else{let i=e.getValueSchema(),n=this.settings.flattenLists||e.getMergedTraits().xmlFlattened,o=1;for(let f of t){if(f==null)continue;let d=this.getKey("member",i.getMergedTraits().xmlName),w=n?`${r}${o}`:`${r}${d}.${o}`;this.write(i,f,w),++o}}}else if(e.isMapSchema()){if(t&&typeof t==="object"){let i=e.getKeySchema(),n=e.getValueSchema(),o=e.getMergedTraits().xmlFlattened,f=1;for(let[d,w]of Object.entries(t)){if(w==null)continue;let u=this.getKey("key",i.getMergedTraits().xmlName),A=o?`${r}${f}.${u}`:`${r}entry.${f}.${u}`,_=this.getKey("value",n.getMergedTraits().xmlName),U=o?`${r}${f}.${_}`:`${r}entry.${f}.${_}`;this.write(i,d,A),this.write(n,w,U),++f}}}else if(e.isStructSchema()){if(t&&typeof t==="object")for(let[i,n]of e.structIterator()){if(t[i]==null&&!n.isIdempotencyToken())continue;let o=this.getKey(i,n.getMergedTraits().xmlName),f=`${r}${o}`;this.write(n,t[i],f)}}else if(e.isUnitSchema());else throw Error(`@aws-sdk/core/protocols - QuerySerializer unrecognized schema type ${e.getName(!0)}`)}flush(){if(this.buffer===void 0)throw Error("@aws-sdk/core/protocols - QuerySerializer cannot flush with nothing written to buffer.");let s=this.buffer;return delete this.buffer,s}getKey(s,t){let r=t??s;if(this.settings.capitalizeKeys)return r[0].toUpperCase()+r.slice(1);return r}writeKey(s){if(s.endsWith("."))s=s.slice(0,s.length-1);this.buffer+=`&${a.extendedEncodeURIComponent(s)}=`}writeValue(s){this.buffer+=a.extendedEncodeURIComponent(s)}}class ee extends a.RpcProtocol{options;serializer;deserializer;mixin=new Os;constructor(s){super({defaultNamespace:s.defaultNamespace});this.options=s;let t={timestampFormat:{useTrait:!0,default:5},httpBindings:!1,xmlNamespace:s.xmlNamespace,serviceNamespace:s.defaultNamespace,serializeEmptyLists:!0};this.serializer=new hh(t),this.deserializer=new Dt(t)}getShapeId(){return"aws.protocols#awsQuery"}setSerdeContext(s){this.serializer.setSerdeContext(s),this.deserializer.setSerdeContext(s)}getPayloadCodec(){throw Error("AWSQuery protocol has no payload codec.")}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r);if(!e.path.endsWith("/"))e.path+="/";if(Object.assign(e.headers,{"content-type":"application/x-www-form-urlencoded"}),X.deref(s.input)==="unit"||!e.body)e.body="";let i=s.name.split("#")[1]??s.name;if(e.body=`Action=${i}&Version=${this.options.version}`+e.body,e.body.endsWith("&"))e.body=e.body.slice(-1);return e}async deserializeResponse(s,t,r){let e=this.deserializer,i=X.NormalizedSchema.of(s.output),n={};if(r.statusCode>=300){let u=await a.collectBody(r.body,t);if(u.byteLength>0)Object.assign(n,await e.read(15,u));await this.handleError(s,t,r,n,this.deserializeMetadata(r))}for(let u in r.headers){let A=r.headers[u];delete r.headers[u],r.headers[u.toLowerCase()]=A}let o=s.name.split("#")[1]??s.name,f=i.isStructSchema()&&this.useNestedResult()?o+"Result":void 0,d=await a.collectBody(r.body,t);if(d.byteLength>0)Object.assign(n,await e.read(i,d,f));return{$metadata:this.deserializeMetadata(r),...n}}useNestedResult(){return!0}async handleError(s,t,r,e,i){let n=this.loadQueryErrorCode(r,e)??"Unknown",o=this.loadQueryError(e),f=this.loadQueryErrorMessage(e);o.message=f,o.Error={Type:o.Type,Code:o.Code,Message:f};let{errorSchema:d,errorMetadata:w}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,o,i,(S,y)=>{try{return S.getSchema(y)}catch(G){return S.find((L)=>X.NormalizedSchema.of(L).getMergedTraits().awsQueryError?.[0]===y)}}),u=X.NormalizedSchema.of(d),_=new(X.TypeRegistry.for(d[1]).getErrorCtor(d)??Error)(f),U={Error:o.Error};for(let[S,y]of u.structIterator()){let G=y.getMergedTraits().xmlName??S,L=o[G]??e[G];U[S]=this.deserializer.readSchema(y,L)}throw this.mixin.decorateServiceException(Object.assign(_,w,{$fault:u.getMergedTraits().error,message:f},U),e)}loadQueryErrorCode(s,t){let r=(t.Errors?.[0]?.Error??t.Errors?.Error??t.Error)?.Code;if(r!==void 0)return r;if(s.statusCode==404)return"NotFound"}loadQueryError(s){return s.Errors?.[0]?.Error??s.Errors?.Error??s.Error}loadQueryErrorMessage(s){let t=this.loadQueryError(s);return t?.message??t?.Message??s.message??s.Message??"Unknown"}getDefaultContentType(){return"application/x-www-form-urlencoded"}}class ch extends ee{options;constructor(s){super(s);this.options=s;let t={capitalizeKeys:!0,flattenLists:!0,serializeEmptyLists:!1};Object.assign(this.serializer.settings,t)}useNestedResult(){return!1}}var fh=(s,t)=>rh(s,t).then((r)=>{if(r.length){let e;try{e=j.parseXML(r)}catch(f){if(f&&typeof f==="object")Object.defineProperty(f,"$responseBodyText",{value:r});throw f}let i="#text",n=Object.keys(e)[0],o=e[n];if(o[i])o[n]=o[i],delete o[i];return cs.getValueFromTextNode(o)}return{}}),ag=async(s,t)=>{let r=await fh(s,t);if(r.Error)r.Error.message=r.Error.message??r.Error.Message;return r},dh=(s,t)=>{if(t?.Error?.Code!==void 0)return t.Error.Code;if(t?.Code!==void 0)return t.Code;if(s.statusCode==404)return"NotFound"};class ie extends $s{settings;stringBuffer;byteBuffer;buffer;constructor(s){super();this.settings=s}write(s,t){let r=X.NormalizedSchema.of(s);if(r.isStringSchema()&&typeof t==="string")this.stringBuffer=t;else if(r.isBlobSchema())this.byteBuffer="byteLength"in t?t:(this.serdeContext?.base64Decoder??ms.fromBase64)(t);else{this.buffer=this.writeStruct(r,t,void 0);let e=r.getMergedTraits();if(e.httpPayload&&!e.xmlName)this.buffer.withName(r.getName())}}flush(){if(this.byteBuffer!==void 0){let t=this.byteBuffer;return delete this.byteBuffer,t}if(this.stringBuffer!==void 0){let t=this.stringBuffer;return delete this.stringBuffer,t}let s=this.buffer;if(this.settings.xmlNamespace){if(!s?.attributes?.xmlns)s.addAttribute("xmlns",this.settings.xmlNamespace)}return delete this.buffer,s.toString()}writeStruct(s,t,r){let e=s.getMergedTraits(),i=s.isMemberSchema()&&!e.httpPayload?s.getMemberTraits().xmlName??s.getMemberName():e.xmlName??s.getName();if(!i||!s.isStructSchema())throw Error(`@aws-sdk/core/protocols - xml serializer, cannot write struct with empty name or non-struct, schema=${s.getName(!0)}.`);let n=j.XmlNode.of(i),[o,f]=this.getXmlnsAttribute(s,r);for(let[d,w]of s.structIterator()){let u=t[d];if(u!=null||w.isIdempotencyToken()){if(w.getMergedTraits().xmlAttribute){n.addAttribute(w.getMergedTraits().xmlName??d,this.writeSimple(w,u));continue}if(w.isListSchema())this.writeList(w,u,n,f);else if(w.isMapSchema())this.writeMap(w,u,n,f);else if(w.isStructSchema())n.addChildNode(this.writeStruct(w,u,f));else{let A=j.XmlNode.of(w.getMergedTraits().xmlName??w.getMemberName());this.writeSimpleInto(w,u,A,f),n.addChildNode(A)}}}if(f)n.addAttribute(o,f);return n}writeList(s,t,r,e){if(!s.isMemberSchema())throw Error(`@aws-sdk/core/protocols - xml serializer, cannot write non-member list: ${s.getName(!0)}`);let i=s.getMergedTraits(),n=s.getValueSchema(),o=n.getMergedTraits(),f=!!o.sparse,d=!!i.xmlFlattened,[w,u]=this.getXmlnsAttribute(s,e),A=(_,U)=>{if(n.isListSchema())this.writeList(n,Array.isArray(U)?U:[U],_,u);else if(n.isMapSchema())this.writeMap(n,U,_,u);else if(n.isStructSchema()){let S=this.writeStruct(n,U,u);_.addChildNode(S.withName(d?i.xmlName??s.getMemberName():o.xmlName??"member"))}else{let S=j.XmlNode.of(d?i.xmlName??s.getMemberName():o.xmlName??"member");this.writeSimpleInto(n,U,S,u),_.addChildNode(S)}};if(d){for(let _ of t)if(f||_!=null)A(r,_)}else{let _=j.XmlNode.of(i.xmlName??s.getMemberName());if(u)_.addAttribute(w,u);for(let U of t)if(f||U!=null)A(_,U);r.addChildNode(_)}}writeMap(s,t,r,e,i=!1){if(!s.isMemberSchema())throw Error(`@aws-sdk/core/protocols - xml serializer, cannot write non-member map: ${s.getName(!0)}`);let n=s.getMergedTraits(),o=s.getKeySchema(),d=o.getMergedTraits().xmlName??"key",w=s.getValueSchema(),u=w.getMergedTraits(),A=u.xmlName??"value",_=!!u.sparse,U=!!n.xmlFlattened,[S,y]=this.getXmlnsAttribute(s,e),G=(L,Z,b)=>{let J=j.XmlNode.of(d,Z),[Ws,rs]=this.getXmlnsAttribute(o,y);if(rs)J.addAttribute(Ws,rs);L.addChildNode(J);let p=j.XmlNode.of(A);if(w.isListSchema())this.writeList(w,b,p,y);else if(w.isMapSchema())this.writeMap(w,b,p,y,!0);else if(w.isStructSchema())p=this.writeStruct(w,b,y);else this.writeSimpleInto(w,b,p,y);L.addChildNode(p)};if(U){for(let[L,Z]of Object.entries(t))if(_||Z!=null){let b=j.XmlNode.of(n.xmlName??s.getMemberName());G(b,L,Z),r.addChildNode(b)}}else{let L;if(!i){if(L=j.XmlNode.of(n.xmlName??s.getMemberName()),y)L.addAttribute(S,y);r.addChildNode(L)}for(let[Z,b]of Object.entries(t))if(_||b!=null){let J=j.XmlNode.of("entry");G(J,Z,b),(i?r:L).addChildNode(J)}}}writeSimple(s,t){if(t===null)throw Error("@aws-sdk/core/protocols - (XML serializer) cannot write null value.");let r=X.NormalizedSchema.of(s),e=null;if(t&&typeof t==="object")if(r.isBlobSchema())e=(this.serdeContext?.base64Encoder??ms.toBase64)(t);else if(r.isTimestampSchema()&&t instanceof Date)switch(a.determineTimestampFormat(r,this.settings)){case 5:e=t.toISOString().replace(".000Z","Z");break;case 6:e=cs.dateToUtcString(t);break;case 7:e=String(t.getTime()/1000);break;default:console.warn("Missing timestamp format, using http date",t),e=cs.dateToUtcString(t);break}else if(r.isBigDecimalSchema()&&t){if(t instanceof K.NumericValue)return t.string;return String(t)}else if(r.isMapSchema()||r.isListSchema())throw Error("@aws-sdk/core/protocols - xml serializer, cannot call _write() on List/Map schema, call writeList or writeMap() instead.");else throw Error(`@aws-sdk/core/protocols - xml serializer, unhandled schema type for object value and schema: ${r.getName(!0)}`);if(r.isBooleanSchema()||r.isNumericSchema()||r.isBigIntegerSchema()||r.isBigDecimalSchema())e=String(t);if(r.isStringSchema())if(t===void 0&&r.isIdempotencyToken())e=K.generateIdempotencyToken();else e=String(t);if(e===null)throw Error(`Unhandled schema-value pair ${r.getName(!0)}=${t}`);return e}writeSimpleInto(s,t,r,e){let i=this.writeSimple(s,t),n=X.NormalizedSchema.of(s),o=new j.XmlText(i),[f,d]=this.getXmlnsAttribute(n,e);if(d)r.addAttribute(f,d);r.addChildNode(o)}getXmlnsAttribute(s,t){let r=s.getMergedTraits(),[e,i]=r.xmlNamespace??[];if(i&&i!==t)return[e?`xmlns:${e}`:"xmlns",i];return[void 0,void 0]}}class ne extends $s{settings;constructor(s){super();this.settings=s}createSerializer(){let s=new ie(this.settings);return s.setSerdeContext(this.serdeContext),s}createDeserializer(){let s=new Dt(this.settings);return s.setSerdeContext(this.serdeContext),s}}class wh extends a.HttpBindingProtocol{codec;serializer;deserializer;mixin=new Os;constructor(s){super(s);let t={timestampFormat:{useTrait:!0,default:5},httpBindings:!0,xmlNamespace:s.xmlNamespace,serviceNamespace:s.defaultNamespace};this.codec=new ne(t),this.serializer=new a.HttpInterceptingShapeSerializer(this.codec.createSerializer(),t),this.deserializer=new a.HttpInterceptingShapeDeserializer(this.codec.createDeserializer(),t)}getPayloadCodec(){return this.codec}getShapeId(){return"aws.protocols#restXml"}async serializeRequest(s,t,r){let e=await super.serializeRequest(s,t,r),i=X.NormalizedSchema.of(s.input);if(!e.headers["content-type"]){let n=this.mixin.resolveRestContentType(this.getDefaultContentType(),i);if(n)e.headers["content-type"]=n}if(e.headers["content-type"]===this.getDefaultContentType()){if(typeof e.body==="string")e.body='<?xml version="1.0" encoding="UTF-8"?>'+e.body}return e}async deserializeResponse(s,t,r){return super.deserializeResponse(s,t,r)}async handleError(s,t,r,e,i){let n=dh(r,e)??"Unknown",{errorSchema:o,errorMetadata:f}=await this.mixin.getErrorSchemaOrThrowBaseException(n,this.options.defaultNamespace,r,e,i),d=X.NormalizedSchema.of(o),w=e.Error?.message??e.Error?.Message??e.message??e.Message??"Unknown",A=new(X.TypeRegistry.for(o[1]).getErrorCtor(o)??Error)(w);await this.deserializeHttpMessage(o,t,r,e);let _={};for(let[U,S]of d.structIterator()){let y=S.getMergedTraits().xmlName??U,G=e.Error?.[y]??e[y];_[U]=this.codec.createDeserializer().readSchema(S,G)}throw this.mixin.decorateServiceException(Object.assign(A,f,{$fault:d.getMergedTraits().error,message:w},_),e)}getDefaultContentType(){return"application/xml"}}mg.AwsEc2QueryProtocol=ch;mg.AwsJson1_0Protocol=ih;mg.AwsJson1_1Protocol=nh;mg.AwsJsonRpcProtocol=Lt;mg.AwsQueryProtocol=ee;mg.AwsRestJsonProtocol=oh;mg.AwsRestXmlProtocol=wh;mg.AwsSmithyRpcV2CborProtocol=th;mg.JsonCodec=Mt;mg.JsonShapeDeserializer=te;mg.JsonShapeSerializer=re;mg.XmlCodec=ne;mg.XmlShapeDeserializer=Dt;mg.XmlShapeSerializer=ie;mg._toBool=Zg;mg._toNum=qg;mg._toStr=Vg;mg.awsExpectUnion=Yg;mg.loadRestJsonErrorCode=se;mg.loadRestXmlErrorCode=dh;mg.parseJsonBody=vr;mg.parseJsonErrorBody=Jg;mg.parseXmlBody=fh;mg.parseXmlErrorBody=ag});
29
- export{kh as c,ec as d,gc as e,tt as f,Jt as g,ci as h,Pi as i,Ln as j,Pn as k,Ut as l,iu as m,bu as n,To as o,m0 as p,Ag as q,Ig as r,Lg as s,$N as t,pg as u,ig as v};
30
-
31
- //# debugId=D0A5BC764102075664756E2164756E21
32
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0Bhd3Mtc2RrL21pZGRsZXdhcmUtaG9zdC1oZWFkZXIvZGlzdC1janMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bhd3Mtc2RrL21pZGRsZXdhcmUtbG9nZ2VyL2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYXdzL2xhbWJkYS1pbnZva2Utc3RvcmUvZGlzdC1janMvaW52b2tlLXN0b3JlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYXdzLXNkay9taWRkbGV3YXJlLXJlY3Vyc2lvbi1kZXRlY3Rpb24vZGlzdC1janMvcmVjdXJzaW9uRGV0ZWN0aW9uTWlkZGxld2FyZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvbWlkZGxld2FyZS1yZWN1cnNpb24tZGV0ZWN0aW9uL2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L21pZGRsZXdhcmUtc2VyZGUvZGlzdC1janMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvY29yZS9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNtaXRoeS91dGlsLWVuZHBvaW50cy9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvdXRpbC1lbmRwb2ludHMvZGlzdC1janMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvc2lnbmF0dXJlLXY0L2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L3V0aWwtYm9keS1sZW5ndGgtYnJvd3Nlci9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9jb3JlL2Rpc3QtY2pzL3N1Ym1vZHVsZXMvY2Jvci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvZmFzdC14bWwtcGFyc2VyL2xpYi9meHAuY2pzIiwgIi4uL25vZGVfbW9kdWxlcy9AYXdzLXNkay94bWwtYnVpbGRlci9kaXN0LWNqcy94bWwtcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYXdzLXNkay94bWwtYnVpbGRlci9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvY29yZS9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvbWlkZGxld2FyZS11c2VyLWFnZW50L2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L3V0aWwtY29uZmlnLXByb3ZpZGVyL2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L2NvbmZpZy1yZXNvbHZlci9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9taWRkbGV3YXJlLWNvbnRlbnQtbGVuZ3RoL2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L21pZGRsZXdhcmUtZW5kcG9pbnQvZGlzdC1janMvYWRhcHRvcnMvZ2V0RW5kcG9pbnRVcmxDb25maWcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1lbmRwb2ludC9kaXN0LWNqcy9hZGFwdG9ycy9nZXRFbmRwb2ludEZyb21Db25maWcuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1lbmRwb2ludC9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNtaXRoeS9zZXJ2aWNlLWVycm9yLWNsYXNzaWZpY2F0aW9uL2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L3V0aWwtcmV0cnkvZGlzdC1janMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvbWlkZGxld2FyZS1yZXRyeS9kaXN0LWNqcy9pc1N0cmVhbWluZ1BheWxvYWQvaXNTdHJlYW1pbmdQYXlsb2FkLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L21pZGRsZXdhcmUtcmV0cnkvZGlzdC1janMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0Bhd3Mtc2RrL3JlZ2lvbi1jb25maWctcmVzb2x2ZXIvZGlzdC1janMvcmVnaW9uQ29uZmlnL3N0c1JlZ2lvbkRlZmF1bHRSZXNvbHZlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvcmVnaW9uLWNvbmZpZy1yZXNvbHZlci9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvdXRpbC11c2VyLWFnZW50LW5vZGUvZGlzdC1janMvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzbWl0aHkvaGFzaC1ub2RlL2Rpc3QtY2pzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac21pdGh5L3V0aWwtYm9keS1sZW5ndGgtbm9kZS9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNtaXRoeS91dGlsLWRlZmF1bHRzLW1vZGUtbm9kZS9kaXN0LWNqcy9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGF3cy1zZGsvY29yZS9kaXN0LWNqcy9zdWJtb2R1bGVzL3Byb3RvY29scy9pbmRleC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBwcm90b2NvbEh0dHAgPSByZXF1aXJlKCdAc21pdGh5L3Byb3RvY29sLWh0dHAnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUhvc3RIZWFkZXJDb25maWcoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5jb25zdCBob3N0SGVhZGVyTWlkZGxld2FyZSA9IChvcHRpb25zKSA9PiAobmV4dCkgPT4gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBpZiAoIXByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5pc0luc3RhbmNlKGFyZ3MucmVxdWVzdCkpXG4gICAgICAgIHJldHVybiBuZXh0KGFyZ3MpO1xuICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gYXJncztcbiAgICBjb25zdCB7IGhhbmRsZXJQcm90b2NvbCA9IFwiXCIgfSA9IG9wdGlvbnMucmVxdWVzdEhhbmRsZXIubWV0YWRhdGEgfHwge307XG4gICAgaWYgKGhhbmRsZXJQcm90b2NvbC5pbmRleE9mKFwiaDJcIikgPj0gMCAmJiAhcmVxdWVzdC5oZWFkZXJzW1wiOmF1dGhvcml0eVwiXSkge1xuICAgICAgICBkZWxldGUgcmVxdWVzdC5oZWFkZXJzW1wiaG9zdFwiXTtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1wiOmF1dGhvcml0eVwiXSA9IHJlcXVlc3QuaG9zdG5hbWUgKyAocmVxdWVzdC5wb3J0ID8gXCI6XCIgKyByZXF1ZXN0LnBvcnQgOiBcIlwiKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXJlcXVlc3QuaGVhZGVyc1tcImhvc3RcIl0pIHtcbiAgICAgICAgbGV0IGhvc3QgPSByZXF1ZXN0Lmhvc3RuYW1lO1xuICAgICAgICBpZiAocmVxdWVzdC5wb3J0ICE9IG51bGwpXG4gICAgICAgICAgICBob3N0ICs9IGA6JHtyZXF1ZXN0LnBvcnR9YDtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1wiaG9zdFwiXSA9IGhvc3Q7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KGFyZ3MpO1xufTtcbmNvbnN0IGhvc3RIZWFkZXJNaWRkbGV3YXJlT3B0aW9ucyA9IHtcbiAgICBuYW1lOiBcImhvc3RIZWFkZXJNaWRkbGV3YXJlXCIsXG4gICAgc3RlcDogXCJidWlsZFwiLFxuICAgIHByaW9yaXR5OiBcImxvd1wiLFxuICAgIHRhZ3M6IFtcIkhPU1RcIl0sXG4gICAgb3ZlcnJpZGU6IHRydWUsXG59O1xuY29uc3QgZ2V0SG9zdEhlYWRlclBsdWdpbiA9IChvcHRpb25zKSA9PiAoe1xuICAgIGFwcGx5VG9TdGFjazogKGNsaWVudFN0YWNrKSA9PiB7XG4gICAgICAgIGNsaWVudFN0YWNrLmFkZChob3N0SGVhZGVyTWlkZGxld2FyZShvcHRpb25zKSwgaG9zdEhlYWRlck1pZGRsZXdhcmVPcHRpb25zKTtcbiAgICB9LFxufSk7XG5cbmV4cG9ydHMuZ2V0SG9zdEhlYWRlclBsdWdpbiA9IGdldEhvc3RIZWFkZXJQbHVnaW47XG5leHBvcnRzLmhvc3RIZWFkZXJNaWRkbGV3YXJlID0gaG9zdEhlYWRlck1pZGRsZXdhcmU7XG5leHBvcnRzLmhvc3RIZWFkZXJNaWRkbGV3YXJlT3B0aW9ucyA9IGhvc3RIZWFkZXJNaWRkbGV3YXJlT3B0aW9ucztcbmV4cG9ydHMucmVzb2x2ZUhvc3RIZWFkZXJDb25maWcgPSByZXNvbHZlSG9zdEhlYWRlckNvbmZpZztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBsb2dnZXJNaWRkbGV3YXJlID0gKCkgPT4gKG5leHQsIGNvbnRleHQpID0+IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBuZXh0KGFyZ3MpO1xuICAgICAgICBjb25zdCB7IGNsaWVudE5hbWUsIGNvbW1hbmROYW1lLCBsb2dnZXIsIGR5bmFtb0RiRG9jdW1lbnRDbGllbnRPcHRpb25zID0ge30gfSA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHsgb3ZlcnJpZGVJbnB1dEZpbHRlclNlbnNpdGl2ZUxvZywgb3ZlcnJpZGVPdXRwdXRGaWx0ZXJTZW5zaXRpdmVMb2cgfSA9IGR5bmFtb0RiRG9jdW1lbnRDbGllbnRPcHRpb25zO1xuICAgICAgICBjb25zdCBpbnB1dEZpbHRlclNlbnNpdGl2ZUxvZyA9IG92ZXJyaWRlSW5wdXRGaWx0ZXJTZW5zaXRpdmVMb2cgPz8gY29udGV4dC5pbnB1dEZpbHRlclNlbnNpdGl2ZUxvZztcbiAgICAgICAgY29uc3Qgb3V0cHV0RmlsdGVyU2Vuc2l0aXZlTG9nID0gb3ZlcnJpZGVPdXRwdXRGaWx0ZXJTZW5zaXRpdmVMb2cgPz8gY29udGV4dC5vdXRwdXRGaWx0ZXJTZW5zaXRpdmVMb2c7XG4gICAgICAgIGNvbnN0IHsgJG1ldGFkYXRhLCAuLi5vdXRwdXRXaXRob3V0TWV0YWRhdGEgfSA9IHJlc3BvbnNlLm91dHB1dDtcbiAgICAgICAgbG9nZ2VyPy5pbmZvPy4oe1xuICAgICAgICAgICAgY2xpZW50TmFtZSxcbiAgICAgICAgICAgIGNvbW1hbmROYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IGlucHV0RmlsdGVyU2Vuc2l0aXZlTG9nKGFyZ3MuaW5wdXQpLFxuICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXRGaWx0ZXJTZW5zaXRpdmVMb2cob3V0cHV0V2l0aG91dE1ldGFkYXRhKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiAkbWV0YWRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCB7IGNsaWVudE5hbWUsIGNvbW1hbmROYW1lLCBsb2dnZXIsIGR5bmFtb0RiRG9jdW1lbnRDbGllbnRPcHRpb25zID0ge30gfSA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHsgb3ZlcnJpZGVJbnB1dEZpbHRlclNlbnNpdGl2ZUxvZyB9ID0gZHluYW1vRGJEb2N1bWVudENsaWVudE9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsdGVyU2Vuc2l0aXZlTG9nID0gb3ZlcnJpZGVJbnB1dEZpbHRlclNlbnNpdGl2ZUxvZyA/PyBjb250ZXh0LmlucHV0RmlsdGVyU2Vuc2l0aXZlTG9nO1xuICAgICAgICBsb2dnZXI/LmVycm9yPy4oe1xuICAgICAgICAgICAgY2xpZW50TmFtZSxcbiAgICAgICAgICAgIGNvbW1hbmROYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IGlucHV0RmlsdGVyU2Vuc2l0aXZlTG9nKGFyZ3MuaW5wdXQpLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBtZXRhZGF0YTogZXJyb3IuJG1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbmNvbnN0IGxvZ2dlck1pZGRsZXdhcmVPcHRpb25zID0ge1xuICAgIG5hbWU6IFwibG9nZ2VyTWlkZGxld2FyZVwiLFxuICAgIHRhZ3M6IFtcIkxPR0dFUlwiXSxcbiAgICBzdGVwOiBcImluaXRpYWxpemVcIixcbiAgICBvdmVycmlkZTogdHJ1ZSxcbn07XG5jb25zdCBnZXRMb2dnZXJQbHVnaW4gPSAob3B0aW9ucykgPT4gKHtcbiAgICBhcHBseVRvU3RhY2s6IChjbGllbnRTdGFjaykgPT4ge1xuICAgICAgICBjbGllbnRTdGFjay5hZGQobG9nZ2VyTWlkZGxld2FyZSgpLCBsb2dnZXJNaWRkbGV3YXJlT3B0aW9ucyk7XG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLmdldExvZ2dlclBsdWdpbiA9IGdldExvZ2dlclBsdWdpbjtcbmV4cG9ydHMubG9nZ2VyTWlkZGxld2FyZSA9IGxvZ2dlck1pZGRsZXdhcmU7XG5leHBvcnRzLmxvZ2dlck1pZGRsZXdhcmVPcHRpb25zID0gbG9nZ2VyTWlkZGxld2FyZU9wdGlvbnM7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUFJPVEVDVEVEX0tFWVMgPSB7XG4gICAgUkVRVUVTVF9JRDogU3ltYm9sLmZvcihcIl9BV1NfTEFNQkRBX1JFUVVFU1RfSURcIiksXG4gICAgWF9SQVlfVFJBQ0VfSUQ6IFN5bWJvbC5mb3IoXCJfQVdTX0xBTUJEQV9YX1JBWV9UUkFDRV9JRFwiKSxcbiAgICBURU5BTlRfSUQ6IFN5bWJvbC5mb3IoXCJfQVdTX0xBTUJEQV9URU5BTlRfSURcIiksXG59O1xuY29uc3QgTk9fR0xPQkFMX0FXU19MQU1CREEgPSBbXCJ0cnVlXCIsIFwiMVwiXS5pbmNsdWRlcyhwcm9jZXNzLmVudj8uQVdTX0xBTUJEQV9OT0RFSlNfTk9fR0xPQkFMX0FXU0xBTUJEQSA/PyBcIlwiKTtcbmlmICghTk9fR0xPQkFMX0FXU19MQU1CREEpIHtcbiAgICBnbG9iYWxUaGlzLmF3c2xhbWJkYSA9IGdsb2JhbFRoaXMuYXdzbGFtYmRhIHx8IHt9O1xufVxuY2xhc3MgSW52b2tlU3RvcmVCYXNlIHtcbiAgICBzdGF0aWMgUFJPVEVDVEVEX0tFWVMgPSBQUk9URUNURURfS0VZUztcbiAgICBpc1Byb3RlY3RlZEtleShrZXkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUFJPVEVDVEVEX0tFWVMpLmluY2x1ZGVzKGtleSk7XG4gICAgfVxuICAgIGdldFJlcXVlc3RJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFBST1RFQ1RFRF9LRVlTLlJFUVVFU1RfSUQpID8/IFwiLVwiO1xuICAgIH1cbiAgICBnZXRYUmF5VHJhY2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KFBST1RFQ1RFRF9LRVlTLlhfUkFZX1RSQUNFX0lEKTtcbiAgICB9XG4gICAgZ2V0VGVuYW50SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChQUk9URUNURURfS0VZUy5URU5BTlRfSUQpO1xuICAgIH1cbn1cbmNsYXNzIEludm9rZVN0b3JlU2luZ2xlIGV4dGVuZHMgSW52b2tlU3RvcmVCYXNlIHtcbiAgICBjdXJyZW50Q29udGV4dDtcbiAgICBnZXRDb250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29udGV4dDtcbiAgICB9XG4gICAgaGFzQ29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbnRleHQgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29udGV4dD8uW2tleV07XG4gICAgfVxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUHJvdGVjdGVkS2V5KGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vZGlmeSBwcm90ZWN0ZWQgTGFtYmRhIGNvbnRleHQgZmllbGQ6ICR7U3RyaW5nKGtleSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IHRoaXMuY3VycmVudENvbnRleHQgfHwge307XG4gICAgICAgIHRoaXMuY3VycmVudENvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBydW4oY29udGV4dCwgZm4pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBJbnZva2VTdG9yZU11bHRpIGV4dGVuZHMgSW52b2tlU3RvcmVCYXNlIHtcbiAgICBhbHM7XG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZSgpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSW52b2tlU3RvcmVNdWx0aSgpO1xuICAgICAgICBjb25zdCBhc3luY0hvb2tzID0gYXdhaXQgaW1wb3J0KCdub2RlOmFzeW5jX2hvb2tzJyk7XG4gICAgICAgIGluc3RhbmNlLmFscyA9IG5ldyBhc3luY0hvb2tzLkFzeW5jTG9jYWxTdG9yYWdlKCk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gICAgZ2V0Q29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxzLmdldFN0b3JlKCk7XG4gICAgfVxuICAgIGhhc0NvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFscy5nZXRTdG9yZSgpICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxzLmdldFN0b3JlKCk/LltrZXldO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5pc1Byb3RlY3RlZEtleShrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb2RpZnkgcHJvdGVjdGVkIExhbWJkYSBjb250ZXh0IGZpZWxkOiAke1N0cmluZyhrZXkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5hbHMuZ2V0U3RvcmUoKTtcbiAgICAgICAgaWYgKCFzdG9yZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCBhdmFpbGFibGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmVba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICBydW4oY29udGV4dCwgZm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxzLnJ1bihjb250ZXh0LCBmbik7XG4gICAgfVxufVxuZXhwb3J0cy5JbnZva2VTdG9yZSA9IHZvaWQgMDtcbihmdW5jdGlvbiAoSW52b2tlU3RvcmUpIHtcbiAgICBsZXQgaW5zdGFuY2UgPSBudWxsO1xuICAgIGFzeW5jIGZ1bmN0aW9uIGdldEluc3RhbmNlQXN5bmMoKSB7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc011bHRpID0gXCJBV1NfTEFNQkRBX01BWF9DT05DVVJSRU5DWVwiIGluIHByb2Nlc3MuZW52O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaXNNdWx0aVxuICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IEludm9rZVN0b3JlTXVsdGkuY3JlYXRlKClcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgSW52b2tlU3RvcmVTaW5nbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIU5PX0dMT0JBTF9BV1NfTEFNQkRBICYmIGdsb2JhbFRoaXMuYXdzbGFtYmRhPy5JbnZva2VTdG9yZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcy5hd3NsYW1iZGEuSW52b2tlU3RvcmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFOT19HTE9CQUxfQVdTX0xBTUJEQSAmJiBnbG9iYWxUaGlzLmF3c2xhbWJkYSkge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLmF3c2xhbWJkYS5JbnZva2VTdG9yZSA9IG5ld0luc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIEludm9rZVN0b3JlLmdldEluc3RhbmNlQXN5bmMgPSBnZXRJbnN0YW5jZUFzeW5jO1xuICAgIEludm9rZVN0b3JlLl90ZXN0aW5nID0gcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9CRU5DSE1BUktfTU9ERSA9PT0gXCIxXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICByZXNldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGhpcy5hd3NsYW1iZGE/Lkludm9rZVN0b3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxUaGlzLmF3c2xhbWJkYS5JbnZva2VTdG9yZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5hd3NsYW1iZGEgPSB7fTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG59KShleHBvcnRzLkludm9rZVN0b3JlIHx8IChleHBvcnRzLkludm9rZVN0b3JlID0ge30pKTtcblxuZXhwb3J0cy5JbnZva2VTdG9yZUJhc2UgPSBJbnZva2VTdG9yZUJhc2U7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWN1cnNpb25EZXRlY3Rpb25NaWRkbGV3YXJlID0gdm9pZCAwO1xuY29uc3QgbGFtYmRhX2ludm9rZV9zdG9yZV8xID0gcmVxdWlyZShcIkBhd3MvbGFtYmRhLWludm9rZS1zdG9yZVwiKTtcbmNvbnN0IHByb3RvY29sX2h0dHBfMSA9IHJlcXVpcmUoXCJAc21pdGh5L3Byb3RvY29sLWh0dHBcIik7XG5jb25zdCBUUkFDRV9JRF9IRUFERVJfTkFNRSA9IFwiWC1BbXpuLVRyYWNlLUlkXCI7XG5jb25zdCBFTlZfTEFNQkRBX0ZVTkNUSU9OX05BTUUgPSBcIkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRVwiO1xuY29uc3QgRU5WX1RSQUNFX0lEID0gXCJfWF9BTVpOX1RSQUNFX0lEXCI7XG5jb25zdCByZWN1cnNpb25EZXRlY3Rpb25NaWRkbGV3YXJlID0gKCkgPT4gKG5leHQpID0+IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyByZXF1ZXN0IH0gPSBhcmdzO1xuICAgIGlmICghcHJvdG9jb2xfaHR0cF8xLkh0dHBSZXF1ZXN0LmlzSW5zdGFuY2UocmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoYXJncyk7XG4gICAgfVxuICAgIGNvbnN0IHRyYWNlSWRIZWFkZXIgPSBPYmplY3Qua2V5cyhyZXF1ZXN0LmhlYWRlcnMgPz8ge30pLmZpbmQoKGgpID0+IGgudG9Mb3dlckNhc2UoKSA9PT0gVFJBQ0VfSURfSEVBREVSX05BTUUudG9Mb3dlckNhc2UoKSkgPz9cbiAgICAgICAgVFJBQ0VfSURfSEVBREVSX05BTUU7XG4gICAgaWYgKHJlcXVlc3QuaGVhZGVycy5oYXNPd25Qcm9wZXJ0eSh0cmFjZUlkSGVhZGVyKSkge1xuICAgICAgICByZXR1cm4gbmV4dChhcmdzKTtcbiAgICB9XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnZbRU5WX0xBTUJEQV9GVU5DVElPTl9OQU1FXTtcbiAgICBjb25zdCB0cmFjZUlkRnJvbUVudiA9IHByb2Nlc3MuZW52W0VOVl9UUkFDRV9JRF07XG4gICAgY29uc3QgaW52b2tlU3RvcmUgPSBhd2FpdCBsYW1iZGFfaW52b2tlX3N0b3JlXzEuSW52b2tlU3RvcmUuZ2V0SW5zdGFuY2VBc3luYygpO1xuICAgIGNvbnN0IHRyYWNlSWRGcm9tSW52b2tlU3RvcmUgPSBpbnZva2VTdG9yZT8uZ2V0WFJheVRyYWNlSWQoKTtcbiAgICBjb25zdCB0cmFjZUlkID0gdHJhY2VJZEZyb21JbnZva2VTdG9yZSA/PyB0cmFjZUlkRnJvbUVudjtcbiAgICBjb25zdCBub25FbXB0eVN0cmluZyA9IChzdHIpID0+IHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCIgJiYgc3RyLmxlbmd0aCA+IDA7XG4gICAgaWYgKG5vbkVtcHR5U3RyaW5nKGZ1bmN0aW9uTmFtZSkgJiYgbm9uRW1wdHlTdHJpbmcodHJhY2VJZCkpIHtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1RSQUNFX0lEX0hFQURFUl9OQU1FXSA9IHRyYWNlSWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KHtcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICB9KTtcbn07XG5leHBvcnRzLnJlY3Vyc2lvbkRldGVjdGlvbk1pZGRsZXdhcmUgPSByZWN1cnNpb25EZXRlY3Rpb25NaWRkbGV3YXJlO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciByZWN1cnNpb25EZXRlY3Rpb25NaWRkbGV3YXJlID0gcmVxdWlyZSgnLi9yZWN1cnNpb25EZXRlY3Rpb25NaWRkbGV3YXJlJyk7XG5cbmNvbnN0IHJlY3Vyc2lvbkRldGVjdGlvbk1pZGRsZXdhcmVPcHRpb25zID0ge1xuICAgIHN0ZXA6IFwiYnVpbGRcIixcbiAgICB0YWdzOiBbXCJSRUNVUlNJT05fREVURUNUSU9OXCJdLFxuICAgIG5hbWU6IFwicmVjdXJzaW9uRGV0ZWN0aW9uTWlkZGxld2FyZVwiLFxuICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgIHByaW9yaXR5OiBcImxvd1wiLFxufTtcblxuY29uc3QgZ2V0UmVjdXJzaW9uRGV0ZWN0aW9uUGx1Z2luID0gKG9wdGlvbnMpID0+ICh7XG4gICAgYXBwbHlUb1N0YWNrOiAoY2xpZW50U3RhY2spID0+IHtcbiAgICAgICAgY2xpZW50U3RhY2suYWRkKHJlY3Vyc2lvbkRldGVjdGlvbk1pZGRsZXdhcmUucmVjdXJzaW9uRGV0ZWN0aW9uTWlkZGxld2FyZSgpLCByZWN1cnNpb25EZXRlY3Rpb25NaWRkbGV3YXJlT3B0aW9ucyk7XG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLmdldFJlY3Vyc2lvbkRldGVjdGlvblBsdWdpbiA9IGdldFJlY3Vyc2lvbkRldGVjdGlvblBsdWdpbjtcbk9iamVjdC5rZXlzKHJlY3Vyc2lvbkRldGVjdGlvbk1pZGRsZXdhcmUpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgaykpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVjdXJzaW9uRGV0ZWN0aW9uTWlkZGxld2FyZVtrXTsgfVxuICAgIH0pO1xufSk7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHByb3RvY29sSHR0cCA9IHJlcXVpcmUoJ0BzbWl0aHkvcHJvdG9jb2wtaHR0cCcpO1xuXG5jb25zdCBkZXNlcmlhbGl6ZXJNaWRkbGV3YXJlID0gKG9wdGlvbnMsIGRlc2VyaWFsaXplcikgPT4gKG5leHQsIGNvbnRleHQpID0+IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgY29uc3QgeyByZXNwb25zZSB9ID0gYXdhaXQgbmV4dChhcmdzKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCBkZXNlcmlhbGl6ZXIocmVzcG9uc2UsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICBvdXRwdXQ6IHBhcnNlZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgXCIkcmVzcG9uc2VcIiwge1xuICAgICAgICAgICAgdmFsdWU6IHJlc3BvbnNlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCEoXCIkbWV0YWRhdGFcIiBpbiBlcnJvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGhpbnQgPSBgRGVzZXJpYWxpemF0aW9uIGVycm9yOiB0byBzZWUgdGhlIHJhdyByZXNwb25zZSwgaW5zcGVjdCB0aGUgaGlkZGVuIGZpZWxkIHtlcnJvcn0uJHJlc3BvbnNlIG9uIHRoaXMgb2JqZWN0LmA7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gXCJcXG4gIFwiICsgaGludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmxvZ2dlciB8fCBjb250ZXh0LmxvZ2dlcj8uY29uc3RydWN0b3I/Lm5hbWUgPT09IFwiTm9PcExvZ2dlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihoaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyPy53YXJuPy4oaGludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvci4kcmVzcG9uc2VCb2R5VGV4dCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci4kcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuJHJlc3BvbnNlLmJvZHkgPSBlcnJvci4kcmVzcG9uc2VCb2R5VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbEh0dHAuSHR0cFJlc3BvbnNlLmlzSW5zdGFuY2UocmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVhZGVycyA9IHt9IH0gPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci4kbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwU3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogZmluZEhlYWRlcigvXngtW1xcdy1dKy1yZXF1ZXN0LT9pZCQvLCBoZWFkZXJFbnRyaWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkUmVxdWVzdElkOiBmaW5kSGVhZGVyKC9eeC1bXFx3LV0rLWlkLTIkLywgaGVhZGVyRW50cmllcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBjZklkOiBmaW5kSGVhZGVyKC9eeC1bXFx3LV0rLWNmLWlkJC8sIGhlYWRlckVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbmNvbnN0IGZpbmRIZWFkZXIgPSAocGF0dGVybiwgaGVhZGVycykgPT4ge1xuICAgIHJldHVybiAoaGVhZGVycy5maW5kKChba10pID0+IHtcbiAgICAgICAgcmV0dXJuIGsubWF0Y2gocGF0dGVybik7XG4gICAgfSkgfHwgW3ZvaWQgMCwgdm9pZCAwXSlbMV07XG59O1xuXG5jb25zdCBzZXJpYWxpemVyTWlkZGxld2FyZSA9IChvcHRpb25zLCBzZXJpYWxpemVyKSA9PiAobmV4dCwgY29udGV4dCkgPT4gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBjb25zdCBlbmRwb2ludENvbmZpZyA9IG9wdGlvbnM7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBjb250ZXh0LmVuZHBvaW50VjI/LnVybCAmJiBlbmRwb2ludENvbmZpZy51cmxQYXJzZXJcbiAgICAgICAgPyBhc3luYyAoKSA9PiBlbmRwb2ludENvbmZpZy51cmxQYXJzZXIoY29udGV4dC5lbmRwb2ludFYyLnVybClcbiAgICAgICAgOiBlbmRwb2ludENvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHZhbGlkIGVuZHBvaW50IHByb3ZpZGVyIGF2YWlsYWJsZS5cIik7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBzZXJpYWxpemVyKGFyZ3MuaW5wdXQsIHsgLi4ub3B0aW9ucywgZW5kcG9pbnQgfSk7XG4gICAgcmV0dXJuIG5leHQoe1xuICAgICAgICAuLi5hcmdzLFxuICAgICAgICByZXF1ZXN0LFxuICAgIH0pO1xufTtcblxuY29uc3QgZGVzZXJpYWxpemVyTWlkZGxld2FyZU9wdGlvbiA9IHtcbiAgICBuYW1lOiBcImRlc2VyaWFsaXplck1pZGRsZXdhcmVcIixcbiAgICBzdGVwOiBcImRlc2VyaWFsaXplXCIsXG4gICAgdGFnczogW1wiREVTRVJJQUxJWkVSXCJdLFxuICAgIG92ZXJyaWRlOiB0cnVlLFxufTtcbmNvbnN0IHNlcmlhbGl6ZXJNaWRkbGV3YXJlT3B0aW9uID0ge1xuICAgIG5hbWU6IFwic2VyaWFsaXplck1pZGRsZXdhcmVcIixcbiAgICBzdGVwOiBcInNlcmlhbGl6ZVwiLFxuICAgIHRhZ3M6IFtcIlNFUklBTElaRVJcIl0sXG4gICAgb3ZlcnJpZGU6IHRydWUsXG59O1xuZnVuY3Rpb24gZ2V0U2VyZGVQbHVnaW4oY29uZmlnLCBzZXJpYWxpemVyLCBkZXNlcmlhbGl6ZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhcHBseVRvU3RhY2s6IChjb21tYW5kU3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbW1hbmRTdGFjay5hZGQoZGVzZXJpYWxpemVyTWlkZGxld2FyZShjb25maWcsIGRlc2VyaWFsaXplciksIGRlc2VyaWFsaXplck1pZGRsZXdhcmVPcHRpb24pO1xuICAgICAgICAgICAgY29tbWFuZFN0YWNrLmFkZChzZXJpYWxpemVyTWlkZGxld2FyZShjb25maWcsIHNlcmlhbGl6ZXIpLCBzZXJpYWxpemVyTWlkZGxld2FyZU9wdGlvbik7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZXhwb3J0cy5kZXNlcmlhbGl6ZXJNaWRkbGV3YXJlID0gZGVzZXJpYWxpemVyTWlkZGxld2FyZTtcbmV4cG9ydHMuZGVzZXJpYWxpemVyTWlkZGxld2FyZU9wdGlvbiA9IGRlc2VyaWFsaXplck1pZGRsZXdhcmVPcHRpb247XG5leHBvcnRzLmdldFNlcmRlUGx1Z2luID0gZ2V0U2VyZGVQbHVnaW47XG5leHBvcnRzLnNlcmlhbGl6ZXJNaWRkbGV3YXJlID0gc2VyaWFsaXplck1pZGRsZXdhcmU7XG5leHBvcnRzLnNlcmlhbGl6ZXJNaWRkbGV3YXJlT3B0aW9uID0gc2VyaWFsaXplck1pZGRsZXdhcmVPcHRpb247XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHR5cGVzID0gcmVxdWlyZSgnQHNtaXRoeS90eXBlcycpO1xudmFyIHV0aWxNaWRkbGV3YXJlID0gcmVxdWlyZSgnQHNtaXRoeS91dGlsLW1pZGRsZXdhcmUnKTtcbnZhciBtaWRkbGV3YXJlU2VyZGUgPSByZXF1aXJlKCdAc21pdGh5L21pZGRsZXdhcmUtc2VyZGUnKTtcbnZhciBwcm90b2NvbEh0dHAgPSByZXF1aXJlKCdAc21pdGh5L3Byb3RvY29sLWh0dHAnKTtcbnZhciBwcm90b2NvbHMgPSByZXF1aXJlKCdAc21pdGh5L2NvcmUvcHJvdG9jb2xzJyk7XG5cbmNvbnN0IGdldFNtaXRoeUNvbnRleHQgPSAoY29udGV4dCkgPT4gY29udGV4dFt0eXBlcy5TTUlUSFlfQ09OVEVYVF9LRVldIHx8IChjb250ZXh0W3R5cGVzLlNNSVRIWV9DT05URVhUX0tFWV0gPSB7fSk7XG5cbmNvbnN0IHJlc29sdmVBdXRoT3B0aW9ucyA9IChjYW5kaWRhdGVBdXRoT3B0aW9ucywgYXV0aFNjaGVtZVByZWZlcmVuY2UpID0+IHtcbiAgICBpZiAoIWF1dGhTY2hlbWVQcmVmZXJlbmNlIHx8IGF1dGhTY2hlbWVQcmVmZXJlbmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlQXV0aE9wdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IHByZWZlcnJlZEF1dGhPcHRpb25zID0gW107XG4gICAgZm9yIChjb25zdCBwcmVmZXJyZWRTY2hlbWVOYW1lIG9mIGF1dGhTY2hlbWVQcmVmZXJlbmNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlQXV0aE9wdGlvbiBvZiBjYW5kaWRhdGVBdXRoT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlQXV0aFNjaGVtZU5hbWUgPSBjYW5kaWRhdGVBdXRoT3B0aW9uLnNjaGVtZUlkLnNwbGl0KFwiI1wiKVsxXTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVBdXRoU2NoZW1lTmFtZSA9PT0gcHJlZmVycmVkU2NoZW1lTmFtZSkge1xuICAgICAgICAgICAgICAgIHByZWZlcnJlZEF1dGhPcHRpb25zLnB1c2goY2FuZGlkYXRlQXV0aE9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVBdXRoT3B0aW9uIG9mIGNhbmRpZGF0ZUF1dGhPcHRpb25zKSB7XG4gICAgICAgIGlmICghcHJlZmVycmVkQXV0aE9wdGlvbnMuZmluZCgoeyBzY2hlbWVJZCB9KSA9PiBzY2hlbWVJZCA9PT0gY2FuZGlkYXRlQXV0aE9wdGlvbi5zY2hlbWVJZCkpIHtcbiAgICAgICAgICAgIHByZWZlcnJlZEF1dGhPcHRpb25zLnB1c2goY2FuZGlkYXRlQXV0aE9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByZWZlcnJlZEF1dGhPcHRpb25zO1xufTtcblxuZnVuY3Rpb24gY29udmVydEh0dHBBdXRoU2NoZW1lc1RvTWFwKGh0dHBBdXRoU2NoZW1lcykge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBodHRwQXV0aFNjaGVtZXMpIHtcbiAgICAgICAgbWFwLnNldChzY2hlbWUuc2NoZW1lSWQsIHNjaGVtZSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5jb25zdCBodHRwQXV0aFNjaGVtZU1pZGRsZXdhcmUgPSAoY29uZmlnLCBtd09wdGlvbnMpID0+IChuZXh0LCBjb250ZXh0KSA9PiBhc3luYyAoYXJncykgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuaHR0cEF1dGhTY2hlbWVQcm92aWRlcihhd2FpdCBtd09wdGlvbnMuaHR0cEF1dGhTY2hlbWVQYXJhbWV0ZXJzUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBhcmdzLmlucHV0KSk7XG4gICAgY29uc3QgYXV0aFNjaGVtZVByZWZlcmVuY2UgPSBjb25maWcuYXV0aFNjaGVtZVByZWZlcmVuY2UgPyBhd2FpdCBjb25maWcuYXV0aFNjaGVtZVByZWZlcmVuY2UoKSA6IFtdO1xuICAgIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHJlc29sdmVBdXRoT3B0aW9ucyhvcHRpb25zLCBhdXRoU2NoZW1lUHJlZmVyZW5jZSk7XG4gICAgY29uc3QgYXV0aFNjaGVtZXMgPSBjb252ZXJ0SHR0cEF1dGhTY2hlbWVzVG9NYXAoY29uZmlnLmh0dHBBdXRoU2NoZW1lcyk7XG4gICAgY29uc3Qgc21pdGh5Q29udGV4dCA9IHV0aWxNaWRkbGV3YXJlLmdldFNtaXRoeUNvbnRleHQoY29udGV4dCk7XG4gICAgY29uc3QgZmFpbHVyZVJlYXNvbnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiByZXNvbHZlZE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1lID0gYXV0aFNjaGVtZXMuZ2V0KG9wdGlvbi5zY2hlbWVJZCk7XG4gICAgICAgIGlmICghc2NoZW1lKSB7XG4gICAgICAgICAgICBmYWlsdXJlUmVhc29ucy5wdXNoKGBIdHRwQXV0aFNjaGVtZSBcXGAke29wdGlvbi5zY2hlbWVJZH1cXGAgd2FzIG5vdCBlbmFibGVkIGZvciB0aGlzIHNlcnZpY2UuYCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZGVudGl0eVByb3ZpZGVyID0gc2NoZW1lLmlkZW50aXR5UHJvdmlkZXIoYXdhaXQgbXdPcHRpb25zLmlkZW50aXR5UHJvdmlkZXJDb25maWdQcm92aWRlcihjb25maWcpKTtcbiAgICAgICAgaWYgKCFpZGVudGl0eVByb3ZpZGVyKSB7XG4gICAgICAgICAgICBmYWlsdXJlUmVhc29ucy5wdXNoKGBIdHRwQXV0aFNjaGVtZSBcXGAke29wdGlvbi5zY2hlbWVJZH1cXGAgZGlkIG5vdCBoYXZlIGFuIElkZW50aXR5UHJvdmlkZXIgY29uZmlndXJlZC5gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaWRlbnRpdHlQcm9wZXJ0aWVzID0ge30sIHNpZ25pbmdQcm9wZXJ0aWVzID0ge30gfSA9IG9wdGlvbi5wcm9wZXJ0aWVzRXh0cmFjdG9yPy4oY29uZmlnLCBjb250ZXh0KSB8fCB7fTtcbiAgICAgICAgb3B0aW9uLmlkZW50aXR5UHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24ob3B0aW9uLmlkZW50aXR5UHJvcGVydGllcyB8fCB7fSwgaWRlbnRpdHlQcm9wZXJ0aWVzKTtcbiAgICAgICAgb3B0aW9uLnNpZ25pbmdQcm9wZXJ0aWVzID0gT2JqZWN0LmFzc2lnbihvcHRpb24uc2lnbmluZ1Byb3BlcnRpZXMgfHwge30sIHNpZ25pbmdQcm9wZXJ0aWVzKTtcbiAgICAgICAgc21pdGh5Q29udGV4dC5zZWxlY3RlZEh0dHBBdXRoU2NoZW1lID0ge1xuICAgICAgICAgICAgaHR0cEF1dGhPcHRpb246IG9wdGlvbixcbiAgICAgICAgICAgIGlkZW50aXR5OiBhd2FpdCBpZGVudGl0eVByb3ZpZGVyKG9wdGlvbi5pZGVudGl0eVByb3BlcnRpZXMpLFxuICAgICAgICAgICAgc2lnbmVyOiBzY2hlbWUuc2lnbmVyLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFzbWl0aHlDb250ZXh0LnNlbGVjdGVkSHR0cEF1dGhTY2hlbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVSZWFzb25zLmpvaW4oXCJcXG5cIikpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhcmdzKTtcbn07XG5cbmNvbnN0IGh0dHBBdXRoU2NoZW1lRW5kcG9pbnRSdWxlU2V0TWlkZGxld2FyZU9wdGlvbnMgPSB7XG4gICAgc3RlcDogXCJzZXJpYWxpemVcIixcbiAgICB0YWdzOiBbXCJIVFRQX0FVVEhfU0NIRU1FXCJdLFxuICAgIG5hbWU6IFwiaHR0cEF1dGhTY2hlbWVNaWRkbGV3YXJlXCIsXG4gICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgcmVsYXRpb246IFwiYmVmb3JlXCIsXG4gICAgdG9NaWRkbGV3YXJlOiBcImVuZHBvaW50VjJNaWRkbGV3YXJlXCIsXG59O1xuY29uc3QgZ2V0SHR0cEF1dGhTY2hlbWVFbmRwb2ludFJ1bGVTZXRQbHVnaW4gPSAoY29uZmlnLCB7IGh0dHBBdXRoU2NoZW1lUGFyYW1ldGVyc1Byb3ZpZGVyLCBpZGVudGl0eVByb3ZpZGVyQ29uZmlnUHJvdmlkZXIsIH0pID0+ICh7XG4gICAgYXBwbHlUb1N0YWNrOiAoY2xpZW50U3RhY2spID0+IHtcbiAgICAgICAgY2xpZW50U3RhY2suYWRkUmVsYXRpdmVUbyhodHRwQXV0aFNjaGVtZU1pZGRsZXdhcmUoY29uZmlnLCB7XG4gICAgICAgICAgICBodHRwQXV0aFNjaGVtZVBhcmFtZXRlcnNQcm92aWRlcixcbiAgICAgICAgICAgIGlkZW50aXR5UHJvdmlkZXJDb25maWdQcm92aWRlcixcbiAgICAgICAgfSksIGh0dHBBdXRoU2NoZW1lRW5kcG9pbnRSdWxlU2V0TWlkZGxld2FyZU9wdGlvbnMpO1xuICAgIH0sXG59KTtcblxuY29uc3QgaHR0cEF1dGhTY2hlbWVNaWRkbGV3YXJlT3B0aW9ucyA9IHtcbiAgICBzdGVwOiBcInNlcmlhbGl6ZVwiLFxuICAgIHRhZ3M6IFtcIkhUVFBfQVVUSF9TQ0hFTUVcIl0sXG4gICAgbmFtZTogXCJodHRwQXV0aFNjaGVtZU1pZGRsZXdhcmVcIixcbiAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICByZWxhdGlvbjogXCJiZWZvcmVcIixcbiAgICB0b01pZGRsZXdhcmU6IG1pZGRsZXdhcmVTZXJkZS5zZXJpYWxpemVyTWlkZGxld2FyZU9wdGlvbi5uYW1lLFxufTtcbmNvbnN0IGdldEh0dHBBdXRoU2NoZW1lUGx1Z2luID0gKGNvbmZpZywgeyBodHRwQXV0aFNjaGVtZVBhcmFtZXRlcnNQcm92aWRlciwgaWRlbnRpdHlQcm92aWRlckNvbmZpZ1Byb3ZpZGVyLCB9KSA9PiAoe1xuICAgIGFwcGx5VG9TdGFjazogKGNsaWVudFN0YWNrKSA9PiB7XG4gICAgICAgIGNsaWVudFN0YWNrLmFkZFJlbGF0aXZlVG8oaHR0cEF1dGhTY2hlbWVNaWRkbGV3YXJlKGNvbmZpZywge1xuICAgICAgICAgICAgaHR0cEF1dGhTY2hlbWVQYXJhbWV0ZXJzUHJvdmlkZXIsXG4gICAgICAgICAgICBpZGVudGl0eVByb3ZpZGVyQ29uZmlnUHJvdmlkZXIsXG4gICAgICAgIH0pLCBodHRwQXV0aFNjaGVtZU1pZGRsZXdhcmVPcHRpb25zKTtcbiAgICB9LFxufSk7XG5cbmNvbnN0IGRlZmF1bHRFcnJvckhhbmRsZXIgPSAoc2lnbmluZ1Byb3BlcnRpZXMpID0+IChlcnJvcikgPT4ge1xuICAgIHRocm93IGVycm9yO1xufTtcbmNvbnN0IGRlZmF1bHRTdWNjZXNzSGFuZGxlciA9IChodHRwUmVzcG9uc2UsIHNpZ25pbmdQcm9wZXJ0aWVzKSA9PiB7IH07XG5jb25zdCBodHRwU2lnbmluZ01pZGRsZXdhcmUgPSAoY29uZmlnKSA9PiAobmV4dCwgY29udGV4dCkgPT4gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBpZiAoIXByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5pc0luc3RhbmNlKGFyZ3MucmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoYXJncyk7XG4gICAgfVxuICAgIGNvbnN0IHNtaXRoeUNvbnRleHQgPSB1dGlsTWlkZGxld2FyZS5nZXRTbWl0aHlDb250ZXh0KGNvbnRleHQpO1xuICAgIGNvbnN0IHNjaGVtZSA9IHNtaXRoeUNvbnRleHQuc2VsZWN0ZWRIdHRwQXV0aFNjaGVtZTtcbiAgICBpZiAoIXNjaGVtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIEh0dHBBdXRoU2NoZW1lIHdhcyBzZWxlY3RlZDogdW5hYmxlIHRvIHNpZ24gcmVxdWVzdGApO1xuICAgIH1cbiAgICBjb25zdCB7IGh0dHBBdXRoT3B0aW9uOiB7IHNpZ25pbmdQcm9wZXJ0aWVzID0ge30gfSwgaWRlbnRpdHksIHNpZ25lciwgfSA9IHNjaGVtZTtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBuZXh0KHtcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICAgcmVxdWVzdDogYXdhaXQgc2lnbmVyLnNpZ24oYXJncy5yZXF1ZXN0LCBpZGVudGl0eSwgc2lnbmluZ1Byb3BlcnRpZXMpLFxuICAgIH0pLmNhdGNoKChzaWduZXIuZXJyb3JIYW5kbGVyIHx8IGRlZmF1bHRFcnJvckhhbmRsZXIpKHNpZ25pbmdQcm9wZXJ0aWVzKSk7XG4gICAgKHNpZ25lci5zdWNjZXNzSGFuZGxlciB8fCBkZWZhdWx0U3VjY2Vzc0hhbmRsZXIpKG91dHB1dC5yZXNwb25zZSwgc2lnbmluZ1Byb3BlcnRpZXMpO1xuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuXG5jb25zdCBodHRwU2lnbmluZ01pZGRsZXdhcmVPcHRpb25zID0ge1xuICAgIHN0ZXA6IFwiZmluYWxpemVSZXF1ZXN0XCIsXG4gICAgdGFnczogW1wiSFRUUF9TSUdOSU5HXCJdLFxuICAgIG5hbWU6IFwiaHR0cFNpZ25pbmdNaWRkbGV3YXJlXCIsXG4gICAgYWxpYXNlczogW1wiYXBpS2V5TWlkZGxld2FyZVwiLCBcInRva2VuTWlkZGxld2FyZVwiLCBcImF3c0F1dGhNaWRkbGV3YXJlXCJdLFxuICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgIHJlbGF0aW9uOiBcImFmdGVyXCIsXG4gICAgdG9NaWRkbGV3YXJlOiBcInJldHJ5TWlkZGxld2FyZVwiLFxufTtcbmNvbnN0IGdldEh0dHBTaWduaW5nUGx1Z2luID0gKGNvbmZpZykgPT4gKHtcbiAgICBhcHBseVRvU3RhY2s6IChjbGllbnRTdGFjaykgPT4ge1xuICAgICAgICBjbGllbnRTdGFjay5hZGRSZWxhdGl2ZVRvKGh0dHBTaWduaW5nTWlkZGxld2FyZSgpLCBodHRwU2lnbmluZ01pZGRsZXdhcmVPcHRpb25zKTtcbiAgICB9LFxufSk7XG5cbmNvbnN0IG5vcm1hbGl6ZVByb3ZpZGVyID0gKGlucHV0KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgY29uc3QgcHJvbWlzaWZpZWQgPSBQcm9taXNlLnJlc29sdmUoaW5wdXQpO1xuICAgIHJldHVybiAoKSA9PiBwcm9taXNpZmllZDtcbn07XG5cbmNvbnN0IG1ha2VQYWdlZENsaWVudFJlcXVlc3QgPSBhc3luYyAoQ29tbWFuZEN0b3IsIGNsaWVudCwgaW5wdXQsIHdpdGhDb21tYW5kID0gKF8pID0+IF8sIC4uLmFyZ3MpID0+IHtcbiAgICBsZXQgY29tbWFuZCA9IG5ldyBDb21tYW5kQ3RvcihpbnB1dCk7XG4gICAgY29tbWFuZCA9IHdpdGhDb21tYW5kKGNvbW1hbmQpID8/IGNvbW1hbmQ7XG4gICAgcmV0dXJuIGF3YWl0IGNsaWVudC5zZW5kKGNvbW1hbmQsIC4uLmFyZ3MpO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVBhZ2luYXRvcihDbGllbnRDdG9yLCBDb21tYW5kQ3RvciwgaW5wdXRUb2tlbk5hbWUsIG91dHB1dFRva2VuTmFtZSwgcGFnZVNpemVUb2tlbk5hbWUpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIHBhZ2luYXRlT3BlcmF0aW9uKGNvbmZpZywgaW5wdXQsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMpIHtcbiAgICAgICAgY29uc3QgX2lucHV0ID0gaW5wdXQ7XG4gICAgICAgIGxldCB0b2tlbiA9IGNvbmZpZy5zdGFydGluZ1Rva2VuID8/IF9pbnB1dFtpbnB1dFRva2VuTmFtZV07XG4gICAgICAgIGxldCBoYXNOZXh0ID0gdHJ1ZTtcbiAgICAgICAgbGV0IHBhZ2U7XG4gICAgICAgIHdoaWxlIChoYXNOZXh0KSB7XG4gICAgICAgICAgICBfaW5wdXRbaW5wdXRUb2tlbk5hbWVdID0gdG9rZW47XG4gICAgICAgICAgICBpZiAocGFnZVNpemVUb2tlbk5hbWUpIHtcbiAgICAgICAgICAgICAgICBfaW5wdXRbcGFnZVNpemVUb2tlbk5hbWVdID0gX2lucHV0W3BhZ2VTaXplVG9rZW5OYW1lXSA/PyBjb25maWcucGFnZVNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLmNsaWVudCBpbnN0YW5jZW9mIENsaWVudEN0b3IpIHtcbiAgICAgICAgICAgICAgICBwYWdlID0gYXdhaXQgbWFrZVBhZ2VkQ2xpZW50UmVxdWVzdChDb21tYW5kQ3RvciwgY29uZmlnLmNsaWVudCwgaW5wdXQsIGNvbmZpZy53aXRoQ29tbWFuZCwgLi4uYWRkaXRpb25hbEFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2xpZW50LCBleHBlY3RlZCBpbnN0YW5jZSBvZiAke0NsaWVudEN0b3IubmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHBhZ2U7XG4gICAgICAgICAgICBjb25zdCBwcmV2VG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgIHRva2VuID0gZ2V0KHBhZ2UsIG91dHB1dFRva2VuTmFtZSk7XG4gICAgICAgICAgICBoYXNOZXh0ID0gISEodG9rZW4gJiYgKCFjb25maWcuc3RvcE9uU2FtZVRva2VuIHx8IHRva2VuICE9PSBwcmV2VG9rZW4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG59XG5jb25zdCBnZXQgPSAoZnJvbU9iamVjdCwgcGF0aCkgPT4ge1xuICAgIGxldCBjdXJzb3IgPSBmcm9tT2JqZWN0O1xuICAgIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIHBhdGhDb21wb25lbnRzKSB7XG4gICAgICAgIGlmICghY3Vyc29yIHx8IHR5cGVvZiBjdXJzb3IgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yID0gY3Vyc29yW3N0ZXBdO1xuICAgIH1cbiAgICByZXR1cm4gY3Vyc29yO1xufTtcblxuZnVuY3Rpb24gc2V0RmVhdHVyZShjb250ZXh0LCBmZWF0dXJlLCB2YWx1ZSkge1xuICAgIGlmICghY29udGV4dC5fX3NtaXRoeV9jb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuX19zbWl0aHlfY29udGV4dCA9IHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiB7fSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWNvbnRleHQuX19zbWl0aHlfY29udGV4dC5mZWF0dXJlcykge1xuICAgICAgICBjb250ZXh0Ll9fc21pdGh5X2NvbnRleHQuZmVhdHVyZXMgPSB7fTtcbiAgICB9XG4gICAgY29udGV4dC5fX3NtaXRoeV9jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdID0gdmFsdWU7XG59XG5cbmNsYXNzIERlZmF1bHRJZGVudGl0eVByb3ZpZGVyQ29uZmlnIHtcbiAgICBhdXRoU2NoZW1lcyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhTY2hlbWVzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRJZGVudGl0eVByb3ZpZGVyKHNjaGVtZUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhTY2hlbWVzLmdldChzY2hlbWVJZCk7XG4gICAgfVxufVxuXG5jbGFzcyBIdHRwQXBpS2V5QXV0aFNpZ25lciB7XG4gICAgYXN5bmMgc2lnbihodHRwUmVxdWVzdCwgaWRlbnRpdHksIHNpZ25pbmdQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmICghc2lnbmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlcXVlc3QgY291bGQgbm90IGJlIHNpZ25lZCB3aXRoIGBhcGlLZXlgIHNpbmNlIHRoZSBgbmFtZWAgYW5kIGBpbmAgc2lnbmVyIHByb3BlcnRpZXMgYXJlIG1pc3NpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaWduaW5nUHJvcGVydGllcy5uYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXF1ZXN0IGNvdWxkIG5vdCBiZSBzaWduZWQgd2l0aCBgYXBpS2V5YCBzaW5jZSB0aGUgYG5hbWVgIHNpZ25lciBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2lnbmluZ1Byb3BlcnRpZXMuaW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlcXVlc3QgY291bGQgbm90IGJlIHNpZ25lZCB3aXRoIGBhcGlLZXlgIHNpbmNlIHRoZSBgaW5gIHNpZ25lciBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaWRlbnRpdHkuYXBpS2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXF1ZXN0IGNvdWxkIG5vdCBiZSBzaWduZWQgd2l0aCBgYXBpS2V5YCBzaW5jZSB0aGUgYGFwaUtleWAgaXMgbm90IGRlZmluZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xvbmVkUmVxdWVzdCA9IHByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5jbG9uZShodHRwUmVxdWVzdCk7XG4gICAgICAgIGlmIChzaWduaW5nUHJvcGVydGllcy5pbiA9PT0gdHlwZXMuSHR0cEFwaUtleUF1dGhMb2NhdGlvbi5RVUVSWSkge1xuICAgICAgICAgICAgY2xvbmVkUmVxdWVzdC5xdWVyeVtzaWduaW5nUHJvcGVydGllcy5uYW1lXSA9IGlkZW50aXR5LmFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzaWduaW5nUHJvcGVydGllcy5pbiA9PT0gdHlwZXMuSHR0cEFwaUtleUF1dGhMb2NhdGlvbi5IRUFERVIpIHtcbiAgICAgICAgICAgIGNsb25lZFJlcXVlc3QuaGVhZGVyc1tzaWduaW5nUHJvcGVydGllcy5uYW1lXSA9IHNpZ25pbmdQcm9wZXJ0aWVzLnNjaGVtZVxuICAgICAgICAgICAgICAgID8gYCR7c2lnbmluZ1Byb3BlcnRpZXMuc2NoZW1lfSAke2lkZW50aXR5LmFwaUtleX1gXG4gICAgICAgICAgICAgICAgOiBpZGVudGl0eS5hcGlLZXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXF1ZXN0IGNhbiBvbmx5IGJlIHNpZ25lZCB3aXRoIGBhcGlLZXlgIGxvY2F0aW9ucyBgcXVlcnlgIG9yIGBoZWFkZXJgLCBcIiArXG4gICAgICAgICAgICAgICAgXCJidXQgZm91bmQ6IGBcIiArXG4gICAgICAgICAgICAgICAgc2lnbmluZ1Byb3BlcnRpZXMuaW4gK1xuICAgICAgICAgICAgICAgIFwiYFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmVkUmVxdWVzdDtcbiAgICB9XG59XG5cbmNsYXNzIEh0dHBCZWFyZXJBdXRoU2lnbmVyIHtcbiAgICBhc3luYyBzaWduKGh0dHBSZXF1ZXN0LCBpZGVudGl0eSwgc2lnbmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgY2xvbmVkUmVxdWVzdCA9IHByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5jbG9uZShodHRwUmVxdWVzdCk7XG4gICAgICAgIGlmICghaWRlbnRpdHkudG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlcXVlc3QgY291bGQgbm90IGJlIHNpZ25lZCB3aXRoIGB0b2tlbmAgc2luY2UgdGhlIGB0b2tlbmAgaXMgbm90IGRlZmluZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmVkUmVxdWVzdC5oZWFkZXJzW1wiQXV0aG9yaXphdGlvblwiXSA9IGBCZWFyZXIgJHtpZGVudGl0eS50b2tlbn1gO1xuICAgICAgICByZXR1cm4gY2xvbmVkUmVxdWVzdDtcbiAgICB9XG59XG5cbmNsYXNzIE5vQXV0aFNpZ25lciB7XG4gICAgYXN5bmMgc2lnbihodHRwUmVxdWVzdCwgaWRlbnRpdHksIHNpZ25pbmdQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiBodHRwUmVxdWVzdDtcbiAgICB9XG59XG5cbmNvbnN0IGNyZWF0ZUlzSWRlbnRpdHlFeHBpcmVkRnVuY3Rpb24gPSAoZXhwaXJhdGlvbk1zKSA9PiBmdW5jdGlvbiBpc0lkZW50aXR5RXhwaXJlZChpZGVudGl0eSkge1xuICAgIHJldHVybiBkb2VzSWRlbnRpdHlSZXF1aXJlUmVmcmVzaChpZGVudGl0eSkgJiYgaWRlbnRpdHkuZXhwaXJhdGlvbi5nZXRUaW1lKCkgLSBEYXRlLm5vdygpIDwgZXhwaXJhdGlvbk1zO1xufTtcbmNvbnN0IEVYUElSQVRJT05fTVMgPSAzMDBfMDAwO1xuY29uc3QgaXNJZGVudGl0eUV4cGlyZWQgPSBjcmVhdGVJc0lkZW50aXR5RXhwaXJlZEZ1bmN0aW9uKEVYUElSQVRJT05fTVMpO1xuY29uc3QgZG9lc0lkZW50aXR5UmVxdWlyZVJlZnJlc2ggPSAoaWRlbnRpdHkpID0+IGlkZW50aXR5LmV4cGlyYXRpb24gIT09IHVuZGVmaW5lZDtcbmNvbnN0IG1lbW9pemVJZGVudGl0eVByb3ZpZGVyID0gKHByb3ZpZGVyLCBpc0V4cGlyZWQsIHJlcXVpcmVzUmVmcmVzaCkgPT4ge1xuICAgIGlmIChwcm92aWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm92aWRlciA9IHR5cGVvZiBwcm92aWRlciAhPT0gXCJmdW5jdGlvblwiID8gYXN5bmMgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHByb3ZpZGVyKSA6IHByb3ZpZGVyO1xuICAgIGxldCByZXNvbHZlZDtcbiAgICBsZXQgcGVuZGluZztcbiAgICBsZXQgaGFzUmVzdWx0O1xuICAgIGxldCBpc0NvbnN0YW50ID0gZmFsc2U7XG4gICAgY29uc3QgY29hbGVzY2VQcm92aWRlciA9IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICAgICAgcGVuZGluZyA9IG5vcm1hbGl6ZWRQcm92aWRlcihvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBwZW5kaW5nO1xuICAgICAgICAgICAgaGFzUmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlzQ29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH07XG4gICAgaWYgKGlzRXhwaXJlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKCFoYXNSZXN1bHQgfHwgb3B0aW9ucz8uZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBjb2FsZXNjZVByb3ZpZGVyKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKCFoYXNSZXN1bHQgfHwgb3B0aW9ucz8uZm9yY2VSZWZyZXNoKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IGNvYWxlc2NlUHJvdmlkZXIob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ29uc3RhbnQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlcXVpcmVzUmVmcmVzaChyZXNvbHZlZCkpIHtcbiAgICAgICAgICAgIGlzQ29uc3RhbnQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0V4cGlyZWQocmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBjb2FsZXNjZVByb3ZpZGVyKG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9O1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVxdWVzdEJ1aWxkZXJcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm90b2NvbHMucmVxdWVzdEJ1aWxkZXI7IH1cbn0pO1xuZXhwb3J0cy5EZWZhdWx0SWRlbnRpdHlQcm92aWRlckNvbmZpZyA9IERlZmF1bHRJZGVudGl0eVByb3ZpZGVyQ29uZmlnO1xuZXhwb3J0cy5FWFBJUkFUSU9OX01TID0gRVhQSVJBVElPTl9NUztcbmV4cG9ydHMuSHR0cEFwaUtleUF1dGhTaWduZXIgPSBIdHRwQXBpS2V5QXV0aFNpZ25lcjtcbmV4cG9ydHMuSHR0cEJlYXJlckF1dGhTaWduZXIgPSBIdHRwQmVhcmVyQXV0aFNpZ25lcjtcbmV4cG9ydHMuTm9BdXRoU2lnbmVyID0gTm9BdXRoU2lnbmVyO1xuZXhwb3J0cy5jcmVhdGVJc0lkZW50aXR5RXhwaXJlZEZ1bmN0aW9uID0gY3JlYXRlSXNJZGVudGl0eUV4cGlyZWRGdW5jdGlvbjtcbmV4cG9ydHMuY3JlYXRlUGFnaW5hdG9yID0gY3JlYXRlUGFnaW5hdG9yO1xuZXhwb3J0cy5kb2VzSWRlbnRpdHlSZXF1aXJlUmVmcmVzaCA9IGRvZXNJZGVudGl0eVJlcXVpcmVSZWZyZXNoO1xuZXhwb3J0cy5nZXRIdHRwQXV0aFNjaGVtZUVuZHBvaW50UnVsZVNldFBsdWdpbiA9IGdldEh0dHBBdXRoU2NoZW1lRW5kcG9pbnRSdWxlU2V0UGx1Z2luO1xuZXhwb3J0cy5nZXRIdHRwQXV0aFNjaGVtZVBsdWdpbiA9IGdldEh0dHBBdXRoU2NoZW1lUGx1Z2luO1xuZXhwb3J0cy5nZXRIdHRwU2lnbmluZ1BsdWdpbiA9IGdldEh0dHBTaWduaW5nUGx1Z2luO1xuZXhwb3J0cy5nZXRTbWl0aHlDb250ZXh0ID0gZ2V0U21pdGh5Q29udGV4dDtcbmV4cG9ydHMuaHR0cEF1dGhTY2hlbWVFbmRwb2ludFJ1bGVTZXRNaWRkbGV3YXJlT3B0aW9ucyA9IGh0dHBBdXRoU2NoZW1lRW5kcG9pbnRSdWxlU2V0TWlkZGxld2FyZU9wdGlvbnM7XG5leHBvcnRzLmh0dHBBdXRoU2NoZW1lTWlkZGxld2FyZSA9IGh0dHBBdXRoU2NoZW1lTWlkZGxld2FyZTtcbmV4cG9ydHMuaHR0cEF1dGhTY2hlbWVNaWRkbGV3YXJlT3B0aW9ucyA9IGh0dHBBdXRoU2NoZW1lTWlkZGxld2FyZU9wdGlvbnM7XG5leHBvcnRzLmh0dHBTaWduaW5nTWlkZGxld2FyZSA9IGh0dHBTaWduaW5nTWlkZGxld2FyZTtcbmV4cG9ydHMuaHR0cFNpZ25pbmdNaWRkbGV3YXJlT3B0aW9ucyA9IGh0dHBTaWduaW5nTWlkZGxld2FyZU9wdGlvbnM7XG5leHBvcnRzLmlzSWRlbnRpdHlFeHBpcmVkID0gaXNJZGVudGl0eUV4cGlyZWQ7XG5leHBvcnRzLm1lbW9pemVJZGVudGl0eVByb3ZpZGVyID0gbWVtb2l6ZUlkZW50aXR5UHJvdmlkZXI7XG5leHBvcnRzLm5vcm1hbGl6ZVByb3ZpZGVyID0gbm9ybWFsaXplUHJvdmlkZXI7XG5leHBvcnRzLnNldEZlYXR1cmUgPSBzZXRGZWF0dXJlO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB0eXBlcyA9IHJlcXVpcmUoJ0BzbWl0aHkvdHlwZXMnKTtcblxuY2xhc3MgRW5kcG9pbnRDYWNoZSB7XG4gICAgY2FwYWNpdHk7XG4gICAgZGF0YSA9IG5ldyBNYXAoKTtcbiAgICBwYXJhbWV0ZXJzID0gW107XG4gICAgY29uc3RydWN0b3IoeyBzaXplLCBwYXJhbXMgfSkge1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gc2l6ZSA/PyA1MDtcbiAgICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1zO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldChlbmRwb2ludFBhcmFtcywgcmVzb2x2ZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5oYXNoKGVuZHBvaW50UGFyYW1zKTtcbiAgICAgICAgaWYgKGtleSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kYXRhLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLnNpemUgPiB0aGlzLmNhcGFjaXR5ICsgMTApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5kYXRhLmtleXMoKTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0ga2V5cy5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5kZWxldGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSB8fCArK2kgPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0KGtleSwgcmVzb2x2ZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQoa2V5KTtcbiAgICB9XG4gICAgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaXplO1xuICAgIH1cbiAgICBoYXNoKGVuZHBvaW50UGFyYW1zKSB7XG4gICAgICAgIGxldCBidWZmZXIgPSBcIlwiO1xuICAgICAgICBjb25zdCB7IHBhcmFtZXRlcnMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gU3RyaW5nKGVuZHBvaW50UGFyYW1zW3BhcmFtXSA/PyBcIlwiKTtcbiAgICAgICAgICAgIGlmICh2YWwuaW5jbHVkZXMoXCJ8O1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciArPSB2YWwgKyBcInw7XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG59XG5cbmNvbnN0IElQX1Y0X1JFR0VYID0gbmV3IFJlZ0V4cChgXig/OjI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxcXFxcZCkoPzpcXFxcLig/OjI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV1cXFxcZHxcXFxcZCkpezN9JGApO1xuY29uc3QgaXNJcEFkZHJlc3MgPSAodmFsdWUpID0+IElQX1Y0X1JFR0VYLnRlc3QodmFsdWUpIHx8ICh2YWx1ZS5zdGFydHNXaXRoKFwiW1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIl1cIikpO1xuXG5jb25zdCBWQUxJRF9IT1NUX0xBQkVMX1JFR0VYID0gbmV3IFJlZ0V4cChgXig/IS4qLSQpKD8hLSlbYS16QS1aMC05LV17MSw2M30kYCk7XG5jb25zdCBpc1ZhbGlkSG9zdExhYmVsID0gKHZhbHVlLCBhbGxvd1N1YkRvbWFpbnMgPSBmYWxzZSkgPT4ge1xuICAgIGlmICghYWxsb3dTdWJEb21haW5zKSB7XG4gICAgICAgIHJldHVybiBWQUxJRF9IT1NUX0xBQkVMX1JFR0VYLnRlc3QodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBsYWJlbHMgPSB2YWx1ZS5zcGxpdChcIi5cIik7XG4gICAgZm9yIChjb25zdCBsYWJlbCBvZiBsYWJlbHMpIHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkSG9zdExhYmVsKGxhYmVsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgY3VzdG9tRW5kcG9pbnRGdW5jdGlvbnMgPSB7fTtcblxuY29uc3QgZGVidWdJZCA9IFwiZW5kcG9pbnRzXCI7XG5cbmZ1bmN0aW9uIHRvRGVidWdTdHJpbmcoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICBpZiAoXCJyZWZcIiBpbiBpbnB1dCkge1xuICAgICAgICByZXR1cm4gYCQke3RvRGVidWdTdHJpbmcoaW5wdXQucmVmKX1gO1xuICAgIH1cbiAgICBpZiAoXCJmblwiIGluIGlucHV0KSB7XG4gICAgICAgIHJldHVybiBgJHtpbnB1dC5mbn0oJHsoaW5wdXQuYXJndiB8fCBbXSkubWFwKHRvRGVidWdTdHJpbmcpLmpvaW4oXCIsIFwiKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGlucHV0LCBudWxsLCAyKTtcbn1cblxuY2xhc3MgRW5kcG9pbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkVuZHBvaW50RXJyb3JcIjtcbiAgICB9XG59XG5cbmNvbnN0IGJvb2xlYW5FcXVhbHMgPSAodmFsdWUxLCB2YWx1ZTIpID0+IHZhbHVlMSA9PT0gdmFsdWUyO1xuXG5jb25zdCBnZXRBdHRyUGF0aExpc3QgPSAocGF0aCkgPT4ge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgY29uc3QgcGF0aExpc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgY29uc3Qgc3F1YXJlQnJhY2tldEluZGV4ID0gcGFydC5pbmRleE9mKFwiW1wiKTtcbiAgICAgICAgaWYgKHNxdWFyZUJyYWNrZXRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmluZGV4T2YoXCJdXCIpICE9PSBwYXJ0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW5kcG9pbnRFcnJvcihgUGF0aDogJyR7cGF0aH0nIGRvZXMgbm90IGVuZCB3aXRoICddJ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXJyYXlJbmRleCA9IHBhcnQuc2xpY2Uoc3F1YXJlQnJhY2tldEluZGV4ICsgMSwgLTEpO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXJzZUludChhcnJheUluZGV4KSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW5kcG9pbnRFcnJvcihgSW52YWxpZCBhcnJheSBpbmRleDogJyR7YXJyYXlJbmRleH0nIGluIHBhdGg6ICcke3BhdGh9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNxdWFyZUJyYWNrZXRJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHBhdGhMaXN0LnB1c2gocGFydC5zbGljZSgwLCBzcXVhcmVCcmFja2V0SW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGhMaXN0LnB1c2goYXJyYXlJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXRoTGlzdC5wdXNoKHBhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXRoTGlzdDtcbn07XG5cbmNvbnN0IGdldEF0dHIgPSAodmFsdWUsIHBhdGgpID0+IGdldEF0dHJQYXRoTGlzdChwYXRoKS5yZWR1Y2UoKGFjYywgaW5kZXgpID0+IHtcbiAgICBpZiAodHlwZW9mIGFjYyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRW5kcG9pbnRFcnJvcihgSW5kZXggJyR7aW5kZXh9JyBpbiAnJHtwYXRofScgbm90IGZvdW5kIGluICcke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0nYCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYWNjKSkge1xuICAgICAgICByZXR1cm4gYWNjW3BhcnNlSW50KGluZGV4KV07XG4gICAgfVxuICAgIHJldHVybiBhY2NbaW5kZXhdO1xufSwgdmFsdWUpO1xuXG5jb25zdCBpc1NldCA9ICh2YWx1ZSkgPT4gdmFsdWUgIT0gbnVsbDtcblxuY29uc3Qgbm90ID0gKHZhbHVlKSA9PiAhdmFsdWU7XG5cbmNvbnN0IERFRkFVTFRfUE9SVFMgPSB7XG4gICAgW3R5cGVzLkVuZHBvaW50VVJMU2NoZW1lLkhUVFBdOiA4MCxcbiAgICBbdHlwZXMuRW5kcG9pbnRVUkxTY2hlbWUuSFRUUFNdOiA0NDMsXG59O1xuY29uc3QgcGFyc2VVUkwgPSAodmFsdWUpID0+IHtcbiAgICBjb25zdCB3aGF0d2dVUkwgPSAoKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcImhvc3RuYW1lXCIgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGhvc3RuYW1lLCBwb3J0LCBwcm90b2NvbCA9IFwiXCIsIHBhdGggPSBcIlwiLCBxdWVyeSA9IHt9IH0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX0ke3BvcnQgPyBgOiR7cG9ydH1gIDogXCJcIn0ke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgdXJsLnNlYXJjaCA9IE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiZcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfSkoKTtcbiAgICBpZiAoIXdoYXR3Z1VSTCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gcGFyc2UgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IGFzIGEgd2hhdHdnIFVSTC5gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHVybFN0cmluZyA9IHdoYXR3Z1VSTC5ocmVmO1xuICAgIGNvbnN0IHsgaG9zdCwgaG9zdG5hbWUsIHBhdGhuYW1lLCBwcm90b2NvbCwgc2VhcmNoIH0gPSB3aGF0d2dVUkw7XG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2NoZW1lID0gcHJvdG9jb2wuc2xpY2UoMCwgLTEpO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyh0eXBlcy5FbmRwb2ludFVSTFNjaGVtZSkuaW5jbHVkZXMoc2NoZW1lKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgaXNJcCA9IGlzSXBBZGRyZXNzKGhvc3RuYW1lKTtcbiAgICBjb25zdCBpbnB1dENvbnRhaW5zRGVmYXVsdFBvcnQgPSB1cmxTdHJpbmcuaW5jbHVkZXMoYCR7aG9zdH06JHtERUZBVUxUX1BPUlRTW3NjaGVtZV19YCkgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5pbmNsdWRlcyhgJHtob3N0fToke0RFRkFVTFRfUE9SVFNbc2NoZW1lXX1gKSk7XG4gICAgY29uc3QgYXV0aG9yaXR5ID0gYCR7aG9zdH0ke2lucHV0Q29udGFpbnNEZWZhdWx0UG9ydCA/IGA6JHtERUZBVUxUX1BPUlRTW3NjaGVtZV19YCA6IGBgfWA7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NoZW1lLFxuICAgICAgICBhdXRob3JpdHksXG4gICAgICAgIHBhdGg6IHBhdGhuYW1lLFxuICAgICAgICBub3JtYWxpemVkUGF0aDogcGF0aG5hbWUuZW5kc1dpdGgoXCIvXCIpID8gcGF0aG5hbWUgOiBgJHtwYXRobmFtZX0vYCxcbiAgICAgICAgaXNJcCxcbiAgICB9O1xufTtcblxuY29uc3Qgc3RyaW5nRXF1YWxzID0gKHZhbHVlMSwgdmFsdWUyKSA9PiB2YWx1ZTEgPT09IHZhbHVlMjtcblxuY29uc3Qgc3Vic3RyaW5nID0gKGlucHV0LCBzdGFydCwgc3RvcCwgcmV2ZXJzZSkgPT4ge1xuICAgIGlmIChzdGFydCA+PSBzdG9wIHx8IGlucHV0Lmxlbmd0aCA8IHN0b3ApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICghcmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCBzdG9wKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnN1YnN0cmluZyhpbnB1dC5sZW5ndGggLSBzdG9wLCBpbnB1dC5sZW5ndGggLSBzdGFydCk7XG59O1xuXG5jb25zdCB1cmlFbmNvZGUgPSAodmFsdWUpID0+IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZSgvWyEqJygpXS9nLCAoYykgPT4gYCUke2MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcblxuY29uc3QgZW5kcG9pbnRGdW5jdGlvbnMgPSB7XG4gICAgYm9vbGVhbkVxdWFscyxcbiAgICBnZXRBdHRyLFxuICAgIGlzU2V0LFxuICAgIGlzVmFsaWRIb3N0TGFiZWwsXG4gICAgbm90LFxuICAgIHBhcnNlVVJMLFxuICAgIHN0cmluZ0VxdWFscyxcbiAgICBzdWJzdHJpbmcsXG4gICAgdXJpRW5jb2RlLFxufTtcblxuY29uc3QgZXZhbHVhdGVUZW1wbGF0ZSA9ICh0ZW1wbGF0ZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGV2YWx1YXRlZFRlbXBsYXRlQXJyID0gW107XG4gICAgY29uc3QgdGVtcGxhdGVDb250ZXh0ID0ge1xuICAgICAgICAuLi5vcHRpb25zLmVuZHBvaW50UGFyYW1zLFxuICAgICAgICAuLi5vcHRpb25zLnJlZmVyZW5jZVJlY29yZCxcbiAgICB9O1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCB0ZW1wbGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgb3BlbmluZ0JyYWNlSW5kZXggPSB0ZW1wbGF0ZS5pbmRleE9mKFwie1wiLCBjdXJyZW50SW5kZXgpO1xuICAgICAgICBpZiAob3BlbmluZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBldmFsdWF0ZWRUZW1wbGF0ZUFyci5wdXNoKHRlbXBsYXRlLnNsaWNlKGN1cnJlbnRJbmRleCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZXZhbHVhdGVkVGVtcGxhdGVBcnIucHVzaCh0ZW1wbGF0ZS5zbGljZShjdXJyZW50SW5kZXgsIG9wZW5pbmdCcmFjZUluZGV4KSk7XG4gICAgICAgIGNvbnN0IGNsb3NpbmdCcmFjZUluZGV4ID0gdGVtcGxhdGUuaW5kZXhPZihcIn1cIiwgb3BlbmluZ0JyYWNlSW5kZXgpO1xuICAgICAgICBpZiAoY2xvc2luZ0JyYWNlSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICBldmFsdWF0ZWRUZW1wbGF0ZUFyci5wdXNoKHRlbXBsYXRlLnNsaWNlKG9wZW5pbmdCcmFjZUluZGV4KSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVtcGxhdGVbb3BlbmluZ0JyYWNlSW5kZXggKyAxXSA9PT0gXCJ7XCIgJiYgdGVtcGxhdGVbY2xvc2luZ0JyYWNlSW5kZXggKyAxXSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZFRlbXBsYXRlQXJyLnB1c2godGVtcGxhdGUuc2xpY2Uob3BlbmluZ0JyYWNlSW5kZXggKyAxLCBjbG9zaW5nQnJhY2VJbmRleCkpO1xuICAgICAgICAgICAgY3VycmVudEluZGV4ID0gY2xvc2luZ0JyYWNlSW5kZXggKyAyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSB0ZW1wbGF0ZS5zdWJzdHJpbmcob3BlbmluZ0JyYWNlSW5kZXggKyAxLCBjbG9zaW5nQnJhY2VJbmRleCk7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJOYW1lLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgICAgICAgICAgY29uc3QgW3JlZk5hbWUsIGF0dHJOYW1lXSA9IHBhcmFtZXRlck5hbWUuc3BsaXQoXCIjXCIpO1xuICAgICAgICAgICAgZXZhbHVhdGVkVGVtcGxhdGVBcnIucHVzaChnZXRBdHRyKHRlbXBsYXRlQ29udGV4dFtyZWZOYW1lXSwgYXR0ck5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZFRlbXBsYXRlQXJyLnB1c2godGVtcGxhdGVDb250ZXh0W3BhcmFtZXRlck5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5kZXggPSBjbG9zaW5nQnJhY2VJbmRleCArIDE7XG4gICAgfVxuICAgIHJldHVybiBldmFsdWF0ZWRUZW1wbGF0ZUFyci5qb2luKFwiXCIpO1xufTtcblxuY29uc3QgZ2V0UmVmZXJlbmNlVmFsdWUgPSAoeyByZWYgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHJlZmVyZW5jZVJlY29yZCA9IHtcbiAgICAgICAgLi4ub3B0aW9ucy5lbmRwb2ludFBhcmFtcyxcbiAgICAgICAgLi4ub3B0aW9ucy5yZWZlcmVuY2VSZWNvcmQsXG4gICAgfTtcbiAgICByZXR1cm4gcmVmZXJlbmNlUmVjb3JkW3JlZl07XG59O1xuXG5jb25zdCBldmFsdWF0ZUV4cHJlc3Npb24gPSAob2JqLCBrZXlOYW1lLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlVGVtcGxhdGUob2JqLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob2JqW1wiZm5cIl0pIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwJDIuY2FsbEZ1bmN0aW9uKG9iaiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9ialtcInJlZlwiXSkge1xuICAgICAgICByZXR1cm4gZ2V0UmVmZXJlbmNlVmFsdWUob2JqLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVuZHBvaW50RXJyb3IoYCcke2tleU5hbWV9JzogJHtTdHJpbmcob2JqKX0gaXMgbm90IGEgc3RyaW5nLCBmdW5jdGlvbiBvciByZWZlcmVuY2UuYCk7XG59O1xuY29uc3QgY2FsbEZ1bmN0aW9uID0gKHsgZm4sIGFyZ3YgfSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhcmd2Lm1hcCgoYXJnKSA9PiBbXCJib29sZWFuXCIsIFwibnVtYmVyXCJdLmluY2x1ZGVzKHR5cGVvZiBhcmcpID8gYXJnIDogZ3JvdXAkMi5ldmFsdWF0ZUV4cHJlc3Npb24oYXJnLCBcImFyZ1wiLCBvcHRpb25zKSk7XG4gICAgY29uc3QgZm5TZWdtZW50cyA9IGZuLnNwbGl0KFwiLlwiKTtcbiAgICBpZiAoZm5TZWdtZW50c1swXSBpbiBjdXN0b21FbmRwb2ludEZ1bmN0aW9ucyAmJiBmblNlZ21lbnRzWzFdICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGN1c3RvbUVuZHBvaW50RnVuY3Rpb25zW2ZuU2VnbWVudHNbMF1dW2ZuU2VnbWVudHNbMV1dKC4uLmV2YWx1YXRlZEFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gZW5kcG9pbnRGdW5jdGlvbnNbZm5dKC4uLmV2YWx1YXRlZEFyZ3MpO1xufTtcbmNvbnN0IGdyb3VwJDIgPSB7XG4gICAgZXZhbHVhdGVFeHByZXNzaW9uLFxuICAgIGNhbGxGdW5jdGlvbixcbn07XG5cbmNvbnN0IGV2YWx1YXRlQ29uZGl0aW9uID0gKHsgYXNzaWduLCAuLi5mbkFyZ3MgfSwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChhc3NpZ24gJiYgYXNzaWduIGluIG9wdGlvbnMucmVmZXJlbmNlUmVjb3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBFbmRwb2ludEVycm9yKGAnJHthc3NpZ259JyBpcyBhbHJlYWR5IGRlZmluZWQgaW4gUmVmZXJlbmNlIFJlY29yZC5gKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBjYWxsRnVuY3Rpb24oZm5BcmdzLCBvcHRpb25zKTtcbiAgICBvcHRpb25zLmxvZ2dlcj8uZGVidWc/LihgJHtkZWJ1Z0lkfSBldmFsdWF0ZUNvbmRpdGlvbjogJHt0b0RlYnVnU3RyaW5nKGZuQXJncyl9ID0gJHt0b0RlYnVnU3RyaW5nKHZhbHVlKX1gKTtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IHZhbHVlID09PSBcIlwiID8gdHJ1ZSA6ICEhdmFsdWUsXG4gICAgICAgIC4uLihhc3NpZ24gIT0gbnVsbCAmJiB7IHRvQXNzaWduOiB7IG5hbWU6IGFzc2lnbiwgdmFsdWUgfSB9KSxcbiAgICB9O1xufTtcblxuY29uc3QgZXZhbHVhdGVDb25kaXRpb25zID0gKGNvbmRpdGlvbnMgPSBbXSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnNSZWZlcmVuY2VSZWNvcmQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgcmVzdWx0LCB0b0Fzc2lnbiB9ID0gZXZhbHVhdGVDb25kaXRpb24oY29uZGl0aW9uLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgcmVmZXJlbmNlUmVjb3JkOiB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5yZWZlcmVuY2VSZWNvcmQsXG4gICAgICAgICAgICAgICAgLi4uY29uZGl0aW9uc1JlZmVyZW5jZVJlY29yZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvQXNzaWduKSB7XG4gICAgICAgICAgICBjb25kaXRpb25zUmVmZXJlbmNlUmVjb3JkW3RvQXNzaWduLm5hbWVdID0gdG9Bc3NpZ24udmFsdWU7XG4gICAgICAgICAgICBvcHRpb25zLmxvZ2dlcj8uZGVidWc/LihgJHtkZWJ1Z0lkfSBhc3NpZ246ICR7dG9Bc3NpZ24ubmFtZX0gOj0gJHt0b0RlYnVnU3RyaW5nKHRvQXNzaWduLnZhbHVlKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZXN1bHQ6IHRydWUsIHJlZmVyZW5jZVJlY29yZDogY29uZGl0aW9uc1JlZmVyZW5jZVJlY29yZCB9O1xufTtcblxuY29uc3QgZ2V0RW5kcG9pbnRIZWFkZXJzID0gKGhlYWRlcnMsIG9wdGlvbnMpID0+IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLnJlZHVjZSgoYWNjLCBbaGVhZGVyS2V5LCBoZWFkZXJWYWxdKSA9PiAoe1xuICAgIC4uLmFjYyxcbiAgICBbaGVhZGVyS2V5XTogaGVhZGVyVmFsLm1hcCgoaGVhZGVyVmFsRW50cnkpID0+IHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkRXhwciA9IGV2YWx1YXRlRXhwcmVzc2lvbihoZWFkZXJWYWxFbnRyeSwgXCJIZWFkZXIgdmFsdWUgZW50cnlcIiwgb3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VkRXhwciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVuZHBvaW50RXJyb3IoYEhlYWRlciAnJHtoZWFkZXJLZXl9JyB2YWx1ZSAnJHtwcm9jZXNzZWRFeHByfScgaXMgbm90IGEgc3RyaW5nYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEV4cHI7XG4gICAgfSksXG59KSwge30pO1xuXG5jb25zdCBnZXRFbmRwb2ludFByb3BlcnRpZXMgPSAocHJvcGVydGllcywgb3B0aW9ucykgPT4gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykucmVkdWNlKChhY2MsIFtwcm9wZXJ0eUtleSwgcHJvcGVydHlWYWxdKSA9PiAoe1xuICAgIC4uLmFjYyxcbiAgICBbcHJvcGVydHlLZXldOiBncm91cCQxLmdldEVuZHBvaW50UHJvcGVydHkocHJvcGVydHlWYWwsIG9wdGlvbnMpLFxufSksIHt9KTtcbmNvbnN0IGdldEVuZHBvaW50UHJvcGVydHkgPSAocHJvcGVydHksIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eSkpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Lm1hcCgocHJvcGVydHlFbnRyeSkgPT4gZ2V0RW5kcG9pbnRQcm9wZXJ0eShwcm9wZXJ0eUVudHJ5LCBvcHRpb25zKSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mIHByb3BlcnR5KSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVRlbXBsYXRlKHByb3BlcnR5LCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuZHBvaW50RXJyb3IoYFVuZXhwZWN0ZWQgZW5kcG9pbnQgcHJvcGVydHk6ICR7cHJvcGVydHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXAkMS5nZXRFbmRwb2ludFByb3BlcnRpZXMocHJvcGVydHksIG9wdGlvbnMpO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVuZHBvaW50RXJyb3IoYFVuZXhwZWN0ZWQgZW5kcG9pbnQgcHJvcGVydHkgdHlwZTogJHt0eXBlb2YgcHJvcGVydHl9YCk7XG4gICAgfVxufTtcbmNvbnN0IGdyb3VwJDEgPSB7XG4gICAgZ2V0RW5kcG9pbnRQcm9wZXJ0eSxcbiAgICBnZXRFbmRwb2ludFByb3BlcnRpZXMsXG59O1xuXG5jb25zdCBnZXRFbmRwb2ludFVybCA9IChlbmRwb2ludFVybCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBldmFsdWF0ZUV4cHJlc3Npb24oZW5kcG9pbnRVcmwsIFwiRW5kcG9pbnQgVVJMXCIsIG9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY29uc3RydWN0IFVSTCB3aXRoICR7ZXhwcmVzc2lvbn1gLCBlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRW5kcG9pbnRFcnJvcihgRW5kcG9pbnQgVVJMIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiBleHByZXNzaW9ufWApO1xufTtcblxuY29uc3QgZXZhbHVhdGVFbmRwb2ludFJ1bGUgPSAoZW5kcG9pbnRSdWxlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBjb25kaXRpb25zLCBlbmRwb2ludCB9ID0gZW5kcG9pbnRSdWxlO1xuICAgIGNvbnN0IHsgcmVzdWx0LCByZWZlcmVuY2VSZWNvcmQgfSA9IGV2YWx1YXRlQ29uZGl0aW9ucyhjb25kaXRpb25zLCBvcHRpb25zKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50UnVsZU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHJlZmVyZW5jZVJlY29yZDogeyAuLi5vcHRpb25zLnJlZmVyZW5jZVJlY29yZCwgLi4ucmVmZXJlbmNlUmVjb3JkIH0sXG4gICAgfTtcbiAgICBjb25zdCB7IHVybCwgcHJvcGVydGllcywgaGVhZGVycyB9ID0gZW5kcG9pbnQ7XG4gICAgb3B0aW9ucy5sb2dnZXI/LmRlYnVnPy4oYCR7ZGVidWdJZH0gUmVzb2x2aW5nIGVuZHBvaW50IGZyb20gdGVtcGxhdGU6ICR7dG9EZWJ1Z1N0cmluZyhlbmRwb2ludCl9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGhlYWRlcnMgIT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IGdldEVuZHBvaW50SGVhZGVycyhoZWFkZXJzLCBlbmRwb2ludFJ1bGVPcHRpb25zKSxcbiAgICAgICAgfSksXG4gICAgICAgIC4uLihwcm9wZXJ0aWVzICE9IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBnZXRFbmRwb2ludFByb3BlcnRpZXMocHJvcGVydGllcywgZW5kcG9pbnRSdWxlT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB1cmw6IGdldEVuZHBvaW50VXJsKHVybCwgZW5kcG9pbnRSdWxlT3B0aW9ucyksXG4gICAgfTtcbn07XG5cbmNvbnN0IGV2YWx1YXRlRXJyb3JSdWxlID0gKGVycm9yUnVsZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgY29uZGl0aW9ucywgZXJyb3IgfSA9IGVycm9yUnVsZTtcbiAgICBjb25zdCB7IHJlc3VsdCwgcmVmZXJlbmNlUmVjb3JkIH0gPSBldmFsdWF0ZUNvbmRpdGlvbnMoY29uZGl0aW9ucywgb3B0aW9ucyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRW5kcG9pbnRFcnJvcihldmFsdWF0ZUV4cHJlc3Npb24oZXJyb3IsIFwiRXJyb3JcIiwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICByZWZlcmVuY2VSZWNvcmQ6IHsgLi4ub3B0aW9ucy5yZWZlcmVuY2VSZWNvcmQsIC4uLnJlZmVyZW5jZVJlY29yZCB9LFxuICAgIH0pKTtcbn07XG5cbmNvbnN0IGV2YWx1YXRlUnVsZXMgPSAocnVsZXMsIG9wdGlvbnMpID0+IHtcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gXCJlbmRwb2ludFwiKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRwb2ludE9yVW5kZWZpbmVkID0gZXZhbHVhdGVFbmRwb2ludFJ1bGUocnVsZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoZW5kcG9pbnRPclVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludE9yVW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICBldmFsdWF0ZUVycm9yUnVsZShydWxlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlLnR5cGUgPT09IFwidHJlZVwiKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRwb2ludE9yVW5kZWZpbmVkID0gZ3JvdXAuZXZhbHVhdGVUcmVlUnVsZShydWxlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChlbmRwb2ludE9yVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50T3JVbmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW5kcG9pbnRFcnJvcihgVW5rbm93biBlbmRwb2ludCBydWxlOiAke3J1bGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVuZHBvaW50RXJyb3IoYFJ1bGVzIGV2YWx1YXRpb24gZmFpbGVkYCk7XG59O1xuY29uc3QgZXZhbHVhdGVUcmVlUnVsZSA9ICh0cmVlUnVsZSwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgY29uZGl0aW9ucywgcnVsZXMgfSA9IHRyZWVSdWxlO1xuICAgIGNvbnN0IHsgcmVzdWx0LCByZWZlcmVuY2VSZWNvcmQgfSA9IGV2YWx1YXRlQ29uZGl0aW9ucyhjb25kaXRpb25zLCBvcHRpb25zKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBncm91cC5ldmFsdWF0ZVJ1bGVzKHJ1bGVzLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHJlZmVyZW5jZVJlY29yZDogeyAuLi5vcHRpb25zLnJlZmVyZW5jZVJlY29yZCwgLi4ucmVmZXJlbmNlUmVjb3JkIH0sXG4gICAgfSk7XG59O1xuY29uc3QgZ3JvdXAgPSB7XG4gICAgZXZhbHVhdGVSdWxlcyxcbiAgICBldmFsdWF0ZVRyZWVSdWxlLFxufTtcblxuY29uc3QgcmVzb2x2ZUVuZHBvaW50ID0gKHJ1bGVTZXRPYmplY3QsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IGVuZHBvaW50UGFyYW1zLCBsb2dnZXIgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJzLCBydWxlcyB9ID0gcnVsZVNldE9iamVjdDtcbiAgICBvcHRpb25zLmxvZ2dlcj8uZGVidWc/LihgJHtkZWJ1Z0lkfSBJbml0aWFsIEVuZHBvaW50UGFyYW1zOiAke3RvRGVidWdTdHJpbmcoZW5kcG9pbnRQYXJhbXMpfWApO1xuICAgIGNvbnN0IHBhcmFtc1dpdGhEZWZhdWx0ID0gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycylcbiAgICAgICAgLmZpbHRlcigoWywgdl0pID0+IHYuZGVmYXVsdCAhPSBudWxsKVxuICAgICAgICAubWFwKChbaywgdl0pID0+IFtrLCB2LmRlZmF1bHRdKTtcbiAgICBpZiAocGFyYW1zV2l0aERlZmF1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbUtleSwgcGFyYW1EZWZhdWx0VmFsdWVdIG9mIHBhcmFtc1dpdGhEZWZhdWx0KSB7XG4gICAgICAgICAgICBlbmRwb2ludFBhcmFtc1twYXJhbUtleV0gPSBlbmRwb2ludFBhcmFtc1twYXJhbUtleV0gPz8gcGFyYW1EZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVxdWlyZWRQYXJhbXMgPSBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gdi5yZXF1aXJlZClcbiAgICAgICAgLm1hcCgoW2tdKSA9PiBrKTtcbiAgICBmb3IgKGNvbnN0IHJlcXVpcmVkUGFyYW0gb2YgcmVxdWlyZWRQYXJhbXMpIHtcbiAgICAgICAgaWYgKGVuZHBvaW50UGFyYW1zW3JlcXVpcmVkUGFyYW1dID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbmRwb2ludEVycm9yKGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogJyR7cmVxdWlyZWRQYXJhbX0nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBldmFsdWF0ZVJ1bGVzKHJ1bGVzLCB7IGVuZHBvaW50UGFyYW1zLCBsb2dnZXIsIHJlZmVyZW5jZVJlY29yZDoge30gfSk7XG4gICAgb3B0aW9ucy5sb2dnZXI/LmRlYnVnPy4oYCR7ZGVidWdJZH0gUmVzb2x2ZWQgZW5kcG9pbnQ6ICR7dG9EZWJ1Z1N0cmluZyhlbmRwb2ludCl9YCk7XG4gICAgcmV0dXJuIGVuZHBvaW50O1xufTtcblxuZXhwb3J0cy5FbmRwb2ludENhY2hlID0gRW5kcG9pbnRDYWNoZTtcbmV4cG9ydHMuRW5kcG9pbnRFcnJvciA9IEVuZHBvaW50RXJyb3I7XG5leHBvcnRzLmN1c3RvbUVuZHBvaW50RnVuY3Rpb25zID0gY3VzdG9tRW5kcG9pbnRGdW5jdGlvbnM7XG5leHBvcnRzLmlzSXBBZGRyZXNzID0gaXNJcEFkZHJlc3M7XG5leHBvcnRzLmlzVmFsaWRIb3N0TGFiZWwgPSBpc1ZhbGlkSG9zdExhYmVsO1xuZXhwb3J0cy5yZXNvbHZlRW5kcG9pbnQgPSByZXNvbHZlRW5kcG9pbnQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxFbmRwb2ludHMgPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtZW5kcG9pbnRzJyk7XG52YXIgdXJsUGFyc2VyID0gcmVxdWlyZSgnQHNtaXRoeS91cmwtcGFyc2VyJyk7XG5cbmNvbnN0IGlzVmlydHVhbEhvc3RhYmxlUzNCdWNrZXQgPSAodmFsdWUsIGFsbG93U3ViRG9tYWlucyA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKGFsbG93U3ViRG9tYWlucykge1xuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIHZhbHVlLnNwbGl0KFwiLlwiKSkge1xuICAgICAgICAgICAgaWYgKCFpc1ZpcnR1YWxIb3N0YWJsZVMzQnVja2V0KGxhYmVsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF1dGlsRW5kcG9pbnRzLmlzVmFsaWRIb3N0TGFiZWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8IDMgfHwgdmFsdWUubGVuZ3RoID4gNjMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgIT09IHZhbHVlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodXRpbEVuZHBvaW50cy5pc0lwQWRkcmVzcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IEFSTl9ERUxJTUlURVIgPSBcIjpcIjtcbmNvbnN0IFJFU09VUkNFX0RFTElNSVRFUiA9IFwiL1wiO1xuY29uc3QgcGFyc2VBcm4gPSAodmFsdWUpID0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHZhbHVlLnNwbGl0KEFSTl9ERUxJTUlURVIpO1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPCA2KVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBbYXJuLCBwYXJ0aXRpb24sIHNlcnZpY2UsIHJlZ2lvbiwgYWNjb3VudElkLCAuLi5yZXNvdXJjZVBhdGhdID0gc2VnbWVudHM7XG4gICAgaWYgKGFybiAhPT0gXCJhcm5cIiB8fCBwYXJ0aXRpb24gPT09IFwiXCIgfHwgc2VydmljZSA9PT0gXCJcIiB8fCByZXNvdXJjZVBhdGguam9pbihBUk5fREVMSU1JVEVSKSA9PT0gXCJcIilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IHJlc291cmNlUGF0aC5tYXAoKHJlc291cmNlKSA9PiByZXNvdXJjZS5zcGxpdChSRVNPVVJDRV9ERUxJTUlURVIpKS5mbGF0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGFydGl0aW9uLFxuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgcmVzb3VyY2VJZCxcbiAgICB9O1xufTtcblxudmFyIHBhcnRpdGlvbnMgPSBbXG5cdHtcblx0XHRpZDogXCJhd3NcIixcblx0XHRvdXRwdXRzOiB7XG5cdFx0XHRkbnNTdWZmaXg6IFwiYW1hem9uYXdzLmNvbVwiLFxuXHRcdFx0ZHVhbFN0YWNrRG5zU3VmZml4OiBcImFwaS5hd3NcIixcblx0XHRcdGltcGxpY2l0R2xvYmFsUmVnaW9uOiBcInVzLWVhc3QtMVwiLFxuXHRcdFx0bmFtZTogXCJhd3NcIixcblx0XHRcdHN1cHBvcnRzRHVhbFN0YWNrOiB0cnVlLFxuXHRcdFx0c3VwcG9ydHNGSVBTOiB0cnVlXG5cdFx0fSxcblx0XHRyZWdpb25SZWdleDogXCJeKHVzfGV1fGFwfHNhfGNhfG1lfGFmfGlsfG14KVxcXFwtXFxcXHcrXFxcXC1cXFxcZCskXCIsXG5cdFx0cmVnaW9uczoge1xuXHRcdFx0XCJhZi1zb3V0aC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQWZyaWNhIChDYXBlIFRvd24pXCJcblx0XHRcdH0sXG5cdFx0XHRcImFwLWVhc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkFzaWEgUGFjaWZpYyAoSG9uZyBLb25nKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJhcC1lYXN0LTJcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJBc2lhIFBhY2lmaWMgKFRhaXBlaSlcIlxuXHRcdFx0fSxcblx0XHRcdFwiYXAtbm9ydGhlYXN0LTFcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJBc2lhIFBhY2lmaWMgKFRva3lvKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJhcC1ub3J0aGVhc3QtMlwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkFzaWEgUGFjaWZpYyAoU2VvdWwpXCJcblx0XHRcdH0sXG5cdFx0XHRcImFwLW5vcnRoZWFzdC0zXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQXNpYSBQYWNpZmljIChPc2FrYSlcIlxuXHRcdFx0fSxcblx0XHRcdFwiYXAtc291dGgtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkFzaWEgUGFjaWZpYyAoTXVtYmFpKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJhcC1zb3V0aC0yXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQXNpYSBQYWNpZmljIChIeWRlcmFiYWQpXCJcblx0XHRcdH0sXG5cdFx0XHRcImFwLXNvdXRoZWFzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQXNpYSBQYWNpZmljIChTaW5nYXBvcmUpXCJcblx0XHRcdH0sXG5cdFx0XHRcImFwLXNvdXRoZWFzdC0yXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQXNpYSBQYWNpZmljIChTeWRuZXkpXCJcblx0XHRcdH0sXG5cdFx0XHRcImFwLXNvdXRoZWFzdC0zXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQXNpYSBQYWNpZmljIChKYWthcnRhKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJhcC1zb3V0aGVhc3QtNFwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkFzaWEgUGFjaWZpYyAoTWVsYm91cm5lKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJhcC1zb3V0aGVhc3QtNVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkFzaWEgUGFjaWZpYyAoTWFsYXlzaWEpXCJcblx0XHRcdH0sXG5cdFx0XHRcImFwLXNvdXRoZWFzdC02XCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQXNpYSBQYWNpZmljIChOZXcgWmVhbGFuZClcIlxuXHRcdFx0fSxcblx0XHRcdFwiYXAtc291dGhlYXN0LTdcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJBc2lhIFBhY2lmaWMgKFRoYWlsYW5kKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJhd3MtZ2xvYmFsXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiYXdzIGdsb2JhbCByZWdpb25cIlxuXHRcdFx0fSxcblx0XHRcdFwiY2EtY2VudHJhbC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQ2FuYWRhIChDZW50cmFsKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJjYS13ZXN0LTFcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJDYW5hZGEgV2VzdCAoQ2FsZ2FyeSlcIlxuXHRcdFx0fSxcblx0XHRcdFwiZXUtY2VudHJhbC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiRXVyb3BlIChGcmFua2Z1cnQpXCJcblx0XHRcdH0sXG5cdFx0XHRcImV1LWNlbnRyYWwtMlwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkV1cm9wZSAoWnVyaWNoKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJldS1ub3J0aC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiRXVyb3BlIChTdG9ja2hvbG0pXCJcblx0XHRcdH0sXG5cdFx0XHRcImV1LXNvdXRoLTFcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJFdXJvcGUgKE1pbGFuKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJldS1zb3V0aC0yXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiRXVyb3BlIChTcGFpbilcIlxuXHRcdFx0fSxcblx0XHRcdFwiZXUtd2VzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiRXVyb3BlIChJcmVsYW5kKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJldS13ZXN0LTJcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJFdXJvcGUgKExvbmRvbilcIlxuXHRcdFx0fSxcblx0XHRcdFwiZXUtd2VzdC0zXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiRXVyb3BlIChQYXJpcylcIlxuXHRcdFx0fSxcblx0XHRcdFwiaWwtY2VudHJhbC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiSXNyYWVsIChUZWwgQXZpdilcIlxuXHRcdFx0fSxcblx0XHRcdFwibWUtY2VudHJhbC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiTWlkZGxlIEVhc3QgKFVBRSlcIlxuXHRcdFx0fSxcblx0XHRcdFwibWUtc291dGgtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIk1pZGRsZSBFYXN0IChCYWhyYWluKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJteC1jZW50cmFsLTFcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJNZXhpY28gKENlbnRyYWwpXCJcblx0XHRcdH0sXG5cdFx0XHRcInNhLWVhc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlNvdXRoIEFtZXJpY2EgKFNhbyBQYXVsbylcIlxuXHRcdFx0fSxcblx0XHRcdFwidXMtZWFzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiVVMgRWFzdCAoTi4gVmlyZ2luaWEpXCJcblx0XHRcdH0sXG5cdFx0XHRcInVzLWVhc3QtMlwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlVTIEVhc3QgKE9oaW8pXCJcblx0XHRcdH0sXG5cdFx0XHRcInVzLXdlc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlVTIFdlc3QgKE4uIENhbGlmb3JuaWEpXCJcblx0XHRcdH0sXG5cdFx0XHRcInVzLXdlc3QtMlwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlVTIFdlc3QgKE9yZWdvbilcIlxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0e1xuXHRcdGlkOiBcImF3cy1jblwiLFxuXHRcdG91dHB1dHM6IHtcblx0XHRcdGRuc1N1ZmZpeDogXCJhbWF6b25hd3MuY29tLmNuXCIsXG5cdFx0XHRkdWFsU3RhY2tEbnNTdWZmaXg6IFwiYXBpLmFtYXpvbndlYnNlcnZpY2VzLmNvbS5jblwiLFxuXHRcdFx0aW1wbGljaXRHbG9iYWxSZWdpb246IFwiY24tbm9ydGh3ZXN0LTFcIixcblx0XHRcdG5hbWU6IFwiYXdzLWNuXCIsXG5cdFx0XHRzdXBwb3J0c0R1YWxTdGFjazogdHJ1ZSxcblx0XHRcdHN1cHBvcnRzRklQUzogdHJ1ZVxuXHRcdH0sXG5cdFx0cmVnaW9uUmVnZXg6IFwiXmNuXFxcXC1cXFxcdytcXFxcLVxcXFxkKyRcIixcblx0XHRyZWdpb25zOiB7XG5cdFx0XHRcImF3cy1jbi1nbG9iYWxcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJhd3MtY24gZ2xvYmFsIHJlZ2lvblwiXG5cdFx0XHR9LFxuXHRcdFx0XCJjbi1ub3J0aC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQ2hpbmEgKEJlaWppbmcpXCJcblx0XHRcdH0sXG5cdFx0XHRcImNuLW5vcnRod2VzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQ2hpbmEgKE5pbmd4aWEpXCJcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdHtcblx0XHRpZDogXCJhd3MtZXVzY1wiLFxuXHRcdG91dHB1dHM6IHtcblx0XHRcdGRuc1N1ZmZpeDogXCJhbWF6b25hd3MuZXVcIixcblx0XHRcdGR1YWxTdGFja0Ruc1N1ZmZpeDogXCJhcGkuYW1hem9ud2Vic2VydmljZXMuZXVcIixcblx0XHRcdGltcGxpY2l0R2xvYmFsUmVnaW9uOiBcImV1c2MtZGUtZWFzdC0xXCIsXG5cdFx0XHRuYW1lOiBcImF3cy1ldXNjXCIsXG5cdFx0XHRzdXBwb3J0c0R1YWxTdGFjazogdHJ1ZSxcblx0XHRcdHN1cHBvcnRzRklQUzogdHJ1ZVxuXHRcdH0sXG5cdFx0cmVnaW9uUmVnZXg6IFwiXmV1c2NcXFxcLShkZSlcXFxcLVxcXFx3K1xcXFwtXFxcXGQrJFwiLFxuXHRcdHJlZ2lvbnM6IHtcblx0XHRcdFwiZXVzYy1kZS1lYXN0LTFcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJFVSAoR2VybWFueSlcIlxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0e1xuXHRcdGlkOiBcImF3cy1pc29cIixcblx0XHRvdXRwdXRzOiB7XG5cdFx0XHRkbnNTdWZmaXg6IFwiYzJzLmljLmdvdlwiLFxuXHRcdFx0ZHVhbFN0YWNrRG5zU3VmZml4OiBcImFwaS5hd3MuaWMuZ292XCIsXG5cdFx0XHRpbXBsaWNpdEdsb2JhbFJlZ2lvbjogXCJ1cy1pc28tZWFzdC0xXCIsXG5cdFx0XHRuYW1lOiBcImF3cy1pc29cIixcblx0XHRcdHN1cHBvcnRzRHVhbFN0YWNrOiB0cnVlLFxuXHRcdFx0c3VwcG9ydHNGSVBTOiB0cnVlXG5cdFx0fSxcblx0XHRyZWdpb25SZWdleDogXCJedXNcXFxcLWlzb1xcXFwtXFxcXHcrXFxcXC1cXFxcZCskXCIsXG5cdFx0cmVnaW9uczoge1xuXHRcdFx0XCJhd3MtaXNvLWdsb2JhbFwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcImF3cy1pc28gZ2xvYmFsIHJlZ2lvblwiXG5cdFx0XHR9LFxuXHRcdFx0XCJ1cy1pc28tZWFzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiVVMgSVNPIEVhc3RcIlxuXHRcdFx0fSxcblx0XHRcdFwidXMtaXNvLXdlc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlVTIElTTyBXRVNUXCJcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdHtcblx0XHRpZDogXCJhd3MtaXNvLWJcIixcblx0XHRvdXRwdXRzOiB7XG5cdFx0XHRkbnNTdWZmaXg6IFwic2Mycy5zZ292LmdvdlwiLFxuXHRcdFx0ZHVhbFN0YWNrRG5zU3VmZml4OiBcImFwaS5hd3Muc2Nsb3VkXCIsXG5cdFx0XHRpbXBsaWNpdEdsb2JhbFJlZ2lvbjogXCJ1cy1pc29iLWVhc3QtMVwiLFxuXHRcdFx0bmFtZTogXCJhd3MtaXNvLWJcIixcblx0XHRcdHN1cHBvcnRzRHVhbFN0YWNrOiB0cnVlLFxuXHRcdFx0c3VwcG9ydHNGSVBTOiB0cnVlXG5cdFx0fSxcblx0XHRyZWdpb25SZWdleDogXCJedXNcXFxcLWlzb2JcXFxcLVxcXFx3K1xcXFwtXFxcXGQrJFwiLFxuXHRcdHJlZ2lvbnM6IHtcblx0XHRcdFwiYXdzLWlzby1iLWdsb2JhbFwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcImF3cy1pc28tYiBnbG9iYWwgcmVnaW9uXCJcblx0XHRcdH0sXG5cdFx0XHRcInVzLWlzb2ItZWFzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiVVMgSVNPQiBFYXN0IChPaGlvKVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJ1cy1pc29iLXdlc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlVTIElTT0IgV2VzdFwiXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0aWQ6IFwiYXdzLWlzby1lXCIsXG5cdFx0b3V0cHV0czoge1xuXHRcdFx0ZG5zU3VmZml4OiBcImNsb3VkLmFkYy1lLnVrXCIsXG5cdFx0XHRkdWFsU3RhY2tEbnNTdWZmaXg6IFwiYXBpLmNsb3VkLWF3cy5hZGMtZS51a1wiLFxuXHRcdFx0aW1wbGljaXRHbG9iYWxSZWdpb246IFwiZXUtaXNvZS13ZXN0LTFcIixcblx0XHRcdG5hbWU6IFwiYXdzLWlzby1lXCIsXG5cdFx0XHRzdXBwb3J0c0R1YWxTdGFjazogdHJ1ZSxcblx0XHRcdHN1cHBvcnRzRklQUzogdHJ1ZVxuXHRcdH0sXG5cdFx0cmVnaW9uUmVnZXg6IFwiXmV1XFxcXC1pc29lXFxcXC1cXFxcdytcXFxcLVxcXFxkKyRcIixcblx0XHRyZWdpb25zOiB7XG5cdFx0XHRcImF3cy1pc28tZS1nbG9iYWxcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJhd3MtaXNvLWUgZ2xvYmFsIHJlZ2lvblwiXG5cdFx0XHR9LFxuXHRcdFx0XCJldS1pc29lLXdlc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkVVIElTT0UgV2VzdFwiXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHR7XG5cdFx0aWQ6IFwiYXdzLWlzby1mXCIsXG5cdFx0b3V0cHV0czoge1xuXHRcdFx0ZG5zU3VmZml4OiBcImNzcC5oY2kuaWMuZ292XCIsXG5cdFx0XHRkdWFsU3RhY2tEbnNTdWZmaXg6IFwiYXBpLmF3cy5oY2kuaWMuZ292XCIsXG5cdFx0XHRpbXBsaWNpdEdsb2JhbFJlZ2lvbjogXCJ1cy1pc29mLXNvdXRoLTFcIixcblx0XHRcdG5hbWU6IFwiYXdzLWlzby1mXCIsXG5cdFx0XHRzdXBwb3J0c0R1YWxTdGFjazogdHJ1ZSxcblx0XHRcdHN1cHBvcnRzRklQUzogdHJ1ZVxuXHRcdH0sXG5cdFx0cmVnaW9uUmVnZXg6IFwiXnVzXFxcXC1pc29mXFxcXC1cXFxcdytcXFxcLVxcXFxkKyRcIixcblx0XHRyZWdpb25zOiB7XG5cdFx0XHRcImF3cy1pc28tZi1nbG9iYWxcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJhd3MtaXNvLWYgZ2xvYmFsIHJlZ2lvblwiXG5cdFx0XHR9LFxuXHRcdFx0XCJ1cy1pc29mLWVhc3QtMVwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcIlVTIElTT0YgRUFTVFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJ1cy1pc29mLXNvdXRoLTFcIjoge1xuXHRcdFx0XHRkZXNjcmlwdGlvbjogXCJVUyBJU09GIFNPVVRIXCJcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdHtcblx0XHRpZDogXCJhd3MtdXMtZ292XCIsXG5cdFx0b3V0cHV0czoge1xuXHRcdFx0ZG5zU3VmZml4OiBcImFtYXpvbmF3cy5jb21cIixcblx0XHRcdGR1YWxTdGFja0Ruc1N1ZmZpeDogXCJhcGkuYXdzXCIsXG5cdFx0XHRpbXBsaWNpdEdsb2JhbFJlZ2lvbjogXCJ1cy1nb3Ytd2VzdC0xXCIsXG5cdFx0XHRuYW1lOiBcImF3cy11cy1nb3ZcIixcblx0XHRcdHN1cHBvcnRzRHVhbFN0YWNrOiB0cnVlLFxuXHRcdFx0c3VwcG9ydHNGSVBTOiB0cnVlXG5cdFx0fSxcblx0XHRyZWdpb25SZWdleDogXCJedXNcXFxcLWdvdlxcXFwtXFxcXHcrXFxcXC1cXFxcZCskXCIsXG5cdFx0cmVnaW9uczoge1xuXHRcdFx0XCJhd3MtdXMtZ292LWdsb2JhbFwiOiB7XG5cdFx0XHRcdGRlc2NyaXB0aW9uOiBcImF3cy11cy1nb3YgZ2xvYmFsIHJlZ2lvblwiXG5cdFx0XHR9LFxuXHRcdFx0XCJ1cy1nb3YtZWFzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQVdTIEdvdkNsb3VkIChVUy1FYXN0KVwiXG5cdFx0XHR9LFxuXHRcdFx0XCJ1cy1nb3Ytd2VzdC0xXCI6IHtcblx0XHRcdFx0ZGVzY3JpcHRpb246IFwiQVdTIEdvdkNsb3VkIChVUy1XZXN0KVwiXG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5dO1xudmFyIHZlcnNpb24gPSBcIjEuMVwiO1xudmFyIHBhcnRpdGlvbnNJbmZvID0ge1xuXHRwYXJ0aXRpb25zOiBwYXJ0aXRpb25zLFxuXHR2ZXJzaW9uOiB2ZXJzaW9uXG59O1xuXG5sZXQgc2VsZWN0ZWRQYXJ0aXRpb25zSW5mbyA9IHBhcnRpdGlvbnNJbmZvO1xubGV0IHNlbGVjdGVkVXNlckFnZW50UHJlZml4ID0gXCJcIjtcbmNvbnN0IHBhcnRpdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHsgcGFydGl0aW9ucyB9ID0gc2VsZWN0ZWRQYXJ0aXRpb25zSW5mbztcbiAgICBmb3IgKGNvbnN0IHBhcnRpdGlvbiBvZiBwYXJ0aXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgcmVnaW9ucywgb3V0cHV0cyB9ID0gcGFydGl0aW9uO1xuICAgICAgICBmb3IgKGNvbnN0IFtyZWdpb24sIHJlZ2lvbkRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHJlZ2lvbnMpKSB7XG4gICAgICAgICAgICBpZiAocmVnaW9uID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlZ2lvbkRhdGEsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhcnRpdGlvbiBvZiBwYXJ0aXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgcmVnaW9uUmVnZXgsIG91dHB1dHMgfSA9IHBhcnRpdGlvbjtcbiAgICAgICAgaWYgKG5ldyBSZWdFeHAocmVnaW9uUmVnZXgpLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLm91dHB1dHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IERFRkFVTFRfUEFSVElUSU9OID0gcGFydGl0aW9ucy5maW5kKChwYXJ0aXRpb24pID0+IHBhcnRpdGlvbi5pZCA9PT0gXCJhd3NcIik7XG4gICAgaWYgKCFERUZBVUxUX1BBUlRJVElPTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCByZWdpb24gd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGFydGl0aW9uIGFycmF5IG9yIHJlZ2V4LFwiICtcbiAgICAgICAgICAgIFwiIGFuZCBkZWZhdWx0IHBhcnRpdGlvbiB3aXRoIGlkICdhd3MnIGRvZXNuJ3QgZXhpc3QuXCIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5ERUZBVUxUX1BBUlRJVElPTi5vdXRwdXRzLFxuICAgIH07XG59O1xuY29uc3Qgc2V0UGFydGl0aW9uSW5mbyA9IChwYXJ0aXRpb25zSW5mbywgdXNlckFnZW50UHJlZml4ID0gXCJcIikgPT4ge1xuICAgIHNlbGVjdGVkUGFydGl0aW9uc0luZm8gPSBwYXJ0aXRpb25zSW5mbztcbiAgICBzZWxlY3RlZFVzZXJBZ2VudFByZWZpeCA9IHVzZXJBZ2VudFByZWZpeDtcbn07XG5jb25zdCB1c2VEZWZhdWx0UGFydGl0aW9uSW5mbyA9ICgpID0+IHtcbiAgICBzZXRQYXJ0aXRpb25JbmZvKHBhcnRpdGlvbnNJbmZvLCBcIlwiKTtcbn07XG5jb25zdCBnZXRVc2VyQWdlbnRQcmVmaXggPSAoKSA9PiBzZWxlY3RlZFVzZXJBZ2VudFByZWZpeDtcblxuY29uc3QgYXdzRW5kcG9pbnRGdW5jdGlvbnMgPSB7XG4gICAgaXNWaXJ0dWFsSG9zdGFibGVTM0J1Y2tldDogaXNWaXJ0dWFsSG9zdGFibGVTM0J1Y2tldCxcbiAgICBwYXJzZUFybjogcGFyc2VBcm4sXG4gICAgcGFydGl0aW9uOiBwYXJ0aXRpb24sXG59O1xudXRpbEVuZHBvaW50cy5jdXN0b21FbmRwb2ludEZ1bmN0aW9ucy5hd3MgPSBhd3NFbmRwb2ludEZ1bmN0aW9ucztcblxuY29uc3QgcmVzb2x2ZURlZmF1bHRBd3NSZWdpb25hbEVuZHBvaW50c0NvbmZpZyA9IChpbnB1dCkgPT4ge1xuICAgIGlmICh0eXBlb2YgaW5wdXQuZW5kcG9pbnRQcm92aWRlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkBhd3Mtc2RrL3V0aWwtZW5kcG9pbnQgLSBlbmRwb2ludFByb3ZpZGVyIGFuZCBlbmRwb2ludCBtaXNzaW5nIGluIGNvbmZpZyBmb3IgdGhpcyBjbGllbnQuXCIpO1xuICAgIH1cbiAgICBjb25zdCB7IGVuZHBvaW50IH0gPSBpbnB1dDtcbiAgICBpZiAoZW5kcG9pbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnB1dC5lbmRwb2ludCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0b0VuZHBvaW50VjEoaW5wdXQuZW5kcG9pbnRQcm92aWRlcih7XG4gICAgICAgICAgICAgICAgUmVnaW9uOiB0eXBlb2YgaW5wdXQucmVnaW9uID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCBpbnB1dC5yZWdpb24oKSA6IGlucHV0LnJlZ2lvbixcbiAgICAgICAgICAgICAgICBVc2VEdWFsU3RhY2s6IHR5cGVvZiBpbnB1dC51c2VEdWFsc3RhY2tFbmRwb2ludCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gYXdhaXQgaW5wdXQudXNlRHVhbHN0YWNrRW5kcG9pbnQoKVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnVzZUR1YWxzdGFja0VuZHBvaW50LFxuICAgICAgICAgICAgICAgIFVzZUZJUFM6IHR5cGVvZiBpbnB1dC51c2VGaXBzRW5kcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGlucHV0LnVzZUZpcHNFbmRwb2ludCgpIDogaW5wdXQudXNlRmlwc0VuZHBvaW50LFxuICAgICAgICAgICAgICAgIEVuZHBvaW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LCB7IGxvZ2dlcjogaW5wdXQubG9nZ2VyIH0pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0O1xufTtcbmNvbnN0IHRvRW5kcG9pbnRWMSA9IChlbmRwb2ludCkgPT4gdXJsUGFyc2VyLnBhcnNlVXJsKGVuZHBvaW50LnVybCk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVuZHBvaW50RXJyb3JcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsRW5kcG9pbnRzLkVuZHBvaW50RXJyb3I7IH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNJcEFkZHJlc3NcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsRW5kcG9pbnRzLmlzSXBBZGRyZXNzOyB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlc29sdmVFbmRwb2ludFwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWxFbmRwb2ludHMucmVzb2x2ZUVuZHBvaW50OyB9XG59KTtcbmV4cG9ydHMuYXdzRW5kcG9pbnRGdW5jdGlvbnMgPSBhd3NFbmRwb2ludEZ1bmN0aW9ucztcbmV4cG9ydHMuZ2V0VXNlckFnZW50UHJlZml4ID0gZ2V0VXNlckFnZW50UHJlZml4O1xuZXhwb3J0cy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247XG5leHBvcnRzLnJlc29sdmVEZWZhdWx0QXdzUmVnaW9uYWxFbmRwb2ludHNDb25maWcgPSByZXNvbHZlRGVmYXVsdEF3c1JlZ2lvbmFsRW5kcG9pbnRzQ29uZmlnO1xuZXhwb3J0cy5zZXRQYXJ0aXRpb25JbmZvID0gc2V0UGFydGl0aW9uSW5mbztcbmV4cG9ydHMudG9FbmRwb2ludFYxID0gdG9FbmRwb2ludFYxO1xuZXhwb3J0cy51c2VEZWZhdWx0UGFydGl0aW9uSW5mbyA9IHVzZURlZmF1bHRQYXJ0aXRpb25JbmZvO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsSGV4RW5jb2RpbmcgPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtaGV4LWVuY29kaW5nJyk7XG52YXIgdXRpbFV0ZjggPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtdXRmOCcpO1xudmFyIGlzQXJyYXlCdWZmZXIgPSByZXF1aXJlKCdAc21pdGh5L2lzLWFycmF5LWJ1ZmZlcicpO1xudmFyIHByb3RvY29sSHR0cCA9IHJlcXVpcmUoJ0BzbWl0aHkvcHJvdG9jb2wtaHR0cCcpO1xudmFyIHV0aWxNaWRkbGV3YXJlID0gcmVxdWlyZSgnQHNtaXRoeS91dGlsLW1pZGRsZXdhcmUnKTtcbnZhciB1dGlsVXJpRXNjYXBlID0gcmVxdWlyZSgnQHNtaXRoeS91dGlsLXVyaS1lc2NhcGUnKTtcblxuY29uc3QgQUxHT1JJVEhNX1FVRVJZX1BBUkFNID0gXCJYLUFtei1BbGdvcml0aG1cIjtcbmNvbnN0IENSRURFTlRJQUxfUVVFUllfUEFSQU0gPSBcIlgtQW16LUNyZWRlbnRpYWxcIjtcbmNvbnN0IEFNWl9EQVRFX1FVRVJZX1BBUkFNID0gXCJYLUFtei1EYXRlXCI7XG5jb25zdCBTSUdORURfSEVBREVSU19RVUVSWV9QQVJBTSA9IFwiWC1BbXotU2lnbmVkSGVhZGVyc1wiO1xuY29uc3QgRVhQSVJFU19RVUVSWV9QQVJBTSA9IFwiWC1BbXotRXhwaXJlc1wiO1xuY29uc3QgU0lHTkFUVVJFX1FVRVJZX1BBUkFNID0gXCJYLUFtei1TaWduYXR1cmVcIjtcbmNvbnN0IFRPS0VOX1FVRVJZX1BBUkFNID0gXCJYLUFtei1TZWN1cml0eS1Ub2tlblwiO1xuY29uc3QgUkVHSU9OX1NFVF9QQVJBTSA9IFwiWC1BbXotUmVnaW9uLVNldFwiO1xuY29uc3QgQVVUSF9IRUFERVIgPSBcImF1dGhvcml6YXRpb25cIjtcbmNvbnN0IEFNWl9EQVRFX0hFQURFUiA9IEFNWl9EQVRFX1FVRVJZX1BBUkFNLnRvTG93ZXJDYXNlKCk7XG5jb25zdCBEQVRFX0hFQURFUiA9IFwiZGF0ZVwiO1xuY29uc3QgR0VORVJBVEVEX0hFQURFUlMgPSBbQVVUSF9IRUFERVIsIEFNWl9EQVRFX0hFQURFUiwgREFURV9IRUFERVJdO1xuY29uc3QgU0lHTkFUVVJFX0hFQURFUiA9IFNJR05BVFVSRV9RVUVSWV9QQVJBTS50b0xvd2VyQ2FzZSgpO1xuY29uc3QgU0hBMjU2X0hFQURFUiA9IFwieC1hbXotY29udGVudC1zaGEyNTZcIjtcbmNvbnN0IFRPS0VOX0hFQURFUiA9IFRPS0VOX1FVRVJZX1BBUkFNLnRvTG93ZXJDYXNlKCk7XG5jb25zdCBIT1NUX0hFQURFUiA9IFwiaG9zdFwiO1xuY29uc3QgQUxXQVlTX1VOU0lHTkFCTEVfSEVBREVSUyA9IHtcbiAgICBhdXRob3JpemF0aW9uOiB0cnVlLFxuICAgIFwiY2FjaGUtY29udHJvbFwiOiB0cnVlLFxuICAgIGNvbm5lY3Rpb246IHRydWUsXG4gICAgZXhwZWN0OiB0cnVlLFxuICAgIGZyb206IHRydWUsXG4gICAgXCJrZWVwLWFsaXZlXCI6IHRydWUsXG4gICAgXCJtYXgtZm9yd2FyZHNcIjogdHJ1ZSxcbiAgICBwcmFnbWE6IHRydWUsXG4gICAgcmVmZXJlcjogdHJ1ZSxcbiAgICB0ZTogdHJ1ZSxcbiAgICB0cmFpbGVyOiB0cnVlLFxuICAgIFwidHJhbnNmZXItZW5jb2RpbmdcIjogdHJ1ZSxcbiAgICB1cGdyYWRlOiB0cnVlLFxuICAgIFwidXNlci1hZ2VudFwiOiB0cnVlLFxuICAgIFwieC1hbXpuLXRyYWNlLWlkXCI6IHRydWUsXG59O1xuY29uc3QgUFJPWFlfSEVBREVSX1BBVFRFUk4gPSAvXnByb3h5LS87XG5jb25zdCBTRUNfSEVBREVSX1BBVFRFUk4gPSAvXnNlYy0vO1xuY29uc3QgVU5TSUdOQUJMRV9QQVRURVJOUyA9IFsvXnByb3h5LS9pLCAvXnNlYy0vaV07XG5jb25zdCBBTEdPUklUSE1fSURFTlRJRklFUiA9IFwiQVdTNC1ITUFDLVNIQTI1NlwiO1xuY29uc3QgQUxHT1JJVEhNX0lERU5USUZJRVJfVjRBID0gXCJBV1M0LUVDRFNBLVAyNTYtU0hBMjU2XCI7XG5jb25zdCBFVkVOVF9BTEdPUklUSE1fSURFTlRJRklFUiA9IFwiQVdTNC1ITUFDLVNIQTI1Ni1QQVlMT0FEXCI7XG5jb25zdCBVTlNJR05FRF9QQVlMT0FEID0gXCJVTlNJR05FRC1QQVlMT0FEXCI7XG5jb25zdCBNQVhfQ0FDSEVfU0laRSA9IDUwO1xuY29uc3QgS0VZX1RZUEVfSURFTlRJRklFUiA9IFwiYXdzNF9yZXF1ZXN0XCI7XG5jb25zdCBNQVhfUFJFU0lHTkVEX1RUTCA9IDYwICogNjAgKiAyNCAqIDc7XG5cbmNvbnN0IHNpZ25pbmdLZXlDYWNoZSA9IHt9O1xuY29uc3QgY2FjaGVRdWV1ZSA9IFtdO1xuY29uc3QgY3JlYXRlU2NvcGUgPSAoc2hvcnREYXRlLCByZWdpb24sIHNlcnZpY2UpID0+IGAke3Nob3J0RGF0ZX0vJHtyZWdpb259LyR7c2VydmljZX0vJHtLRVlfVFlQRV9JREVOVElGSUVSfWA7XG5jb25zdCBnZXRTaWduaW5nS2V5ID0gYXN5bmMgKHNoYTI1NkNvbnN0cnVjdG9yLCBjcmVkZW50aWFscywgc2hvcnREYXRlLCByZWdpb24sIHNlcnZpY2UpID0+IHtcbiAgICBjb25zdCBjcmVkc0hhc2ggPSBhd2FpdCBobWFjKHNoYTI1NkNvbnN0cnVjdG9yLCBjcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXksIGNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkKTtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke3Nob3J0RGF0ZX06JHtyZWdpb259OiR7c2VydmljZX06JHt1dGlsSGV4RW5jb2RpbmcudG9IZXgoY3JlZHNIYXNoKX06JHtjcmVkZW50aWFscy5zZXNzaW9uVG9rZW59YDtcbiAgICBpZiAoY2FjaGVLZXkgaW4gc2lnbmluZ0tleUNhY2hlKSB7XG4gICAgICAgIHJldHVybiBzaWduaW5nS2V5Q2FjaGVbY2FjaGVLZXldO1xuICAgIH1cbiAgICBjYWNoZVF1ZXVlLnB1c2goY2FjaGVLZXkpO1xuICAgIHdoaWxlIChjYWNoZVF1ZXVlLmxlbmd0aCA+IE1BWF9DQUNIRV9TSVpFKSB7XG4gICAgICAgIGRlbGV0ZSBzaWduaW5nS2V5Q2FjaGVbY2FjaGVRdWV1ZS5zaGlmdCgpXTtcbiAgICB9XG4gICAgbGV0IGtleSA9IGBBV1M0JHtjcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXl9YDtcbiAgICBmb3IgKGNvbnN0IHNpZ25hYmxlIG9mIFtzaG9ydERhdGUsIHJlZ2lvbiwgc2VydmljZSwgS0VZX1RZUEVfSURFTlRJRklFUl0pIHtcbiAgICAgICAga2V5ID0gYXdhaXQgaG1hYyhzaGEyNTZDb25zdHJ1Y3Rvciwga2V5LCBzaWduYWJsZSk7XG4gICAgfVxuICAgIHJldHVybiAoc2lnbmluZ0tleUNhY2hlW2NhY2hlS2V5XSA9IGtleSk7XG59O1xuY29uc3QgY2xlYXJDcmVkZW50aWFsQ2FjaGUgPSAoKSA9PiB7XG4gICAgY2FjaGVRdWV1ZS5sZW5ndGggPSAwO1xuICAgIE9iamVjdC5rZXlzKHNpZ25pbmdLZXlDYWNoZSkuZm9yRWFjaCgoY2FjaGVLZXkpID0+IHtcbiAgICAgICAgZGVsZXRlIHNpZ25pbmdLZXlDYWNoZVtjYWNoZUtleV07XG4gICAgfSk7XG59O1xuY29uc3QgaG1hYyA9IChjdG9yLCBzZWNyZXQsIGRhdGEpID0+IHtcbiAgICBjb25zdCBoYXNoID0gbmV3IGN0b3Ioc2VjcmV0KTtcbiAgICBoYXNoLnVwZGF0ZSh1dGlsVXRmOC50b1VpbnQ4QXJyYXkoZGF0YSkpO1xuICAgIHJldHVybiBoYXNoLmRpZ2VzdCgpO1xufTtcblxuY29uc3QgZ2V0Q2Fub25pY2FsSGVhZGVycyA9ICh7IGhlYWRlcnMgfSwgdW5zaWduYWJsZUhlYWRlcnMsIHNpZ25hYmxlSGVhZGVycykgPT4ge1xuICAgIGNvbnN0IGNhbm9uaWNhbCA9IHt9O1xuICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKS5zb3J0KCkpIHtcbiAgICAgICAgaWYgKGhlYWRlcnNbaGVhZGVyTmFtZV0gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5vbmljYWxIZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY2Fub25pY2FsSGVhZGVyTmFtZSBpbiBBTFdBWVNfVU5TSUdOQUJMRV9IRUFERVJTIHx8XG4gICAgICAgICAgICB1bnNpZ25hYmxlSGVhZGVycz8uaGFzKGNhbm9uaWNhbEhlYWRlck5hbWUpIHx8XG4gICAgICAgICAgICBQUk9YWV9IRUFERVJfUEFUVEVSTi50ZXN0KGNhbm9uaWNhbEhlYWRlck5hbWUpIHx8XG4gICAgICAgICAgICBTRUNfSEVBREVSX1BBVFRFUk4udGVzdChjYW5vbmljYWxIZWFkZXJOYW1lKSkge1xuICAgICAgICAgICAgaWYgKCFzaWduYWJsZUhlYWRlcnMgfHwgKHNpZ25hYmxlSGVhZGVycyAmJiAhc2lnbmFibGVIZWFkZXJzLmhhcyhjYW5vbmljYWxIZWFkZXJOYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYW5vbmljYWxbY2Fub25pY2FsSGVhZGVyTmFtZV0gPSBoZWFkZXJzW2hlYWRlck5hbWVdLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbm9uaWNhbDtcbn07XG5cbmNvbnN0IGdldFBheWxvYWRIYXNoID0gYXN5bmMgKHsgaGVhZGVycywgYm9keSB9LCBoYXNoQ29uc3RydWN0b3IpID0+IHtcbiAgICBmb3IgKGNvbnN0IGhlYWRlck5hbWUgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgICAgaWYgKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gU0hBMjU2X0hFQURFUikge1xuICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJvZHkgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBcImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTVcIjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KGJvZHkpIHx8IGlzQXJyYXlCdWZmZXIuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgICAgICBjb25zdCBoYXNoQ3RvciA9IG5ldyBoYXNoQ29uc3RydWN0b3IoKTtcbiAgICAgICAgaGFzaEN0b3IudXBkYXRlKHV0aWxVdGY4LnRvVWludDhBcnJheShib2R5KSk7XG4gICAgICAgIHJldHVybiB1dGlsSGV4RW5jb2RpbmcudG9IZXgoYXdhaXQgaGFzaEN0b3IuZGlnZXN0KCkpO1xuICAgIH1cbiAgICByZXR1cm4gVU5TSUdORURfUEFZTE9BRDtcbn07XG5cbmNsYXNzIEhlYWRlckZvcm1hdHRlciB7XG4gICAgZm9ybWF0KGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKSkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB1dGlsVXRmOC5mcm9tVXRmOChoZWFkZXJOYW1lKTtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKFVpbnQ4QXJyYXkuZnJvbShbYnl0ZXMuYnl0ZUxlbmd0aF0pLCBieXRlcywgdGhpcy5mb3JtYXRIZWFkZXJWYWx1ZShoZWFkZXJzW2hlYWRlck5hbWVdKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmtzLnJlZHVjZSgoY2FycnksIGJ5dGVzKSA9PiBjYXJyeSArIGJ5dGVzLmJ5dGVMZW5ndGgsIDApKTtcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgICAgICAgIG91dC5zZXQoY2h1bmssIHBvc2l0aW9uKTtcbiAgICAgICAgICAgIHBvc2l0aW9uICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgZm9ybWF0SGVhZGVyVmFsdWUoaGVhZGVyKSB7XG4gICAgICAgIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShbaGVhZGVyLnZhbHVlID8gMCA6IDFdKTtcbiAgICAgICAgICAgIGNhc2UgXCJieXRlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShbMiwgaGVhZGVyLnZhbHVlXSk7XG4gICAgICAgICAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBzaG9ydFZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDMpKTtcbiAgICAgICAgICAgICAgICBzaG9ydFZpZXcuc2V0VWludDgoMCwgMyk7XG4gICAgICAgICAgICAgICAgc2hvcnRWaWV3LnNldEludDE2KDEsIGhlYWRlci52YWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShzaG9ydFZpZXcuYnVmZmVyKTtcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgICAgICAgICAgY29uc3QgaW50VmlldyA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoNSkpO1xuICAgICAgICAgICAgICAgIGludFZpZXcuc2V0VWludDgoMCwgNCk7XG4gICAgICAgICAgICAgICAgaW50Vmlldy5zZXRJbnQzMigxLCBoZWFkZXIudmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW50Vmlldy5idWZmZXIpO1xuICAgICAgICAgICAgY2FzZSBcImxvbmdcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBsb25nQnl0ZXMgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICBsb25nQnl0ZXNbMF0gPSA1O1xuICAgICAgICAgICAgICAgIGxvbmdCeXRlcy5zZXQoaGVhZGVyLnZhbHVlLmJ5dGVzLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9uZ0J5dGVzO1xuICAgICAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxuICAgICAgICAgICAgICAgIGNvbnN0IGJpblZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDMgKyBoZWFkZXIudmFsdWUuYnl0ZUxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGJpblZpZXcuc2V0VWludDgoMCwgNik7XG4gICAgICAgICAgICAgICAgYmluVmlldy5zZXRVaW50MTYoMSwgaGVhZGVyLnZhbHVlLmJ5dGVMZW5ndGgsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaW5CeXRlcyA9IG5ldyBVaW50OEFycmF5KGJpblZpZXcuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBiaW5CeXRlcy5zZXQoaGVhZGVyLnZhbHVlLCAzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmluQnl0ZXM7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgY29uc3QgdXRmOEJ5dGVzID0gdXRpbFV0ZjguZnJvbVV0ZjgoaGVhZGVyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJWaWV3ID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigzICsgdXRmOEJ5dGVzLmJ5dGVMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBzdHJWaWV3LnNldFVpbnQ4KDAsIDcpO1xuICAgICAgICAgICAgICAgIHN0clZpZXcuc2V0VWludDE2KDEsIHV0ZjhCeXRlcy5ieXRlTGVuZ3RoLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyQnl0ZXMgPSBuZXcgVWludDhBcnJheShzdHJWaWV3LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgc3RyQnl0ZXMuc2V0KHV0ZjhCeXRlcywgMyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0ckJ5dGVzO1xuICAgICAgICAgICAgY2FzZSBcInRpbWVzdGFtcFwiOlxuICAgICAgICAgICAgICAgIGNvbnN0IHRzQnl0ZXMgPSBuZXcgVWludDhBcnJheSg5KTtcbiAgICAgICAgICAgICAgICB0c0J5dGVzWzBdID0gODtcbiAgICAgICAgICAgICAgICB0c0J5dGVzLnNldChJbnQ2NC5mcm9tTnVtYmVyKGhlYWRlci52YWx1ZS52YWx1ZU9mKCkpLmJ5dGVzLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHNCeXRlcztcbiAgICAgICAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgICAgICAgICAgaWYgKCFVVUlEX1BBVFRFUk4udGVzdChoZWFkZXIudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVVUlEIHJlY2VpdmVkOiAke2hlYWRlci52YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTcpO1xuICAgICAgICAgICAgICAgIHV1aWRCeXRlc1swXSA9IDk7XG4gICAgICAgICAgICAgICAgdXVpZEJ5dGVzLnNldCh1dGlsSGV4RW5jb2RpbmcuZnJvbUhleChoZWFkZXIudmFsdWUucmVwbGFjZSgvXFwtL2csIFwiXCIpKSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV1aWRCeXRlcztcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IFVVSURfUEFUVEVSTiA9IC9eW2EtZjAtOV17OH0tW2EtZjAtOV17NH0tW2EtZjAtOV17NH0tW2EtZjAtOV17NH0tW2EtZjAtOV17MTJ9JC87XG5jbGFzcyBJbnQ2NCB7XG4gICAgYnl0ZXM7XG4gICAgY29uc3RydWN0b3IoYnl0ZXMpIHtcbiAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzO1xuICAgICAgICBpZiAoYnl0ZXMuYnl0ZUxlbmd0aCAhPT0gOCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50NjQgYnVmZmVycyBtdXN0IGJlIGV4YWN0bHkgOCBieXRlc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbU51bWJlcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA+IDlfMjIzXzM3Ml8wMzZfODU0Xzc3NV84MDcgfHwgbnVtYmVyIDwgLTkyMjMzNzIwMzY4NTQ3NzZlMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke251bWJlcn0gaXMgdG9vIGxhcmdlIChvciwgaWYgbmVnYXRpdmUsIHRvbyBzbWFsbCkgdG8gcmVwcmVzZW50IGFzIGFuIEludDY0YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheSg4KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDcsIHJlbWFpbmluZyA9IE1hdGguYWJzKE1hdGgucm91bmQobnVtYmVyKSk7IGkgPiAtMSAmJiByZW1haW5pbmcgPiAwOyBpLS0sIHJlbWFpbmluZyAvPSAyNTYpIHtcbiAgICAgICAgICAgIGJ5dGVzW2ldID0gcmVtYWluaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICBuZWdhdGUoYnl0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSW50NjQoYnl0ZXMpO1xuICAgIH1cbiAgICB2YWx1ZU9mKCkge1xuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXMuc2xpY2UoMCk7XG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlID0gYnl0ZXNbMF0gJiAwYjEwMDAwMDAwO1xuICAgICAgICBpZiAobmVnYXRpdmUpIHtcbiAgICAgICAgICAgIG5lZ2F0ZShieXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHV0aWxIZXhFbmNvZGluZy50b0hleChieXRlcyksIDE2KSAqIChuZWdhdGl2ZSA/IC0xIDogMSk7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWVPZigpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBuZWdhdGUoYnl0ZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICBieXRlc1tpXSBePSAweGZmO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gNzsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgYnl0ZXNbaV0rKztcbiAgICAgICAgaWYgKGJ5dGVzW2ldICE9PSAwKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuXG5jb25zdCBoYXNIZWFkZXIgPSAoc291Z2h0SGVhZGVyLCBoZWFkZXJzKSA9PiB7XG4gICAgc291Z2h0SGVhZGVyID0gc291Z2h0SGVhZGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICAgIGlmIChzb3VnaHRIZWFkZXIgPT09IGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgbW92ZUhlYWRlcnNUb1F1ZXJ5ID0gKHJlcXVlc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZGVycywgcXVlcnkgPSB7fSB9ID0gcHJvdG9jb2xIdHRwLkh0dHBSZXF1ZXN0LmNsb25lKHJlcXVlc3QpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKSkge1xuICAgICAgICBjb25zdCBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKChsbmFtZS5zbGljZSgwLCA2KSA9PT0gXCJ4LWFtei1cIiAmJiAhb3B0aW9ucy51bmhvaXN0YWJsZUhlYWRlcnM/LmhhcyhsbmFtZSkpIHx8XG4gICAgICAgICAgICBvcHRpb25zLmhvaXN0YWJsZUhlYWRlcnM/LmhhcyhsbmFtZSkpIHtcbiAgICAgICAgICAgIHF1ZXJ5W25hbWVdID0gaGVhZGVyc1tuYW1lXTtcbiAgICAgICAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHF1ZXJ5LFxuICAgIH07XG59O1xuXG5jb25zdCBwcmVwYXJlUmVxdWVzdCA9IChyZXF1ZXN0KSA9PiB7XG4gICAgcmVxdWVzdCA9IHByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5jbG9uZShyZXF1ZXN0KTtcbiAgICBmb3IgKGNvbnN0IGhlYWRlck5hbWUgb2YgT2JqZWN0LmtleXMocmVxdWVzdC5oZWFkZXJzKSkge1xuICAgICAgICBpZiAoR0VORVJBVEVEX0hFQURFUlMuaW5kZXhPZihoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0LmhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59O1xuXG5jb25zdCBnZXRDYW5vbmljYWxRdWVyeSA9ICh7IHF1ZXJ5ID0ge30gfSkgPT4ge1xuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocXVlcnkpKSB7XG4gICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gU0lHTkFUVVJFX0hFQURFUikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5jb2RlZEtleSA9IHV0aWxVcmlFc2NhcGUuZXNjYXBlVXJpKGtleSk7XG4gICAgICAgIGtleXMucHVzaChlbmNvZGVkS2V5KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBxdWVyeVtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkW2VuY29kZWRLZXldID0gYCR7ZW5jb2RlZEtleX09JHt1dGlsVXJpRXNjYXBlLmVzY2FwZVVyaSh2YWx1ZSl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgc2VyaWFsaXplZFtlbmNvZGVkS2V5XSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgLnNsaWNlKDApXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoZW5jb2RlZCwgdmFsdWUpID0+IGVuY29kZWQuY29uY2F0KFtgJHtlbmNvZGVkS2V5fT0ke3V0aWxVcmlFc2NhcGUuZXNjYXBlVXJpKHZhbHVlKX1gXSksIFtdKVxuICAgICAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgICAgICAuam9pbihcIiZcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXNcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAubWFwKChrZXkpID0+IHNlcmlhbGl6ZWRba2V5XSlcbiAgICAgICAgLmZpbHRlcigoc2VyaWFsaXplZCkgPT4gc2VyaWFsaXplZClcbiAgICAgICAgLmpvaW4oXCImXCIpO1xufTtcblxuY29uc3QgaXNvODYwMSA9ICh0aW1lKSA9PiB0b0RhdGUodGltZSlcbiAgICAudG9JU09TdHJpbmcoKVxuICAgIC5yZXBsYWNlKC9cXC5cXGR7M31aJC8sIFwiWlwiKTtcbmNvbnN0IHRvRGF0ZSA9ICh0aW1lKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0aW1lID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lICogMTAwMCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGltZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoTnVtYmVyKHRpbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoTnVtYmVyKHRpbWUpICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRpbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcbn07XG5cbmNsYXNzIFNpZ25hdHVyZVY0QmFzZSB7XG4gICAgc2VydmljZTtcbiAgICByZWdpb25Qcm92aWRlcjtcbiAgICBjcmVkZW50aWFsUHJvdmlkZXI7XG4gICAgc2hhMjU2O1xuICAgIHVyaUVzY2FwZVBhdGg7XG4gICAgYXBwbHlDaGVja3N1bTtcbiAgICBjb25zdHJ1Y3Rvcih7IGFwcGx5Q2hlY2tzdW0sIGNyZWRlbnRpYWxzLCByZWdpb24sIHNlcnZpY2UsIHNoYTI1NiwgdXJpRXNjYXBlUGF0aCA9IHRydWUsIH0pIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTtcbiAgICAgICAgdGhpcy5zaGEyNTYgPSBzaGEyNTY7XG4gICAgICAgIHRoaXMudXJpRXNjYXBlUGF0aCA9IHVyaUVzY2FwZVBhdGg7XG4gICAgICAgIHRoaXMuYXBwbHlDaGVja3N1bSA9IHR5cGVvZiBhcHBseUNoZWNrc3VtID09PSBcImJvb2xlYW5cIiA/IGFwcGx5Q2hlY2tzdW0gOiB0cnVlO1xuICAgICAgICB0aGlzLnJlZ2lvblByb3ZpZGVyID0gdXRpbE1pZGRsZXdhcmUubm9ybWFsaXplUHJvdmlkZXIocmVnaW9uKTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFsUHJvdmlkZXIgPSB1dGlsTWlkZGxld2FyZS5ub3JtYWxpemVQcm92aWRlcihjcmVkZW50aWFscyk7XG4gICAgfVxuICAgIGNyZWF0ZUNhbm9uaWNhbFJlcXVlc3QocmVxdWVzdCwgY2Fub25pY2FsSGVhZGVycywgcGF5bG9hZEhhc2gpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkSGVhZGVycyA9IE9iamVjdC5rZXlzKGNhbm9uaWNhbEhlYWRlcnMpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGAke3JlcXVlc3QubWV0aG9kfVxuJHt0aGlzLmdldENhbm9uaWNhbFBhdGgocmVxdWVzdCl9XG4ke2dldENhbm9uaWNhbFF1ZXJ5KHJlcXVlc3QpfVxuJHtzb3J0ZWRIZWFkZXJzLm1hcCgobmFtZSkgPT4gYCR7bmFtZX06JHtjYW5vbmljYWxIZWFkZXJzW25hbWVdfWApLmpvaW4oXCJcXG5cIil9XG5cbiR7c29ydGVkSGVhZGVycy5qb2luKFwiO1wiKX1cbiR7cGF5bG9hZEhhc2h9YDtcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlU3RyaW5nVG9TaWduKGxvbmdEYXRlLCBjcmVkZW50aWFsU2NvcGUsIGNhbm9uaWNhbFJlcXVlc3QsIGFsZ29yaXRobUlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IG5ldyB0aGlzLnNoYTI1NigpO1xuICAgICAgICBoYXNoLnVwZGF0ZSh1dGlsVXRmOC50b1VpbnQ4QXJyYXkoY2Fub25pY2FsUmVxdWVzdCkpO1xuICAgICAgICBjb25zdCBoYXNoZWRSZXF1ZXN0ID0gYXdhaXQgaGFzaC5kaWdlc3QoKTtcbiAgICAgICAgcmV0dXJuIGAke2FsZ29yaXRobUlkZW50aWZpZXJ9XG4ke2xvbmdEYXRlfVxuJHtjcmVkZW50aWFsU2NvcGV9XG4ke3V0aWxIZXhFbmNvZGluZy50b0hleChoYXNoZWRSZXF1ZXN0KX1gO1xuICAgIH1cbiAgICBnZXRDYW5vbmljYWxQYXRoKHsgcGF0aCB9KSB7XG4gICAgICAgIGlmICh0aGlzLnVyaUVzY2FwZVBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoU2VnbWVudHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aFNlZ21lbnQgb2YgcGF0aC5zcGxpdChcIi9cIikpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0aFNlZ21lbnQ/Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhTZWdtZW50ID09PSBcIi5cIilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGhTZWdtZW50ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFBhdGhTZWdtZW50cy5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoU2VnbWVudHMucHVzaChwYXRoU2VnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBgJHtwYXRoPy5zdGFydHNXaXRoKFwiL1wiKSA/IFwiL1wiIDogXCJcIn0ke25vcm1hbGl6ZWRQYXRoU2VnbWVudHMuam9pbihcIi9cIil9JHtub3JtYWxpemVkUGF0aFNlZ21lbnRzLmxlbmd0aCA+IDAgJiYgcGF0aD8uZW5kc1dpdGgoXCIvXCIpID8gXCIvXCIgOiBcIlwifWA7XG4gICAgICAgICAgICBjb25zdCBkb3VibGVFbmNvZGVkID0gdXRpbFVyaUVzY2FwZS5lc2NhcGVVcmkobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIGRvdWJsZUVuY29kZWQucmVwbGFjZSgvJTJGL2csIFwiL1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgdmFsaWRhdGVSZXNvbHZlZENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY3JlZGVudGlhbHMgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFscy5hY2Nlc3NLZXlJZCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxzLnNlY3JldEFjY2Vzc0tleSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzb2x2ZWQgY3JlZGVudGlhbCBvYmplY3QgaXMgbm90IHZhbGlkXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcm1hdERhdGUobm93KSB7XG4gICAgICAgIGNvbnN0IGxvbmdEYXRlID0gaXNvODYwMShub3cpLnJlcGxhY2UoL1tcXC06XS9nLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvbmdEYXRlLFxuICAgICAgICAgICAgc2hvcnREYXRlOiBsb25nRGF0ZS5zbGljZSgwLCA4KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0Q2Fub25pY2FsSGVhZGVyTGlzdChoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhoZWFkZXJzKS5zb3J0KCkuam9pbihcIjtcIik7XG4gICAgfVxufVxuXG5jbGFzcyBTaWduYXR1cmVWNCBleHRlbmRzIFNpZ25hdHVyZVY0QmFzZSB7XG4gICAgaGVhZGVyRm9ybWF0dGVyID0gbmV3IEhlYWRlckZvcm1hdHRlcigpO1xuICAgIGNvbnN0cnVjdG9yKHsgYXBwbHlDaGVja3N1bSwgY3JlZGVudGlhbHMsIHJlZ2lvbiwgc2VydmljZSwgc2hhMjU2LCB1cmlFc2NhcGVQYXRoID0gdHJ1ZSwgfSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBhcHBseUNoZWNrc3VtLFxuICAgICAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBzZXJ2aWNlLFxuICAgICAgICAgICAgc2hhMjU2LFxuICAgICAgICAgICAgdXJpRXNjYXBlUGF0aCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHByZXNpZ24ob3JpZ2luYWxSZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzaWduaW5nRGF0ZSA9IG5ldyBEYXRlKCksIGV4cGlyZXNJbiA9IDM2MDAsIHVuc2lnbmFibGVIZWFkZXJzLCB1bmhvaXN0YWJsZUhlYWRlcnMsIHNpZ25hYmxlSGVhZGVycywgaG9pc3RhYmxlSGVhZGVycywgc2lnbmluZ1JlZ2lvbiwgc2lnbmluZ1NlcnZpY2UsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY3JlZGVudGlhbFByb3ZpZGVyKCk7XG4gICAgICAgIHRoaXMudmFsaWRhdGVSZXNvbHZlZENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKTtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gc2lnbmluZ1JlZ2lvbiA/PyAoYXdhaXQgdGhpcy5yZWdpb25Qcm92aWRlcigpKTtcbiAgICAgICAgY29uc3QgeyBsb25nRGF0ZSwgc2hvcnREYXRlIH0gPSB0aGlzLmZvcm1hdERhdGUoc2lnbmluZ0RhdGUpO1xuICAgICAgICBpZiAoZXhwaXJlc0luID4gTUFYX1BSRVNJR05FRF9UVEwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlNpZ25hdHVyZSB2ZXJzaW9uIDQgcHJlc2lnbmVkIFVSTHNcIiArIFwiIG11c3QgaGF2ZSBhbiBleHBpcmF0aW9uIGRhdGUgbGVzcyB0aGFuIG9uZSB3ZWVrIGluXCIgKyBcIiB0aGUgZnV0dXJlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjb3BlID0gY3JlYXRlU2NvcGUoc2hvcnREYXRlLCByZWdpb24sIHNpZ25pbmdTZXJ2aWNlID8/IHRoaXMuc2VydmljZSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBtb3ZlSGVhZGVyc1RvUXVlcnkocHJlcGFyZVJlcXVlc3Qob3JpZ2luYWxSZXF1ZXN0KSwgeyB1bmhvaXN0YWJsZUhlYWRlcnMsIGhvaXN0YWJsZUhlYWRlcnMgfSk7XG4gICAgICAgIGlmIChjcmVkZW50aWFscy5zZXNzaW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHJlcXVlc3QucXVlcnlbVE9LRU5fUVVFUllfUEFSQU1dID0gY3JlZGVudGlhbHMuc2Vzc2lvblRva2VuO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3QucXVlcnlbQUxHT1JJVEhNX1FVRVJZX1BBUkFNXSA9IEFMR09SSVRITV9JREVOVElGSUVSO1xuICAgICAgICByZXF1ZXN0LnF1ZXJ5W0NSRURFTlRJQUxfUVVFUllfUEFSQU1dID0gYCR7Y3JlZGVudGlhbHMuYWNjZXNzS2V5SWR9LyR7c2NvcGV9YDtcbiAgICAgICAgcmVxdWVzdC5xdWVyeVtBTVpfREFURV9RVUVSWV9QQVJBTV0gPSBsb25nRGF0ZTtcbiAgICAgICAgcmVxdWVzdC5xdWVyeVtFWFBJUkVTX1FVRVJZX1BBUkFNXSA9IGV4cGlyZXNJbi50b1N0cmluZygxMCk7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbEhlYWRlcnMgPSBnZXRDYW5vbmljYWxIZWFkZXJzKHJlcXVlc3QsIHVuc2lnbmFibGVIZWFkZXJzLCBzaWduYWJsZUhlYWRlcnMpO1xuICAgICAgICByZXF1ZXN0LnF1ZXJ5W1NJR05FRF9IRUFERVJTX1FVRVJZX1BBUkFNXSA9IHRoaXMuZ2V0Q2Fub25pY2FsSGVhZGVyTGlzdChjYW5vbmljYWxIZWFkZXJzKTtcbiAgICAgICAgcmVxdWVzdC5xdWVyeVtTSUdOQVRVUkVfUVVFUllfUEFSQU1dID0gYXdhaXQgdGhpcy5nZXRTaWduYXR1cmUobG9uZ0RhdGUsIHNjb3BlLCB0aGlzLmdldFNpZ25pbmdLZXkoY3JlZGVudGlhbHMsIHJlZ2lvbiwgc2hvcnREYXRlLCBzaWduaW5nU2VydmljZSksIHRoaXMuY3JlYXRlQ2Fub25pY2FsUmVxdWVzdChyZXF1ZXN0LCBjYW5vbmljYWxIZWFkZXJzLCBhd2FpdCBnZXRQYXlsb2FkSGFzaChvcmlnaW5hbFJlcXVlc3QsIHRoaXMuc2hhMjU2KSkpO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgYXN5bmMgc2lnbih0b1NpZ24sIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b1NpZ24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpZ25TdHJpbmcodG9TaWduLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0b1NpZ24uaGVhZGVycyAmJiB0b1NpZ24ucGF5bG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnbkV2ZW50KHRvU2lnbiwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodG9TaWduLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpZ25NZXNzYWdlKHRvU2lnbiwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdCh0b1NpZ24sIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNpZ25FdmVudCh7IGhlYWRlcnMsIHBheWxvYWQgfSwgeyBzaWduaW5nRGF0ZSA9IG5ldyBEYXRlKCksIHByaW9yU2lnbmF0dXJlLCBzaWduaW5nUmVnaW9uLCBzaWduaW5nU2VydmljZSB9KSB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHNpZ25pbmdSZWdpb24gPz8gKGF3YWl0IHRoaXMucmVnaW9uUHJvdmlkZXIoKSk7XG4gICAgICAgIGNvbnN0IHsgc2hvcnREYXRlLCBsb25nRGF0ZSB9ID0gdGhpcy5mb3JtYXREYXRlKHNpZ25pbmdEYXRlKTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBjcmVhdGVTY29wZShzaG9ydERhdGUsIHJlZ2lvbiwgc2lnbmluZ1NlcnZpY2UgPz8gdGhpcy5zZXJ2aWNlKTtcbiAgICAgICAgY29uc3QgaGFzaGVkUGF5bG9hZCA9IGF3YWl0IGdldFBheWxvYWRIYXNoKHsgaGVhZGVyczoge30sIGJvZHk6IHBheWxvYWQgfSwgdGhpcy5zaGEyNTYpO1xuICAgICAgICBjb25zdCBoYXNoID0gbmV3IHRoaXMuc2hhMjU2KCk7XG4gICAgICAgIGhhc2gudXBkYXRlKGhlYWRlcnMpO1xuICAgICAgICBjb25zdCBoYXNoZWRIZWFkZXJzID0gdXRpbEhleEVuY29kaW5nLnRvSGV4KGF3YWl0IGhhc2guZGlnZXN0KCkpO1xuICAgICAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICBFVkVOVF9BTEdPUklUSE1fSURFTlRJRklFUixcbiAgICAgICAgICAgIGxvbmdEYXRlLFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBwcmlvclNpZ25hdHVyZSxcbiAgICAgICAgICAgIGhhc2hlZEhlYWRlcnMsXG4gICAgICAgICAgICBoYXNoZWRQYXlsb2FkLFxuICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25TdHJpbmcoc3RyaW5nVG9TaWduLCB7IHNpZ25pbmdEYXRlLCBzaWduaW5nUmVnaW9uOiByZWdpb24sIHNpZ25pbmdTZXJ2aWNlIH0pO1xuICAgIH1cbiAgICBhc3luYyBzaWduTWVzc2FnZShzaWduYWJsZU1lc3NhZ2UsIHsgc2lnbmluZ0RhdGUgPSBuZXcgRGF0ZSgpLCBzaWduaW5nUmVnaW9uLCBzaWduaW5nU2VydmljZSB9KSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnNpZ25FdmVudCh7XG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlckZvcm1hdHRlci5mb3JtYXQoc2lnbmFibGVNZXNzYWdlLm1lc3NhZ2UuaGVhZGVycyksXG4gICAgICAgICAgICBwYXlsb2FkOiBzaWduYWJsZU1lc3NhZ2UubWVzc2FnZS5ib2R5LFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBzaWduaW5nRGF0ZSxcbiAgICAgICAgICAgIHNpZ25pbmdSZWdpb24sXG4gICAgICAgICAgICBzaWduaW5nU2VydmljZSxcbiAgICAgICAgICAgIHByaW9yU2lnbmF0dXJlOiBzaWduYWJsZU1lc3NhZ2UucHJpb3JTaWduYXR1cmUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChzaWduYXR1cmUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IHNpZ25hYmxlTWVzc2FnZS5tZXNzYWdlLCBzaWduYXR1cmUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHNpZ25TdHJpbmcoc3RyaW5nVG9TaWduLCB7IHNpZ25pbmdEYXRlID0gbmV3IERhdGUoKSwgc2lnbmluZ1JlZ2lvbiwgc2lnbmluZ1NlcnZpY2UgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5jcmVkZW50aWFsUHJvdmlkZXIoKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVJlc29sdmVkQ3JlZGVudGlhbHMoY3JlZGVudGlhbHMpO1xuICAgICAgICBjb25zdCByZWdpb24gPSBzaWduaW5nUmVnaW9uID8/IChhd2FpdCB0aGlzLnJlZ2lvblByb3ZpZGVyKCkpO1xuICAgICAgICBjb25zdCB7IHNob3J0RGF0ZSB9ID0gdGhpcy5mb3JtYXREYXRlKHNpZ25pbmdEYXRlKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IG5ldyB0aGlzLnNoYTI1Nihhd2FpdCB0aGlzLmdldFNpZ25pbmdLZXkoY3JlZGVudGlhbHMsIHJlZ2lvbiwgc2hvcnREYXRlLCBzaWduaW5nU2VydmljZSkpO1xuICAgICAgICBoYXNoLnVwZGF0ZSh1dGlsVXRmOC50b1VpbnQ4QXJyYXkoc3RyaW5nVG9TaWduKSk7XG4gICAgICAgIHJldHVybiB1dGlsSGV4RW5jb2RpbmcudG9IZXgoYXdhaXQgaGFzaC5kaWdlc3QoKSk7XG4gICAgfVxuICAgIGFzeW5jIHNpZ25SZXF1ZXN0KHJlcXVlc3RUb1NpZ24sIHsgc2lnbmluZ0RhdGUgPSBuZXcgRGF0ZSgpLCBzaWduYWJsZUhlYWRlcnMsIHVuc2lnbmFibGVIZWFkZXJzLCBzaWduaW5nUmVnaW9uLCBzaWduaW5nU2VydmljZSwgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5jcmVkZW50aWFsUHJvdmlkZXIoKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVJlc29sdmVkQ3JlZGVudGlhbHMoY3JlZGVudGlhbHMpO1xuICAgICAgICBjb25zdCByZWdpb24gPSBzaWduaW5nUmVnaW9uID8/IChhd2FpdCB0aGlzLnJlZ2lvblByb3ZpZGVyKCkpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcHJlcGFyZVJlcXVlc3QocmVxdWVzdFRvU2lnbik7XG4gICAgICAgIGNvbnN0IHsgbG9uZ0RhdGUsIHNob3J0RGF0ZSB9ID0gdGhpcy5mb3JtYXREYXRlKHNpZ25pbmdEYXRlKTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBjcmVhdGVTY29wZShzaG9ydERhdGUsIHJlZ2lvbiwgc2lnbmluZ1NlcnZpY2UgPz8gdGhpcy5zZXJ2aWNlKTtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzW0FNWl9EQVRFX0hFQURFUl0gPSBsb25nRGF0ZTtcbiAgICAgICAgaWYgKGNyZWRlbnRpYWxzLnNlc3Npb25Ub2tlbikge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1RPS0VOX0hFQURFUl0gPSBjcmVkZW50aWFscy5zZXNzaW9uVG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF5bG9hZEhhc2ggPSBhd2FpdCBnZXRQYXlsb2FkSGFzaChyZXF1ZXN0LCB0aGlzLnNoYTI1Nik7XG4gICAgICAgIGlmICghaGFzSGVhZGVyKFNIQTI1Nl9IRUFERVIsIHJlcXVlc3QuaGVhZGVycykgJiYgdGhpcy5hcHBseUNoZWNrc3VtKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbU0hBMjU2X0hFQURFUl0gPSBwYXlsb2FkSGFzaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW5vbmljYWxIZWFkZXJzID0gZ2V0Q2Fub25pY2FsSGVhZGVycyhyZXF1ZXN0LCB1bnNpZ25hYmxlSGVhZGVycywgc2lnbmFibGVIZWFkZXJzKTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5nZXRTaWduYXR1cmUobG9uZ0RhdGUsIHNjb3BlLCB0aGlzLmdldFNpZ25pbmdLZXkoY3JlZGVudGlhbHMsIHJlZ2lvbiwgc2hvcnREYXRlLCBzaWduaW5nU2VydmljZSksIHRoaXMuY3JlYXRlQ2Fub25pY2FsUmVxdWVzdChyZXF1ZXN0LCBjYW5vbmljYWxIZWFkZXJzLCBwYXlsb2FkSGFzaCkpO1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnNbQVVUSF9IRUFERVJdID1cbiAgICAgICAgICAgIGAke0FMR09SSVRITV9JREVOVElGSUVSfSBgICtcbiAgICAgICAgICAgICAgICBgQ3JlZGVudGlhbD0ke2NyZWRlbnRpYWxzLmFjY2Vzc0tleUlkfS8ke3Njb3BlfSwgYCArXG4gICAgICAgICAgICAgICAgYFNpZ25lZEhlYWRlcnM9JHt0aGlzLmdldENhbm9uaWNhbEhlYWRlckxpc3QoY2Fub25pY2FsSGVhZGVycyl9LCBgICtcbiAgICAgICAgICAgICAgICBgU2lnbmF0dXJlPSR7c2lnbmF0dXJlfWA7XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICBhc3luYyBnZXRTaWduYXR1cmUobG9uZ0RhdGUsIGNyZWRlbnRpYWxTY29wZSwga2V5UHJvbWlzZSwgY2Fub25pY2FsUmVxdWVzdCkge1xuICAgICAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBhd2FpdCB0aGlzLmNyZWF0ZVN0cmluZ1RvU2lnbihsb25nRGF0ZSwgY3JlZGVudGlhbFNjb3BlLCBjYW5vbmljYWxSZXF1ZXN0LCBBTEdPUklUSE1fSURFTlRJRklFUik7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBuZXcgdGhpcy5zaGEyNTYoYXdhaXQga2V5UHJvbWlzZSk7XG4gICAgICAgIGhhc2gudXBkYXRlKHV0aWxVdGY4LnRvVWludDhBcnJheShzdHJpbmdUb1NpZ24pKTtcbiAgICAgICAgcmV0dXJuIHV0aWxIZXhFbmNvZGluZy50b0hleChhd2FpdCBoYXNoLmRpZ2VzdCgpKTtcbiAgICB9XG4gICAgZ2V0U2lnbmluZ0tleShjcmVkZW50aWFscywgcmVnaW9uLCBzaG9ydERhdGUsIHNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25pbmdLZXkodGhpcy5zaGEyNTYsIGNyZWRlbnRpYWxzLCBzaG9ydERhdGUsIHJlZ2lvbiwgc2VydmljZSB8fCB0aGlzLnNlcnZpY2UpO1xuICAgIH1cbn1cblxuY29uc3Qgc2lnbmF0dXJlVjRhQ29udGFpbmVyID0ge1xuICAgIFNpZ25hdHVyZVY0YTogbnVsbCxcbn07XG5cbmV4cG9ydHMuQUxHT1JJVEhNX0lERU5USUZJRVIgPSBBTEdPUklUSE1fSURFTlRJRklFUjtcbmV4cG9ydHMuQUxHT1JJVEhNX0lERU5USUZJRVJfVjRBID0gQUxHT1JJVEhNX0lERU5USUZJRVJfVjRBO1xuZXhwb3J0cy5BTEdPUklUSE1fUVVFUllfUEFSQU0gPSBBTEdPUklUSE1fUVVFUllfUEFSQU07XG5leHBvcnRzLkFMV0FZU19VTlNJR05BQkxFX0hFQURFUlMgPSBBTFdBWVNfVU5TSUdOQUJMRV9IRUFERVJTO1xuZXhwb3J0cy5BTVpfREFURV9IRUFERVIgPSBBTVpfREFURV9IRUFERVI7XG5leHBvcnRzLkFNWl9EQVRFX1FVRVJZX1BBUkFNID0gQU1aX0RBVEVfUVVFUllfUEFSQU07XG5leHBvcnRzLkFVVEhfSEVBREVSID0gQVVUSF9IRUFERVI7XG5leHBvcnRzLkNSRURFTlRJQUxfUVVFUllfUEFSQU0gPSBDUkVERU5USUFMX1FVRVJZX1BBUkFNO1xuZXhwb3J0cy5EQVRFX0hFQURFUiA9IERBVEVfSEVBREVSO1xuZXhwb3J0cy5FVkVOVF9BTEdPUklUSE1fSURFTlRJRklFUiA9IEVWRU5UX0FMR09SSVRITV9JREVOVElGSUVSO1xuZXhwb3J0cy5FWFBJUkVTX1FVRVJZX1BBUkFNID0gRVhQSVJFU19RVUVSWV9QQVJBTTtcbmV4cG9ydHMuR0VORVJBVEVEX0hFQURFUlMgPSBHRU5FUkFURURfSEVBREVSUztcbmV4cG9ydHMuSE9TVF9IRUFERVIgPSBIT1NUX0hFQURFUjtcbmV4cG9ydHMuS0VZX1RZUEVfSURFTlRJRklFUiA9IEtFWV9UWVBFX0lERU5USUZJRVI7XG5leHBvcnRzLk1BWF9DQUNIRV9TSVpFID0gTUFYX0NBQ0hFX1NJWkU7XG5leHBvcnRzLk1BWF9QUkVTSUdORURfVFRMID0gTUFYX1BSRVNJR05FRF9UVEw7XG5leHBvcnRzLlBST1hZX0hFQURFUl9QQVRURVJOID0gUFJPWFlfSEVBREVSX1BBVFRFUk47XG5leHBvcnRzLlJFR0lPTl9TRVRfUEFSQU0gPSBSRUdJT05fU0VUX1BBUkFNO1xuZXhwb3J0cy5TRUNfSEVBREVSX1BBVFRFUk4gPSBTRUNfSEVBREVSX1BBVFRFUk47XG5leHBvcnRzLlNIQTI1Nl9IRUFERVIgPSBTSEEyNTZfSEVBREVSO1xuZXhwb3J0cy5TSUdOQVRVUkVfSEVBREVSID0gU0lHTkFUVVJFX0hFQURFUjtcbmV4cG9ydHMuU0lHTkFUVVJFX1FVRVJZX1BBUkFNID0gU0lHTkFUVVJFX1FVRVJZX1BBUkFNO1xuZXhwb3J0cy5TSUdORURfSEVBREVSU19RVUVSWV9QQVJBTSA9IFNJR05FRF9IRUFERVJTX1FVRVJZX1BBUkFNO1xuZXhwb3J0cy5TaWduYXR1cmVWNCA9IFNpZ25hdHVyZVY0O1xuZXhwb3J0cy5TaWduYXR1cmVWNEJhc2UgPSBTaWduYXR1cmVWNEJhc2U7XG5leHBvcnRzLlRPS0VOX0hFQURFUiA9IFRPS0VOX0hFQURFUjtcbmV4cG9ydHMuVE9LRU5fUVVFUllfUEFSQU0gPSBUT0tFTl9RVUVSWV9QQVJBTTtcbmV4cG9ydHMuVU5TSUdOQUJMRV9QQVRURVJOUyA9IFVOU0lHTkFCTEVfUEFUVEVSTlM7XG5leHBvcnRzLlVOU0lHTkVEX1BBWUxPQUQgPSBVTlNJR05FRF9QQVlMT0FEO1xuZXhwb3J0cy5jbGVhckNyZWRlbnRpYWxDYWNoZSA9IGNsZWFyQ3JlZGVudGlhbENhY2hlO1xuZXhwb3J0cy5jcmVhdGVTY29wZSA9IGNyZWF0ZVNjb3BlO1xuZXhwb3J0cy5nZXRDYW5vbmljYWxIZWFkZXJzID0gZ2V0Q2Fub25pY2FsSGVhZGVycztcbmV4cG9ydHMuZ2V0Q2Fub25pY2FsUXVlcnkgPSBnZXRDYW5vbmljYWxRdWVyeTtcbmV4cG9ydHMuZ2V0UGF5bG9hZEhhc2ggPSBnZXRQYXlsb2FkSGFzaDtcbmV4cG9ydHMuZ2V0U2lnbmluZ0tleSA9IGdldFNpZ25pbmdLZXk7XG5leHBvcnRzLmhhc0hlYWRlciA9IGhhc0hlYWRlcjtcbmV4cG9ydHMubW92ZUhlYWRlcnNUb1F1ZXJ5ID0gbW92ZUhlYWRlcnNUb1F1ZXJ5O1xuZXhwb3J0cy5wcmVwYXJlUmVxdWVzdCA9IHByZXBhcmVSZXF1ZXN0O1xuZXhwb3J0cy5zaWduYXR1cmVWNGFDb250YWluZXIgPSBzaWduYXR1cmVWNGFDb250YWluZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgVEVYVF9FTkNPREVSID0gdHlwZW9mIFRleHRFbmNvZGVyID09IFwiZnVuY3Rpb25cIiA/IG5ldyBUZXh0RW5jb2RlcigpIDogbnVsbDtcbmNvbnN0IGNhbGN1bGF0ZUJvZHlMZW5ndGggPSAoYm9keSkgPT4ge1xuICAgIGlmICh0eXBlb2YgYm9keSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoVEVYVF9FTkNPREVSKSB7XG4gICAgICAgICAgICByZXR1cm4gVEVYVF9FTkNPREVSLmVuY29kZShib2R5KS5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsZW4gPSBib2R5Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gYm9keS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGNvZGUgPiAweDdmICYmIGNvZGUgPD0gMHg3ZmYpXG4gICAgICAgICAgICAgICAgbGVuKys7XG4gICAgICAgICAgICBlbHNlIGlmIChjb2RlID4gMHg3ZmYgJiYgY29kZSA8PSAweGZmZmYpXG4gICAgICAgICAgICAgICAgbGVuICs9IDI7XG4gICAgICAgICAgICBpZiAoY29kZSA+PSAweGRjMDAgJiYgY29kZSA8PSAweGRmZmYpXG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsZW47XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBib2R5LmJ5dGVMZW5ndGggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJvZHkuc2l6ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gYm9keS5zaXplO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJvZHkgTGVuZ3RoIGNvbXB1dGF0aW9uIGZhaWxlZCBmb3IgJHtib2R5fWApO1xufTtcblxuZXhwb3J0cy5jYWxjdWxhdGVCb2R5TGVuZ3RoID0gY2FsY3VsYXRlQm9keUxlbmd0aDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2VyZGUgPSByZXF1aXJlKCdAc21pdGh5L2NvcmUvc2VyZGUnKTtcbnZhciB1dGlsVXRmOCA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC11dGY4Jyk7XG52YXIgcHJvdG9jb2xzID0gcmVxdWlyZSgnQHNtaXRoeS9jb3JlL3Byb3RvY29scycpO1xudmFyIHByb3RvY29sSHR0cCA9IHJlcXVpcmUoJ0BzbWl0aHkvcHJvdG9jb2wtaHR0cCcpO1xudmFyIHV0aWxCb2R5TGVuZ3RoQnJvd3NlciA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC1ib2R5LWxlbmd0aC1icm93c2VyJyk7XG52YXIgc2NoZW1hID0gcmVxdWlyZSgnQHNtaXRoeS9jb3JlL3NjaGVtYScpO1xudmFyIHV0aWxNaWRkbGV3YXJlID0gcmVxdWlyZSgnQHNtaXRoeS91dGlsLW1pZGRsZXdhcmUnKTtcbnZhciB1dGlsQmFzZTY0ID0gcmVxdWlyZSgnQHNtaXRoeS91dGlsLWJhc2U2NCcpO1xuXG5jb25zdCBtYWpvclVpbnQ2NCA9IDA7XG5jb25zdCBtYWpvck5lZ2F0aXZlSW50NjQgPSAxO1xuY29uc3QgbWFqb3JVbnN0cnVjdHVyZWRCeXRlU3RyaW5nID0gMjtcbmNvbnN0IG1ham9yVXRmOFN0cmluZyA9IDM7XG5jb25zdCBtYWpvckxpc3QgPSA0O1xuY29uc3QgbWFqb3JNYXAgPSA1O1xuY29uc3QgbWFqb3JUYWcgPSA2O1xuY29uc3QgbWFqb3JTcGVjaWFsID0gNztcbmNvbnN0IHNwZWNpYWxGYWxzZSA9IDIwO1xuY29uc3Qgc3BlY2lhbFRydWUgPSAyMTtcbmNvbnN0IHNwZWNpYWxOdWxsID0gMjI7XG5jb25zdCBzcGVjaWFsVW5kZWZpbmVkID0gMjM7XG5jb25zdCBleHRlbmRlZE9uZUJ5dGUgPSAyNDtcbmNvbnN0IGV4dGVuZGVkRmxvYXQxNiA9IDI1O1xuY29uc3QgZXh0ZW5kZWRGbG9hdDMyID0gMjY7XG5jb25zdCBleHRlbmRlZEZsb2F0NjQgPSAyNztcbmNvbnN0IG1pbm9ySW5kZWZpbml0ZSA9IDMxO1xuZnVuY3Rpb24gYWxsb2Moc2l6ZSkge1xuICAgIHJldHVybiB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiID8gQnVmZmVyLmFsbG9jKHNpemUpIDogbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG59XG5jb25zdCB0YWdTeW1ib2wgPSBTeW1ib2woXCJAc21pdGh5L2NvcmUvY2Jvcjo6dGFnU3ltYm9sXCIpO1xuZnVuY3Rpb24gdGFnKGRhdGEpIHtcbiAgICBkYXRhW3RhZ1N5bWJvbF0gPSB0cnVlO1xuICAgIHJldHVybiBkYXRhO1xufVxuXG5jb25zdCBVU0VfVEVYVF9ERUNPREVSID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3QgVVNFX0JVRkZFUiQxID0gdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIjtcbmxldCBwYXlsb2FkID0gYWxsb2MoMCk7XG5sZXQgZGF0YVZpZXckMSA9IG5ldyBEYXRhVmlldyhwYXlsb2FkLmJ1ZmZlciwgcGF5bG9hZC5ieXRlT2Zmc2V0LCBwYXlsb2FkLmJ5dGVMZW5ndGgpO1xuY29uc3QgdGV4dERlY29kZXIgPSBVU0VfVEVYVF9ERUNPREVSID8gbmV3IFRleHREZWNvZGVyKCkgOiBudWxsO1xubGV0IF9vZmZzZXQgPSAwO1xuZnVuY3Rpb24gc2V0UGF5bG9hZChieXRlcykge1xuICAgIHBheWxvYWQgPSBieXRlcztcbiAgICBkYXRhVmlldyQxID0gbmV3IERhdGFWaWV3KHBheWxvYWQuYnVmZmVyLCBwYXlsb2FkLmJ5dGVPZmZzZXQsIHBheWxvYWQuYnl0ZUxlbmd0aCk7XG59XG5mdW5jdGlvbiBkZWNvZGUoYXQsIHRvKSB7XG4gICAgaWYgKGF0ID49IHRvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZW5kIG9mIChkZWNvZGUpIHBheWxvYWQuXCIpO1xuICAgIH1cbiAgICBjb25zdCBtYWpvciA9IChwYXlsb2FkW2F0XSAmIDBiMTExMF8wMDAwKSA+PiA1O1xuICAgIGNvbnN0IG1pbm9yID0gcGF5bG9hZFthdF0gJiAwYjAwMDFfMTExMTtcbiAgICBzd2l0Y2ggKG1ham9yKSB7XG4gICAgICAgIGNhc2UgbWFqb3JVaW50NjQ6XG4gICAgICAgIGNhc2UgbWFqb3JOZWdhdGl2ZUludDY0OlxuICAgICAgICBjYXNlIG1ham9yVGFnOlxuICAgICAgICAgICAgbGV0IHVuc2lnbmVkSW50O1xuICAgICAgICAgICAgbGV0IG9mZnNldDtcbiAgICAgICAgICAgIGlmIChtaW5vciA8IDI0KSB7XG4gICAgICAgICAgICAgICAgdW5zaWduZWRJbnQgPSBtaW5vcjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChtaW5vcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGV4dGVuZGVkT25lQnl0ZTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBleHRlbmRlZEZsb2F0MTY6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZXh0ZW5kZWRGbG9hdDMyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIGV4dGVuZGVkRmxvYXQ2NDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50TGVuZ3RoID0gbWlub3JWYWx1ZVRvQXJndW1lbnRMZW5ndGhbbWlub3JdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRPZmZzZXQgPSAoY291bnRMZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvdW50T2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvIC0gYXQgPCBjb3VudE9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY291bnRMZW5ndGggJHtjb3VudExlbmd0aH0gZ3JlYXRlciB0aGFuIHJlbWFpbmluZyBidWYgbGVuLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRJbmRleCA9IGF0ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudExlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkSW50ID0gcGF5bG9hZFtjb3VudEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50TGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWRJbnQgPSBkYXRhVmlldyQxLmdldFVpbnQxNihjb3VudEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50TGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWRJbnQgPSBkYXRhVmlldyQxLmdldFVpbnQzMihjb3VudEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkSW50ID0gZGF0YVZpZXckMS5nZXRCaWdVaW50NjQoY291bnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtaW5vciB2YWx1ZSAke21pbm9yfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFqb3IgPT09IG1ham9yVWludDY0KSB7XG4gICAgICAgICAgICAgICAgX29mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FzdEJpZ0ludCh1bnNpZ25lZEludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYWpvciA9PT0gbWFqb3JOZWdhdGl2ZUludDY0KSB7XG4gICAgICAgICAgICAgICAgbGV0IG5lZ2F0aXZlSW50O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdW5zaWduZWRJbnQgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmVJbnQgPSBCaWdJbnQoLTEpIC0gdW5zaWduZWRJbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZUludCA9IC0xIC0gdW5zaWduZWRJbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RCaWdJbnQobmVnYXRpdmVJbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbm9yID09PSAyIHx8IG1pbm9yID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGRlY29kZUNvdW50KGF0ICsgb2Zmc2V0LCB0byk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiID0gQmlnSW50KDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGF0ICsgb2Zmc2V0ICsgX29mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChiIDw8IEJpZ0ludCg4KSkgfCBCaWdJbnQocGF5bG9hZFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX29mZnNldCA9IG9mZnNldCArIF9vZmZzZXQgKyBsZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW5vciA9PT0gMyA/IC1iIC0gQmlnSW50KDEpIDogYjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWlub3IgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjaW1hbEZyYWN0aW9uID0gZGVjb2RlKGF0ICsgb2Zmc2V0LCB0byk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtleHBvbmVudCwgbWFudGlzc2FdID0gZGVjaW1hbEZyYWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVyID0gbWFudGlzc2EgPCAwID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYW50aXNzYVN0ciA9IFwiMFwiLnJlcGVhdChNYXRoLmFicyhleHBvbmVudCkgKyAxKSArIFN0cmluZyhCaWdJbnQobm9ybWFsaXplcikgKiBCaWdJbnQobWFudGlzc2EpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG51bWVyaWNTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ24gPSBtYW50aXNzYSA8IDAgPyBcIi1cIiA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIG51bWVyaWNTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1hbnRpc3NhU3RyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYW50aXNzYVN0ci5zbGljZSgwLCBtYW50aXNzYVN0ci5sZW5ndGggKyBleHBvbmVudCkgKyBcIi5cIiArIG1hbnRpc3NhU3RyLnNsaWNlKGV4cG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbnVtZXJpY1N0cmluZyA9IG51bWVyaWNTdHJpbmcucmVwbGFjZSgvXjArL2csIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobnVtZXJpY1N0cmluZyA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY1N0cmluZyA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1lcmljU3RyaW5nWzBdID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY1N0cmluZyA9IFwiMFwiICsgbnVtZXJpY1N0cmluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBudW1lcmljU3RyaW5nID0gc2lnbiArIG51bWVyaWNTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBvZmZzZXQgKyBfb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyZGUubnYobnVtZXJpY1N0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlY29kZShhdCArIG9mZnNldCwgdG8pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZU9mZnNldCA9IF9vZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIF9vZmZzZXQgPSBvZmZzZXQgKyB2YWx1ZU9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZyh7IHRhZzogY2FzdEJpZ0ludCh1bnNpZ25lZEludCksIHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBtYWpvclV0ZjhTdHJpbmc6XG4gICAgICAgIGNhc2UgbWFqb3JNYXA6XG4gICAgICAgIGNhc2UgbWFqb3JMaXN0OlxuICAgICAgICBjYXNlIG1ham9yVW5zdHJ1Y3R1cmVkQnl0ZVN0cmluZzpcbiAgICAgICAgICAgIGlmIChtaW5vciA9PT0gbWlub3JJbmRlZmluaXRlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChtYWpvcikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIG1ham9yVXRmOFN0cmluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVdGY4U3RyaW5nSW5kZWZpbml0ZShhdCwgdG8pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIG1ham9yTWFwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZU1hcEluZGVmaW5pdGUoYXQsIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBtYWpvckxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlTGlzdEluZGVmaW5pdGUoYXQsIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBtYWpvclVuc3RydWN0dXJlZEJ5dGVTdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVW5zdHJ1Y3R1cmVkQnl0ZVN0cmluZ0luZGVmaW5pdGUoYXQsIHRvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1ham9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgbWFqb3JVdGY4U3RyaW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVV0ZjhTdHJpbmcoYXQsIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBtYWpvck1hcDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVNYXAoYXQsIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBtYWpvckxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlTGlzdChhdCwgdG8pO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIG1ham9yVW5zdHJ1Y3R1cmVkQnl0ZVN0cmluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVbnN0cnVjdHVyZWRCeXRlU3RyaW5nKGF0LCB0byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVNwZWNpYWwoYXQsIHRvKTtcbiAgICB9XG59XG5mdW5jdGlvbiBieXRlc1RvVXRmOChieXRlcywgYXQsIHRvKSB7XG4gICAgaWYgKFVTRV9CVUZGRVIkMSAmJiBieXRlcy5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gXCJCdWZmZXJcIikge1xuICAgICAgICByZXR1cm4gYnl0ZXMudG9TdHJpbmcoXCJ1dGYtOFwiLCBhdCwgdG8pO1xuICAgIH1cbiAgICBpZiAodGV4dERlY29kZXIpIHtcbiAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShieXRlcy5zdWJhcnJheShhdCwgdG8pKTtcbiAgICB9XG4gICAgcmV0dXJuIHV0aWxVdGY4LnRvVXRmOChieXRlcy5zdWJhcnJheShhdCwgdG8pKTtcbn1cbmZ1bmN0aW9uIGRlbW90ZShiaWdJbnRlZ2VyKSB7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKGJpZ0ludGVnZXIpO1xuICAgIGlmIChudW0gPCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA8IG51bSkge1xuICAgICAgICBjb25zb2xlLndhcm4obmV3IEVycm9yKGBAc21pdGh5L2NvcmUvY2JvciAtIHRydW5jYXRpbmcgQmlnSW50KCR7YmlnSW50ZWdlcn0pIHRvICR7bnVtfSB3aXRoIGxvc3Mgb2YgcHJlY2lzaW9uLmApKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbn1cbmNvbnN0IG1pbm9yVmFsdWVUb0FyZ3VtZW50TGVuZ3RoID0ge1xuICAgIFtleHRlbmRlZE9uZUJ5dGVdOiAxLFxuICAgIFtleHRlbmRlZEZsb2F0MTZdOiAyLFxuICAgIFtleHRlbmRlZEZsb2F0MzJdOiA0LFxuICAgIFtleHRlbmRlZEZsb2F0NjRdOiA4LFxufTtcbmZ1bmN0aW9uIGJ5dGVzVG9GbG9hdDE2KGEsIGIpIHtcbiAgICBjb25zdCBzaWduID0gYSA+PiA3O1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGEgJiAwYjAxMTFfMTEwMCkgPj4gMjtcbiAgICBjb25zdCBmcmFjdGlvbiA9ICgoYSAmIDBiMDAwMF8wMDExKSA8PCA4KSB8IGI7XG4gICAgY29uc3Qgc2NhbGFyID0gc2lnbiA9PT0gMCA/IDEgOiAtMTtcbiAgICBsZXQgZXhwb25lbnRDb21wb25lbnQ7XG4gICAgbGV0IHN1bW1hdGlvbjtcbiAgICBpZiAoZXhwb25lbnQgPT09IDBiMDAwMDApIHtcbiAgICAgICAgaWYgKGZyYWN0aW9uID09PSAwYjAwMDAwXzAwMDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV4cG9uZW50Q29tcG9uZW50ID0gTWF0aC5wb3coMiwgMSAtIDE1KTtcbiAgICAgICAgICAgIHN1bW1hdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwb25lbnQgPT09IDBiMTExMTEpIHtcbiAgICAgICAgaWYgKGZyYWN0aW9uID09PSAwYjAwMDAwXzAwMDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NhbGFyICogSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBleHBvbmVudENvbXBvbmVudCA9IE1hdGgucG93KDIsIGV4cG9uZW50IC0gMTUpO1xuICAgICAgICBzdW1tYXRpb24gPSAxO1xuICAgIH1cbiAgICBzdW1tYXRpb24gKz0gZnJhY3Rpb24gLyAxMDI0O1xuICAgIHJldHVybiBzY2FsYXIgKiAoZXhwb25lbnRDb21wb25lbnQgKiBzdW1tYXRpb24pO1xufVxuZnVuY3Rpb24gZGVjb2RlQ291bnQoYXQsIHRvKSB7XG4gICAgY29uc3QgbWlub3IgPSBwYXlsb2FkW2F0XSAmIDBiMDAwMV8xMTExO1xuICAgIGlmIChtaW5vciA8IDI0KSB7XG4gICAgICAgIF9vZmZzZXQgPSAxO1xuICAgICAgICByZXR1cm4gbWlub3I7XG4gICAgfVxuICAgIGlmIChtaW5vciA9PT0gZXh0ZW5kZWRPbmVCeXRlIHx8XG4gICAgICAgIG1pbm9yID09PSBleHRlbmRlZEZsb2F0MTYgfHxcbiAgICAgICAgbWlub3IgPT09IGV4dGVuZGVkRmxvYXQzMiB8fFxuICAgICAgICBtaW5vciA9PT0gZXh0ZW5kZWRGbG9hdDY0KSB7XG4gICAgICAgIGNvbnN0IGNvdW50TGVuZ3RoID0gbWlub3JWYWx1ZVRvQXJndW1lbnRMZW5ndGhbbWlub3JdO1xuICAgICAgICBfb2Zmc2V0ID0gKGNvdW50TGVuZ3RoICsgMSk7XG4gICAgICAgIGlmICh0byAtIGF0IDwgX29mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb3VudExlbmd0aCAke2NvdW50TGVuZ3RofSBncmVhdGVyIHRoYW4gcmVtYWluaW5nIGJ1ZiBsZW4uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY291bnRJbmRleCA9IGF0ICsgMTtcbiAgICAgICAgaWYgKGNvdW50TGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZFtjb3VudEluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb3VudExlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFWaWV3JDEuZ2V0VWludDE2KGNvdW50SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvdW50TGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVZpZXckMS5nZXRVaW50MzIoY291bnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbW90ZShkYXRhVmlldyQxLmdldEJpZ1VpbnQ2NChjb3VudEluZGV4KSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtaW5vciB2YWx1ZSAke21pbm9yfS5gKTtcbn1cbmZ1bmN0aW9uIGRlY29kZVV0ZjhTdHJpbmcoYXQsIHRvKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gZGVjb2RlQ291bnQoYXQsIHRvKTtcbiAgICBjb25zdCBvZmZzZXQgPSBfb2Zmc2V0O1xuICAgIGF0ICs9IG9mZnNldDtcbiAgICBpZiAodG8gLSBhdCA8IGxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmluZyBsZW4gJHtsZW5ndGh9IGdyZWF0ZXIgdGhhbiByZW1haW5pbmcgYnVmIGxlbi5gKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBieXRlc1RvVXRmOChwYXlsb2FkLCBhdCwgYXQgKyBsZW5ndGgpO1xuICAgIF9vZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gZGVjb2RlVXRmOFN0cmluZ0luZGVmaW5pdGUoYXQsIHRvKSB7XG4gICAgYXQgKz0gMTtcbiAgICBjb25zdCB2ZWN0b3IgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJhc2UgPSBhdDsgYXQgPCB0bzspIHtcbiAgICAgICAgaWYgKHBheWxvYWRbYXRdID09PSAwYjExMTFfMTExMSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGFsbG9jKHZlY3Rvci5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQodmVjdG9yLCAwKTtcbiAgICAgICAgICAgIF9vZmZzZXQgPSBhdCAtIGJhc2UgKyAyO1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzVG9VdGY4KGRhdGEsIDAsIGRhdGEubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYWpvciA9IChwYXlsb2FkW2F0XSAmIDBiMTExMF8wMDAwKSA+PiA1O1xuICAgICAgICBjb25zdCBtaW5vciA9IHBheWxvYWRbYXRdICYgMGIwMDAxXzExMTE7XG4gICAgICAgIGlmIChtYWpvciAhPT0gbWFqb3JVdGY4U3RyaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgbWFqb3IgdHlwZSAke21ham9yfSBpbiBpbmRlZmluaXRlIHN0cmluZy5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlub3IgPT09IG1pbm9ySW5kZWZpbml0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibmVzdGVkIGluZGVmaW5pdGUgc3RyaW5nLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IGRlY29kZVVuc3RydWN0dXJlZEJ5dGVTdHJpbmcoYXQsIHRvKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gX29mZnNldDtcbiAgICAgICAgYXQgKz0gbGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2ZWN0b3IucHVzaChieXRlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgYnJlYWsgbWFya2VyLlwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZVVuc3RydWN0dXJlZEJ5dGVTdHJpbmcoYXQsIHRvKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gZGVjb2RlQ291bnQoYXQsIHRvKTtcbiAgICBjb25zdCBvZmZzZXQgPSBfb2Zmc2V0O1xuICAgIGF0ICs9IG9mZnNldDtcbiAgICBpZiAodG8gLSBhdCA8IGxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3RydWN0dXJlZCBieXRlIHN0cmluZyBsZW4gJHtsZW5ndGh9IGdyZWF0ZXIgdGhhbiByZW1haW5pbmcgYnVmIGxlbi5gKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXlsb2FkLnN1YmFycmF5KGF0LCBhdCArIGxlbmd0aCk7XG4gICAgX29mZnNldCA9IG9mZnNldCArIGxlbmd0aDtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBkZWNvZGVVbnN0cnVjdHVyZWRCeXRlU3RyaW5nSW5kZWZpbml0ZShhdCwgdG8pIHtcbiAgICBhdCArPSAxO1xuICAgIGNvbnN0IHZlY3RvciA9IFtdO1xuICAgIGZvciAoY29uc3QgYmFzZSA9IGF0OyBhdCA8IHRvOykge1xuICAgICAgICBpZiAocGF5bG9hZFthdF0gPT09IDBiMTExMV8xMTExKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYWxsb2ModmVjdG9yLmxlbmd0aCk7XG4gICAgICAgICAgICBkYXRhLnNldCh2ZWN0b3IsIDApO1xuICAgICAgICAgICAgX29mZnNldCA9IGF0IC0gYmFzZSArIDI7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYWpvciA9IChwYXlsb2FkW2F0XSAmIDBiMTExMF8wMDAwKSA+PiA1O1xuICAgICAgICBjb25zdCBtaW5vciA9IHBheWxvYWRbYXRdICYgMGIwMDAxXzExMTE7XG4gICAgICAgIGlmIChtYWpvciAhPT0gbWFqb3JVbnN0cnVjdHVyZWRCeXRlU3RyaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgbWFqb3IgdHlwZSAke21ham9yfSBpbiBpbmRlZmluaXRlIHN0cmluZy5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWlub3IgPT09IG1pbm9ySW5kZWZpbml0ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibmVzdGVkIGluZGVmaW5pdGUgc3RyaW5nLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IGRlY29kZVVuc3RydWN0dXJlZEJ5dGVTdHJpbmcoYXQsIHRvKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gX29mZnNldDtcbiAgICAgICAgYXQgKz0gbGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2ZWN0b3IucHVzaChieXRlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgYnJlYWsgbWFya2VyLlwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZUxpc3QoYXQsIHRvKSB7XG4gICAgY29uc3QgbGlzdERhdGFMZW5ndGggPSBkZWNvZGVDb3VudChhdCwgdG8pO1xuICAgIGNvbnN0IG9mZnNldCA9IF9vZmZzZXQ7XG4gICAgYXQgKz0gb2Zmc2V0O1xuICAgIGNvbnN0IGJhc2UgPSBhdDtcbiAgICBjb25zdCBsaXN0ID0gQXJyYXkobGlzdERhdGFMZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdERhdGFMZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gZGVjb2RlKGF0LCB0byk7XG4gICAgICAgIGNvbnN0IGl0ZW1PZmZzZXQgPSBfb2Zmc2V0O1xuICAgICAgICBsaXN0W2ldID0gaXRlbTtcbiAgICAgICAgYXQgKz0gaXRlbU9mZnNldDtcbiAgICB9XG4gICAgX29mZnNldCA9IG9mZnNldCArIChhdCAtIGJhc2UpO1xuICAgIHJldHVybiBsaXN0O1xufVxuZnVuY3Rpb24gZGVjb2RlTGlzdEluZGVmaW5pdGUoYXQsIHRvKSB7XG4gICAgYXQgKz0gMTtcbiAgICBjb25zdCBsaXN0ID0gW107XG4gICAgZm9yIChjb25zdCBiYXNlID0gYXQ7IGF0IDwgdG87KSB7XG4gICAgICAgIGlmIChwYXlsb2FkW2F0XSA9PT0gMGIxMTExXzExMTEpIHtcbiAgICAgICAgICAgIF9vZmZzZXQgPSBhdCAtIGJhc2UgKyAyO1xuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IGRlY29kZShhdCwgdG8pO1xuICAgICAgICBjb25zdCBuID0gX29mZnNldDtcbiAgICAgICAgYXQgKz0gbjtcbiAgICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBicmVhayBtYXJrZXIuXCIpO1xufVxuZnVuY3Rpb24gZGVjb2RlTWFwKGF0LCB0bykge1xuICAgIGNvbnN0IG1hcERhdGFMZW5ndGggPSBkZWNvZGVDb3VudChhdCwgdG8pO1xuICAgIGNvbnN0IG9mZnNldCA9IF9vZmZzZXQ7XG4gICAgYXQgKz0gb2Zmc2V0O1xuICAgIGNvbnN0IGJhc2UgPSBhdDtcbiAgICBjb25zdCBtYXAgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcERhdGFMZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYXQgPj0gdG8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgZW5kIG9mIG1hcCBwYXlsb2FkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYWpvciA9IChwYXlsb2FkW2F0XSAmIDBiMTExMF8wMDAwKSA+PiA1O1xuICAgICAgICBpZiAobWFqb3IgIT09IG1ham9yVXRmOFN0cmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIG1ham9yIHR5cGUgJHttYWpvcn0gZm9yIG1hcCBrZXkgYXQgaW5kZXggJHthdH0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gZGVjb2RlKGF0LCB0byk7XG4gICAgICAgIGF0ICs9IF9vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2RlKGF0LCB0byk7XG4gICAgICAgIGF0ICs9IF9vZmZzZXQ7XG4gICAgICAgIG1hcFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIF9vZmZzZXQgPSBvZmZzZXQgKyAoYXQgLSBiYXNlKTtcbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gZGVjb2RlTWFwSW5kZWZpbml0ZShhdCwgdG8pIHtcbiAgICBhdCArPSAxO1xuICAgIGNvbnN0IGJhc2UgPSBhdDtcbiAgICBjb25zdCBtYXAgPSB7fTtcbiAgICBmb3IgKDsgYXQgPCB0bzspIHtcbiAgICAgICAgaWYgKGF0ID49IHRvKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmV4cGVjdGVkIGVuZCBvZiBtYXAgcGF5bG9hZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBheWxvYWRbYXRdID09PSAwYjExMTFfMTExMSkge1xuICAgICAgICAgICAgX29mZnNldCA9IGF0IC0gYmFzZSArIDI7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ham9yID0gKHBheWxvYWRbYXRdICYgMGIxMTEwXzAwMDApID4+IDU7XG4gICAgICAgIGlmIChtYWpvciAhPT0gbWFqb3JVdGY4U3RyaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgbWFqb3IgdHlwZSAke21ham9yfSBmb3IgbWFwIGtleS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBkZWNvZGUoYXQsIHRvKTtcbiAgICAgICAgYXQgKz0gX29mZnNldDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGUoYXQsIHRvKTtcbiAgICAgICAgYXQgKz0gX29mZnNldDtcbiAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgYnJlYWsgbWFya2VyLlwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZVNwZWNpYWwoYXQsIHRvKSB7XG4gICAgY29uc3QgbWlub3IgPSBwYXlsb2FkW2F0XSAmIDBiMDAwMV8xMTExO1xuICAgIHN3aXRjaCAobWlub3IpIHtcbiAgICAgICAgY2FzZSBzcGVjaWFsVHJ1ZTpcbiAgICAgICAgY2FzZSBzcGVjaWFsRmFsc2U6XG4gICAgICAgICAgICBfb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgIHJldHVybiBtaW5vciA9PT0gc3BlY2lhbFRydWU7XG4gICAgICAgIGNhc2Ugc3BlY2lhbE51bGw6XG4gICAgICAgICAgICBfb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlIHNwZWNpYWxVbmRlZmluZWQ6XG4gICAgICAgICAgICBfb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlIGV4dGVuZGVkRmxvYXQxNjpcbiAgICAgICAgICAgIGlmICh0byAtIGF0IDwgMykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImluY29tcGxldGUgZmxvYXQxNiBhdCBlbmQgb2YgYnVmLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9vZmZzZXQgPSAzO1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzVG9GbG9hdDE2KHBheWxvYWRbYXQgKyAxXSwgcGF5bG9hZFthdCArIDJdKTtcbiAgICAgICAgY2FzZSBleHRlbmRlZEZsb2F0MzI6XG4gICAgICAgICAgICBpZiAodG8gLSBhdCA8IDUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbmNvbXBsZXRlIGZsb2F0MzIgYXQgZW5kIG9mIGJ1Zi5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfb2Zmc2V0ID0gNTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhVmlldyQxLmdldEZsb2F0MzIoYXQgKyAxKTtcbiAgICAgICAgY2FzZSBleHRlbmRlZEZsb2F0NjQ6XG4gICAgICAgICAgICBpZiAodG8gLSBhdCA8IDkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbmNvbXBsZXRlIGZsb2F0NjQgYXQgZW5kIG9mIGJ1Zi5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfb2Zmc2V0ID0gOTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhVmlldyQxLmdldEZsb2F0NjQoYXQgKyAxKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBtaW5vciB2YWx1ZSAke21pbm9yfS5gKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjYXN0QmlnSW50KGJpZ0ludCkge1xuICAgIGlmICh0eXBlb2YgYmlnSW50ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBiaWdJbnQ7XG4gICAgfVxuICAgIGNvbnN0IG51bSA9IE51bWJlcihiaWdJbnQpO1xuICAgIGlmIChOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiA8PSBudW0gJiYgbnVtIDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBudW07XG4gICAgfVxuICAgIHJldHVybiBiaWdJbnQ7XG59XG5cbmNvbnN0IFVTRV9CVUZGRVIgPSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3QgaW5pdGlhbFNpemUgPSAyMDQ4O1xubGV0IGRhdGEgPSBhbGxvYyhpbml0aWFsU2l6ZSk7XG5sZXQgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbmxldCBjdXJzb3IgPSAwO1xuZnVuY3Rpb24gZW5zdXJlU3BhY2UoYnl0ZXMpIHtcbiAgICBjb25zdCByZW1haW5pbmcgPSBkYXRhLmJ5dGVMZW5ndGggLSBjdXJzb3I7XG4gICAgaWYgKHJlbWFpbmluZyA8IGJ5dGVzKSB7XG4gICAgICAgIGlmIChjdXJzb3IgPCAxNl8wMDBfMDAwKSB7XG4gICAgICAgICAgICByZXNpemUoTWF0aC5tYXgoZGF0YS5ieXRlTGVuZ3RoICogNCwgZGF0YS5ieXRlTGVuZ3RoICsgYnl0ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc2l6ZShkYXRhLmJ5dGVMZW5ndGggKyBieXRlcyArIDE2XzAwMF8wMDApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdG9VaW50OEFycmF5KCkge1xuICAgIGNvbnN0IG91dCA9IGFsbG9jKGN1cnNvcik7XG4gICAgb3V0LnNldChkYXRhLnN1YmFycmF5KDAsIGN1cnNvciksIDApO1xuICAgIGN1cnNvciA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHJlc2l6ZShzaXplKSB7XG4gICAgY29uc3Qgb2xkID0gZGF0YTtcbiAgICBkYXRhID0gYWxsb2Moc2l6ZSk7XG4gICAgaWYgKG9sZCkge1xuICAgICAgICBpZiAob2xkLmNvcHkpIHtcbiAgICAgICAgICAgIG9sZC5jb3B5KGRhdGEsIDAsIDAsIG9sZC5ieXRlTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEuc2V0KG9sZCwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGVuY29kZUhlYWRlcihtYWpvciwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPCAyNCkge1xuICAgICAgICBkYXRhW2N1cnNvcisrXSA9IChtYWpvciA8PCA1KSB8IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA8IDEgPDwgOCkge1xuICAgICAgICBkYXRhW2N1cnNvcisrXSA9IChtYWpvciA8PCA1KSB8IDI0O1xuICAgICAgICBkYXRhW2N1cnNvcisrXSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA8IDEgPDwgMTYpIHtcbiAgICAgICAgZGF0YVtjdXJzb3IrK10gPSAobWFqb3IgPDwgNSkgfCBleHRlbmRlZEZsb2F0MTY7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihjdXJzb3IsIHZhbHVlKTtcbiAgICAgICAgY3Vyc29yICs9IDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlIDwgMiAqKiAzMikge1xuICAgICAgICBkYXRhW2N1cnNvcisrXSA9IChtYWpvciA8PCA1KSB8IGV4dGVuZGVkRmxvYXQzMjtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDMyKGN1cnNvciwgdmFsdWUpO1xuICAgICAgICBjdXJzb3IgKz0gNDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRhdGFbY3Vyc29yKytdID0gKG1ham9yIDw8IDUpIHwgZXh0ZW5kZWRGbG9hdDY0O1xuICAgICAgICBkYXRhVmlldy5zZXRCaWdVaW50NjQoY3Vyc29yLCB0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIgPyB2YWx1ZSA6IEJpZ0ludCh2YWx1ZSkpO1xuICAgICAgICBjdXJzb3IgKz0gODtcbiAgICB9XG59XG5mdW5jdGlvbiBlbmNvZGUoX2lucHV0KSB7XG4gICAgY29uc3QgZW5jb2RlU3RhY2sgPSBbX2lucHV0XTtcbiAgICB3aGlsZSAoZW5jb2RlU3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZW5jb2RlU3RhY2sucG9wKCk7XG4gICAgICAgIGVuc3VyZVNwYWNlKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGlucHV0Lmxlbmd0aCAqIDQgOiA2NCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChVU0VfQlVGRkVSKSB7XG4gICAgICAgICAgICAgICAgZW5jb2RlSGVhZGVyKG1ham9yVXRmOFN0cmluZywgQnVmZmVyLmJ5dGVMZW5ndGgoaW5wdXQpKTtcbiAgICAgICAgICAgICAgICBjdXJzb3IgKz0gZGF0YS53cml0ZShpbnB1dCwgY3Vyc29yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gdXRpbFV0ZjguZnJvbVV0ZjgoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGVuY29kZUhlYWRlcihtYWpvclV0ZjhTdHJpbmcsIGJ5dGVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGRhdGEuc2V0KGJ5dGVzLCBjdXJzb3IpO1xuICAgICAgICAgICAgICAgIGN1cnNvciArPSBieXRlcy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub25OZWdhdGl2ZSA9IGlucHV0ID49IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFqb3IgPSBub25OZWdhdGl2ZSA/IG1ham9yVWludDY0IDogbWFqb3JOZWdhdGl2ZUludDY0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbm9uTmVnYXRpdmUgPyBpbnB1dCA6IC1pbnB1dCAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMjQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSAobWFqb3IgPDwgNSkgfCB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSAobWFqb3IgPDwgNSkgfCAyNDtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCA2NTUzNikge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2N1cnNvcisrXSA9IChtYWpvciA8PCA1KSB8IGV4dGVuZGVkRmxvYXQxNjtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSB2YWx1ZSA+PiA4O1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2N1cnNvcisrXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IDQyOTQ5NjcyOTYpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSAobWFqb3IgPDwgNSkgfCBleHRlbmRlZEZsb2F0MzI7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFWaWV3LnNldFVpbnQzMihjdXJzb3IsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2N1cnNvcisrXSA9IChtYWpvciA8PCA1KSB8IGV4dGVuZGVkRmxvYXQ2NDtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVZpZXcuc2V0QmlnVWludDY0KGN1cnNvciwgQmlnSW50KHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnNvciArPSA4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFbY3Vyc29yKytdID0gKG1ham9yU3BlY2lhbCA8PCA1KSB8IGV4dGVuZGVkRmxvYXQ2NDtcbiAgICAgICAgICAgIGRhdGFWaWV3LnNldEZsb2F0NjQoY3Vyc29yLCBpbnB1dCk7XG4gICAgICAgICAgICBjdXJzb3IgKz0gODtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgY29uc3Qgbm9uTmVnYXRpdmUgPSBpbnB1dCA+PSAwO1xuICAgICAgICAgICAgY29uc3QgbWFqb3IgPSBub25OZWdhdGl2ZSA/IG1ham9yVWludDY0IDogbWFqb3JOZWdhdGl2ZUludDY0O1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBub25OZWdhdGl2ZSA/IGlucHV0IDogLWlucHV0IC0gQmlnSW50KDEpO1xuICAgICAgICAgICAgY29uc3QgbiA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAobiA8IDI0KSB7XG4gICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSAobWFqb3IgPDwgNSkgfCBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobiA8IDI1Nikge1xuICAgICAgICAgICAgICAgIGRhdGFbY3Vyc29yKytdID0gKG1ham9yIDw8IDUpIHwgMjQ7XG4gICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobiA8IDY1NTM2KSB7XG4gICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSAobWFqb3IgPDwgNSkgfCBleHRlbmRlZEZsb2F0MTY7XG4gICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSBuID4+IDg7XG4gICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSBuICYgMGIxMTExXzExMTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChuIDwgNDI5NDk2NzI5Nikge1xuICAgICAgICAgICAgICAgIGRhdGFbY3Vyc29yKytdID0gKG1ham9yIDw8IDUpIHwgZXh0ZW5kZWRGbG9hdDMyO1xuICAgICAgICAgICAgICAgIGRhdGFWaWV3LnNldFVpbnQzMihjdXJzb3IsIG4pO1xuICAgICAgICAgICAgICAgIGN1cnNvciArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPCBCaWdJbnQoXCIxODQ0Njc0NDA3MzcwOTU1MTYxNlwiKSkge1xuICAgICAgICAgICAgICAgIGRhdGFbY3Vyc29yKytdID0gKG1ham9yIDw8IDUpIHwgZXh0ZW5kZWRGbG9hdDY0O1xuICAgICAgICAgICAgICAgIGRhdGFWaWV3LnNldEJpZ1VpbnQ2NChjdXJzb3IsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjdXJzb3IgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbmFyeUJpZ0ludCA9IHZhbHVlLnRvU3RyaW5nKDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpZ0ludEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKGJpbmFyeUJpZ0ludC5sZW5ndGggLyA4KSk7XG4gICAgICAgICAgICAgICAgbGV0IGIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGJpZ0ludEJ5dGVzLmJ5dGVMZW5ndGggLSArK2kgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiaWdJbnRCeXRlc1tiaWdJbnRCeXRlcy5ieXRlTGVuZ3RoIC0gaV0gPSBOdW1iZXIoYiAmIEJpZ0ludCgyNTUpKTtcbiAgICAgICAgICAgICAgICAgICAgYiA+Pj0gQmlnSW50KDgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnN1cmVTcGFjZShiaWdJbnRCeXRlcy5ieXRlTGVuZ3RoICogMik7XG4gICAgICAgICAgICAgICAgZGF0YVtjdXJzb3IrK10gPSBub25OZWdhdGl2ZSA/IDBiMTEwXzAwMDEwIDogMGIxMTBfMDAwMTE7XG4gICAgICAgICAgICAgICAgaWYgKFVTRV9CVUZGRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlSGVhZGVyKG1ham9yVW5zdHJ1Y3R1cmVkQnl0ZVN0cmluZywgQnVmZmVyLmJ5dGVMZW5ndGgoYmlnSW50Qnl0ZXMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kZUhlYWRlcihtYWpvclVuc3RydWN0dXJlZEJ5dGVTdHJpbmcsIGJpZ0ludEJ5dGVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhLnNldChiaWdJbnRCeXRlcywgY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjdXJzb3IgKz0gYmlnSW50Qnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBkYXRhW2N1cnNvcisrXSA9IChtYWpvclNwZWNpYWwgPDwgNSkgfCBzcGVjaWFsTnVsbDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGRhdGFbY3Vyc29yKytdID0gKG1ham9yU3BlY2lhbCA8PCA1KSB8IChpbnB1dCA/IHNwZWNpYWxUcnVlIDogc3BlY2lhbEZhbHNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQHNtaXRoeS9jb3JlL2Nib3I6IGNsaWVudCBtYXkgbm90IHNlcmlhbGl6ZSB1bmRlZmluZWQgdmFsdWUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gaW5wdXQubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVTdGFjay5wdXNoKGlucHV0W2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuY29kZUhlYWRlcihtYWpvckxpc3QsIGlucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQuYnl0ZUxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZW5zdXJlU3BhY2UoaW5wdXQubGVuZ3RoICogMik7XG4gICAgICAgICAgICBlbmNvZGVIZWFkZXIobWFqb3JVbnN0cnVjdHVyZWRCeXRlU3RyaW5nLCBpbnB1dC5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQoaW5wdXQsIGN1cnNvcik7XG4gICAgICAgICAgICBjdXJzb3IgKz0gaW5wdXQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2Ygc2VyZGUuTnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjaW1hbEluZGV4ID0gaW5wdXQuc3RyaW5nLmluZGV4T2YoXCIuXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9uZW50ID0gZGVjaW1hbEluZGV4ID09PSAtMSA/IDAgOiBkZWNpbWFsSW5kZXggLSBpbnB1dC5zdHJpbmcubGVuZ3RoICsgMTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW50aXNzYSA9IEJpZ0ludChpbnB1dC5zdHJpbmcucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgIGRhdGFbY3Vyc29yKytdID0gMGIxMTBfMDAxMDA7XG4gICAgICAgICAgICAgICAgZW5jb2RlU3RhY2sucHVzaChtYW50aXNzYSk7XG4gICAgICAgICAgICAgICAgZW5jb2RlU3RhY2sucHVzaChleHBvbmVudCk7XG4gICAgICAgICAgICAgICAgZW5jb2RlSGVhZGVyKG1ham9yTGlzdCwgMik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXRbdGFnU3ltYm9sXSkge1xuICAgICAgICAgICAgICAgIGlmIChcInRhZ1wiIGluIGlucHV0ICYmIFwidmFsdWVcIiBpbiBpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVTdGFjay5wdXNoKGlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlSGVhZGVyKG1ham9yVGFnLCBpbnB1dC50YWcpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRhZyBlbmNvdW50ZXJlZCB3aXRoIG1pc3NpbmcgZmllbGRzLCBuZWVkICd0YWcnIGFuZCAndmFsdWUnLCBmb3VuZDogXCIgKyBKU09OLnN0cmluZ2lmeShpbnB1dCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0ga2V5cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgZW5jb2RlU3RhY2sucHVzaChpbnB1dFtrZXldKTtcbiAgICAgICAgICAgICAgICBlbmNvZGVTdGFjay5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbmNvZGVIZWFkZXIobWFqb3JNYXAsIGtleXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSB0eXBlICR7aW5wdXQ/LmNvbnN0cnVjdG9yPy5uYW1lID8/IHR5cGVvZiBpbnB1dH0gbm90IGNvbXBhdGlibGUgZm9yIGVuY29kaW5nLmApO1xuICAgIH1cbn1cblxuY29uc3QgY2JvciA9IHtcbiAgICBkZXNlcmlhbGl6ZShwYXlsb2FkKSB7XG4gICAgICAgIHNldFBheWxvYWQocGF5bG9hZCk7XG4gICAgICAgIHJldHVybiBkZWNvZGUoMCwgcGF5bG9hZC5sZW5ndGgpO1xuICAgIH0sXG4gICAgc2VyaWFsaXplKGlucHV0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbmNvZGUoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuIHRvVWludDhBcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0b1VpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlc2l6ZUVuY29kaW5nQnVmZmVyKHNpemUpIHtcbiAgICAgICAgcmVzaXplKHNpemUpO1xuICAgIH0sXG59O1xuXG5jb25zdCBwYXJzZUNib3JCb2R5ID0gKHN0cmVhbUJvZHksIGNvbnRleHQpID0+IHtcbiAgICByZXR1cm4gcHJvdG9jb2xzLmNvbGxlY3RCb2R5KHN0cmVhbUJvZHksIGNvbnRleHQpLnRoZW4oYXN5bmMgKGJ5dGVzKSA9PiB7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNib3IuZGVzZXJpYWxpemUoYnl0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCIkcmVzcG9uc2VCb2R5VGV4dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb250ZXh0LnV0ZjhFbmNvZGVyKGJ5dGVzKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9KTtcbn07XG5jb25zdCBkYXRlVG9UYWcgPSAoZGF0ZSkgPT4ge1xuICAgIHJldHVybiB0YWcoe1xuICAgICAgICB0YWc6IDEsXG4gICAgICAgIHZhbHVlOiBkYXRlLmdldFRpbWUoKSAvIDEwMDAsXG4gICAgfSk7XG59O1xuY29uc3QgcGFyc2VDYm9yRXJyb3JCb2R5ID0gYXN5bmMgKGVycm9yQm9keSwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFyc2VDYm9yQm9keShlcnJvckJvZHksIGNvbnRleHQpO1xuICAgIHZhbHVlLm1lc3NhZ2UgPSB2YWx1ZS5tZXNzYWdlID8/IHZhbHVlLk1lc3NhZ2U7XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbmNvbnN0IGxvYWRTbWl0aHlScGNWMkNib3JFcnJvckNvZGUgPSAob3V0cHV0LCBkYXRhKSA9PiB7XG4gICAgY29uc3Qgc2FuaXRpemVFcnJvckNvZGUgPSAocmF3VmFsdWUpID0+IHtcbiAgICAgICAgbGV0IGNsZWFuVmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhblZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjbGVhblZhbHVlID0gY2xlYW5WYWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGVhblZhbHVlLmluZGV4T2YoXCIsXCIpID49IDApIHtcbiAgICAgICAgICAgIGNsZWFuVmFsdWUgPSBjbGVhblZhbHVlLnNwbGl0KFwiLFwiKVswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYW5WYWx1ZS5pbmRleE9mKFwiOlwiKSA+PSAwKSB7XG4gICAgICAgICAgICBjbGVhblZhbHVlID0gY2xlYW5WYWx1ZS5zcGxpdChcIjpcIilbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsZWFuVmFsdWUuaW5kZXhPZihcIiNcIikgPj0gMCkge1xuICAgICAgICAgICAgY2xlYW5WYWx1ZSA9IGNsZWFuVmFsdWUuc3BsaXQoXCIjXCIpWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGVhblZhbHVlO1xuICAgIH07XG4gICAgaWYgKGRhdGFbXCJfX3R5cGVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc2FuaXRpemVFcnJvckNvZGUoZGF0YVtcIl9fdHlwZVwiXSk7XG4gICAgfVxuICAgIGNvbnN0IGNvZGVLZXkgPSBPYmplY3Qua2V5cyhkYXRhKS5maW5kKChrZXkpID0+IGtleS50b0xvd2VyQ2FzZSgpID09PSBcImNvZGVcIik7XG4gICAgaWYgKGNvZGVLZXkgJiYgZGF0YVtjb2RlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZUVycm9yQ29kZShkYXRhW2NvZGVLZXldKTtcbiAgICB9XG59O1xuY29uc3QgY2hlY2tDYm9yUmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgICBpZiAoU3RyaW5nKHJlc3BvbnNlLmhlYWRlcnNbXCJzbWl0aHktcHJvdG9jb2xcIl0pLnRvTG93ZXJDYXNlKCkgIT09IFwicnBjLXYyLWNib3JcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgUlBDdjIgQ0JPUiByZXNwb25zZSwgc3RhdHVzOiBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgIH1cbn07XG5jb25zdCBidWlsZEh0dHBScGNSZXF1ZXN0ID0gYXN5bmMgKGNvbnRleHQsIGhlYWRlcnMsIHBhdGgsIHJlc29sdmVkSG9zdG5hbWUsIGJvZHkpID0+IHtcbiAgICBjb25zdCB7IGhvc3RuYW1lLCBwcm90b2NvbCA9IFwiaHR0cHNcIiwgcG9ydCwgcGF0aDogYmFzZVBhdGggfSA9IGF3YWl0IGNvbnRleHQuZW5kcG9pbnQoKTtcbiAgICBjb25zdCBjb250ZW50cyA9IHtcbiAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBwYXRoOiBiYXNlUGF0aC5lbmRzV2l0aChcIi9cIikgPyBiYXNlUGF0aC5zbGljZSgwLCAtMSkgKyBwYXRoIDogYmFzZVBhdGggKyBwYXRoLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgaWYgKHJlc29sdmVkSG9zdG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250ZW50cy5ob3N0bmFtZSA9IHJlc29sdmVkSG9zdG5hbWU7XG4gICAgfVxuICAgIGlmIChib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGVudHMuYm9keSA9IGJvZHk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb250ZW50cy5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gPSBTdHJpbmcodXRpbEJvZHlMZW5ndGhCcm93c2VyLmNhbGN1bGF0ZUJvZHlMZW5ndGgoYm9keSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBwcm90b2NvbEh0dHAuSHR0cFJlcXVlc3QoY29udGVudHMpO1xufTtcblxuY2xhc3MgQ2JvckNvZGVjIGV4dGVuZHMgcHJvdG9jb2xzLlNlcmRlQ29udGV4dCB7XG4gICAgY3JlYXRlU2VyaWFsaXplcigpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBDYm9yU2hhcGVTZXJpYWxpemVyKCk7XG4gICAgICAgIHNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHRoaXMuc2VyZGVDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXI7XG4gICAgfVxuICAgIGNyZWF0ZURlc2VyaWFsaXplcigpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gbmV3IENib3JTaGFwZURlc2VyaWFsaXplcigpO1xuICAgICAgICBkZXNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHRoaXMuc2VyZGVDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplcjtcbiAgICB9XG59XG5jbGFzcyBDYm9yU2hhcGVTZXJpYWxpemVyIGV4dGVuZHMgcHJvdG9jb2xzLlNlcmRlQ29udGV4dCB7XG4gICAgdmFsdWU7XG4gICAgd3JpdGUoc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zZXJpYWxpemUoc2NoZW1hLCB2YWx1ZSk7XG4gICAgfVxuICAgIHNlcmlhbGl6ZShzY2hlbWEkMSwgc291cmNlKSB7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yoc2NoZW1hJDEpO1xuICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChucy5pc0lkZW1wb3RlbmN5VG9rZW4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJkZS5nZW5lcmF0ZUlkZW1wb3RlbmN5VG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzQmxvYlNjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5zZXJkZUNvbnRleHQ/LmJhc2U2NERlY29kZXIgPz8gdXRpbEJhc2U2NC5mcm9tQmFzZTY0KShzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNUaW1lc3RhbXBTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHNvdXJjZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVG9UYWcobmV3IERhdGUoKE51bWJlcihzb3VyY2UpIC8gMTAwMCkgfCAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0ZVRvVGFnKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VPYmplY3QgPSBzb3VyY2U7XG4gICAgICAgICAgICBpZiAobnMuaXNMaXN0U2NoZW1hKCkgJiYgQXJyYXkuaXNBcnJheShzb3VyY2VPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhcnNlID0gISFucy5nZXRNZXJnZWRUcmFpdHMoKS5zcGFyc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHNvdXJjZU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VyaWFsaXplKG5zLmdldFZhbHVlU2NoZW1hKCksIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBzcGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FycmF5W2krK10gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlT2JqZWN0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlVG9UYWcoc291cmNlT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5ld09iamVjdCA9IHt9O1xuICAgICAgICAgICAgaWYgKG5zLmlzTWFwU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGFyc2UgPSAhIW5zLmdldE1lcmdlZFRyYWl0cygpLnNwYXJzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2VPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZXJpYWxpemUobnMuZ2V0VmFsdWVTY2hlbWEoKSwgc291cmNlT2JqZWN0W2tleV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBzcGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChucy5pc1N0cnVjdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBtZW1iZXJTY2hlbWFdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlcmlhbGl6ZShtZW1iZXJTY2hlbWEsIHNvdXJjZU9iamVjdFtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChucy5pc0RvY3VtZW50U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2VPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld09iamVjdFtrZXldID0gdGhpcy5zZXJpYWxpemUobnMuZ2V0VmFsdWVTY2hlbWEoKSwgc291cmNlT2JqZWN0W2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgZmx1c2goKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGNib3Iuc2VyaWFsaXplKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbn1cbmNsYXNzIENib3JTaGFwZURlc2VyaWFsaXplciBleHRlbmRzIHByb3RvY29scy5TZXJkZUNvbnRleHQge1xuICAgIHJlYWQoc2NoZW1hLCBieXRlcykge1xuICAgICAgICBjb25zdCBkYXRhID0gY2Jvci5kZXNlcmlhbGl6ZShieXRlcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRWYWx1ZShzY2hlbWEsIGRhdGEpO1xuICAgIH1cbiAgICByZWFkVmFsdWUoX3NjaGVtYSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihfc2NoZW1hKTtcbiAgICAgICAgaWYgKG5zLmlzVGltZXN0YW1wU2NoZW1hKCkgJiYgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VyZGUuX3BhcnNlRXBvY2hUaW1lc3RhbXAodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0Jsb2JTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5zZXJkZUNvbnRleHQ/LmJhc2U2NERlY29kZXIgPz8gdXRpbEJhc2U2NC5mcm9tQmFzZTY0KSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcImJ5dGVMZW5ndGhcIiBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobnMuaXNEb2N1bWVudFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5zLmlzTGlzdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJTY2hlbWEgPSBucy5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuc3BhcnNlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFsdWUgPSB0aGlzLnJlYWRWYWx1ZShtZW1iZXJTY2hlbWEsIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhbHVlICE9IG51bGwgfHwgc3BhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdBcnJheS5wdXNoKGl0ZW1WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0FycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3T2JqZWN0ID0ge307XG4gICAgICAgICAgICBpZiAobnMuaXNNYXBTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuc3BhcnNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFNjaGVtYSA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZSA9IHRoaXMucmVhZFZhbHVlKHRhcmdldFNjaGVtYSwgdmFsdWVba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtVmFsdWUgIT0gbnVsbCB8fCBzcGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdFtrZXldID0gaXRlbVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnMuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgbWVtYmVyU2NoZW1hXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLnJlYWRWYWx1ZShtZW1iZXJTY2hlbWEsIHZhbHVlW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmplY3Rba2V5XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3T2JqZWN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBTbWl0aHlScGNWMkNib3JQcm90b2NvbCBleHRlbmRzIHByb3RvY29scy5ScGNQcm90b2NvbCB7XG4gICAgY29kZWMgPSBuZXcgQ2JvckNvZGVjKCk7XG4gICAgc2VyaWFsaXplciA9IHRoaXMuY29kZWMuY3JlYXRlU2VyaWFsaXplcigpO1xuICAgIGRlc2VyaWFsaXplciA9IHRoaXMuY29kZWMuY3JlYXRlRGVzZXJpYWxpemVyKCk7XG4gICAgY29uc3RydWN0b3IoeyBkZWZhdWx0TmFtZXNwYWNlIH0pIHtcbiAgICAgICAgc3VwZXIoeyBkZWZhdWx0TmFtZXNwYWNlIH0pO1xuICAgIH1cbiAgICBnZXRTaGFwZUlkKCkge1xuICAgICAgICByZXR1cm4gXCJzbWl0aHkucHJvdG9jb2xzI3JwY3YyQ2JvclwiO1xuICAgIH1cbiAgICBnZXRQYXlsb2FkQ29kZWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGVjO1xuICAgIH1cbiAgICBhc3luYyBzZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdC5oZWFkZXJzLCB7XG4gICAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiB0aGlzLmdldERlZmF1bHRDb250ZW50VHlwZSgpLFxuICAgICAgICAgICAgXCJzbWl0aHktcHJvdG9jb2xcIjogXCJycGMtdjItY2JvclwiLFxuICAgICAgICAgICAgYWNjZXB0OiB0aGlzLmdldERlZmF1bHRDb250ZW50VHlwZSgpLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNjaGVtYS5kZXJlZihvcGVyYXRpb25TY2hlbWEuaW5wdXQpID09PSBcInVuaXRcIikge1xuICAgICAgICAgICAgZGVsZXRlIHJlcXVlc3QuYm9keTtcbiAgICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplci53cml0ZSgxNSwge30pO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuYm9keSA9IHRoaXMuc2VyaWFsaXplci5mbHVzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LWxlbmd0aFwiXSA9IFN0cmluZyhyZXF1ZXN0LmJvZHkuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZXJ2aWNlLCBvcGVyYXRpb24gfSA9IHV0aWxNaWRkbGV3YXJlLmdldFNtaXRoeUNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBgL3NlcnZpY2UvJHtzZXJ2aWNlfS9vcGVyYXRpb24vJHtvcGVyYXRpb259YDtcbiAgICAgICAgaWYgKHJlcXVlc3QucGF0aC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucGF0aCArPSBwYXRoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdC5wYXRoICs9IHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuICAgIGFzeW5jIGRlc2VyaWFsaXplUmVzcG9uc2Uob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemVSZXNwb25zZShvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlKTtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlRXJyb3Iob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3JOYW1lID0gbG9hZFNtaXRoeVJwY1YyQ2JvckVycm9yQ29kZShyZXNwb25zZSwgZGF0YU9iamVjdCkgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGxldCBuYW1lc3BhY2UgPSB0aGlzLm9wdGlvbnMuZGVmYXVsdE5hbWVzcGFjZTtcbiAgICAgICAgaWYgKGVycm9yTmFtZS5pbmNsdWRlcyhcIiNcIikpIHtcbiAgICAgICAgICAgIFtuYW1lc3BhY2VdID0gZXJyb3JOYW1lLnNwbGl0KFwiI1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvck1ldGFkYXRhID0ge1xuICAgICAgICAgICAgJG1ldGFkYXRhOiBtZXRhZGF0YSxcbiAgICAgICAgICAgICRmYXVsdDogcmVzcG9uc2Uuc3RhdHVzQ29kZSA8PSA1MDAgPyBcImNsaWVudFwiIDogXCJzZXJ2ZXJcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBzY2hlbWEuVHlwZVJlZ2lzdHJ5LmZvcihuYW1lc3BhY2UpO1xuICAgICAgICBsZXQgZXJyb3JTY2hlbWE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlcnJvclNjaGVtYSA9IHJlZ2lzdHJ5LmdldFNjaGVtYShlcnJvck5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdC5tZXNzYWdlID0gZGF0YU9iamVjdC5NZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3ludGhldGljID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IoXCJzbWl0aHkudHMuc2RrLnN5bnRoZXRpYy5cIiArIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBjb25zdCBiYXNlRXhjZXB0aW9uU2NoZW1hID0gc3ludGhldGljLmdldEJhc2VFeGNlcHRpb24oKTtcbiAgICAgICAgICAgIGlmIChiYXNlRXhjZXB0aW9uU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDdG9yID0gc3ludGhldGljLmdldEVycm9yQ3RvcihiYXNlRXhjZXB0aW9uU2NoZW1hKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvckN0b3IoeyBuYW1lOiBlcnJvck5hbWUgfSksIGVycm9yTWV0YWRhdGEsIGRhdGFPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoZXJyb3JOYW1lKSwgZXJyb3JNZXRhZGF0YSwgZGF0YU9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihlcnJvclNjaGVtYSk7XG4gICAgICAgIGNvbnN0IEVycm9yQ3RvciA9IHJlZ2lzdHJ5LmdldEVycm9yQ3RvcihlcnJvclNjaGVtYSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhT2JqZWN0Lm1lc3NhZ2UgPz8gZGF0YU9iamVjdC5NZXNzYWdlID8/IFwiVW5rbm93blwiO1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgRXJyb3JDdG9yKG1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWVtYmVyXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSB0aGlzLmRlc2VyaWFsaXplci5yZWFkVmFsdWUobWVtYmVyLCBkYXRhT2JqZWN0W25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKGV4Y2VwdGlvbiwgZXJyb3JNZXRhZGF0YSwge1xuICAgICAgICAgICAgJGZhdWx0OiBucy5nZXRNZXJnZWRUcmFpdHMoKS5lcnJvcixcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIH0sIG91dHB1dCk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXBwbGljYXRpb24vY2JvclwiO1xuICAgIH1cbn1cblxuZXhwb3J0cy5DYm9yQ29kZWMgPSBDYm9yQ29kZWM7XG5leHBvcnRzLkNib3JTaGFwZURlc2VyaWFsaXplciA9IENib3JTaGFwZURlc2VyaWFsaXplcjtcbmV4cG9ydHMuQ2JvclNoYXBlU2VyaWFsaXplciA9IENib3JTaGFwZVNlcmlhbGl6ZXI7XG5leHBvcnRzLlNtaXRoeVJwY1YyQ2JvclByb3RvY29sID0gU21pdGh5UnBjVjJDYm9yUHJvdG9jb2w7XG5leHBvcnRzLmJ1aWxkSHR0cFJwY1JlcXVlc3QgPSBidWlsZEh0dHBScGNSZXF1ZXN0O1xuZXhwb3J0cy5jYm9yID0gY2JvcjtcbmV4cG9ydHMuY2hlY2tDYm9yUmVzcG9uc2UgPSBjaGVja0Nib3JSZXNwb25zZTtcbmV4cG9ydHMuZGF0ZVRvVGFnID0gZGF0ZVRvVGFnO1xuZXhwb3J0cy5sb2FkU21pdGh5UnBjVjJDYm9yRXJyb3JDb2RlID0gbG9hZFNtaXRoeVJwY1YyQ2JvckVycm9yQ29kZTtcbmV4cG9ydHMucGFyc2VDYm9yQm9keSA9IHBhcnNlQ2JvckJvZHk7XG5leHBvcnRzLnBhcnNlQ2JvckVycm9yQm9keSA9IHBhcnNlQ2JvckVycm9yQm9keTtcbmV4cG9ydHMudGFnID0gdGFnO1xuZXhwb3J0cy50YWdTeW1ib2wgPSB0YWdTeW1ib2w7XG4iLAogICAgIigoKT0+e1widXNlIHN0cmljdFwiO3ZhciB0PXtkOihlLG4pPT57Zm9yKHZhciBpIGluIG4pdC5vKG4saSkmJiF0Lm8oZSxpKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSx7ZW51bWVyYWJsZTohMCxnZXQ6bltpXX0pfSxvOih0LGUpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSxyOnQ9PntcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfX0sZT17fTt0LnIoZSksdC5kKGUse1hNTEJ1aWxkZXI6KCk9PmZ0LFhNTFBhcnNlcjooKT0+c3QsWE1MVmFsaWRhdG9yOigpPT5tdH0pO2NvbnN0IG49XCI6QS1aYS16X1xcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCIsaT1uZXcgUmVnRXhwKFwiXltcIituK1wiXVtcIituK1wiXFxcXC0uXFxcXGRcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiKTtmdW5jdGlvbiBzKHQsZSl7Y29uc3Qgbj1bXTtsZXQgaT1lLmV4ZWModCk7Zm9yKDtpOyl7Y29uc3Qgcz1bXTtzLnN0YXJ0SW5kZXg9ZS5sYXN0SW5kZXgtaVswXS5sZW5ndGg7Y29uc3Qgcj1pLmxlbmd0aDtmb3IobGV0IHQ9MDt0PHI7dCsrKXMucHVzaChpW3RdKTtuLnB1c2gocyksaT1lLmV4ZWModCl9cmV0dXJuIG59Y29uc3Qgcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PWkuZXhlYyh0KSl9LG89e2FsbG93Qm9vbGVhbkF0dHJpYnV0ZXM6ITEsdW5wYWlyZWRUYWdzOltdfTtmdW5jdGlvbiBhKHQsZSl7ZT1PYmplY3QuYXNzaWduKHt9LG8sZSk7Y29uc3Qgbj1bXTtsZXQgaT0hMSxzPSExO1wiXFx1ZmVmZlwiPT09dFswXSYmKHQ9dC5zdWJzdHIoMSkpO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKWlmKFwiPFwiPT09dFtvXSYmXCI/XCI9PT10W28rMV0pe2lmKG8rPTIsbz11KHQsbyksby5lcnIpcmV0dXJuIG99ZWxzZXtpZihcIjxcIiE9PXRbb10pe2lmKGwodFtvXSkpY29udGludWU7cmV0dXJuIHgoXCJJbnZhbGlkQ2hhclwiLFwiY2hhciAnXCIrdFtvXStcIicgaXMgbm90IGV4cGVjdGVkLlwiLE4odCxvKSl9e2xldCBhPW87aWYobysrLFwiIVwiPT09dFtvXSl7bz1oKHQsbyk7Y29udGludWV9e2xldCBkPSExO1wiL1wiPT09dFtvXSYmKGQ9ITAsbysrKTtsZXQgZj1cIlwiO2Zvcig7bzx0Lmxlbmd0aCYmXCI+XCIhPT10W29dJiZcIiBcIiE9PXRbb10mJlwiXFx0XCIhPT10W29dJiZcIlxcblwiIT09dFtvXSYmXCJcXHJcIiE9PXRbb107bysrKWYrPXRbb107aWYoZj1mLnRyaW0oKSxcIi9cIj09PWZbZi5sZW5ndGgtMV0mJihmPWYuc3Vic3RyaW5nKDAsZi5sZW5ndGgtMSksby0tKSwhcihmKSl7bGV0IGU7cmV0dXJuIGU9MD09PWYudHJpbSgpLmxlbmd0aD9cIkludmFsaWQgc3BhY2UgYWZ0ZXIgJzwnLlwiOlwiVGFnICdcIitmK1wiJyBpcyBhbiBpbnZhbGlkIG5hbWUuXCIseChcIkludmFsaWRUYWdcIixlLE4odCxvKSl9Y29uc3QgcD1jKHQsbyk7aWYoITE9PT1wKXJldHVybiB4KFwiSW52YWxpZEF0dHJcIixcIkF0dHJpYnV0ZXMgZm9yICdcIitmK1wiJyBoYXZlIG9wZW4gcXVvdGUuXCIsTih0LG8pKTtsZXQgYj1wLnZhbHVlO2lmKG89cC5pbmRleCxcIi9cIj09PWJbYi5sZW5ndGgtMV0pe2NvbnN0IG49by1iLmxlbmd0aDtiPWIuc3Vic3RyaW5nKDAsYi5sZW5ndGgtMSk7Y29uc3Qgcz1nKGIsZSk7aWYoITAhPT1zKXJldHVybiB4KHMuZXJyLmNvZGUscy5lcnIubXNnLE4odCxuK3MuZXJyLmxpbmUpKTtpPSEwfWVsc2UgaWYoZCl7aWYoIXAudGFnQ2xvc2VkKXJldHVybiB4KFwiSW52YWxpZFRhZ1wiLFwiQ2xvc2luZyB0YWcgJ1wiK2YrXCInIGRvZXNuJ3QgaGF2ZSBwcm9wZXIgY2xvc2luZy5cIixOKHQsbykpO2lmKGIudHJpbSgpLmxlbmd0aD4wKXJldHVybiB4KFwiSW52YWxpZFRhZ1wiLFwiQ2xvc2luZyB0YWcgJ1wiK2YrXCInIGNhbid0IGhhdmUgYXR0cmlidXRlcyBvciBpbnZhbGlkIHN0YXJ0aW5nLlwiLE4odCxhKSk7aWYoMD09PW4ubGVuZ3RoKXJldHVybiB4KFwiSW52YWxpZFRhZ1wiLFwiQ2xvc2luZyB0YWcgJ1wiK2YrXCInIGhhcyBub3QgYmVlbiBvcGVuZWQuXCIsTih0LGEpKTt7Y29uc3QgZT1uLnBvcCgpO2lmKGYhPT1lLnRhZ05hbWUpe2xldCBuPU4odCxlLnRhZ1N0YXJ0UG9zKTtyZXR1cm4geChcIkludmFsaWRUYWdcIixcIkV4cGVjdGVkIGNsb3NpbmcgdGFnICdcIitlLnRhZ05hbWUrXCInIChvcGVuZWQgaW4gbGluZSBcIituLmxpbmUrXCIsIGNvbCBcIituLmNvbCtcIikgaW5zdGVhZCBvZiBjbG9zaW5nIHRhZyAnXCIrZitcIicuXCIsTih0LGEpKX0wPT1uLmxlbmd0aCYmKHM9ITApfX1lbHNle2NvbnN0IHI9ZyhiLGUpO2lmKCEwIT09cilyZXR1cm4geChyLmVyci5jb2RlLHIuZXJyLm1zZyxOKHQsby1iLmxlbmd0aCtyLmVyci5saW5lKSk7aWYoITA9PT1zKXJldHVybiB4KFwiSW52YWxpZFhtbFwiLFwiTXVsdGlwbGUgcG9zc2libGUgcm9vdCBub2RlcyBmb3VuZC5cIixOKHQsbykpOy0xIT09ZS51bnBhaXJlZFRhZ3MuaW5kZXhPZihmKXx8bi5wdXNoKHt0YWdOYW1lOmYsdGFnU3RhcnRQb3M6YX0pLGk9ITB9Zm9yKG8rKztvPHQubGVuZ3RoO28rKylpZihcIjxcIj09PXRbb10pe2lmKFwiIVwiPT09dFtvKzFdKXtvKyssbz1oKHQsbyk7Y29udGludWV9aWYoXCI/XCIhPT10W28rMV0pYnJlYWs7aWYobz11KHQsKytvKSxvLmVycilyZXR1cm4gb31lbHNlIGlmKFwiJlwiPT09dFtvXSl7Y29uc3QgZT1tKHQsbyk7aWYoLTE9PWUpcmV0dXJuIHgoXCJJbnZhbGlkQ2hhclwiLFwiY2hhciAnJicgaXMgbm90IGV4cGVjdGVkLlwiLE4odCxvKSk7bz1lfWVsc2UgaWYoITA9PT1zJiYhbCh0W29dKSlyZXR1cm4geChcIkludmFsaWRYbWxcIixcIkV4dHJhIHRleHQgYXQgdGhlIGVuZFwiLE4odCxvKSk7XCI8XCI9PT10W29dJiZvLS19fX1yZXR1cm4gaT8xPT1uLmxlbmd0aD94KFwiSW52YWxpZFRhZ1wiLFwiVW5jbG9zZWQgdGFnICdcIituWzBdLnRhZ05hbWUrXCInLlwiLE4odCxuWzBdLnRhZ1N0YXJ0UG9zKSk6IShuLmxlbmd0aD4wKXx8eChcIkludmFsaWRYbWxcIixcIkludmFsaWQgJ1wiK0pTT04uc3RyaW5naWZ5KG4ubWFwKCh0PT50LnRhZ05hbWUpKSxudWxsLDQpLnJlcGxhY2UoL1xccj9cXG4vZyxcIlwiKStcIicgZm91bmQuXCIse2xpbmU6MSxjb2w6MX0pOngoXCJJbnZhbGlkWG1sXCIsXCJTdGFydCB0YWcgZXhwZWN0ZWQuXCIsMSl9ZnVuY3Rpb24gbCh0KXtyZXR1cm5cIiBcIj09PXR8fFwiXFx0XCI9PT10fHxcIlxcblwiPT09dHx8XCJcXHJcIj09PXR9ZnVuY3Rpb24gdSh0LGUpe2NvbnN0IG49ZTtmb3IoO2U8dC5sZW5ndGg7ZSsrKWlmKFwiP1wiIT10W2VdJiZcIiBcIiE9dFtlXSk7ZWxzZXtjb25zdCBpPXQuc3Vic3RyKG4sZS1uKTtpZihlPjUmJlwieG1sXCI9PT1pKXJldHVybiB4KFwiSW52YWxpZFhtbFwiLFwiWE1MIGRlY2xhcmF0aW9uIGFsbG93ZWQgb25seSBhdCB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LlwiLE4odCxlKSk7aWYoXCI/XCI9PXRbZV0mJlwiPlwiPT10W2UrMV0pe2UrKzticmVha319cmV0dXJuIGV9ZnVuY3Rpb24gaCh0LGUpe2lmKHQubGVuZ3RoPmUrNSYmXCItXCI9PT10W2UrMV0mJlwiLVwiPT09dFtlKzJdKXtmb3IoZSs9MztlPHQubGVuZ3RoO2UrKylpZihcIi1cIj09PXRbZV0mJlwiLVwiPT09dFtlKzFdJiZcIj5cIj09PXRbZSsyXSl7ZSs9MjticmVha319ZWxzZSBpZih0Lmxlbmd0aD5lKzgmJlwiRFwiPT09dFtlKzFdJiZcIk9cIj09PXRbZSsyXSYmXCJDXCI9PT10W2UrM10mJlwiVFwiPT09dFtlKzRdJiZcIllcIj09PXRbZSs1XSYmXCJQXCI9PT10W2UrNl0mJlwiRVwiPT09dFtlKzddKXtsZXQgbj0xO2ZvcihlKz04O2U8dC5sZW5ndGg7ZSsrKWlmKFwiPFwiPT09dFtlXSluKys7ZWxzZSBpZihcIj5cIj09PXRbZV0mJihuLS0sMD09PW4pKWJyZWFrfWVsc2UgaWYodC5sZW5ndGg+ZSs5JiZcIltcIj09PXRbZSsxXSYmXCJDXCI9PT10W2UrMl0mJlwiRFwiPT09dFtlKzNdJiZcIkFcIj09PXRbZSs0XSYmXCJUXCI9PT10W2UrNV0mJlwiQVwiPT09dFtlKzZdJiZcIltcIj09PXRbZSs3XSlmb3IoZSs9ODtlPHQubGVuZ3RoO2UrKylpZihcIl1cIj09PXRbZV0mJlwiXVwiPT09dFtlKzFdJiZcIj5cIj09PXRbZSsyXSl7ZSs9MjticmVha31yZXR1cm4gZX1jb25zdCBkPSdcIicsZj1cIidcIjtmdW5jdGlvbiBjKHQsZSl7bGV0IG49XCJcIixpPVwiXCIscz0hMTtmb3IoO2U8dC5sZW5ndGg7ZSsrKXtpZih0W2VdPT09ZHx8dFtlXT09PWYpXCJcIj09PWk/aT10W2VdOmkhPT10W2VdfHwoaT1cIlwiKTtlbHNlIGlmKFwiPlwiPT09dFtlXSYmXCJcIj09PWkpe3M9ITA7YnJlYWt9bis9dFtlXX1yZXR1cm5cIlwiPT09aSYme3ZhbHVlOm4saW5kZXg6ZSx0YWdDbG9zZWQ6c319Y29uc3QgcD1uZXcgUmVnRXhwKFwiKFxcXFxzKikoW15cXFxccz1dKykoXFxcXHMqPSk/KFxcXFxzKihbJ1xcXCJdKSgoW1xcXFxzXFxcXFNdKSo/KVxcXFw1KT9cIixcImdcIik7ZnVuY3Rpb24gZyh0LGUpe2NvbnN0IG49cyh0LHApLGk9e307Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKDA9PT1uW3RdWzFdLmxlbmd0aClyZXR1cm4geChcIkludmFsaWRBdHRyXCIsXCJBdHRyaWJ1dGUgJ1wiK25bdF1bMl0rXCInIGhhcyBubyBzcGFjZSBpbiBzdGFydGluZy5cIixFKG5bdF0pKTtpZih2b2lkIDAhPT1uW3RdWzNdJiZ2b2lkIDA9PT1uW3RdWzRdKXJldHVybiB4KFwiSW52YWxpZEF0dHJcIixcIkF0dHJpYnV0ZSAnXCIrblt0XVsyXStcIicgaXMgd2l0aG91dCB2YWx1ZS5cIixFKG5bdF0pKTtpZih2b2lkIDA9PT1uW3RdWzNdJiYhZS5hbGxvd0Jvb2xlYW5BdHRyaWJ1dGVzKXJldHVybiB4KFwiSW52YWxpZEF0dHJcIixcImJvb2xlYW4gYXR0cmlidXRlICdcIituW3RdWzJdK1wiJyBpcyBub3QgYWxsb3dlZC5cIixFKG5bdF0pKTtjb25zdCBzPW5bdF1bMl07aWYoIWIocykpcmV0dXJuIHgoXCJJbnZhbGlkQXR0clwiLFwiQXR0cmlidXRlICdcIitzK1wiJyBpcyBhbiBpbnZhbGlkIG5hbWUuXCIsRShuW3RdKSk7aWYoaS5oYXNPd25Qcm9wZXJ0eShzKSlyZXR1cm4geChcIkludmFsaWRBdHRyXCIsXCJBdHRyaWJ1dGUgJ1wiK3MrXCInIGlzIHJlcGVhdGVkLlwiLEUoblt0XSkpO2lbc109MX1yZXR1cm4hMH1mdW5jdGlvbiBtKHQsZSl7aWYoXCI7XCI9PT10WysrZV0pcmV0dXJuLTE7aWYoXCIjXCI9PT10W2VdKXJldHVybiBmdW5jdGlvbih0LGUpe2xldCBuPS9cXGQvO2ZvcihcInhcIj09PXRbZV0mJihlKyssbj0vW1xcZGEtZkEtRl0vKTtlPHQubGVuZ3RoO2UrKyl7aWYoXCI7XCI9PT10W2VdKXJldHVybiBlO2lmKCF0W2VdLm1hdGNoKG4pKWJyZWFrfXJldHVybi0xfSh0LCsrZSk7bGV0IG49MDtmb3IoO2U8dC5sZW5ndGg7ZSsrLG4rKylpZighKHRbZV0ubWF0Y2goL1xcdy8pJiZuPDIwKSl7aWYoXCI7XCI9PT10W2VdKWJyZWFrO3JldHVybi0xfXJldHVybiBlfWZ1bmN0aW9uIHgodCxlLG4pe3JldHVybntlcnI6e2NvZGU6dCxtc2c6ZSxsaW5lOm4ubGluZXx8bixjb2w6bi5jb2x9fX1mdW5jdGlvbiBiKHQpe3JldHVybiByKHQpfWZ1bmN0aW9uIE4odCxlKXtjb25zdCBuPXQuc3Vic3RyaW5nKDAsZSkuc3BsaXQoL1xccj9cXG4vKTtyZXR1cm57bGluZTpuLmxlbmd0aCxjb2w6bltuLmxlbmd0aC0xXS5sZW5ndGgrMX19ZnVuY3Rpb24gRSh0KXtyZXR1cm4gdC5zdGFydEluZGV4K3RbMV0ubGVuZ3RofWNvbnN0IHY9e3ByZXNlcnZlT3JkZXI6ITEsYXR0cmlidXRlTmFtZVByZWZpeDpcIkBfXCIsYXR0cmlidXRlc0dyb3VwTmFtZTohMSx0ZXh0Tm9kZU5hbWU6XCIjdGV4dFwiLGlnbm9yZUF0dHJpYnV0ZXM6ITAscmVtb3ZlTlNQcmVmaXg6ITEsYWxsb3dCb29sZWFuQXR0cmlidXRlczohMSxwYXJzZVRhZ1ZhbHVlOiEwLHBhcnNlQXR0cmlidXRlVmFsdWU6ITEsdHJpbVZhbHVlczohMCxjZGF0YVByb3BOYW1lOiExLG51bWJlclBhcnNlT3B0aW9uczp7aGV4OiEwLGxlYWRpbmdaZXJvczohMCxlTm90YXRpb246ITB9LHRhZ1ZhbHVlUHJvY2Vzc29yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9LGF0dHJpYnV0ZVZhbHVlUHJvY2Vzc29yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9LHN0b3BOb2RlczpbXSxhbHdheXNDcmVhdGVUZXh0Tm9kZTohMSxpc0FycmF5OigpPT4hMSxjb21tZW50UHJvcE5hbWU6ITEsdW5wYWlyZWRUYWdzOltdLHByb2Nlc3NFbnRpdGllczohMCxodG1sRW50aXRpZXM6ITEsaWdub3JlRGVjbGFyYXRpb246ITEsaWdub3JlUGlUYWdzOiExLHRyYW5zZm9ybVRhZ05hbWU6ITEsdHJhbnNmb3JtQXR0cmlidXRlTmFtZTohMSx1cGRhdGVUYWc6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0fSxjYXB0dXJlTWV0YURhdGE6ITF9O2xldCB5O3k9XCJmdW5jdGlvblwiIT10eXBlb2YgU3ltYm9sP1wiQEB4bWxNZXRhZGF0YVwiOlN5bWJvbChcIlhNTCBOb2RlIE1ldGFkYXRhXCIpO2NsYXNzIFR7Y29uc3RydWN0b3IodCl7dGhpcy50YWduYW1lPXQsdGhpcy5jaGlsZD1bXSx0aGlzW1wiOkBcIl09e319YWRkKHQsZSl7XCJfX3Byb3RvX19cIj09PXQmJih0PVwiI19fcHJvdG9fX1wiKSx0aGlzLmNoaWxkLnB1c2goe1t0XTplfSl9YWRkQ2hpbGQodCxlKXtcIl9fcHJvdG9fX1wiPT09dC50YWduYW1lJiYodC50YWduYW1lPVwiI19fcHJvdG9fX1wiKSx0W1wiOkBcIl0mJk9iamVjdC5rZXlzKHRbXCI6QFwiXSkubGVuZ3RoPjA/dGhpcy5jaGlsZC5wdXNoKHtbdC50YWduYW1lXTp0LmNoaWxkLFwiOkBcIjp0W1wiOkBcIl19KTp0aGlzLmNoaWxkLnB1c2goe1t0LnRhZ25hbWVdOnQuY2hpbGR9KSx2b2lkIDAhPT1lJiYodGhpcy5jaGlsZFt0aGlzLmNoaWxkLmxlbmd0aC0xXVt5XT17c3RhcnRJbmRleDplfSl9c3RhdGljIGdldE1ldGFEYXRhU3ltYm9sKCl7cmV0dXJuIHl9fWZ1bmN0aW9uIHcodCxlKXtjb25zdCBuPXt9O2lmKFwiT1wiIT09dFtlKzNdfHxcIkNcIiE9PXRbZSs0XXx8XCJUXCIhPT10W2UrNV18fFwiWVwiIT09dFtlKzZdfHxcIlBcIiE9PXRbZSs3XXx8XCJFXCIhPT10W2UrOF0pdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBUYWcgaW5zdGVhZCBvZiBET0NUWVBFXCIpO3tlKz05O2xldCBpPTEscz0hMSxyPSExLG89XCJcIjtmb3IoO2U8dC5sZW5ndGg7ZSsrKWlmKFwiPFwiIT09dFtlXXx8cilpZihcIj5cIj09PXRbZV0pe2lmKHI/XCItXCI9PT10W2UtMV0mJlwiLVwiPT09dFtlLTJdJiYocj0hMSxpLS0pOmktLSwwPT09aSlicmVha31lbHNlXCJbXCI9PT10W2VdP3M9ITA6bys9dFtlXTtlbHNle2lmKHMmJkModCxcIiFFTlRJVFlcIixlKSl7bGV0IGkscztlKz03LFtpLHMsZV09Tyh0LGUrMSksLTE9PT1zLmluZGV4T2YoXCImXCIpJiYobltpXT17cmVneDpSZWdFeHAoYCYke2l9O2AsXCJnXCIpLHZhbDpzfSl9ZWxzZSBpZihzJiZDKHQsXCIhRUxFTUVOVFwiLGUpKXtlKz04O2NvbnN0e2luZGV4Om59PVModCxlKzEpO2U9bn1lbHNlIGlmKHMmJkModCxcIiFBVFRMSVNUXCIsZSkpZSs9ODtlbHNlIGlmKHMmJkModCxcIiFOT1RBVElPTlwiLGUpKXtlKz05O2NvbnN0e2luZGV4Om59PUEodCxlKzEpO2U9bn1lbHNle2lmKCFDKHQsXCIhLS1cIixlKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIERPQ1RZUEVcIik7cj0hMH1pKyssbz1cIlwifWlmKDAhPT1pKXRocm93IG5ldyBFcnJvcihcIlVuY2xvc2VkIERPQ1RZUEVcIil9cmV0dXJue2VudGl0aWVzOm4saTplfX1jb25zdCBQPSh0LGUpPT57Zm9yKDtlPHQubGVuZ3RoJiYvXFxzLy50ZXN0KHRbZV0pOyllKys7cmV0dXJuIGV9O2Z1bmN0aW9uIE8odCxlKXtlPVAodCxlKTtsZXQgbj1cIlwiO2Zvcig7ZTx0Lmxlbmd0aCYmIS9cXHMvLnRlc3QodFtlXSkmJidcIichPT10W2VdJiZcIidcIiE9PXRbZV07KW4rPXRbZV0sZSsrO2lmKCQobiksZT1QKHQsZSksXCJTWVNURU1cIj09PXQuc3Vic3RyaW5nKGUsZSs2KS50b1VwcGVyQ2FzZSgpKXRocm93IG5ldyBFcnJvcihcIkV4dGVybmFsIGVudGl0aWVzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO2lmKFwiJVwiPT09dFtlXSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgZW50aXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7bGV0IGk9XCJcIjtyZXR1cm5bZSxpXT1JKHQsZSxcImVudGl0eVwiKSxbbixpLC0tZV19ZnVuY3Rpb24gQSh0LGUpe2U9UCh0LGUpO2xldCBuPVwiXCI7Zm9yKDtlPHQubGVuZ3RoJiYhL1xccy8udGVzdCh0W2VdKTspbis9dFtlXSxlKys7JChuKSxlPVAodCxlKTtjb25zdCBpPXQuc3Vic3RyaW5nKGUsZSs2KS50b1VwcGVyQ2FzZSgpO2lmKFwiU1lTVEVNXCIhPT1pJiZcIlBVQkxJQ1wiIT09aSl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFNZU1RFTSBvciBQVUJMSUMsIGZvdW5kIFwiJHtpfVwiYCk7ZSs9aS5sZW5ndGgsZT1QKHQsZSk7bGV0IHM9bnVsbCxyPW51bGw7aWYoXCJQVUJMSUNcIj09PWkpW2Usc109SSh0LGUsXCJwdWJsaWNJZGVudGlmaWVyXCIpLCdcIichPT10W2U9UCh0LGUpXSYmXCInXCIhPT10W2VdfHwoW2Uscl09SSh0LGUsXCJzeXN0ZW1JZGVudGlmaWVyXCIpKTtlbHNlIGlmKFwiU1lTVEVNXCI9PT1pJiYoW2Uscl09SSh0LGUsXCJzeXN0ZW1JZGVudGlmaWVyXCIpLCFyKSl0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBzeXN0ZW0gaWRlbnRpZmllciBmb3IgU1lTVEVNIG5vdGF0aW9uXCIpO3JldHVybntub3RhdGlvbk5hbWU6bixwdWJsaWNJZGVudGlmaWVyOnMsc3lzdGVtSWRlbnRpZmllcjpyLGluZGV4Oi0tZX19ZnVuY3Rpb24gSSh0LGUsbil7bGV0IGk9XCJcIjtjb25zdCBzPXRbZV07aWYoJ1wiJyE9PXMmJlwiJ1wiIT09cyl0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHF1b3RlZCBzdHJpbmcsIGZvdW5kIFwiJHtzfVwiYCk7Zm9yKGUrKztlPHQubGVuZ3RoJiZ0W2VdIT09czspaSs9dFtlXSxlKys7aWYodFtlXSE9PXMpdGhyb3cgbmV3IEVycm9yKGBVbnRlcm1pbmF0ZWQgJHtufSB2YWx1ZWApO3JldHVyblsrK2UsaV19ZnVuY3Rpb24gUyh0LGUpe2U9UCh0LGUpO2xldCBuPVwiXCI7Zm9yKDtlPHQubGVuZ3RoJiYhL1xccy8udGVzdCh0W2VdKTspbis9dFtlXSxlKys7aWYoISQobikpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgbmFtZTogXCIke259XCJgKTtsZXQgaT1cIlwiO2lmKFwiRVwiPT09dFtlPVAodCxlKV0mJkModCxcIk1QVFlcIixlKSllKz00O2Vsc2UgaWYoXCJBXCI9PT10W2VdJiZDKHQsXCJOWVwiLGUpKWUrPTI7ZWxzZXtpZihcIihcIiE9PXRbZV0pdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEVsZW1lbnQgRXhwcmVzc2lvbiwgZm91bmQgXCIke3RbZV19XCJgKTtmb3IoZSsrO2U8dC5sZW5ndGgmJlwiKVwiIT09dFtlXTspaSs9dFtlXSxlKys7aWYoXCIpXCIhPT10W2VdKXRocm93IG5ldyBFcnJvcihcIlVudGVybWluYXRlZCBjb250ZW50IG1vZGVsXCIpfXJldHVybntlbGVtZW50TmFtZTpuLGNvbnRlbnRNb2RlbDppLnRyaW0oKSxpbmRleDplfX1mdW5jdGlvbiBDKHQsZSxuKXtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKylpZihlW2ldIT09dFtuK2krMV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gJCh0KXtpZihyKHQpKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbnRpdHkgbmFtZSAke3R9YCl9Y29uc3Qgaj0vXlstK10/MHhbYS1mQS1GMC05XSskLyxEPS9eKFtcXC1cXCtdKT8oMCopKFswLTldKihcXC5bMC05XSopPykkLyxWPXtoZXg6ITAsbGVhZGluZ1plcm9zOiEwLGRlY2ltYWxQb2ludDpcIi5cIixlTm90YXRpb246ITB9O2NvbnN0IE09L14oWy0rXSk/KDAqKShcXGQqKFxcLlxcZCopP1tlRV1bLVxcK10/XFxkKykkLztmdW5jdGlvbiBfKHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2U9Pntmb3IoY29uc3QgbiBvZiB0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgbiYmZT09PW4pcmV0dXJuITA7aWYobiBpbnN0YW5jZW9mIFJlZ0V4cCYmbi50ZXN0KGUpKXJldHVybiEwfX06KCk9PiExfWNsYXNzIGt7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXQsdGhpcy5jdXJyZW50Tm9kZT1udWxsLHRoaXMudGFnc05vZGVTdGFjaz1bXSx0aGlzLmRvY1R5cGVFbnRpdGllcz17fSx0aGlzLmxhc3RFbnRpdGllcz17YXBvczp7cmVnZXg6LyYoYXBvc3wjMzl8I3gyNyk7L2csdmFsOlwiJ1wifSxndDp7cmVnZXg6LyYoZ3R8IzYyfCN4M0UpOy9nLHZhbDpcIj5cIn0sbHQ6e3JlZ2V4Oi8mKGx0fCM2MHwjeDNDKTsvZyx2YWw6XCI8XCJ9LHF1b3Q6e3JlZ2V4Oi8mKHF1b3R8IzM0fCN4MjIpOy9nLHZhbDonXCInfX0sdGhpcy5hbXBFbnRpdHk9e3JlZ2V4Oi8mKGFtcHwjMzh8I3gyNik7L2csdmFsOlwiJlwifSx0aGlzLmh0bWxFbnRpdGllcz17c3BhY2U6e3JlZ2V4Oi8mKG5ic3B8IzE2MCk7L2csdmFsOlwiIFwifSxjZW50OntyZWdleDovJihjZW50fCMxNjIpOy9nLHZhbDpcIsKiXCJ9LHBvdW5kOntyZWdleDovJihwb3VuZHwjMTYzKTsvZyx2YWw6XCLCo1wifSx5ZW46e3JlZ2V4Oi8mKHllbnwjMTY1KTsvZyx2YWw6XCLCpVwifSxldXJvOntyZWdleDovJihldXJvfCM4MzY0KTsvZyx2YWw6XCLigqxcIn0sY29weXJpZ2h0OntyZWdleDovJihjb3B5fCMxNjkpOy9nLHZhbDpcIsKpXCJ9LHJlZzp7cmVnZXg6LyYocmVnfCMxNzQpOy9nLHZhbDpcIsKuXCJ9LGlucjp7cmVnZXg6LyYoaW5yfCM4Mzc3KTsvZyx2YWw6XCLigrlcIn0sbnVtX2RlYzp7cmVnZXg6LyYjKFswLTldezEsN30pOy9nLHZhbDoodCxlKT0+U3RyaW5nLmZyb21Db2RlUG9pbnQoTnVtYmVyLnBhcnNlSW50KGUsMTApKX0sbnVtX2hleDp7cmVnZXg6LyYjeChbMC05YS1mQS1GXXsxLDZ9KTsvZyx2YWw6KHQsZSk9PlN0cmluZy5mcm9tQ29kZVBvaW50KE51bWJlci5wYXJzZUludChlLDE2KSl9fSx0aGlzLmFkZEV4dGVybmFsRW50aXRpZXM9Rix0aGlzLnBhcnNlWG1sPVgsdGhpcy5wYXJzZVRleHREYXRhPUwsdGhpcy5yZXNvbHZlTmFtZVNwYWNlPUIsdGhpcy5idWlsZEF0dHJpYnV0ZXNNYXA9Ryx0aGlzLmlzSXRTdG9wTm9kZT1aLHRoaXMucmVwbGFjZUVudGl0aWVzVmFsdWU9Uix0aGlzLnJlYWRTdG9wTm9kZURhdGE9Six0aGlzLnNhdmVUZXh0VG9QYXJlbnRUYWc9cSx0aGlzLmFkZENoaWxkPVksdGhpcy5pZ25vcmVBdHRyaWJ1dGVzRm49Xyh0aGlzLm9wdGlvbnMuaWdub3JlQXR0cmlidXRlcyl9fWZ1bmN0aW9uIEYodCl7Y29uc3QgZT1PYmplY3Qua2V5cyh0KTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3QgaT1lW25dO3RoaXMubGFzdEVudGl0aWVzW2ldPXtyZWdleDpuZXcgUmVnRXhwKFwiJlwiK2krXCI7XCIsXCJnXCIpLHZhbDp0W2ldfX19ZnVuY3Rpb24gTCh0LGUsbixpLHMscixvKXtpZih2b2lkIDAhPT10JiYodGhpcy5vcHRpb25zLnRyaW1WYWx1ZXMmJiFpJiYodD10LnRyaW0oKSksdC5sZW5ndGg+MCkpe298fCh0PXRoaXMucmVwbGFjZUVudGl0aWVzVmFsdWUodCkpO2NvbnN0IGk9dGhpcy5vcHRpb25zLnRhZ1ZhbHVlUHJvY2Vzc29yKGUsdCxuLHMscik7cmV0dXJuIG51bGw9PWk/dDp0eXBlb2YgaSE9dHlwZW9mIHR8fGkhPT10P2k6dGhpcy5vcHRpb25zLnRyaW1WYWx1ZXN8fHQudHJpbSgpPT09dD9IKHQsdGhpcy5vcHRpb25zLnBhcnNlVGFnVmFsdWUsdGhpcy5vcHRpb25zLm51bWJlclBhcnNlT3B0aW9ucyk6dH19ZnVuY3Rpb24gQih0KXtpZih0aGlzLm9wdGlvbnMucmVtb3ZlTlNQcmVmaXgpe2NvbnN0IGU9dC5zcGxpdChcIjpcIiksbj1cIi9cIj09PXQuY2hhckF0KDApP1wiL1wiOlwiXCI7aWYoXCJ4bWxuc1wiPT09ZVswXSlyZXR1cm5cIlwiOzI9PT1lLmxlbmd0aCYmKHQ9bitlWzFdKX1yZXR1cm4gdH1jb25zdCBVPW5ldyBSZWdFeHAoXCIoW15cXFxccz1dKylcXFxccyooPVxcXFxzKihbJ1xcXCJdKShbXFxcXHNcXFxcU10qPylcXFxcMyk/XCIsXCJnbVwiKTtmdW5jdGlvbiBHKHQsZSxuKXtpZighMCE9PXRoaXMub3B0aW9ucy5pZ25vcmVBdHRyaWJ1dGVzJiZcInN0cmluZ1wiPT10eXBlb2YgdCl7Y29uc3Qgbj1zKHQsVSksaT1uLmxlbmd0aCxyPXt9O2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IGk9dGhpcy5yZXNvbHZlTmFtZVNwYWNlKG5bdF1bMV0pO2lmKHRoaXMuaWdub3JlQXR0cmlidXRlc0ZuKGksZSkpY29udGludWU7bGV0IHM9blt0XVs0XSxvPXRoaXMub3B0aW9ucy5hdHRyaWJ1dGVOYW1lUHJlZml4K2k7aWYoaS5sZW5ndGgpaWYodGhpcy5vcHRpb25zLnRyYW5zZm9ybUF0dHJpYnV0ZU5hbWUmJihvPXRoaXMub3B0aW9ucy50cmFuc2Zvcm1BdHRyaWJ1dGVOYW1lKG8pKSxcIl9fcHJvdG9fX1wiPT09byYmKG89XCIjX19wcm90b19fXCIpLHZvaWQgMCE9PXMpe3RoaXMub3B0aW9ucy50cmltVmFsdWVzJiYocz1zLnRyaW0oKSkscz10aGlzLnJlcGxhY2VFbnRpdGllc1ZhbHVlKHMpO2NvbnN0IHQ9dGhpcy5vcHRpb25zLmF0dHJpYnV0ZVZhbHVlUHJvY2Vzc29yKGkscyxlKTtyW29dPW51bGw9PXQ/czp0eXBlb2YgdCE9dHlwZW9mIHN8fHQhPT1zP3Q6SChzLHRoaXMub3B0aW9ucy5wYXJzZUF0dHJpYnV0ZVZhbHVlLHRoaXMub3B0aW9ucy5udW1iZXJQYXJzZU9wdGlvbnMpfWVsc2UgdGhpcy5vcHRpb25zLmFsbG93Qm9vbGVhbkF0dHJpYnV0ZXMmJihyW29dPSEwKX1pZighT2JqZWN0LmtleXMocikubGVuZ3RoKXJldHVybjtpZih0aGlzLm9wdGlvbnMuYXR0cmlidXRlc0dyb3VwTmFtZSl7Y29uc3QgdD17fTtyZXR1cm4gdFt0aGlzLm9wdGlvbnMuYXR0cmlidXRlc0dyb3VwTmFtZV09cix0fXJldHVybiByfX1jb25zdCBYPWZ1bmN0aW9uKHQpe3Q9dC5yZXBsYWNlKC9cXHJcXG4/L2csXCJcXG5cIik7Y29uc3QgZT1uZXcgVChcIiF4bWxcIik7bGV0IG49ZSxpPVwiXCIscz1cIlwiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKWlmKFwiPFwiPT09dFtyXSlpZihcIi9cIj09PXRbcisxXSl7Y29uc3QgZT1XKHQsXCI+XCIscixcIkNsb3NpbmcgVGFnIGlzIG5vdCBjbG9zZWQuXCIpO2xldCBvPXQuc3Vic3RyaW5nKHIrMixlKS50cmltKCk7aWYodGhpcy5vcHRpb25zLnJlbW92ZU5TUHJlZml4KXtjb25zdCB0PW8uaW5kZXhPZihcIjpcIik7LTEhPT10JiYobz1vLnN1YnN0cih0KzEpKX10aGlzLm9wdGlvbnMudHJhbnNmb3JtVGFnTmFtZSYmKG89dGhpcy5vcHRpb25zLnRyYW5zZm9ybVRhZ05hbWUobykpLG4mJihpPXRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyhpLG4scykpO2NvbnN0IGE9cy5zdWJzdHJpbmcocy5sYXN0SW5kZXhPZihcIi5cIikrMSk7aWYobyYmLTEhPT10aGlzLm9wdGlvbnMudW5wYWlyZWRUYWdzLmluZGV4T2YobykpdGhyb3cgbmV3IEVycm9yKGBVbnBhaXJlZCB0YWcgY2FuIG5vdCBiZSB1c2VkIGFzIGNsb3NpbmcgdGFnOiA8LyR7b30+YCk7bGV0IGw9MDthJiYtMSE9PXRoaXMub3B0aW9ucy51bnBhaXJlZFRhZ3MuaW5kZXhPZihhKT8obD1zLmxhc3RJbmRleE9mKFwiLlwiLHMubGFzdEluZGV4T2YoXCIuXCIpLTEpLHRoaXMudGFnc05vZGVTdGFjay5wb3AoKSk6bD1zLmxhc3RJbmRleE9mKFwiLlwiKSxzPXMuc3Vic3RyaW5nKDAsbCksbj10aGlzLnRhZ3NOb2RlU3RhY2sucG9wKCksaT1cIlwiLHI9ZX1lbHNlIGlmKFwiP1wiPT09dFtyKzFdKXtsZXQgZT16KHQsciwhMSxcIj8+XCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcihcIlBpIFRhZyBpcyBub3QgY2xvc2VkLlwiKTtpZihpPXRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyhpLG4scyksdGhpcy5vcHRpb25zLmlnbm9yZURlY2xhcmF0aW9uJiZcIj94bWxcIj09PWUudGFnTmFtZXx8dGhpcy5vcHRpb25zLmlnbm9yZVBpVGFncyk7ZWxzZXtjb25zdCB0PW5ldyBUKGUudGFnTmFtZSk7dC5hZGQodGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSxcIlwiKSxlLnRhZ05hbWUhPT1lLnRhZ0V4cCYmZS5hdHRyRXhwUHJlc2VudCYmKHRbXCI6QFwiXT10aGlzLmJ1aWxkQXR0cmlidXRlc01hcChlLnRhZ0V4cCxzLGUudGFnTmFtZSkpLHRoaXMuYWRkQ2hpbGQobix0LHMscil9cj1lLmNsb3NlSW5kZXgrMX1lbHNlIGlmKFwiIS0tXCI9PT10LnN1YnN0cihyKzEsMykpe2NvbnN0IGU9Vyh0LFwiLS1cXHgzZVwiLHIrNCxcIkNvbW1lbnQgaXMgbm90IGNsb3NlZC5cIik7aWYodGhpcy5vcHRpb25zLmNvbW1lbnRQcm9wTmFtZSl7Y29uc3Qgbz10LnN1YnN0cmluZyhyKzQsZS0yKTtpPXRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyhpLG4scyksbi5hZGQodGhpcy5vcHRpb25zLmNvbW1lbnRQcm9wTmFtZSxbe1t0aGlzLm9wdGlvbnMudGV4dE5vZGVOYW1lXTpvfV0pfXI9ZX1lbHNlIGlmKFwiIURcIj09PXQuc3Vic3RyKHIrMSwyKSl7Y29uc3QgZT13KHQscik7dGhpcy5kb2NUeXBlRW50aXRpZXM9ZS5lbnRpdGllcyxyPWUuaX1lbHNlIGlmKFwiIVtcIj09PXQuc3Vic3RyKHIrMSwyKSl7Y29uc3QgZT1XKHQsXCJdXT5cIixyLFwiQ0RBVEEgaXMgbm90IGNsb3NlZC5cIiktMixvPXQuc3Vic3RyaW5nKHIrOSxlKTtpPXRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyhpLG4scyk7bGV0IGE9dGhpcy5wYXJzZVRleHREYXRhKG8sbi50YWduYW1lLHMsITAsITEsITAsITApO251bGw9PWEmJihhPVwiXCIpLHRoaXMub3B0aW9ucy5jZGF0YVByb3BOYW1lP24uYWRkKHRoaXMub3B0aW9ucy5jZGF0YVByb3BOYW1lLFt7W3RoaXMub3B0aW9ucy50ZXh0Tm9kZU5hbWVdOm99XSk6bi5hZGQodGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSxhKSxyPWUrMn1lbHNle2xldCBvPXoodCxyLHRoaXMub3B0aW9ucy5yZW1vdmVOU1ByZWZpeCksYT1vLnRhZ05hbWU7Y29uc3QgbD1vLnJhd1RhZ05hbWU7bGV0IHU9by50YWdFeHAsaD1vLmF0dHJFeHBQcmVzZW50LGQ9by5jbG9zZUluZGV4O3RoaXMub3B0aW9ucy50cmFuc2Zvcm1UYWdOYW1lJiYoYT10aGlzLm9wdGlvbnMudHJhbnNmb3JtVGFnTmFtZShhKSksbiYmaSYmXCIheG1sXCIhPT1uLnRhZ25hbWUmJihpPXRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyhpLG4scywhMSkpO2NvbnN0IGY9bjtmJiYtMSE9PXRoaXMub3B0aW9ucy51bnBhaXJlZFRhZ3MuaW5kZXhPZihmLnRhZ25hbWUpJiYobj10aGlzLnRhZ3NOb2RlU3RhY2sucG9wKCkscz1zLnN1YnN0cmluZygwLHMubGFzdEluZGV4T2YoXCIuXCIpKSksYSE9PWUudGFnbmFtZSYmKHMrPXM/XCIuXCIrYTphKTtjb25zdCBjPXI7aWYodGhpcy5pc0l0U3RvcE5vZGUodGhpcy5vcHRpb25zLnN0b3BOb2RlcyxzLGEpKXtsZXQgZT1cIlwiO2lmKHUubGVuZ3RoPjAmJnUubGFzdEluZGV4T2YoXCIvXCIpPT09dS5sZW5ndGgtMSlcIi9cIj09PWFbYS5sZW5ndGgtMV0/KGE9YS5zdWJzdHIoMCxhLmxlbmd0aC0xKSxzPXMuc3Vic3RyKDAscy5sZW5ndGgtMSksdT1hKTp1PXUuc3Vic3RyKDAsdS5sZW5ndGgtMSkscj1vLmNsb3NlSW5kZXg7ZWxzZSBpZigtMSE9PXRoaXMub3B0aW9ucy51bnBhaXJlZFRhZ3MuaW5kZXhPZihhKSlyPW8uY2xvc2VJbmRleDtlbHNle2NvbnN0IG49dGhpcy5yZWFkU3RvcE5vZGVEYXRhKHQsbCxkKzEpO2lmKCFuKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgJHtsfWApO3I9bi5pLGU9bi50YWdDb250ZW50fWNvbnN0IGk9bmV3IFQoYSk7YSE9PXUmJmgmJihpW1wiOkBcIl09dGhpcy5idWlsZEF0dHJpYnV0ZXNNYXAodSxzLGEpKSxlJiYoZT10aGlzLnBhcnNlVGV4dERhdGEoZSxhLHMsITAsaCwhMCwhMCkpLHM9cy5zdWJzdHIoMCxzLmxhc3RJbmRleE9mKFwiLlwiKSksaS5hZGQodGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSxlKSx0aGlzLmFkZENoaWxkKG4saSxzLGMpfWVsc2V7aWYodS5sZW5ndGg+MCYmdS5sYXN0SW5kZXhPZihcIi9cIik9PT11Lmxlbmd0aC0xKXtcIi9cIj09PWFbYS5sZW5ndGgtMV0/KGE9YS5zdWJzdHIoMCxhLmxlbmd0aC0xKSxzPXMuc3Vic3RyKDAscy5sZW5ndGgtMSksdT1hKTp1PXUuc3Vic3RyKDAsdS5sZW5ndGgtMSksdGhpcy5vcHRpb25zLnRyYW5zZm9ybVRhZ05hbWUmJihhPXRoaXMub3B0aW9ucy50cmFuc2Zvcm1UYWdOYW1lKGEpKTtjb25zdCB0PW5ldyBUKGEpO2EhPT11JiZoJiYodFtcIjpAXCJdPXRoaXMuYnVpbGRBdHRyaWJ1dGVzTWFwKHUscyxhKSksdGhpcy5hZGRDaGlsZChuLHQscyxjKSxzPXMuc3Vic3RyKDAscy5sYXN0SW5kZXhPZihcIi5cIikpfWVsc2V7Y29uc3QgdD1uZXcgVChhKTt0aGlzLnRhZ3NOb2RlU3RhY2sucHVzaChuKSxhIT09dSYmaCYmKHRbXCI6QFwiXT10aGlzLmJ1aWxkQXR0cmlidXRlc01hcCh1LHMsYSkpLHRoaXMuYWRkQ2hpbGQobix0LHMsYyksbj10fWk9XCJcIixyPWR9fWVsc2UgaSs9dFtyXTtyZXR1cm4gZS5jaGlsZH07ZnVuY3Rpb24gWSh0LGUsbixpKXt0aGlzLm9wdGlvbnMuY2FwdHVyZU1ldGFEYXRhfHwoaT12b2lkIDApO2NvbnN0IHM9dGhpcy5vcHRpb25zLnVwZGF0ZVRhZyhlLnRhZ25hbWUsbixlW1wiOkBcIl0pOyExPT09c3x8KFwic3RyaW5nXCI9PXR5cGVvZiBzPyhlLnRhZ25hbWU9cyx0LmFkZENoaWxkKGUsaSkpOnQuYWRkQ2hpbGQoZSxpKSl9Y29uc3QgUj1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMucHJvY2Vzc0VudGl0aWVzKXtmb3IobGV0IGUgaW4gdGhpcy5kb2NUeXBlRW50aXRpZXMpe2NvbnN0IG49dGhpcy5kb2NUeXBlRW50aXRpZXNbZV07dD10LnJlcGxhY2Uobi5yZWd4LG4udmFsKX1mb3IobGV0IGUgaW4gdGhpcy5sYXN0RW50aXRpZXMpe2NvbnN0IG49dGhpcy5sYXN0RW50aXRpZXNbZV07dD10LnJlcGxhY2Uobi5yZWdleCxuLnZhbCl9aWYodGhpcy5vcHRpb25zLmh0bWxFbnRpdGllcylmb3IobGV0IGUgaW4gdGhpcy5odG1sRW50aXRpZXMpe2NvbnN0IG49dGhpcy5odG1sRW50aXRpZXNbZV07dD10LnJlcGxhY2Uobi5yZWdleCxuLnZhbCl9dD10LnJlcGxhY2UodGhpcy5hbXBFbnRpdHkucmVnZXgsdGhpcy5hbXBFbnRpdHkudmFsKX1yZXR1cm4gdH07ZnVuY3Rpb24gcSh0LGUsbixpKXtyZXR1cm4gdCYmKHZvaWQgMD09PWkmJihpPTA9PT1lLmNoaWxkLmxlbmd0aCksdm9pZCAwIT09KHQ9dGhpcy5wYXJzZVRleHREYXRhKHQsZS50YWduYW1lLG4sITEsISFlW1wiOkBcIl0mJjAhPT1PYmplY3Qua2V5cyhlW1wiOkBcIl0pLmxlbmd0aCxpKSkmJlwiXCIhPT10JiZlLmFkZCh0aGlzLm9wdGlvbnMudGV4dE5vZGVOYW1lLHQpLHQ9XCJcIiksdH1mdW5jdGlvbiBaKHQsZSxuKXtjb25zdCBpPVwiKi5cIituO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IHM9dFtuXTtpZihpPT09c3x8ZT09PXMpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVyh0LGUsbixpKXtjb25zdCBzPXQuaW5kZXhPZihlLG4pO2lmKC0xPT09cyl0aHJvdyBuZXcgRXJyb3IoaSk7cmV0dXJuIHMrZS5sZW5ndGgtMX1mdW5jdGlvbiB6KHQsZSxuLGk9XCI+XCIpe2NvbnN0IHM9ZnVuY3Rpb24odCxlLG49XCI+XCIpe2xldCBpLHM9XCJcIjtmb3IobGV0IHI9ZTtyPHQubGVuZ3RoO3IrKyl7bGV0IGU9dFtyXTtpZihpKWU9PT1pJiYoaT1cIlwiKTtlbHNlIGlmKCdcIic9PT1lfHxcIidcIj09PWUpaT1lO2Vsc2UgaWYoZT09PW5bMF0pe2lmKCFuWzFdKXJldHVybntkYXRhOnMsaW5kZXg6cn07aWYodFtyKzFdPT09blsxXSlyZXR1cm57ZGF0YTpzLGluZGV4OnJ9fWVsc2VcIlxcdFwiPT09ZSYmKGU9XCIgXCIpO3MrPWV9fSh0LGUrMSxpKTtpZighcylyZXR1cm47bGV0IHI9cy5kYXRhO2NvbnN0IG89cy5pbmRleCxhPXIuc2VhcmNoKC9cXHMvKTtsZXQgbD1yLHU9ITA7LTEhPT1hJiYobD1yLnN1YnN0cmluZygwLGEpLHI9ci5zdWJzdHJpbmcoYSsxKS50cmltU3RhcnQoKSk7Y29uc3QgaD1sO2lmKG4pe2NvbnN0IHQ9bC5pbmRleE9mKFwiOlwiKTstMSE9PXQmJihsPWwuc3Vic3RyKHQrMSksdT1sIT09cy5kYXRhLnN1YnN0cih0KzEpKX1yZXR1cm57dGFnTmFtZTpsLHRhZ0V4cDpyLGNsb3NlSW5kZXg6byxhdHRyRXhwUHJlc2VudDp1LHJhd1RhZ05hbWU6aH19ZnVuY3Rpb24gSih0LGUsbil7Y29uc3QgaT1uO2xldCBzPTE7Zm9yKDtuPHQubGVuZ3RoO24rKylpZihcIjxcIj09PXRbbl0paWYoXCIvXCI9PT10W24rMV0pe2NvbnN0IHI9Vyh0LFwiPlwiLG4sYCR7ZX0gaXMgbm90IGNsb3NlZGApO2lmKHQuc3Vic3RyaW5nKG4rMixyKS50cmltKCk9PT1lJiYocy0tLDA9PT1zKSlyZXR1cm57dGFnQ29udGVudDp0LnN1YnN0cmluZyhpLG4pLGk6cn07bj1yfWVsc2UgaWYoXCI/XCI9PT10W24rMV0pbj1XKHQsXCI/PlwiLG4rMSxcIlN0b3BOb2RlIGlzIG5vdCBjbG9zZWQuXCIpO2Vsc2UgaWYoXCIhLS1cIj09PXQuc3Vic3RyKG4rMSwzKSluPVcodCxcIi0tXFx4M2VcIixuKzMsXCJTdG9wTm9kZSBpcyBub3QgY2xvc2VkLlwiKTtlbHNlIGlmKFwiIVtcIj09PXQuc3Vic3RyKG4rMSwyKSluPVcodCxcIl1dPlwiLG4sXCJTdG9wTm9kZSBpcyBub3QgY2xvc2VkLlwiKS0yO2Vsc2V7Y29uc3QgaT16KHQsbixcIj5cIik7aSYmKChpJiZpLnRhZ05hbWUpPT09ZSYmXCIvXCIhPT1pLnRhZ0V4cFtpLnRhZ0V4cC5sZW5ndGgtMV0mJnMrKyxuPWkuY2xvc2VJbmRleCl9fWZ1bmN0aW9uIEgodCxlLG4pe2lmKGUmJlwic3RyaW5nXCI9PXR5cGVvZiB0KXtjb25zdCBlPXQudHJpbSgpO3JldHVyblwidHJ1ZVwiPT09ZXx8XCJmYWxzZVwiIT09ZSYmZnVuY3Rpb24odCxlPXt9KXtpZihlPU9iamVjdC5hc3NpZ24oe30sVixlKSwhdHx8XCJzdHJpbmdcIiE9dHlwZW9mIHQpcmV0dXJuIHQ7bGV0IG49dC50cmltKCk7aWYodm9pZCAwIT09ZS5za2lwTGlrZSYmZS5za2lwTGlrZS50ZXN0KG4pKXJldHVybiB0O2lmKFwiMFwiPT09dClyZXR1cm4gMDtpZihlLmhleCYmai50ZXN0KG4pKXJldHVybiBmdW5jdGlvbih0KXtpZihwYXJzZUludClyZXR1cm4gcGFyc2VJbnQodCwxNik7aWYoTnVtYmVyLnBhcnNlSW50KXJldHVybiBOdW1iZXIucGFyc2VJbnQodCwxNik7aWYod2luZG93JiZ3aW5kb3cucGFyc2VJbnQpcmV0dXJuIHdpbmRvdy5wYXJzZUludCh0LDE2KTt0aHJvdyBuZXcgRXJyb3IoXCJwYXJzZUludCwgTnVtYmVyLnBhcnNlSW50LCB3aW5kb3cucGFyc2VJbnQgYXJlIG5vdCBzdXBwb3J0ZWRcIil9KG4pO2lmKC0xIT09bi5zZWFyY2goLy4rW2VFXS4rLykpcmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtpZighbi5lTm90YXRpb24pcmV0dXJuIHQ7Y29uc3QgaT1lLm1hdGNoKE0pO2lmKGkpe2xldCBzPWlbMV18fFwiXCI7Y29uc3Qgcj0tMT09PWlbM10uaW5kZXhPZihcImVcIik/XCJFXCI6XCJlXCIsbz1pWzJdLGE9cz90W28ubGVuZ3RoKzFdPT09cjp0W28ubGVuZ3RoXT09PXI7cmV0dXJuIG8ubGVuZ3RoPjEmJmE/dDoxIT09by5sZW5ndGh8fCFpWzNdLnN0YXJ0c1dpdGgoYC4ke3J9YCkmJmlbM11bMF0hPT1yP24ubGVhZGluZ1plcm9zJiYhYT8oZT0oaVsxXXx8XCJcIikraVszXSxOdW1iZXIoZSkpOnQ6TnVtYmVyKGUpfXJldHVybiB0fSh0LG4sZSk7e2NvbnN0IHM9RC5leGVjKG4pO2lmKHMpe2NvbnN0IHI9c1sxXXx8XCJcIixvPXNbMl07bGV0IGE9KGk9c1szXSkmJi0xIT09aS5pbmRleE9mKFwiLlwiKT8oXCIuXCI9PT0oaT1pLnJlcGxhY2UoLzArJC8sXCJcIikpP2k9XCIwXCI6XCIuXCI9PT1pWzBdP2k9XCIwXCIraTpcIi5cIj09PWlbaS5sZW5ndGgtMV0mJihpPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMSkpLGkpOmk7Y29uc3QgbD1yP1wiLlwiPT09dFtvLmxlbmd0aCsxXTpcIi5cIj09PXRbby5sZW5ndGhdO2lmKCFlLmxlYWRpbmdaZXJvcyYmKG8ubGVuZ3RoPjF8fDE9PT1vLmxlbmd0aCYmIWwpKXJldHVybiB0O3tjb25zdCBpPU51bWJlcihuKSxzPVN0cmluZyhpKTtpZigwPT09aXx8LTA9PT1pKXJldHVybiBpO2lmKC0xIT09cy5zZWFyY2goL1tlRV0vKSlyZXR1cm4gZS5lTm90YXRpb24/aTp0O2lmKC0xIT09bi5pbmRleE9mKFwiLlwiKSlyZXR1cm5cIjBcIj09PXN8fHM9PT1hfHxzPT09YCR7cn0ke2F9YD9pOnQ7bGV0IGw9bz9hOm47cmV0dXJuIG8/bD09PXN8fHIrbD09PXM/aTp0Omw9PT1zfHxsPT09citzP2k6dH19cmV0dXJuIHR9dmFyIGl9KHQsbil9cmV0dXJuIHZvaWQgMCE9PXQ/dDpcIlwifWNvbnN0IEs9VC5nZXRNZXRhRGF0YVN5bWJvbCgpO2Z1bmN0aW9uIFEodCxlKXtyZXR1cm4gdHQodCxlKX1mdW5jdGlvbiB0dCh0LGUsbil7bGV0IGk7Y29uc3Qgcz17fTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3Qgbz10W3JdLGE9ZXQobyk7bGV0IGw9XCJcIjtpZihsPXZvaWQgMD09PW4/YTpuK1wiLlwiK2EsYT09PWUudGV4dE5vZGVOYW1lKXZvaWQgMD09PWk/aT1vW2FdOmkrPVwiXCIrb1thXTtlbHNle2lmKHZvaWQgMD09PWEpY29udGludWU7aWYob1thXSl7bGV0IHQ9dHQob1thXSxlLGwpO2NvbnN0IG49aXQodCxlKTt2b2lkIDAhPT1vW0tdJiYodFtLXT1vW0tdKSxvW1wiOkBcIl0/bnQodCxvW1wiOkBcIl0sbCxlKToxIT09T2JqZWN0LmtleXModCkubGVuZ3RofHx2b2lkIDA9PT10W2UudGV4dE5vZGVOYW1lXXx8ZS5hbHdheXNDcmVhdGVUZXh0Tm9kZT8wPT09T2JqZWN0LmtleXModCkubGVuZ3RoJiYoZS5hbHdheXNDcmVhdGVUZXh0Tm9kZT90W2UudGV4dE5vZGVOYW1lXT1cIlwiOnQ9XCJcIik6dD10W2UudGV4dE5vZGVOYW1lXSx2b2lkIDAhPT1zW2FdJiZzLmhhc093blByb3BlcnR5KGEpPyhBcnJheS5pc0FycmF5KHNbYV0pfHwoc1thXT1bc1thXV0pLHNbYV0ucHVzaCh0KSk6ZS5pc0FycmF5KGEsbCxuKT9zW2FdPVt0XTpzW2FdPXR9fX1yZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgaT9pLmxlbmd0aD4wJiYoc1tlLnRleHROb2RlTmFtZV09aSk6dm9pZCAwIT09aSYmKHNbZS50ZXh0Tm9kZU5hbWVdPWkpLHN9ZnVuY3Rpb24gZXQodCl7Y29uc3QgZT1PYmplY3Qua2V5cyh0KTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdO2lmKFwiOkBcIiE9PW4pcmV0dXJuIG59fWZ1bmN0aW9uIG50KHQsZSxuLGkpe2lmKGUpe2NvbnN0IHM9T2JqZWN0LmtleXMoZSkscj1zLmxlbmd0aDtmb3IobGV0IG89MDtvPHI7bysrKXtjb25zdCByPXNbb107aS5pc0FycmF5KHIsbitcIi5cIityLCEwLCEwKT90W3JdPVtlW3JdXTp0W3JdPWVbcl19fX1mdW5jdGlvbiBpdCh0LGUpe2NvbnN0e3RleHROb2RlTmFtZTpufT1lLGk9T2JqZWN0LmtleXModCkubGVuZ3RoO3JldHVybiAwPT09aXx8ISgxIT09aXx8IXRbbl0mJlwiYm9vbGVhblwiIT10eXBlb2YgdFtuXSYmMCE9PXRbbl0pfWNsYXNzIHN0e2NvbnN0cnVjdG9yKHQpe3RoaXMuZXh0ZXJuYWxFbnRpdGllcz17fSx0aGlzLm9wdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sdix0KX0odCl9cGFyc2UodCxlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgdCk7ZWxzZXtpZighdC50b1N0cmluZyl0aHJvdyBuZXcgRXJyb3IoXCJYTUwgZGF0YSBpcyBhY2NlcHRlZCBpbiBTdHJpbmcgb3IgQnl0ZXNbXSBmb3JtLlwiKTt0PXQudG9TdHJpbmcoKX1pZihlKXshMD09PWUmJihlPXt9KTtjb25zdCBuPWEodCxlKTtpZighMCE9PW4pdGhyb3cgRXJyb3IoYCR7bi5lcnIubXNnfToke24uZXJyLmxpbmV9OiR7bi5lcnIuY29sfWApfWNvbnN0IG49bmV3IGsodGhpcy5vcHRpb25zKTtuLmFkZEV4dGVybmFsRW50aXRpZXModGhpcy5leHRlcm5hbEVudGl0aWVzKTtjb25zdCBpPW4ucGFyc2VYbWwodCk7cmV0dXJuIHRoaXMub3B0aW9ucy5wcmVzZXJ2ZU9yZGVyfHx2b2lkIDA9PT1pP2k6UShpLHRoaXMub3B0aW9ucyl9YWRkRW50aXR5KHQsZSl7aWYoLTEhPT1lLmluZGV4T2YoXCImXCIpKXRocm93IG5ldyBFcnJvcihcIkVudGl0eSB2YWx1ZSBjYW4ndCBoYXZlICcmJ1wiKTtpZigtMSE9PXQuaW5kZXhPZihcIiZcIil8fC0xIT09dC5pbmRleE9mKFwiO1wiKSl0aHJvdyBuZXcgRXJyb3IoXCJBbiBlbnRpdHkgbXVzdCBiZSBzZXQgd2l0aG91dCAnJicgYW5kICc7Jy4gRWcuIHVzZSAnI3hEJyBmb3IgJyYjeEQ7J1wiKTtpZihcIiZcIj09PWUpdGhyb3cgbmV3IEVycm9yKFwiQW4gZW50aXR5IHdpdGggdmFsdWUgJyYnIGlzIG5vdCBwZXJtaXR0ZWRcIik7dGhpcy5leHRlcm5hbEVudGl0aWVzW3RdPWV9c3RhdGljIGdldE1ldGFEYXRhU3ltYm9sKCl7cmV0dXJuIFQuZ2V0TWV0YURhdGFTeW1ib2woKX19ZnVuY3Rpb24gcnQodCxlKXtsZXQgbj1cIlwiO3JldHVybiBlLmZvcm1hdCYmZS5pbmRlbnRCeS5sZW5ndGg+MCYmKG49XCJcXG5cIiksb3QodCxlLFwiXCIsbil9ZnVuY3Rpb24gb3QodCxlLG4saSl7bGV0IHM9XCJcIixyPSExO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb10sbD1hdChhKTtpZih2b2lkIDA9PT1sKWNvbnRpbnVlO2xldCB1PVwiXCI7aWYodT0wPT09bi5sZW5ndGg/bDpgJHtufS4ke2x9YCxsPT09ZS50ZXh0Tm9kZU5hbWUpe2xldCB0PWFbbF07dXQodSxlKXx8KHQ9ZS50YWdWYWx1ZVByb2Nlc3NvcihsLHQpLHQ9aHQodCxlKSksciYmKHMrPWkpLHMrPXQscj0hMTtjb250aW51ZX1pZihsPT09ZS5jZGF0YVByb3BOYW1lKXtyJiYocys9aSkscys9YDwhW0NEQVRBWyR7YVtsXVswXVtlLnRleHROb2RlTmFtZV19XV0+YCxyPSExO2NvbnRpbnVlfWlmKGw9PT1lLmNvbW1lbnRQcm9wTmFtZSl7cys9aStgXFx4M2MhLS0ke2FbbF1bMF1bZS50ZXh0Tm9kZU5hbWVdfS0tXFx4M2VgLHI9ITA7Y29udGludWV9aWYoXCI/XCI9PT1sWzBdKXtjb25zdCB0PWx0KGFbXCI6QFwiXSxlKSxuPVwiP3htbFwiPT09bD9cIlwiOmk7bGV0IG89YVtsXVswXVtlLnRleHROb2RlTmFtZV07bz0wIT09by5sZW5ndGg/XCIgXCIrbzpcIlwiLHMrPW4rYDwke2x9JHtvfSR7dH0/PmAscj0hMDtjb250aW51ZX1sZXQgaD1pO1wiXCIhPT1oJiYoaCs9ZS5pbmRlbnRCeSk7Y29uc3QgZD1pK2A8JHtsfSR7bHQoYVtcIjpAXCJdLGUpfWAsZj1vdChhW2xdLGUsdSxoKTstMSE9PWUudW5wYWlyZWRUYWdzLmluZGV4T2YobCk/ZS5zdXBwcmVzc1VucGFpcmVkTm9kZT9zKz1kK1wiPlwiOnMrPWQrXCIvPlwiOmYmJjAhPT1mLmxlbmd0aHx8IWUuc3VwcHJlc3NFbXB0eU5vZGU/ZiYmZi5lbmRzV2l0aChcIj5cIik/cys9ZCtgPiR7Zn0ke2l9PC8ke2x9PmA6KHMrPWQrXCI+XCIsZiYmXCJcIiE9PWkmJihmLmluY2x1ZGVzKFwiLz5cIil8fGYuaW5jbHVkZXMoXCI8L1wiKSk/cys9aStlLmluZGVudEJ5K2YraTpzKz1mLHMrPWA8LyR7bH0+YCk6cys9ZCtcIi8+XCIscj0hMH1yZXR1cm4gc31mdW5jdGlvbiBhdCh0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCBpPWVbbl07aWYodC5oYXNPd25Qcm9wZXJ0eShpKSYmXCI6QFwiIT09aSlyZXR1cm4gaX19ZnVuY3Rpb24gbHQodCxlKXtsZXQgbj1cIlwiO2lmKHQmJiFlLmlnbm9yZUF0dHJpYnV0ZXMpZm9yKGxldCBpIGluIHQpe2lmKCF0Lmhhc093blByb3BlcnR5KGkpKWNvbnRpbnVlO2xldCBzPWUuYXR0cmlidXRlVmFsdWVQcm9jZXNzb3IoaSx0W2ldKTtzPWh0KHMsZSksITA9PT1zJiZlLnN1cHByZXNzQm9vbGVhbkF0dHJpYnV0ZXM/bis9YCAke2kuc3Vic3RyKGUuYXR0cmlidXRlTmFtZVByZWZpeC5sZW5ndGgpfWA6bis9YCAke2kuc3Vic3RyKGUuYXR0cmlidXRlTmFtZVByZWZpeC5sZW5ndGgpfT1cIiR7c31cImB9cmV0dXJuIG59ZnVuY3Rpb24gdXQodCxlKXtsZXQgbj0odD10LnN1YnN0cigwLHQubGVuZ3RoLWUudGV4dE5vZGVOYW1lLmxlbmd0aC0xKSkuc3Vic3RyKHQubGFzdEluZGV4T2YoXCIuXCIpKzEpO2ZvcihsZXQgaSBpbiBlLnN0b3BOb2RlcylpZihlLnN0b3BOb2Rlc1tpXT09PXR8fGUuc3RvcE5vZGVzW2ldPT09XCIqLlwiK24pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gaHQodCxlKXtpZih0JiZ0Lmxlbmd0aD4wJiZlLnByb2Nlc3NFbnRpdGllcylmb3IobGV0IG49MDtuPGUuZW50aXRpZXMubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmVudGl0aWVzW25dO3Q9dC5yZXBsYWNlKGkucmVnZXgsaS52YWwpfXJldHVybiB0fWNvbnN0IGR0PXthdHRyaWJ1dGVOYW1lUHJlZml4OlwiQF9cIixhdHRyaWJ1dGVzR3JvdXBOYW1lOiExLHRleHROb2RlTmFtZTpcIiN0ZXh0XCIsaWdub3JlQXR0cmlidXRlczohMCxjZGF0YVByb3BOYW1lOiExLGZvcm1hdDohMSxpbmRlbnRCeTpcIiAgXCIsc3VwcHJlc3NFbXB0eU5vZGU6ITEsc3VwcHJlc3NVbnBhaXJlZE5vZGU6ITAsc3VwcHJlc3NCb29sZWFuQXR0cmlidXRlczohMCx0YWdWYWx1ZVByb2Nlc3NvcjpmdW5jdGlvbih0LGUpe3JldHVybiBlfSxhdHRyaWJ1dGVWYWx1ZVByb2Nlc3NvcjpmdW5jdGlvbih0LGUpe3JldHVybiBlfSxwcmVzZXJ2ZU9yZGVyOiExLGNvbW1lbnRQcm9wTmFtZTohMSx1bnBhaXJlZFRhZ3M6W10sZW50aXRpZXM6W3tyZWdleDpuZXcgUmVnRXhwKFwiJlwiLFwiZ1wiKSx2YWw6XCImYW1wO1wifSx7cmVnZXg6bmV3IFJlZ0V4cChcIj5cIixcImdcIiksdmFsOlwiJmd0O1wifSx7cmVnZXg6bmV3IFJlZ0V4cChcIjxcIixcImdcIiksdmFsOlwiJmx0O1wifSx7cmVnZXg6bmV3IFJlZ0V4cChcIidcIixcImdcIiksdmFsOlwiJmFwb3M7XCJ9LHtyZWdleDpuZXcgUmVnRXhwKCdcIicsXCJnXCIpLHZhbDpcIiZxdW90O1wifV0scHJvY2Vzc0VudGl0aWVzOiEwLHN0b3BOb2RlczpbXSxvbmVMaXN0R3JvdXA6ITF9O2Z1bmN0aW9uIGZ0KHQpe3RoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGR0LHQpLCEwPT09dGhpcy5vcHRpb25zLmlnbm9yZUF0dHJpYnV0ZXN8fHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzR3JvdXBOYW1lP3RoaXMuaXNBdHRyaWJ1dGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX06KHRoaXMuaWdub3JlQXR0cmlidXRlc0ZuPV8odGhpcy5vcHRpb25zLmlnbm9yZUF0dHJpYnV0ZXMpLHRoaXMuYXR0clByZWZpeExlbj10aGlzLm9wdGlvbnMuYXR0cmlidXRlTmFtZVByZWZpeC5sZW5ndGgsdGhpcy5pc0F0dHJpYnV0ZT1ndCksdGhpcy5wcm9jZXNzVGV4dE9yT2JqTm9kZT1jdCx0aGlzLm9wdGlvbnMuZm9ybWF0Pyh0aGlzLmluZGVudGF0ZT1wdCx0aGlzLnRhZ0VuZENoYXI9XCI+XFxuXCIsdGhpcy5uZXdMaW5lPVwiXFxuXCIpOih0aGlzLmluZGVudGF0ZT1mdW5jdGlvbigpe3JldHVyblwiXCJ9LHRoaXMudGFnRW5kQ2hhcj1cIj5cIix0aGlzLm5ld0xpbmU9XCJcIil9ZnVuY3Rpb24gY3QodCxlLG4saSl7Y29uc3Qgcz10aGlzLmoyeCh0LG4rMSxpLmNvbmNhdChlKSk7cmV0dXJuIHZvaWQgMCE9PXRbdGhpcy5vcHRpb25zLnRleHROb2RlTmFtZV0mJjE9PT1PYmplY3Qua2V5cyh0KS5sZW5ndGg/dGhpcy5idWlsZFRleHRWYWxOb2RlKHRbdGhpcy5vcHRpb25zLnRleHROb2RlTmFtZV0sZSxzLmF0dHJTdHIsbik6dGhpcy5idWlsZE9iamVjdE5vZGUocy52YWwsZSxzLmF0dHJTdHIsbil9ZnVuY3Rpb24gcHQodCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pbmRlbnRCeS5yZXBlYXQodCl9ZnVuY3Rpb24gZ3QodCl7cmV0dXJuISghdC5zdGFydHNXaXRoKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVOYW1lUHJlZml4KXx8dD09PXRoaXMub3B0aW9ucy50ZXh0Tm9kZU5hbWUpJiZ0LnN1YnN0cih0aGlzLmF0dHJQcmVmaXhMZW4pfWZ0LnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5vcHRpb25zLnByZXNlcnZlT3JkZXI/cnQodCx0aGlzLm9wdGlvbnMpOihBcnJheS5pc0FycmF5KHQpJiZ0aGlzLm9wdGlvbnMuYXJyYXlOb2RlTmFtZSYmdGhpcy5vcHRpb25zLmFycmF5Tm9kZU5hbWUubGVuZ3RoPjEmJih0PXtbdGhpcy5vcHRpb25zLmFycmF5Tm9kZU5hbWVdOnR9KSx0aGlzLmoyeCh0LDAsW10pLnZhbCl9LGZ0LnByb3RvdHlwZS5qMng9ZnVuY3Rpb24odCxlLG4pe2xldCBpPVwiXCIscz1cIlwiO2NvbnN0IHI9bi5qb2luKFwiLlwiKTtmb3IobGV0IG8gaW4gdClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSlpZih2b2lkIDA9PT10W29dKXRoaXMuaXNBdHRyaWJ1dGUobykmJihzKz1cIlwiKTtlbHNlIGlmKG51bGw9PT10W29dKXRoaXMuaXNBdHRyaWJ1dGUobyl8fG89PT10aGlzLm9wdGlvbnMuY2RhdGFQcm9wTmFtZT9zKz1cIlwiOlwiP1wiPT09b1swXT9zKz10aGlzLmluZGVudGF0ZShlKStcIjxcIitvK1wiP1wiK3RoaXMudGFnRW5kQ2hhcjpzKz10aGlzLmluZGVudGF0ZShlKStcIjxcIitvK1wiL1wiK3RoaXMudGFnRW5kQ2hhcjtlbHNlIGlmKHRbb11pbnN0YW5jZW9mIERhdGUpcys9dGhpcy5idWlsZFRleHRWYWxOb2RlKHRbb10sbyxcIlwiLGUpO2Vsc2UgaWYoXCJvYmplY3RcIiE9dHlwZW9mIHRbb10pe2NvbnN0IG49dGhpcy5pc0F0dHJpYnV0ZShvKTtpZihuJiYhdGhpcy5pZ25vcmVBdHRyaWJ1dGVzRm4obixyKSlpKz10aGlzLmJ1aWxkQXR0clBhaXJTdHIobixcIlwiK3Rbb10pO2Vsc2UgaWYoIW4paWYobz09PXRoaXMub3B0aW9ucy50ZXh0Tm9kZU5hbWUpe2xldCBlPXRoaXMub3B0aW9ucy50YWdWYWx1ZVByb2Nlc3NvcihvLFwiXCIrdFtvXSk7cys9dGhpcy5yZXBsYWNlRW50aXRpZXNWYWx1ZShlKX1lbHNlIHMrPXRoaXMuYnVpbGRUZXh0VmFsTm9kZSh0W29dLG8sXCJcIixlKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkodFtvXSkpe2NvbnN0IGk9dFtvXS5sZW5ndGg7bGV0IHI9XCJcIixhPVwiXCI7Zm9yKGxldCBsPTA7bDxpO2wrKyl7Y29uc3QgaT10W29dW2xdO2lmKHZvaWQgMD09PWkpO2Vsc2UgaWYobnVsbD09PWkpXCI/XCI9PT1vWzBdP3MrPXRoaXMuaW5kZW50YXRlKGUpK1wiPFwiK28rXCI/XCIrdGhpcy50YWdFbmRDaGFyOnMrPXRoaXMuaW5kZW50YXRlKGUpK1wiPFwiK28rXCIvXCIrdGhpcy50YWdFbmRDaGFyO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGkpaWYodGhpcy5vcHRpb25zLm9uZUxpc3RHcm91cCl7Y29uc3QgdD10aGlzLmoyeChpLGUrMSxuLmNvbmNhdChvKSk7cis9dC52YWwsdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXNHcm91cE5hbWUmJmkuaGFzT3duUHJvcGVydHkodGhpcy5vcHRpb25zLmF0dHJpYnV0ZXNHcm91cE5hbWUpJiYoYSs9dC5hdHRyU3RyKX1lbHNlIHIrPXRoaXMucHJvY2Vzc1RleHRPck9iak5vZGUoaSxvLGUsbik7ZWxzZSBpZih0aGlzLm9wdGlvbnMub25lTGlzdEdyb3VwKXtsZXQgdD10aGlzLm9wdGlvbnMudGFnVmFsdWVQcm9jZXNzb3IobyxpKTt0PXRoaXMucmVwbGFjZUVudGl0aWVzVmFsdWUodCkscis9dH1lbHNlIHIrPXRoaXMuYnVpbGRUZXh0VmFsTm9kZShpLG8sXCJcIixlKX10aGlzLm9wdGlvbnMub25lTGlzdEdyb3VwJiYocj10aGlzLmJ1aWxkT2JqZWN0Tm9kZShyLG8sYSxlKSkscys9cn1lbHNlIGlmKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzR3JvdXBOYW1lJiZvPT09dGhpcy5vcHRpb25zLmF0dHJpYnV0ZXNHcm91cE5hbWUpe2NvbnN0IGU9T2JqZWN0LmtleXModFtvXSksbj1lLmxlbmd0aDtmb3IobGV0IHM9MDtzPG47cysrKWkrPXRoaXMuYnVpbGRBdHRyUGFpclN0cihlW3NdLFwiXCIrdFtvXVtlW3NdXSl9ZWxzZSBzKz10aGlzLnByb2Nlc3NUZXh0T3JPYmpOb2RlKHRbb10sbyxlLG4pO3JldHVybnthdHRyU3RyOmksdmFsOnN9fSxmdC5wcm90b3R5cGUuYnVpbGRBdHRyUGFpclN0cj1mdW5jdGlvbih0LGUpe3JldHVybiBlPXRoaXMub3B0aW9ucy5hdHRyaWJ1dGVWYWx1ZVByb2Nlc3Nvcih0LFwiXCIrZSksZT10aGlzLnJlcGxhY2VFbnRpdGllc1ZhbHVlKGUpLHRoaXMub3B0aW9ucy5zdXBwcmVzc0Jvb2xlYW5BdHRyaWJ1dGVzJiZcInRydWVcIj09PWU/XCIgXCIrdDpcIiBcIit0Kyc9XCInK2UrJ1wiJ30sZnQucHJvdG90eXBlLmJ1aWxkT2JqZWN0Tm9kZT1mdW5jdGlvbih0LGUsbixpKXtpZihcIlwiPT09dClyZXR1cm5cIj9cIj09PWVbMF0/dGhpcy5pbmRlbnRhdGUoaSkrXCI8XCIrZStuK1wiP1wiK3RoaXMudGFnRW5kQ2hhcjp0aGlzLmluZGVudGF0ZShpKStcIjxcIitlK24rdGhpcy5jbG9zZVRhZyhlKSt0aGlzLnRhZ0VuZENoYXI7e2xldCBzPVwiPC9cIitlK3RoaXMudGFnRW5kQ2hhcixyPVwiXCI7cmV0dXJuXCI/XCI9PT1lWzBdJiYocj1cIj9cIixzPVwiXCIpLCFuJiZcIlwiIT09bnx8LTEhPT10LmluZGV4T2YoXCI8XCIpPyExIT09dGhpcy5vcHRpb25zLmNvbW1lbnRQcm9wTmFtZSYmZT09PXRoaXMub3B0aW9ucy5jb21tZW50UHJvcE5hbWUmJjA9PT1yLmxlbmd0aD90aGlzLmluZGVudGF0ZShpKStgXFx4M2MhLS0ke3R9LS1cXHgzZWArdGhpcy5uZXdMaW5lOnRoaXMuaW5kZW50YXRlKGkpK1wiPFwiK2UrbityK3RoaXMudGFnRW5kQ2hhcit0K3RoaXMuaW5kZW50YXRlKGkpK3M6dGhpcy5pbmRlbnRhdGUoaSkrXCI8XCIrZStuK3IrXCI+XCIrdCtzfX0sZnQucHJvdG90eXBlLmNsb3NlVGFnPWZ1bmN0aW9uKHQpe2xldCBlPVwiXCI7cmV0dXJuLTEhPT10aGlzLm9wdGlvbnMudW5wYWlyZWRUYWdzLmluZGV4T2YodCk/dGhpcy5vcHRpb25zLnN1cHByZXNzVW5wYWlyZWROb2RlfHwoZT1cIi9cIik6ZT10aGlzLm9wdGlvbnMuc3VwcHJlc3NFbXB0eU5vZGU/XCIvXCI6YD48LyR7dH1gLGV9LGZ0LnByb3RvdHlwZS5idWlsZFRleHRWYWxOb2RlPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKCExIT09dGhpcy5vcHRpb25zLmNkYXRhUHJvcE5hbWUmJmU9PT10aGlzLm9wdGlvbnMuY2RhdGFQcm9wTmFtZSlyZXR1cm4gdGhpcy5pbmRlbnRhdGUoaSkrYDwhW0NEQVRBWyR7dH1dXT5gK3RoaXMubmV3TGluZTtpZighMSE9PXRoaXMub3B0aW9ucy5jb21tZW50UHJvcE5hbWUmJmU9PT10aGlzLm9wdGlvbnMuY29tbWVudFByb3BOYW1lKXJldHVybiB0aGlzLmluZGVudGF0ZShpKStgXFx4M2MhLS0ke3R9LS1cXHgzZWArdGhpcy5uZXdMaW5lO2lmKFwiP1wiPT09ZVswXSlyZXR1cm4gdGhpcy5pbmRlbnRhdGUoaSkrXCI8XCIrZStuK1wiP1wiK3RoaXMudGFnRW5kQ2hhcjt7bGV0IHM9dGhpcy5vcHRpb25zLnRhZ1ZhbHVlUHJvY2Vzc29yKGUsdCk7cmV0dXJuIHM9dGhpcy5yZXBsYWNlRW50aXRpZXNWYWx1ZShzKSxcIlwiPT09cz90aGlzLmluZGVudGF0ZShpKStcIjxcIitlK24rdGhpcy5jbG9zZVRhZyhlKSt0aGlzLnRhZ0VuZENoYXI6dGhpcy5pbmRlbnRhdGUoaSkrXCI8XCIrZStuK1wiPlwiK3MrXCI8L1wiK2UrdGhpcy50YWdFbmRDaGFyfX0sZnQucHJvdG90eXBlLnJlcGxhY2VFbnRpdGllc1ZhbHVlPWZ1bmN0aW9uKHQpe2lmKHQmJnQubGVuZ3RoPjAmJnRoaXMub3B0aW9ucy5wcm9jZXNzRW50aXRpZXMpZm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMuZW50aXRpZXMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLm9wdGlvbnMuZW50aXRpZXNbZV07dD10LnJlcGxhY2Uobi5yZWdleCxuLnZhbCl9cmV0dXJuIHR9O2NvbnN0IG10PXt2YWxpZGF0ZTphfTttb2R1bGUuZXhwb3J0cz1lfSkoKTsiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVhNTCA9IHBhcnNlWE1MO1xuY29uc3QgZmFzdF94bWxfcGFyc2VyXzEgPSByZXF1aXJlKFwiZmFzdC14bWwtcGFyc2VyXCIpO1xuY29uc3QgcGFyc2VyID0gbmV3IGZhc3RfeG1sX3BhcnNlcl8xLlhNTFBhcnNlcih7XG4gICAgYXR0cmlidXRlTmFtZVByZWZpeDogXCJcIixcbiAgICBodG1sRW50aXRpZXM6IHRydWUsXG4gICAgaWdub3JlQXR0cmlidXRlczogZmFsc2UsXG4gICAgaWdub3JlRGVjbGFyYXRpb246IHRydWUsXG4gICAgcGFyc2VUYWdWYWx1ZTogZmFsc2UsXG4gICAgdHJpbVZhbHVlczogZmFsc2UsXG4gICAgdGFnVmFsdWVQcm9jZXNzb3I6IChfLCB2YWwpID0+ICh2YWwudHJpbSgpID09PSBcIlwiICYmIHZhbC5pbmNsdWRlcyhcIlxcblwiKSA/IFwiXCIgOiB1bmRlZmluZWQpLFxufSk7XG5wYXJzZXIuYWRkRW50aXR5KFwiI3hEXCIsIFwiXFxyXCIpO1xucGFyc2VyLmFkZEVudGl0eShcIiMxMFwiLCBcIlxcblwiKTtcbmZ1bmN0aW9uIHBhcnNlWE1MKHhtbFN0cmluZykge1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UoeG1sU3RyaW5nLCB0cnVlKTtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgeG1sUGFyc2VyID0gcmVxdWlyZSgnLi94bWwtcGFyc2VyJyk7XG5cbmZ1bmN0aW9uIGVzY2FwZUF0dHJpYnV0ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvPi9nLCBcIiZndDtcIikucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIik7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUVsZW1lbnQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuICAgICAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAgICAgLnJlcGxhY2UoLycvZywgXCImYXBvcztcIilcbiAgICAgICAgLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG4gICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csIFwiJiN4MEQ7XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCImI3gwQTtcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdTAwODUvZywgXCImI3g4NTtcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdTIwMjgvLCBcIiYjeDIwMjg7XCIpO1xufVxuXG5jbGFzcyBYbWxUZXh0IHtcbiAgICB2YWx1ZTtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gZXNjYXBlRWxlbWVudChcIlwiICsgdGhpcy52YWx1ZSk7XG4gICAgfVxufVxuXG5jbGFzcyBYbWxOb2RlIHtcbiAgICBuYW1lO1xuICAgIGNoaWxkcmVuO1xuICAgIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICBzdGF0aWMgb2YobmFtZSwgY2hpbGRUZXh0LCB3aXRoTmFtZSkge1xuICAgICAgICBjb25zdCBub2RlID0gbmV3IFhtbE5vZGUobmFtZSk7XG4gICAgICAgIGlmIChjaGlsZFRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZE5vZGUobmV3IFhtbFRleHQoY2hpbGRUZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpdGhOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vZGUud2l0aE5hbWUod2l0aE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBjaGlsZHJlbiA9IFtdKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgd2l0aE5hbWUobmFtZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkQ2hpbGROb2RlKGNoaWxkKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZW1vdmVBdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbihuYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBjKGNoaWxkKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBhKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2MoaW5wdXQsIGZpZWxkLCB3aXRoTmFtZSA9IGZpZWxkKSB7XG4gICAgICAgIGlmIChpbnB1dFtmaWVsZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IFhtbE5vZGUub2YoZmllbGQsIGlucHV0W2ZpZWxkXSkud2l0aE5hbWUod2l0aE5hbWUpO1xuICAgICAgICAgICAgdGhpcy5jKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGwoaW5wdXQsIGxpc3ROYW1lLCBtZW1iZXJOYW1lLCB2YWx1ZVByb3ZpZGVyKSB7XG4gICAgICAgIGlmIChpbnB1dFtsaXN0TmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSB2YWx1ZVByb3ZpZGVyKCk7XG4gICAgICAgICAgICBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBub2RlLndpdGhOYW1lKG1lbWJlck5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYyhub2RlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxjKGlucHV0LCBsaXN0TmFtZSwgbWVtYmVyTmFtZSwgdmFsdWVQcm92aWRlcikge1xuICAgICAgICBpZiAoaW5wdXRbbGlzdE5hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gdmFsdWVQcm92aWRlcigpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTm9kZSA9IG5ldyBYbWxOb2RlKG1lbWJlck5hbWUpO1xuICAgICAgICAgICAgbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5jKG5vZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmMoY29udGFpbmVyTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIGxldCB4bWxUZXh0ID0gYDwke3RoaXMubmFtZX1gO1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB4bWxUZXh0ICs9IGAgJHthdHRyaWJ1dGVOYW1lfT1cIiR7ZXNjYXBlQXR0cmlidXRlKFwiXCIgKyBhdHRyaWJ1dGUpfVwiYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHhtbFRleHQgKz0gIWhhc0NoaWxkcmVuID8gXCIvPlwiIDogYD4ke3RoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiBjLnRvU3RyaW5nKCkpLmpvaW4oXCJcIil9PC8ke3RoaXMubmFtZX0+YCk7XG4gICAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXJzZVhNTFwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHhtbFBhcnNlci5wYXJzZVhNTDsgfVxufSk7XG5leHBvcnRzLlhtbE5vZGUgPSBYbWxOb2RlO1xuZXhwb3J0cy5YbWxUZXh0ID0gWG1sVGV4dDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJvdG9jb2xIdHRwID0gcmVxdWlyZSgnQHNtaXRoeS9wcm90b2NvbC1odHRwJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZScpO1xudmFyIHByb3BlcnR5UHJvdmlkZXIgPSByZXF1aXJlKCdAc21pdGh5L3Byb3BlcnR5LXByb3ZpZGVyJyk7XG52YXIgY2xpZW50ID0gcmVxdWlyZSgnQGF3cy1zZGsvY29yZS9jbGllbnQnKTtcbnZhciBzaWduYXR1cmVWNCA9IHJlcXVpcmUoJ0BzbWl0aHkvc2lnbmF0dXJlLXY0Jyk7XG52YXIgY2JvciA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZS9jYm9yJyk7XG52YXIgc2NoZW1hID0gcmVxdWlyZSgnQHNtaXRoeS9jb3JlL3NjaGVtYScpO1xudmFyIHNtaXRoeUNsaWVudCA9IHJlcXVpcmUoJ0BzbWl0aHkvc21pdGh5LWNsaWVudCcpO1xudmFyIHByb3RvY29scyA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZS9wcm90b2NvbHMnKTtcbnZhciBzZXJkZSA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZS9zZXJkZScpO1xudmFyIHV0aWxCYXNlNjQgPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtYmFzZTY0Jyk7XG52YXIgdXRpbFV0ZjggPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtdXRmOCcpO1xudmFyIHhtbEJ1aWxkZXIgPSByZXF1aXJlKCdAYXdzLXNkay94bWwtYnVpbGRlcicpO1xuXG5jb25zdCBzdGF0ZSA9IHtcbiAgICB3YXJuaW5nRW1pdHRlZDogZmFsc2UsXG59O1xuY29uc3QgZW1pdFdhcm5pbmdJZlVuc3VwcG9ydGVkVmVyc2lvbiA9ICh2ZXJzaW9uKSA9PiB7XG4gICAgaWYgKHZlcnNpb24gJiYgIXN0YXRlLndhcm5pbmdFbWl0dGVkICYmIHBhcnNlSW50KHZlcnNpb24uc3Vic3RyaW5nKDEsIHZlcnNpb24uaW5kZXhPZihcIi5cIikpKSA8IDE4KSB7XG4gICAgICAgIHN0YXRlLndhcm5pbmdFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhgTm9kZURlcHJlY2F0aW9uV2FybmluZzogVGhlIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYzKSB3aWxsXG5ubyBsb25nZXIgc3VwcG9ydCBOb2RlLmpzIDE2Lnggb24gSmFudWFyeSA2LCAyMDI1LlxuXG5UbyBjb250aW51ZSByZWNlaXZpbmcgdXBkYXRlcyB0byBBV1Mgc2VydmljZXMsIGJ1ZyBmaXhlcywgYW5kIHNlY3VyaXR5XG51cGRhdGVzIHBsZWFzZSB1cGdyYWRlIHRvIGEgc3VwcG9ydGVkIE5vZGUuanMgTFRTIHZlcnNpb24uXG5cbk1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0OiBodHRwczovL2EuY28vNzRrSk1tSWApO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHNldENyZWRlbnRpYWxGZWF0dXJlKGNyZWRlbnRpYWxzLCBmZWF0dXJlLCB2YWx1ZSkge1xuICAgIGlmICghY3JlZGVudGlhbHMuJHNvdXJjZSkge1xuICAgICAgICBjcmVkZW50aWFscy4kc291cmNlID0ge307XG4gICAgfVxuICAgIGNyZWRlbnRpYWxzLiRzb3VyY2VbZmVhdHVyZV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gY3JlZGVudGlhbHM7XG59XG5cbmZ1bmN0aW9uIHNldEZlYXR1cmUoY29udGV4dCwgZmVhdHVyZSwgdmFsdWUpIHtcbiAgICBpZiAoIWNvbnRleHQuX19hd3Nfc2RrX2NvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5fX2F3c19zZGtfY29udGV4dCA9IHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiB7fSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWNvbnRleHQuX19hd3Nfc2RrX2NvbnRleHQuZmVhdHVyZXMpIHtcbiAgICAgICAgY29udGV4dC5fX2F3c19zZGtfY29udGV4dC5mZWF0dXJlcyA9IHt9O1xuICAgIH1cbiAgICBjb250ZXh0Ll9fYXdzX3Nka19jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHNldFRva2VuRmVhdHVyZSh0b2tlbiwgZmVhdHVyZSwgdmFsdWUpIHtcbiAgICBpZiAoIXRva2VuLiRzb3VyY2UpIHtcbiAgICAgICAgdG9rZW4uJHNvdXJjZSA9IHt9O1xuICAgIH1cbiAgICB0b2tlbi4kc291cmNlW2ZlYXR1cmVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHRva2VuO1xufVxuXG5jb25zdCBnZXREYXRlSGVhZGVyID0gKHJlc3BvbnNlKSA9PiBwcm90b2NvbEh0dHAuSHR0cFJlc3BvbnNlLmlzSW5zdGFuY2UocmVzcG9uc2UpID8gcmVzcG9uc2UuaGVhZGVycz8uZGF0ZSA/PyByZXNwb25zZS5oZWFkZXJzPy5EYXRlIDogdW5kZWZpbmVkO1xuXG5jb25zdCBnZXRTa2V3Q29ycmVjdGVkRGF0ZSA9IChzeXN0ZW1DbG9ja09mZnNldCkgPT4gbmV3IERhdGUoRGF0ZS5ub3coKSArIHN5c3RlbUNsb2NrT2Zmc2V0KTtcblxuY29uc3QgaXNDbG9ja1NrZXdlZCA9IChjbG9ja1RpbWUsIHN5c3RlbUNsb2NrT2Zmc2V0KSA9PiBNYXRoLmFicyhnZXRTa2V3Q29ycmVjdGVkRGF0ZShzeXN0ZW1DbG9ja09mZnNldCkuZ2V0VGltZSgpIC0gY2xvY2tUaW1lKSA+PSAzMDAwMDA7XG5cbmNvbnN0IGdldFVwZGF0ZWRTeXN0ZW1DbG9ja09mZnNldCA9IChjbG9ja1RpbWUsIGN1cnJlbnRTeXN0ZW1DbG9ja09mZnNldCkgPT4ge1xuICAgIGNvbnN0IGNsb2NrVGltZUluTXMgPSBEYXRlLnBhcnNlKGNsb2NrVGltZSk7XG4gICAgaWYgKGlzQ2xvY2tTa2V3ZWQoY2xvY2tUaW1lSW5NcywgY3VycmVudFN5c3RlbUNsb2NrT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gY2xvY2tUaW1lSW5NcyAtIERhdGUubm93KCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3lzdGVtQ2xvY2tPZmZzZXQ7XG59O1xuXG5jb25zdCB0aHJvd1NpZ25pbmdQcm9wZXJ0eUVycm9yID0gKG5hbWUsIHByb3BlcnR5KSA9PiB7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFxcYCR7bmFtZX1cXGAgaXMgbm90IHJlc29sdmVkIGZvciBBV1MgU0RLIFNpZ1Y0QXV0aGApO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydHk7XG59O1xuY29uc3QgdmFsaWRhdGVTaWduaW5nUHJvcGVydGllcyA9IGFzeW5jIChzaWduaW5nUHJvcGVydGllcykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aHJvd1NpZ25pbmdQcm9wZXJ0eUVycm9yKFwiY29udGV4dFwiLCBzaWduaW5nUHJvcGVydGllcy5jb250ZXh0KTtcbiAgICBjb25zdCBjb25maWcgPSB0aHJvd1NpZ25pbmdQcm9wZXJ0eUVycm9yKFwiY29uZmlnXCIsIHNpZ25pbmdQcm9wZXJ0aWVzLmNvbmZpZyk7XG4gICAgY29uc3QgYXV0aFNjaGVtZSA9IGNvbnRleHQuZW5kcG9pbnRWMj8ucHJvcGVydGllcz8uYXV0aFNjaGVtZXM/LlswXTtcbiAgICBjb25zdCBzaWduZXJGdW5jdGlvbiA9IHRocm93U2lnbmluZ1Byb3BlcnR5RXJyb3IoXCJzaWduZXJcIiwgY29uZmlnLnNpZ25lcik7XG4gICAgY29uc3Qgc2lnbmVyID0gYXdhaXQgc2lnbmVyRnVuY3Rpb24oYXV0aFNjaGVtZSk7XG4gICAgY29uc3Qgc2lnbmluZ1JlZ2lvbiA9IHNpZ25pbmdQcm9wZXJ0aWVzPy5zaWduaW5nUmVnaW9uO1xuICAgIGNvbnN0IHNpZ25pbmdSZWdpb25TZXQgPSBzaWduaW5nUHJvcGVydGllcz8uc2lnbmluZ1JlZ2lvblNldDtcbiAgICBjb25zdCBzaWduaW5nTmFtZSA9IHNpZ25pbmdQcm9wZXJ0aWVzPy5zaWduaW5nTmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHNpZ25lcixcbiAgICAgICAgc2lnbmluZ1JlZ2lvbixcbiAgICAgICAgc2lnbmluZ1JlZ2lvblNldCxcbiAgICAgICAgc2lnbmluZ05hbWUsXG4gICAgfTtcbn07XG5jbGFzcyBBd3NTZGtTaWdWNFNpZ25lciB7XG4gICAgYXN5bmMgc2lnbihodHRwUmVxdWVzdCwgaWRlbnRpdHksIHNpZ25pbmdQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmICghcHJvdG9jb2xIdHRwLkh0dHBSZXF1ZXN0LmlzSW5zdGFuY2UoaHR0cFJlcXVlc3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcmVxdWVzdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYEh0dHBSZXF1ZXN0YCBhbmQgY2Fubm90IGJlIHNpZ25lZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRQcm9wcyA9IGF3YWl0IHZhbGlkYXRlU2lnbmluZ1Byb3BlcnRpZXMoc2lnbmluZ1Byb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgc2lnbmVyIH0gPSB2YWxpZGF0ZWRQcm9wcztcbiAgICAgICAgbGV0IHsgc2lnbmluZ1JlZ2lvbiwgc2lnbmluZ05hbWUgfSA9IHZhbGlkYXRlZFByb3BzO1xuICAgICAgICBjb25zdCBoYW5kbGVyRXhlY3V0aW9uQ29udGV4dCA9IHNpZ25pbmdQcm9wZXJ0aWVzLmNvbnRleHQ7XG4gICAgICAgIGlmIChoYW5kbGVyRXhlY3V0aW9uQ29udGV4dD8uYXV0aFNjaGVtZXM/Lmxlbmd0aCA/PyAwID4gMSkge1xuICAgICAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gaGFuZGxlckV4ZWN1dGlvbkNvbnRleHQuYXV0aFNjaGVtZXM7XG4gICAgICAgICAgICBpZiAoZmlyc3Q/Lm5hbWUgPT09IFwic2lndjRhXCIgJiYgc2Vjb25kPy5uYW1lID09PSBcInNpZ3Y0XCIpIHtcbiAgICAgICAgICAgICAgICBzaWduaW5nUmVnaW9uID0gc2Vjb25kPy5zaWduaW5nUmVnaW9uID8/IHNpZ25pbmdSZWdpb247XG4gICAgICAgICAgICAgICAgc2lnbmluZ05hbWUgPSBzZWNvbmQ/LnNpZ25pbmdOYW1lID8/IHNpZ25pbmdOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25lZFJlcXVlc3QgPSBhd2FpdCBzaWduZXIuc2lnbihodHRwUmVxdWVzdCwge1xuICAgICAgICAgICAgc2lnbmluZ0RhdGU6IGdldFNrZXdDb3JyZWN0ZWREYXRlKGNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCksXG4gICAgICAgICAgICBzaWduaW5nUmVnaW9uOiBzaWduaW5nUmVnaW9uLFxuICAgICAgICAgICAgc2lnbmluZ1NlcnZpY2U6IHNpZ25pbmdOYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNpZ25lZFJlcXVlc3Q7XG4gICAgfVxuICAgIGVycm9ySGFuZGxlcihzaWduaW5nUHJvcGVydGllcykge1xuICAgICAgICByZXR1cm4gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJUaW1lID0gZXJyb3IuU2VydmVyVGltZSA/PyBnZXREYXRlSGVhZGVyKGVycm9yLiRyZXNwb25zZSk7XG4gICAgICAgICAgICBpZiAoc2VydmVyVGltZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRocm93U2lnbmluZ1Byb3BlcnR5RXJyb3IoXCJjb25maWdcIiwgc2lnbmluZ1Byb3BlcnRpZXMuY29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsU3lzdGVtQ2xvY2tPZmZzZXQgPSBjb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ7XG4gICAgICAgICAgICAgICAgY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0ID0gZ2V0VXBkYXRlZFN5c3RlbUNsb2NrT2Zmc2V0KHNlcnZlclRpbWUsIGNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvY2tTa2V3Q29ycmVjdGVkID0gY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0ICE9PSBpbml0aWFsU3lzdGVtQ2xvY2tPZmZzZXQ7XG4gICAgICAgICAgICAgICAgaWYgKGNsb2NrU2tld0NvcnJlY3RlZCAmJiBlcnJvci4kbWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuJG1ldGFkYXRhLmNsb2NrU2tld0NvcnJlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHN1Y2Nlc3NIYW5kbGVyKGh0dHBSZXNwb25zZSwgc2lnbmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgZGF0ZUhlYWRlciA9IGdldERhdGVIZWFkZXIoaHR0cFJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGRhdGVIZWFkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRocm93U2lnbmluZ1Byb3BlcnR5RXJyb3IoXCJjb25maWdcIiwgc2lnbmluZ1Byb3BlcnRpZXMuY29uZmlnKTtcbiAgICAgICAgICAgIGNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCA9IGdldFVwZGF0ZWRTeXN0ZW1DbG9ja09mZnNldChkYXRlSGVhZGVyLCBjb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3QgQVdTU0RLU2lnVjRTaWduZXIgPSBBd3NTZGtTaWdWNFNpZ25lcjtcblxuY2xhc3MgQXdzU2RrU2lnVjRBU2lnbmVyIGV4dGVuZHMgQXdzU2RrU2lnVjRTaWduZXIge1xuICAgIGFzeW5jIHNpZ24oaHR0cFJlcXVlc3QsIGlkZW50aXR5LCBzaWduaW5nUHJvcGVydGllcykge1xuICAgICAgICBpZiAoIXByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5pc0luc3RhbmNlKGh0dHBSZXF1ZXN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlcXVlc3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIGBIdHRwUmVxdWVzdGAgYW5kIGNhbm5vdCBiZSBzaWduZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjb25maWcsIHNpZ25lciwgc2lnbmluZ1JlZ2lvbiwgc2lnbmluZ1JlZ2lvblNldCwgc2lnbmluZ05hbWUgfSA9IGF3YWl0IHZhbGlkYXRlU2lnbmluZ1Byb3BlcnRpZXMoc2lnbmluZ1Byb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCBjb25maWdSZXNvbHZlZFNpZ25pbmdSZWdpb25TZXQgPSBhd2FpdCBjb25maWcuc2lndjRhU2lnbmluZ1JlZ2lvblNldD8uKCk7XG4gICAgICAgIGNvbnN0IG11bHRpUmVnaW9uT3ZlcnJpZGUgPSAoY29uZmlnUmVzb2x2ZWRTaWduaW5nUmVnaW9uU2V0ID8/XG4gICAgICAgICAgICBzaWduaW5nUmVnaW9uU2V0ID8/IFtzaWduaW5nUmVnaW9uXSkuam9pbihcIixcIik7XG4gICAgICAgIGNvbnN0IHNpZ25lZFJlcXVlc3QgPSBhd2FpdCBzaWduZXIuc2lnbihodHRwUmVxdWVzdCwge1xuICAgICAgICAgICAgc2lnbmluZ0RhdGU6IGdldFNrZXdDb3JyZWN0ZWREYXRlKGNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCksXG4gICAgICAgICAgICBzaWduaW5nUmVnaW9uOiBtdWx0aVJlZ2lvbk92ZXJyaWRlLFxuICAgICAgICAgICAgc2lnbmluZ1NlcnZpY2U6IHNpZ25pbmdOYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNpZ25lZFJlcXVlc3Q7XG4gICAgfVxufVxuXG5jb25zdCBnZXRBcnJheUZvckNvbW1hU2VwYXJhdGVkU3RyaW5nID0gKHN0cikgPT4gdHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiAmJiBzdHIubGVuZ3RoID4gMCA/IHN0ci5zcGxpdChcIixcIikubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSkgOiBbXTtcblxuY29uc3QgZ2V0QmVhcmVyVG9rZW5FbnZLZXkgPSAoc2lnbmluZ05hbWUpID0+IGBBV1NfQkVBUkVSX1RPS0VOXyR7c2lnbmluZ05hbWUucmVwbGFjZSgvW1xccy1dL2csIFwiX1wiKS50b1VwcGVyQ2FzZSgpfWA7XG5cbmNvbnN0IE5PREVfQVVUSF9TQ0hFTUVfUFJFRkVSRU5DRV9FTlZfS0VZID0gXCJBV1NfQVVUSF9TQ0hFTUVfUFJFRkVSRU5DRVwiO1xuY29uc3QgTk9ERV9BVVRIX1NDSEVNRV9QUkVGRVJFTkNFX0NPTkZJR19LRVkgPSBcImF1dGhfc2NoZW1lX3ByZWZlcmVuY2VcIjtcbmNvbnN0IE5PREVfQVVUSF9TQ0hFTUVfUFJFRkVSRU5DRV9PUFRJT05TID0ge1xuICAgIGVudmlyb25tZW50VmFyaWFibGVTZWxlY3RvcjogKGVudiwgb3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8uc2lnbmluZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlYXJlclRva2VuS2V5ID0gZ2V0QmVhcmVyVG9rZW5FbnZLZXkob3B0aW9ucy5zaWduaW5nTmFtZSk7XG4gICAgICAgICAgICBpZiAoYmVhcmVyVG9rZW5LZXkgaW4gZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiBbXCJodHRwQmVhcmVyQXV0aFwiXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShOT0RFX0FVVEhfU0NIRU1FX1BSRUZFUkVOQ0VfRU5WX0tFWSBpbiBlbnYpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGdldEFycmF5Rm9yQ29tbWFTZXBhcmF0ZWRTdHJpbmcoZW52W05PREVfQVVUSF9TQ0hFTUVfUFJFRkVSRU5DRV9FTlZfS0VZXSk7XG4gICAgfSxcbiAgICBjb25maWdGaWxlU2VsZWN0b3I6IChwcm9maWxlKSA9PiB7XG4gICAgICAgIGlmICghKE5PREVfQVVUSF9TQ0hFTUVfUFJFRkVSRU5DRV9DT05GSUdfS0VZIGluIHByb2ZpbGUpKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGdldEFycmF5Rm9yQ29tbWFTZXBhcmF0ZWRTdHJpbmcocHJvZmlsZVtOT0RFX0FVVEhfU0NIRU1FX1BSRUZFUkVOQ0VfQ09ORklHX0tFWV0pO1xuICAgIH0sXG4gICAgZGVmYXVsdDogW10sXG59O1xuXG5jb25zdCByZXNvbHZlQXdzU2RrU2lnVjRBQ29uZmlnID0gKGNvbmZpZykgPT4ge1xuICAgIGNvbmZpZy5zaWd2NGFTaWduaW5nUmVnaW9uU2V0ID0gY29yZS5ub3JtYWxpemVQcm92aWRlcihjb25maWcuc2lndjRhU2lnbmluZ1JlZ2lvblNldCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbn07XG5jb25zdCBOT0RFX1NJR1Y0QV9DT05GSUdfT1BUSU9OUyA9IHtcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlU2VsZWN0b3IoZW52KSB7XG4gICAgICAgIGlmIChlbnYuQVdTX1NJR1Y0QV9TSUdOSU5HX1JFR0lPTl9TRVQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnYuQVdTX1NJR1Y0QV9TSUdOSU5HX1JFR0lPTl9TRVQuc3BsaXQoXCIsXCIpLm1hcCgoXykgPT4gXy50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBwcm9wZXJ0eVByb3ZpZGVyLlByb3ZpZGVyRXJyb3IoXCJBV1NfU0lHVjRBX1NJR05JTkdfUkVHSU9OX1NFVCBub3Qgc2V0IGluIGVudi5cIiwge1xuICAgICAgICAgICAgdHJ5TmV4dExpbms6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY29uZmlnRmlsZVNlbGVjdG9yKHByb2ZpbGUpIHtcbiAgICAgICAgaWYgKHByb2ZpbGUuc2lndjRhX3NpZ25pbmdfcmVnaW9uX3NldCkge1xuICAgICAgICAgICAgcmV0dXJuIChwcm9maWxlLnNpZ3Y0YV9zaWduaW5nX3JlZ2lvbl9zZXQgPz8gXCJcIikuc3BsaXQoXCIsXCIpLm1hcCgoXykgPT4gXy50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBwcm9wZXJ0eVByb3ZpZGVyLlByb3ZpZGVyRXJyb3IoXCJzaWd2NGFfc2lnbmluZ19yZWdpb25fc2V0IG5vdCBzZXQgaW4gcHJvZmlsZS5cIiwge1xuICAgICAgICAgICAgdHJ5TmV4dExpbms6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxufTtcblxuY29uc3QgcmVzb2x2ZUF3c1Nka1NpZ1Y0Q29uZmlnID0gKGNvbmZpZykgPT4ge1xuICAgIGxldCBpbnB1dENyZWRlbnRpYWxzID0gY29uZmlnLmNyZWRlbnRpYWxzO1xuICAgIGxldCBpc1VzZXJTdXBwbGllZCA9ICEhY29uZmlnLmNyZWRlbnRpYWxzO1xuICAgIGxldCByZXNvbHZlZENyZWRlbnRpYWxzID0gdW5kZWZpbmVkO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25maWcsIFwiY3JlZGVudGlhbHNcIiwge1xuICAgICAgICBzZXQoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIGlmIChjcmVkZW50aWFscyAmJiBjcmVkZW50aWFscyAhPT0gaW5wdXRDcmVkZW50aWFscyAmJiBjcmVkZW50aWFscyAhPT0gcmVzb2x2ZWRDcmVkZW50aWFscykge1xuICAgICAgICAgICAgICAgIGlzVXNlclN1cHBsaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlucHV0Q3JlZGVudGlhbHMgPSBjcmVkZW50aWFscztcbiAgICAgICAgICAgIGNvbnN0IG1lbW9pemVkUHJvdmlkZXIgPSBub3JtYWxpemVDcmVkZW50aWFsUHJvdmlkZXIoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IGlucHV0Q3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbERlZmF1bHRQcm92aWRlcjogY29uZmlnLmNyZWRlbnRpYWxEZWZhdWx0UHJvdmlkZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kUHJvdmlkZXIgPSBiaW5kQ2FsbGVyQ29uZmlnKGNvbmZpZywgbWVtb2l6ZWRQcm92aWRlcik7XG4gICAgICAgICAgICBpZiAoaXNVc2VyU3VwcGxpZWQgJiYgIWJvdW5kUHJvdmlkZXIuYXR0cmlidXRlZCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkQ3JlZGVudGlhbHMgPSBhc3luYyAob3B0aW9ucykgPT4gYm91bmRQcm92aWRlcihvcHRpb25zKS50aGVuKChjcmVkcykgPT4gY2xpZW50LnNldENyZWRlbnRpYWxGZWF0dXJlKGNyZWRzLCBcIkNSRURFTlRJQUxTX0NPREVcIiwgXCJlXCIpKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlZENyZWRlbnRpYWxzLm1lbW9pemVkID0gYm91bmRQcm92aWRlci5tZW1vaXplZDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZENyZWRlbnRpYWxzLmNvbmZpZ0JvdW5kID0gYm91bmRQcm92aWRlci5jb25maWdCb3VuZDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZENyZWRlbnRpYWxzLmF0dHJpYnV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRDcmVkZW50aWFscyA9IGJvdW5kUHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZENyZWRlbnRpYWxzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgY29uZmlnLmNyZWRlbnRpYWxzID0gaW5wdXRDcmVkZW50aWFscztcbiAgICBjb25zdCB7IHNpZ25pbmdFc2NhcGVQYXRoID0gdHJ1ZSwgc3lzdGVtQ2xvY2tPZmZzZXQgPSBjb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQgfHwgMCwgc2hhMjU2LCB9ID0gY29uZmlnO1xuICAgIGxldCBzaWduZXI7XG4gICAgaWYgKGNvbmZpZy5zaWduZXIpIHtcbiAgICAgICAgc2lnbmVyID0gY29yZS5ub3JtYWxpemVQcm92aWRlcihjb25maWcuc2lnbmVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29uZmlnLnJlZ2lvbkluZm9Qcm92aWRlcikge1xuICAgICAgICBzaWduZXIgPSAoKSA9PiBjb3JlLm5vcm1hbGl6ZVByb3ZpZGVyKGNvbmZpZy5yZWdpb24pKClcbiAgICAgICAgICAgIC50aGVuKGFzeW5jIChyZWdpb24pID0+IFtcbiAgICAgICAgICAgIChhd2FpdCBjb25maWcucmVnaW9uSW5mb1Byb3ZpZGVyKHJlZ2lvbiwge1xuICAgICAgICAgICAgICAgIHVzZUZpcHNFbmRwb2ludDogYXdhaXQgY29uZmlnLnVzZUZpcHNFbmRwb2ludCgpLFxuICAgICAgICAgICAgICAgIHVzZUR1YWxzdGFja0VuZHBvaW50OiBhd2FpdCBjb25maWcudXNlRHVhbHN0YWNrRW5kcG9pbnQoKSxcbiAgICAgICAgICAgIH0pKSB8fCB7fSxcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgXSlcbiAgICAgICAgICAgIC50aGVuKChbcmVnaW9uSW5mbywgcmVnaW9uXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBzaWduaW5nUmVnaW9uLCBzaWduaW5nU2VydmljZSB9ID0gcmVnaW9uSW5mbztcbiAgICAgICAgICAgIGNvbmZpZy5zaWduaW5nUmVnaW9uID0gY29uZmlnLnNpZ25pbmdSZWdpb24gfHwgc2lnbmluZ1JlZ2lvbiB8fCByZWdpb247XG4gICAgICAgICAgICBjb25maWcuc2lnbmluZ05hbWUgPSBjb25maWcuc2lnbmluZ05hbWUgfHwgc2lnbmluZ1NlcnZpY2UgfHwgY29uZmlnLnNlcnZpY2VJZDtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IGNvbmZpZy5jcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICByZWdpb246IGNvbmZpZy5zaWduaW5nUmVnaW9uLFxuICAgICAgICAgICAgICAgIHNlcnZpY2U6IGNvbmZpZy5zaWduaW5nTmFtZSxcbiAgICAgICAgICAgICAgICBzaGEyNTYsXG4gICAgICAgICAgICAgICAgdXJpRXNjYXBlUGF0aDogc2lnbmluZ0VzY2FwZVBhdGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgU2lnbmVyQ3RvciA9IGNvbmZpZy5zaWduZXJDb25zdHJ1Y3RvciB8fCBzaWduYXR1cmVWNC5TaWduYXR1cmVWNDtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmVyQ3RvcihwYXJhbXMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNpZ25lciA9IGFzeW5jIChhdXRoU2NoZW1lKSA9PiB7XG4gICAgICAgICAgICBhdXRoU2NoZW1lID0gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic2lndjRcIixcbiAgICAgICAgICAgICAgICBzaWduaW5nTmFtZTogY29uZmlnLnNpZ25pbmdOYW1lIHx8IGNvbmZpZy5kZWZhdWx0U2lnbmluZ05hbWUsXG4gICAgICAgICAgICAgICAgc2lnbmluZ1JlZ2lvbjogYXdhaXQgY29yZS5ub3JtYWxpemVQcm92aWRlcihjb25maWcucmVnaW9uKSgpLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgfSwgYXV0aFNjaGVtZSk7XG4gICAgICAgICAgICBjb25zdCBzaWduaW5nUmVnaW9uID0gYXV0aFNjaGVtZS5zaWduaW5nUmVnaW9uO1xuICAgICAgICAgICAgY29uc3Qgc2lnbmluZ1NlcnZpY2UgPSBhdXRoU2NoZW1lLnNpZ25pbmdOYW1lO1xuICAgICAgICAgICAgY29uZmlnLnNpZ25pbmdSZWdpb24gPSBjb25maWcuc2lnbmluZ1JlZ2lvbiB8fCBzaWduaW5nUmVnaW9uO1xuICAgICAgICAgICAgY29uZmlnLnNpZ25pbmdOYW1lID0gY29uZmlnLnNpZ25pbmdOYW1lIHx8IHNpZ25pbmdTZXJ2aWNlIHx8IGNvbmZpZy5zZXJ2aWNlSWQ7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBjb25maWcuY3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgcmVnaW9uOiBjb25maWcuc2lnbmluZ1JlZ2lvbixcbiAgICAgICAgICAgICAgICBzZXJ2aWNlOiBjb25maWcuc2lnbmluZ05hbWUsXG4gICAgICAgICAgICAgICAgc2hhMjU2LFxuICAgICAgICAgICAgICAgIHVyaUVzY2FwZVBhdGg6IHNpZ25pbmdFc2NhcGVQYXRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IFNpZ25lckN0b3IgPSBjb25maWcuc2lnbmVyQ29uc3RydWN0b3IgfHwgc2lnbmF0dXJlVjQuU2lnbmF0dXJlVjQ7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25lckN0b3IocGFyYW1zKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRDb25maWcgPSBPYmplY3QuYXNzaWduKGNvbmZpZywge1xuICAgICAgICBzeXN0ZW1DbG9ja09mZnNldCxcbiAgICAgICAgc2lnbmluZ0VzY2FwZVBhdGgsXG4gICAgICAgIHNpZ25lcixcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzb2x2ZWRDb25maWc7XG59O1xuY29uc3QgcmVzb2x2ZUFXU1NES1NpZ1Y0Q29uZmlnID0gcmVzb2x2ZUF3c1Nka1NpZ1Y0Q29uZmlnO1xuZnVuY3Rpb24gbm9ybWFsaXplQ3JlZGVudGlhbFByb3ZpZGVyKGNvbmZpZywgeyBjcmVkZW50aWFscywgY3JlZGVudGlhbERlZmF1bHRQcm92aWRlciwgfSkge1xuICAgIGxldCBjcmVkZW50aWFsc1Byb3ZpZGVyO1xuICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICBpZiAoIWNyZWRlbnRpYWxzPy5tZW1vaXplZCkge1xuICAgICAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlciA9IGNvcmUubWVtb2l6ZUlkZW50aXR5UHJvdmlkZXIoY3JlZGVudGlhbHMsIGNvcmUuaXNJZGVudGl0eUV4cGlyZWQsIGNvcmUuZG9lc0lkZW50aXR5UmVxdWlyZVJlZnJlc2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlciA9IGNyZWRlbnRpYWxzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoY3JlZGVudGlhbERlZmF1bHRQcm92aWRlcikge1xuICAgICAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlciA9IGNvcmUubm9ybWFsaXplUHJvdmlkZXIoY3JlZGVudGlhbERlZmF1bHRQcm92aWRlcihPYmplY3QuYXNzaWduKHt9LCBjb25maWcsIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDbGllbnRDb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjcmVkZW50aWFsc1Byb3ZpZGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkBhd3Mtc2RrL2NvcmU6OnJlc29sdmVBd3NTZGtTaWdWNENvbmZpZyAtIGBjcmVkZW50aWFsc2Agbm90IHByb3ZpZGVkIGFuZCBubyBjcmVkZW50aWFsRGVmYXVsdFByb3ZpZGVyIHdhcyBjb25maWd1cmVkLlwiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlZGVudGlhbHNQcm92aWRlci5tZW1vaXplZCA9IHRydWU7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzUHJvdmlkZXI7XG59XG5mdW5jdGlvbiBiaW5kQ2FsbGVyQ29uZmlnKGNvbmZpZywgY3JlZGVudGlhbHNQcm92aWRlcikge1xuICAgIGlmIChjcmVkZW50aWFsc1Byb3ZpZGVyLmNvbmZpZ0JvdW5kKSB7XG4gICAgICAgIHJldHVybiBjcmVkZW50aWFsc1Byb3ZpZGVyO1xuICAgIH1cbiAgICBjb25zdCBmbiA9IGFzeW5jIChvcHRpb25zKSA9PiBjcmVkZW50aWFsc1Byb3ZpZGVyKHsgLi4ub3B0aW9ucywgY2FsbGVyQ2xpZW50Q29uZmlnOiBjb25maWcgfSk7XG4gICAgZm4ubWVtb2l6ZWQgPSBjcmVkZW50aWFsc1Byb3ZpZGVyLm1lbW9pemVkO1xuICAgIGZuLmNvbmZpZ0JvdW5kID0gdHJ1ZTtcbiAgICByZXR1cm4gZm47XG59XG5cbmNsYXNzIFByb3RvY29sTGliIHtcbiAgICBxdWVyeUNvbXBhdDtcbiAgICBjb25zdHJ1Y3RvcihxdWVyeUNvbXBhdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucXVlcnlDb21wYXQgPSBxdWVyeUNvbXBhdDtcbiAgICB9XG4gICAgcmVzb2x2ZVJlc3RDb250ZW50VHlwZShkZWZhdWx0Q29udGVudFR5cGUsIGlucHV0U2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBpbnB1dFNjaGVtYS5nZXRNZW1iZXJTY2hlbWFzKCk7XG4gICAgICAgIGNvbnN0IGh0dHBQYXlsb2FkTWVtYmVyID0gT2JqZWN0LnZhbHVlcyhtZW1iZXJzKS5maW5kKChtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gISFtLmdldE1lcmdlZFRyYWl0cygpLmh0dHBQYXlsb2FkO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGh0dHBQYXlsb2FkTWVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBodHRwUGF5bG9hZE1lbWJlci5nZXRNZXJnZWRUcmFpdHMoKS5tZWRpYVR5cGU7XG4gICAgICAgICAgICBpZiAobWVkaWFUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGh0dHBQYXlsb2FkTWVtYmVyLmlzU3RyaW5nU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ0ZXh0L3BsYWluXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChodHRwUGF5bG9hZE1lbWJlci5pc0Jsb2JTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb250ZW50VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5wdXRTY2hlbWEuaXNVbml0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0JvZHkgPSBPYmplY3QudmFsdWVzKG1lbWJlcnMpLmZpbmQoKG0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGh0dHBRdWVyeSwgaHR0cFF1ZXJ5UGFyYW1zLCBodHRwSGVhZGVyLCBodHRwTGFiZWwsIGh0dHBQcmVmaXhIZWFkZXJzIH0gPSBtLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vUHJlZml4SGVhZGVycyA9IGh0dHBQcmVmaXhIZWFkZXJzID09PSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFodHRwUXVlcnkgJiYgIWh0dHBRdWVyeVBhcmFtcyAmJiAhaHR0cEhlYWRlciAmJiAhaHR0cExhYmVsICYmIG5vUHJlZml4SGVhZGVycztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGhhc0JvZHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldEVycm9yU2NoZW1hT3JUaHJvd0Jhc2VFeGNlcHRpb24oZXJyb3JJZGVudGlmaWVyLCBkZWZhdWx0TmFtZXNwYWNlLCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEsIGdldEVycm9yU2NoZW1hKSB7XG4gICAgICAgIGxldCBuYW1lc3BhY2UgPSBkZWZhdWx0TmFtZXNwYWNlO1xuICAgICAgICBsZXQgZXJyb3JOYW1lID0gZXJyb3JJZGVudGlmaWVyO1xuICAgICAgICBpZiAoZXJyb3JJZGVudGlmaWVyLmluY2x1ZGVzKFwiI1wiKSkge1xuICAgICAgICAgICAgW25hbWVzcGFjZSwgZXJyb3JOYW1lXSA9IGVycm9ySWRlbnRpZmllci5zcGxpdChcIiNcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICRtZXRhZGF0YTogbWV0YWRhdGEsXG4gICAgICAgICAgICAkZmF1bHQ6IHJlc3BvbnNlLnN0YXR1c0NvZGUgPCA1MDAgPyBcImNsaWVudFwiIDogXCJzZXJ2ZXJcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBzY2hlbWEuVHlwZVJlZ2lzdHJ5LmZvcihuYW1lc3BhY2UpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JTY2hlbWEgPSBnZXRFcnJvclNjaGVtYT8uKHJlZ2lzdHJ5LCBlcnJvck5hbWUpID8/IHJlZ2lzdHJ5LmdldFNjaGVtYShlcnJvcklkZW50aWZpZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3JTY2hlbWEsIGVycm9yTWV0YWRhdGEgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGF0YU9iamVjdC5tZXNzYWdlID0gZGF0YU9iamVjdC5tZXNzYWdlID8/IGRhdGFPYmplY3QuTWVzc2FnZSA/PyBcIlVua25vd25FcnJvclwiO1xuICAgICAgICAgICAgY29uc3Qgc3ludGhldGljID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IoXCJzbWl0aHkudHMuc2RrLnN5bnRoZXRpYy5cIiArIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICBjb25zdCBiYXNlRXhjZXB0aW9uU2NoZW1hID0gc3ludGhldGljLmdldEJhc2VFeGNlcHRpb24oKTtcbiAgICAgICAgICAgIGlmIChiYXNlRXhjZXB0aW9uU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDdG9yID0gc3ludGhldGljLmdldEVycm9yQ3RvcihiYXNlRXhjZXB0aW9uU2NoZW1hKSA/PyBFcnJvcjtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLmRlY29yYXRlU2VydmljZUV4Y2VwdGlvbihPYmplY3QuYXNzaWduKG5ldyBFcnJvckN0b3IoeyBuYW1lOiBlcnJvck5hbWUgfSksIGVycm9yTWV0YWRhdGEpLCBkYXRhT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IHRoaXMuZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGVycm9yTmFtZSksIGVycm9yTWV0YWRhdGEpLCBkYXRhT2JqZWN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oZXhjZXB0aW9uLCBhZGRpdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5xdWVyeUNvbXBhdCkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gZXhjZXB0aW9uLk1lc3NhZ2UgPz8gYWRkaXRpb25zLk1lc3NhZ2U7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHNtaXRoeUNsaWVudC5kZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oZXhjZXB0aW9uLCBhZGRpdGlvbnMpO1xuICAgICAgICAgICAgaWYgKG1zZykge1xuICAgICAgICAgICAgICAgIGVycm9yLk1lc3NhZ2UgPSBtc2c7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IG1zZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc21pdGh5Q2xpZW50LmRlY29yYXRlU2VydmljZUV4Y2VwdGlvbihleGNlcHRpb24sIGFkZGl0aW9ucyk7XG4gICAgfVxuICAgIHNldFF1ZXJ5Q29tcGF0RXJyb3Iob3V0cHV0LCByZXNwb25zZSkge1xuICAgICAgICBjb25zdCBxdWVyeUVycm9ySGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycz8uW1wieC1hbXpuLXF1ZXJ5LWVycm9yXCJdO1xuICAgICAgICBpZiAob3V0cHV0ICE9PSB1bmRlZmluZWQgJiYgcXVlcnlFcnJvckhlYWRlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBbQ29kZSwgVHlwZV0gPSBxdWVyeUVycm9ySGVhZGVyLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvdXRwdXQpO1xuICAgICAgICAgICAgY29uc3QgRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgQ29kZSxcbiAgICAgICAgICAgICAgICBUeXBlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCBFcnJvcik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgRXJyb3Jba10gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIEVycm9yLl9fdHlwZTtcbiAgICAgICAgICAgIG91dHB1dC5FcnJvciA9IEVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXJ5Q29tcGF0T3V0cHV0KHF1ZXJ5Q29tcGF0RXJyb3JEYXRhLCBlcnJvckRhdGEpIHtcbiAgICAgICAgaWYgKHF1ZXJ5Q29tcGF0RXJyb3JEYXRhLkVycm9yKSB7XG4gICAgICAgICAgICBlcnJvckRhdGEuRXJyb3IgPSBxdWVyeUNvbXBhdEVycm9yRGF0YS5FcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnlDb21wYXRFcnJvckRhdGEuVHlwZSkge1xuICAgICAgICAgICAgZXJyb3JEYXRhLlR5cGUgPSBxdWVyeUNvbXBhdEVycm9yRGF0YS5UeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxdWVyeUNvbXBhdEVycm9yRGF0YS5Db2RlKSB7XG4gICAgICAgICAgICBlcnJvckRhdGEuQ29kZSA9IHF1ZXJ5Q29tcGF0RXJyb3JEYXRhLkNvZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEF3c1NtaXRoeVJwY1YyQ2JvclByb3RvY29sIGV4dGVuZHMgY2Jvci5TbWl0aHlScGNWMkNib3JQcm90b2NvbCB7XG4gICAgYXdzUXVlcnlDb21wYXRpYmxlO1xuICAgIG1peGluO1xuICAgIGNvbnN0cnVjdG9yKHsgZGVmYXVsdE5hbWVzcGFjZSwgYXdzUXVlcnlDb21wYXRpYmxlLCB9KSB7XG4gICAgICAgIHN1cGVyKHsgZGVmYXVsdE5hbWVzcGFjZSB9KTtcbiAgICAgICAgdGhpcy5hd3NRdWVyeUNvbXBhdGlibGUgPSAhIWF3c1F1ZXJ5Q29tcGF0aWJsZTtcbiAgICAgICAgdGhpcy5taXhpbiA9IG5ldyBQcm90b2NvbExpYih0aGlzLmF3c1F1ZXJ5Q29tcGF0aWJsZSk7XG4gICAgfVxuICAgIGFzeW5jIHNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgc3VwZXIuc2VyaWFsaXplUmVxdWVzdChvcGVyYXRpb25TY2hlbWEsIGlucHV0LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHRoaXMuYXdzUXVlcnlDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJ4LWFtem4tcXVlcnktbW9kZVwiXSA9IFwidHJ1ZVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICBhc3luYyBoYW5kbGVFcnJvcihvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIHRoaXMubWl4aW4uc2V0UXVlcnlDb21wYXRFcnJvcihkYXRhT2JqZWN0LCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JOYW1lID0gY2Jvci5sb2FkU21pdGh5UnBjVjJDYm9yRXJyb3JDb2RlKHJlc3BvbnNlLCBkYXRhT2JqZWN0KSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgeyBlcnJvclNjaGVtYSwgZXJyb3JNZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5taXhpbi5nZXRFcnJvclNjaGVtYU9yVGhyb3dCYXNlRXhjZXB0aW9uKGVycm9yTmFtZSwgdGhpcy5vcHRpb25zLmRlZmF1bHROYW1lc3BhY2UsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSk7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoZXJyb3JTY2hlbWEpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGF0YU9iamVjdC5tZXNzYWdlID8/IGRhdGFPYmplY3QuTWVzc2FnZSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgRXJyb3JDdG9yID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IoZXJyb3JTY2hlbWFbMV0pLmdldEVycm9yQ3RvcihlcnJvclNjaGVtYSkgPz8gRXJyb3I7XG4gICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBFcnJvckN0b3IobWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtZW1iZXJdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IHRoaXMuZGVzZXJpYWxpemVyLnJlYWRWYWx1ZShtZW1iZXIsIGRhdGFPYmplY3RbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF3c1F1ZXJ5Q29tcGF0aWJsZSkge1xuICAgICAgICAgICAgdGhpcy5taXhpbi5xdWVyeUNvbXBhdE91dHB1dChkYXRhT2JqZWN0LCBvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHRoaXMubWl4aW4uZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCBlcnJvck1ldGFkYXRhLCB7XG4gICAgICAgICAgICAkZmF1bHQ6IG5zLmdldE1lcmdlZFRyYWl0cygpLmVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSwgb3V0cHV0KSwgZGF0YU9iamVjdCk7XG4gICAgfVxufVxuXG5jb25zdCBfdG9TdHIgPSAodmFsKSA9PiB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWwgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgY29uc3Qgd2FybmluZyA9IG5ldyBFcnJvcihgUmVjZWl2ZWQgbnVtYmVyICR7dmFsfSB3aGVyZSBhIHN0cmluZyB3YXMgZXhwZWN0ZWQuYCk7XG4gICAgICAgIHdhcm5pbmcubmFtZSA9IFwiV2FybmluZ1wiO1xuICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBuZXcgRXJyb3IoYFJlY2VpdmVkIGJvb2xlYW4gJHt2YWx9IHdoZXJlIGEgc3RyaW5nIHdhcyBleHBlY3RlZC5gKTtcbiAgICAgICAgd2FybmluZy5uYW1lID0gXCJXYXJuaW5nXCI7XG4gICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcbmNvbnN0IF90b0Jvb2wgPSAodmFsKSA9PiB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyY2FzZSA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsICE9PSBcIlwiICYmIGxvd2VyY2FzZSAhPT0gXCJmYWxzZVwiICYmIGxvd2VyY2FzZSAhPT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSBuZXcgRXJyb3IoYFJlY2VpdmVkIHN0cmluZyBcIiR7dmFsfVwiIHdoZXJlIGEgYm9vbGVhbiB3YXMgZXhwZWN0ZWQuYCk7XG4gICAgICAgICAgICB3YXJuaW5nLm5hbWUgPSBcIldhcm5pbmdcIjtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsICE9PSBcIlwiICYmIGxvd2VyY2FzZSAhPT0gXCJmYWxzZVwiO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcbmNvbnN0IF90b051bSA9ICh2YWwpID0+IHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbCk7XG4gICAgICAgIGlmIChudW0udG9TdHJpbmcoKSAhPT0gdmFsKSB7XG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gbmV3IEVycm9yKGBSZWNlaXZlZCBzdHJpbmcgXCIke3ZhbH1cIiB3aGVyZSBhIG51bWJlciB3YXMgZXhwZWN0ZWQuYCk7XG4gICAgICAgICAgICB3YXJuaW5nLm5hbWUgPSBcIldhcm5pbmdcIjtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn07XG5cbmNsYXNzIFNlcmRlQ29udGV4dENvbmZpZyB7XG4gICAgc2VyZGVDb250ZXh0O1xuICAgIHNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5zZXJkZUNvbnRleHQgPSBzZXJkZUNvbnRleHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqc29uUmV2aXZlcihrZXksIHZhbHVlLCBjb250ZXh0KSB7XG4gICAgaWYgKGNvbnRleHQ/LnNvdXJjZSkge1xuICAgICAgICBjb25zdCBudW1lcmljU3RyaW5nID0gY29udGV4dC5zb3VyY2U7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IHZhbHVlIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgfHwgbnVtZXJpY1N0cmluZyAhPT0gU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRnJhY3Rpb25hbCA9IG51bWVyaWNTdHJpbmcuaW5jbHVkZXMoXCIuXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZyYWN0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzZXJkZS5OdW1lcmljVmFsdWUobnVtZXJpY1N0cmluZywgXCJiaWdEZWNpbWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChudW1lcmljU3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5jb25zdCBjb2xsZWN0Qm9keVN0cmluZyA9IChzdHJlYW1Cb2R5LCBjb250ZXh0KSA9PiBzbWl0aHlDbGllbnQuY29sbGVjdEJvZHkoc3RyZWFtQm9keSwgY29udGV4dCkudGhlbigoYm9keSkgPT4gKGNvbnRleHQ/LnV0ZjhFbmNvZGVyID8/IHV0aWxVdGY4LnRvVXRmOCkoYm9keSkpO1xuXG5jb25zdCBwYXJzZUpzb25Cb2R5ID0gKHN0cmVhbUJvZHksIGNvbnRleHQpID0+IGNvbGxlY3RCb2R5U3RyaW5nKHN0cmVhbUJvZHksIGNvbnRleHQpLnRoZW4oKGVuY29kZWQpID0+IHtcbiAgICBpZiAoZW5jb2RlZC5sZW5ndGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGVuY29kZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZT8ubmFtZSA9PT0gXCJTeW50YXhFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiJHJlc3BvbnNlQm9keVRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW5jb2RlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufSk7XG5jb25zdCBwYXJzZUpzb25FcnJvckJvZHkgPSBhc3luYyAoZXJyb3JCb2R5LCBjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYXJzZUpzb25Cb2R5KGVycm9yQm9keSwgY29udGV4dCk7XG4gICAgdmFsdWUubWVzc2FnZSA9IHZhbHVlLm1lc3NhZ2UgPz8gdmFsdWUuTWVzc2FnZTtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuY29uc3QgbG9hZFJlc3RKc29uRXJyb3JDb2RlID0gKG91dHB1dCwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IGZpbmRLZXkgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5rZXlzKG9iamVjdCkuZmluZCgoaykgPT4gay50b0xvd2VyQ2FzZSgpID09PSBrZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgY29uc3Qgc2FuaXRpemVFcnJvckNvZGUgPSAocmF3VmFsdWUpID0+IHtcbiAgICAgICAgbGV0IGNsZWFuVmFsdWUgPSByYXdWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhblZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBjbGVhblZhbHVlID0gY2xlYW5WYWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGVhblZhbHVlLmluZGV4T2YoXCIsXCIpID49IDApIHtcbiAgICAgICAgICAgIGNsZWFuVmFsdWUgPSBjbGVhblZhbHVlLnNwbGl0KFwiLFwiKVswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYW5WYWx1ZS5pbmRleE9mKFwiOlwiKSA+PSAwKSB7XG4gICAgICAgICAgICBjbGVhblZhbHVlID0gY2xlYW5WYWx1ZS5zcGxpdChcIjpcIilbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsZWFuVmFsdWUuaW5kZXhPZihcIiNcIikgPj0gMCkge1xuICAgICAgICAgICAgY2xlYW5WYWx1ZSA9IGNsZWFuVmFsdWUuc3BsaXQoXCIjXCIpWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGVhblZhbHVlO1xuICAgIH07XG4gICAgY29uc3QgaGVhZGVyS2V5ID0gZmluZEtleShvdXRwdXQuaGVhZGVycywgXCJ4LWFtem4tZXJyb3J0eXBlXCIpO1xuICAgIGlmIChoZWFkZXJLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc2FuaXRpemVFcnJvckNvZGUob3V0cHV0LmhlYWRlcnNbaGVhZGVyS2V5XSk7XG4gICAgfVxuICAgIGlmIChkYXRhICYmIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IGNvZGVLZXkgPSBmaW5kS2V5KGRhdGEsIFwiY29kZVwiKTtcbiAgICAgICAgaWYgKGNvZGVLZXkgJiYgZGF0YVtjb2RlS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc2FuaXRpemVFcnJvckNvZGUoZGF0YVtjb2RlS2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGFbXCJfX3R5cGVcIl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplRXJyb3JDb2RlKGRhdGFbXCJfX3R5cGVcIl0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuY2xhc3MgSnNvblNoYXBlRGVzZXJpYWxpemVyIGV4dGVuZHMgU2VyZGVDb250ZXh0Q29uZmlnIHtcbiAgICBzZXR0aW5ncztcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgfVxuICAgIGFzeW5jIHJlYWQoc2NoZW1hLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKHNjaGVtYSwgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKGRhdGEsIGpzb25SZXZpdmVyKSA6IGF3YWl0IHBhcnNlSnNvbkJvZHkoZGF0YSwgdGhpcy5zZXJkZUNvbnRleHQpKTtcbiAgICB9XG4gICAgcmVhZE9iamVjdChzY2hlbWEsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWQoc2NoZW1hLCBkYXRhKTtcbiAgICB9XG4gICAgX3JlYWQoc2NoZW1hJDEsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiO1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKHNjaGVtYSQxKTtcbiAgICAgICAgaWYgKG5zLmlzTGlzdFNjaGVtYSgpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0TWVtYmVyID0gbnMuZ2V0VmFsdWVTY2hlbWEoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dCA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgc3BhcnNlID0gISFucy5nZXRNZXJnZWRUcmFpdHMoKS5zcGFyc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhcnNlIHx8IGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaCh0aGlzLl9yZWFkKGxpc3RNZW1iZXIsIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzTWFwU2NoZW1hKCkgJiYgaXNPYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcE1lbWJlciA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuc3BhcnNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbX2ssIF92XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhcnNlIHx8IF92ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0W19rXSA9IHRoaXMuX3JlYWQobWFwTWVtYmVyLCBfdik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc1N0cnVjdFNjaGVtYSgpICYmIGlzT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW21lbWJlck5hbWUsIG1lbWJlclNjaGVtYV0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21LZXkgPSB0aGlzLnNldHRpbmdzLmpzb25OYW1lID8gbWVtYmVyU2NoZW1hLmdldE1lcmdlZFRyYWl0cygpLmpzb25OYW1lID8/IG1lbWJlck5hbWUgOiBtZW1iZXJOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZFZhbHVlID0gdGhpcy5fcmVhZChtZW1iZXJTY2hlbWEsIHZhbHVlW2Zyb21LZXldKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVkVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRbbWVtYmVyTmFtZV0gPSBkZXNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0Jsb2JTY2hlbWEoKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlsQmFzZTY0LmZyb21CYXNlNjQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IG5zLmdldE1lcmdlZFRyYWl0cygpLm1lZGlhVHlwZTtcbiAgICAgICAgaWYgKG5zLmlzU3RyaW5nU2NoZW1hKCkgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgaXNKc29uID0gbWVkaWFUeXBlID09PSBcImFwcGxpY2F0aW9uL2pzb25cIiB8fCBtZWRpYVR5cGUuZW5kc1dpdGgoXCIranNvblwiKTtcbiAgICAgICAgICAgIGlmIChpc0pzb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VyZGUuTGF6eUpzb25TdHJpbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzVGltZXN0YW1wU2NoZW1hKCkgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gcHJvdG9jb2xzLmRldGVybWluZVRpbWVzdGFtcEZvcm1hdChucywgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcmRlLnBhcnNlUmZjMzMzOURhdGVUaW1lV2l0aE9mZnNldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyZGUucGFyc2VSZmM3MjMxRGF0ZVRpbWUodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcmRlLnBhcnNlRXBvY2hUaW1lc3RhbXAodmFsdWUpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk1pc3NpbmcgdGltZXN0YW1wIGZvcm1hdCwgcGFyc2luZyB2YWx1ZSB3aXRoIERhdGUgY29uc3RydWN0b3I6XCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNCaWdJbnRlZ2VyU2NoZW1hKCkgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNCaWdEZWNpbWFsU2NoZW1hKCkgJiYgdmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBzZXJkZS5OdW1lcmljVmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1bnR5cGVkID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodW50eXBlZC50eXBlID09PSBcImJpZ0RlY2ltYWxcIiAmJiBcInN0cmluZ1wiIGluIHVudHlwZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNlcmRlLk51bWVyaWNWYWx1ZSh1bnR5cGVkLnN0cmluZywgdW50eXBlZC50eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgc2VyZGUuTnVtZXJpY1ZhbHVlKFN0cmluZyh2YWx1ZSksIFwiYmlnRGVjaW1hbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNOdW1lcmljU2NoZW1hKCkgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkluZmluaXR5XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiLUluZmluaXR5XCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIk5hTlwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0RvY3VtZW50U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBzZXJkZS5OdW1lcmljVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dFtrXSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRba10gPSB0aGlzLl9yZWFkKG5zLCB2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuY29uc3QgTlVNRVJJQ19DT05UUk9MX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDkyNSk7XG5jbGFzcyBKc29uUmVwbGFjZXIge1xuICAgIHZhbHVlcyA9IG5ldyBNYXAoKTtcbiAgICBjb3VudGVyID0gMDtcbiAgICBzdGFnZSA9IDA7XG4gICAgY3JlYXRlUmVwbGFjZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWdlID09PSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIEpzb25SZXBsYWNlciBhbHJlYWR5IGNyZWF0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YWdlID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIEpzb25SZXBsYWNlciBleGhhdXN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhZ2UgPSAxO1xuICAgICAgICByZXR1cm4gKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHNlcmRlLk51bWVyaWNWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBgJHtOVU1FUklDX0NPTlRST0xfQ0hBUiArIFwibnZcIiArIHRoaXMuY291bnRlcisrfV9gICsgdmFsdWUuc3RyaW5nO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChgXCIke3Z9XCJgLCB2YWx1ZS5zdHJpbmcpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBgJHtOVU1FUklDX0NPTlRST0xfQ0hBUiArIFwiYlwiICsgdGhpcy5jb3VudGVyKyt9X2AgKyBzO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChgXCIke3Z9XCJgLCBzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVwbGFjZUluSnNvbihqc29uKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWdlID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIEpzb25SZXBsYWNlciBub3QgY3JlYXRlZCB5ZXQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YWdlID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIEpzb25SZXBsYWNlciBleGhhdXN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhZ2UgPSAyO1xuICAgICAgICBpZiAodGhpcy5jb3VudGVyID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnZhbHVlcykge1xuICAgICAgICAgICAganNvbiA9IGpzb24ucmVwbGFjZShrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG59XG5cbmNsYXNzIEpzb25TaGFwZVNlcmlhbGl6ZXIgZXh0ZW5kcyBTZXJkZUNvbnRleHRDb25maWcge1xuICAgIHNldHRpbmdzO1xuICAgIGJ1ZmZlcjtcbiAgICByb290U2NoZW1hO1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG4gICAgd3JpdGUoc2NoZW1hJDEsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMucm9vdFNjaGVtYSA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKHNjaGVtYSQxKTtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLl93cml0ZSh0aGlzLnJvb3RTY2hlbWEsIHZhbHVlKTtcbiAgICB9XG4gICAgd3JpdGVEaXNjcmltaW5hdGVkRG9jdW1lbnQoc2NoZW1hJDEsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMud3JpdGUoc2NoZW1hJDEsIHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJ1ZmZlciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuX190eXBlID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yoc2NoZW1hJDEpLmdldE5hbWUodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2goKSB7XG4gICAgICAgIGNvbnN0IHsgcm9vdFNjaGVtYSB9ID0gdGhpcztcbiAgICAgICAgdGhpcy5yb290U2NoZW1hID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocm9vdFNjaGVtYT8uaXNTdHJ1Y3RTY2hlbWEoKSB8fCByb290U2NoZW1hPy5pc0RvY3VtZW50U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VyID0gbmV3IEpzb25SZXBsYWNlcigpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyLnJlcGxhY2VJbkpzb24oSlNPTi5zdHJpbmdpZnkodGhpcy5idWZmZXIsIHJlcGxhY2VyLmNyZWF0ZVJlcGxhY2VyKCksIDApKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gICAgfVxuICAgIF93cml0ZShzY2hlbWEkMSwgdmFsdWUsIGNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCBpc09iamVjdCA9IHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSk7XG4gICAgICAgIGlmIChucy5pc0xpc3RTY2hlbWEoKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdE1lbWJlciA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuc3BhcnNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYXJzZSB8fCBpdGVtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2godGhpcy5fd3JpdGUobGlzdE1lbWJlciwgaXRlbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNNYXBTY2hlbWEoKSAmJiBpc09iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgbWFwTWVtYmVyID0gbnMuZ2V0VmFsdWVTY2hlbWEoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dCA9IHt9O1xuICAgICAgICAgICAgY29uc3Qgc3BhcnNlID0gISFucy5nZXRNZXJnZWRUcmFpdHMoKS5zcGFyc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtfaywgX3ZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFyc2UgfHwgX3YgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRbX2tdID0gdGhpcy5fd3JpdGUobWFwTWVtYmVyLCBfdik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc1N0cnVjdFNjaGVtYSgpICYmIGlzT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW21lbWJlck5hbWUsIG1lbWJlclNjaGVtYV0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEtleSA9IHRoaXMuc2V0dGluZ3MuanNvbk5hbWUgPyBtZW1iZXJTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCkuanNvbk5hbWUgPz8gbWVtYmVyTmFtZSA6IG1lbWJlck5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlVmFsdWUgPSB0aGlzLl93cml0ZShtZW1iZXJTY2hlbWEsIHZhbHVlW21lbWJlck5hbWVdLCBucyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6YWJsZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0W3RhcmdldEtleV0gPSBzZXJpYWxpemFibGVWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBjb250YWluZXI/LmlzU3RydWN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChucy5pc0Jsb2JTY2hlbWEoKSAmJiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikpIHx8XG4gICAgICAgICAgICAobnMuaXNEb2N1bWVudFNjaGVtYSgpICYmIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgIGlmIChucyA9PT0gdGhpcy5yb290U2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnNlcmRlQ29udGV4dD8uYmFzZTY0RW5jb2RlciA/PyB1dGlsQmFzZTY0LnRvQmFzZTY0KSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChucy5pc1RpbWVzdGFtcFNjaGVtYSgpIHx8IG5zLmlzRG9jdW1lbnRTY2hlbWEoKSkgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBwcm90b2NvbHMuZGV0ZXJtaW5lVGltZXN0YW1wRm9ybWF0KG5zLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiLjAwMFpcIiwgXCJaXCIpO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcmRlLmRhdGVUb1V0Y1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJNaXNzaW5nIHRpbWVzdGFtcCBmb3JtYXQsIHVzaW5nIGVwb2NoIHNlY29uZHNcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNOdW1lcmljU2NoZW1hKCkgJiYgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModmFsdWUpID09PSBJbmZpbml0eSB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNTdHJpbmdTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBucy5pc0lkZW1wb3RlbmN5VG9rZW4oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJkZS5nZW5lcmF0ZUlkZW1wb3RlbmN5VG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IG5zLmdldE1lcmdlZFRyYWl0cygpLm1lZGlhVHlwZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSnNvbiA9IG1lZGlhVHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9qc29uXCIgfHwgbWVkaWFUeXBlLmVuZHNXaXRoKFwiK2pzb25cIik7XG4gICAgICAgICAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyZGUuTGF6eUpzb25TdHJpbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0RvY3VtZW50U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBzZXJkZS5OdW1lcmljVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dFtrXSA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRba10gPSB0aGlzLl93cml0ZShucywgdik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmNsYXNzIEpzb25Db2RlYyBleHRlbmRzIFNlcmRlQ29udGV4dENvbmZpZyB7XG4gICAgc2V0dGluZ3M7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICBjcmVhdGVTZXJpYWxpemVyKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IEpzb25TaGFwZVNlcmlhbGl6ZXIodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIHNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHRoaXMuc2VyZGVDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXI7XG4gICAgfVxuICAgIGNyZWF0ZURlc2VyaWFsaXplcigpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gbmV3IEpzb25TaGFwZURlc2VyaWFsaXplcih0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgZGVzZXJpYWxpemVyLnNldFNlcmRlQ29udGV4dCh0aGlzLnNlcmRlQ29udGV4dCk7XG4gICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZXI7XG4gICAgfVxufVxuXG5jbGFzcyBBd3NKc29uUnBjUHJvdG9jb2wgZXh0ZW5kcyBwcm90b2NvbHMuUnBjUHJvdG9jb2wge1xuICAgIHNlcmlhbGl6ZXI7XG4gICAgZGVzZXJpYWxpemVyO1xuICAgIHNlcnZpY2VUYXJnZXQ7XG4gICAgY29kZWM7XG4gICAgbWl4aW47XG4gICAgYXdzUXVlcnlDb21wYXRpYmxlO1xuICAgIGNvbnN0cnVjdG9yKHsgZGVmYXVsdE5hbWVzcGFjZSwgc2VydmljZVRhcmdldCwgYXdzUXVlcnlDb21wYXRpYmxlLCB9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGRlZmF1bHROYW1lc3BhY2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlcnZpY2VUYXJnZXQgPSBzZXJ2aWNlVGFyZ2V0O1xuICAgICAgICB0aGlzLmNvZGVjID0gbmV3IEpzb25Db2RlYyh7XG4gICAgICAgICAgICB0aW1lc3RhbXBGb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICB1c2VUcmFpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGpzb25OYW1lOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IHRoaXMuY29kZWMuY3JlYXRlU2VyaWFsaXplcigpO1xuICAgICAgICB0aGlzLmRlc2VyaWFsaXplciA9IHRoaXMuY29kZWMuY3JlYXRlRGVzZXJpYWxpemVyKCk7XG4gICAgICAgIHRoaXMuYXdzUXVlcnlDb21wYXRpYmxlID0gISFhd3NRdWVyeUNvbXBhdGlibGU7XG4gICAgICAgIHRoaXMubWl4aW4gPSBuZXcgUHJvdG9jb2xMaWIodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpO1xuICAgIH1cbiAgICBhc3luYyBzZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCk7XG4gICAgICAgIGlmICghcmVxdWVzdC5wYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5wYXRoICs9IFwiL1wiO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdC5oZWFkZXJzLCB7XG4gICAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBgYXBwbGljYXRpb24veC1hbXotanNvbi0ke3RoaXMuZ2V0SnNvblJwY1ZlcnNpb24oKX1gLFxuICAgICAgICAgICAgXCJ4LWFtei10YXJnZXRcIjogYCR7dGhpcy5zZXJ2aWNlVGFyZ2V0fS4ke29wZXJhdGlvblNjaGVtYS5uYW1lfWAsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1tcIngtYW16bi1xdWVyeS1tb2RlXCJdID0gXCJ0cnVlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYS5kZXJlZihvcGVyYXRpb25TY2hlbWEuaW5wdXQpID09PSBcInVuaXRcIiB8fCAhcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBcInt9XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuICAgIGdldFBheWxvYWRDb2RlYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29kZWM7XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZUVycm9yKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLmF3c1F1ZXJ5Q29tcGF0aWJsZSkge1xuICAgICAgICAgICAgdGhpcy5taXhpbi5zZXRRdWVyeUNvbXBhdEVycm9yKGRhdGFPYmplY3QsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvcklkZW50aWZpZXIgPSBsb2FkUmVzdEpzb25FcnJvckNvZGUocmVzcG9uc2UsIGRhdGFPYmplY3QpID8/IFwiVW5rbm93blwiO1xuICAgICAgICBjb25zdCB7IGVycm9yU2NoZW1hLCBlcnJvck1ldGFkYXRhIH0gPSBhd2FpdCB0aGlzLm1peGluLmdldEVycm9yU2NoZW1hT3JUaHJvd0Jhc2VFeGNlcHRpb24oZXJyb3JJZGVudGlmaWVyLCB0aGlzLm9wdGlvbnMuZGVmYXVsdE5hbWVzcGFjZSwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhKTtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihlcnJvclNjaGVtYSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhT2JqZWN0Lm1lc3NhZ2UgPz8gZGF0YU9iamVjdC5NZXNzYWdlID8/IFwiVW5rbm93blwiO1xuICAgICAgICBjb25zdCBFcnJvckN0b3IgPSBzY2hlbWEuVHlwZVJlZ2lzdHJ5LmZvcihlcnJvclNjaGVtYVsxXSkuZ2V0RXJyb3JDdG9yKGVycm9yU2NoZW1hKSA/PyBFcnJvcjtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gbmV3IEVycm9yQ3RvcihtZXNzYWdlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1lbWJlcl0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbWVtYmVyLmdldE1lcmdlZFRyYWl0cygpLmpzb25OYW1lID8/IG5hbWU7XG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSB0aGlzLmNvZGVjLmNyZWF0ZURlc2VyaWFsaXplcigpLnJlYWRPYmplY3QobWVtYmVyLCBkYXRhT2JqZWN0W3RhcmdldF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF3c1F1ZXJ5Q29tcGF0aWJsZSkge1xuICAgICAgICAgICAgdGhpcy5taXhpbi5xdWVyeUNvbXBhdE91dHB1dChkYXRhT2JqZWN0LCBvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHRoaXMubWl4aW4uZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCBlcnJvck1ldGFkYXRhLCB7XG4gICAgICAgICAgICAkZmF1bHQ6IG5zLmdldE1lcmdlZFRyYWl0cygpLmVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSwgb3V0cHV0KSwgZGF0YU9iamVjdCk7XG4gICAgfVxufVxuXG5jbGFzcyBBd3NKc29uMV8wUHJvdG9jb2wgZXh0ZW5kcyBBd3NKc29uUnBjUHJvdG9jb2wge1xuICAgIGNvbnN0cnVjdG9yKHsgZGVmYXVsdE5hbWVzcGFjZSwgc2VydmljZVRhcmdldCwgYXdzUXVlcnlDb21wYXRpYmxlLCB9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGRlZmF1bHROYW1lc3BhY2UsXG4gICAgICAgICAgICBzZXJ2aWNlVGFyZ2V0LFxuICAgICAgICAgICAgYXdzUXVlcnlDb21wYXRpYmxlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0U2hhcGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXdzLnByb3RvY29scyNhd3NKc29uMV8wXCI7XG4gICAgfVxuICAgIGdldEpzb25ScGNWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gXCIxLjBcIjtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJhcHBsaWNhdGlvbi94LWFtei1qc29uLTEuMFwiO1xuICAgIH1cbn1cblxuY2xhc3MgQXdzSnNvbjFfMVByb3RvY29sIGV4dGVuZHMgQXdzSnNvblJwY1Byb3RvY29sIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGRlZmF1bHROYW1lc3BhY2UsIHNlcnZpY2VUYXJnZXQsIGF3c1F1ZXJ5Q29tcGF0aWJsZSwgfSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICAgICAgc2VydmljZVRhcmdldCxcbiAgICAgICAgICAgIGF3c1F1ZXJ5Q29tcGF0aWJsZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFNoYXBlSWQoKSB7XG4gICAgICAgIHJldHVybiBcImF3cy5wcm90b2NvbHMjYXdzSnNvbjFfMVwiO1xuICAgIH1cbiAgICBnZXRKc29uUnBjVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIFwiMS4xXCI7XG4gICAgfVxuICAgIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXBwbGljYXRpb24veC1hbXotanNvbi0xLjFcIjtcbiAgICB9XG59XG5cbmNsYXNzIEF3c1Jlc3RKc29uUHJvdG9jb2wgZXh0ZW5kcyBwcm90b2NvbHMuSHR0cEJpbmRpbmdQcm90b2NvbCB7XG4gICAgc2VyaWFsaXplcjtcbiAgICBkZXNlcmlhbGl6ZXI7XG4gICAgY29kZWM7XG4gICAgbWl4aW4gPSBuZXcgUHJvdG9jb2xMaWIoKTtcbiAgICBjb25zdHJ1Y3Rvcih7IGRlZmF1bHROYW1lc3BhY2UgfSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB0aW1lc3RhbXBGb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICB1c2VUcmFpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiA3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGh0dHBCaW5kaW5nczogdHJ1ZSxcbiAgICAgICAgICAgIGpzb25OYW1lOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvZGVjID0gbmV3IEpzb25Db2RlYyhzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IG5ldyBwcm90b2NvbHMuSHR0cEludGVyY2VwdGluZ1NoYXBlU2VyaWFsaXplcih0aGlzLmNvZGVjLmNyZWF0ZVNlcmlhbGl6ZXIoKSwgc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmRlc2VyaWFsaXplciA9IG5ldyBwcm90b2NvbHMuSHR0cEludGVyY2VwdGluZ1NoYXBlRGVzZXJpYWxpemVyKHRoaXMuY29kZWMuY3JlYXRlRGVzZXJpYWxpemVyKCksIHNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0U2hhcGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXdzLnByb3RvY29scyNyZXN0SnNvbjFcIjtcbiAgICB9XG4gICAgZ2V0UGF5bG9hZENvZGVjKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2RlYztcbiAgICB9XG4gICAgc2V0U2VyZGVDb250ZXh0KHNlcmRlQ29udGV4dCkge1xuICAgICAgICB0aGlzLmNvZGVjLnNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpO1xuICAgICAgICBzdXBlci5zZXRTZXJkZUNvbnRleHQoc2VyZGVDb250ZXh0KTtcbiAgICB9XG4gICAgYXN5bmMgc2VyaWFsaXplUmVxdWVzdChvcGVyYXRpb25TY2hlbWEsIGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBzdXBlci5zZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpO1xuICAgICAgICBjb25zdCBpbnB1dFNjaGVtYSA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKG9wZXJhdGlvblNjaGVtYS5pbnB1dCk7XG4gICAgICAgIGlmICghcmVxdWVzdC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHRoaXMubWl4aW4ucmVzb2x2ZVJlc3RDb250ZW50VHlwZSh0aGlzLmdldERlZmF1bHRDb250ZW50VHlwZSgpLCBpbnB1dFNjaGVtYSk7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBjb250ZW50VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5ib2R5ID09IG51bGwgJiYgcmVxdWVzdC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdID09PSB0aGlzLmdldERlZmF1bHRDb250ZW50VHlwZSgpKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBcInt9XCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuICAgIGFzeW5jIGRlc2VyaWFsaXplUmVzcG9uc2Uob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSkge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBzdXBlci5kZXNlcmlhbGl6ZVJlc3BvbnNlKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UpO1xuICAgICAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihvcGVyYXRpb25TY2hlbWEub3V0cHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWVtYmVyXSBvZiBvdXRwdXRTY2hlbWEuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgaWYgKG1lbWJlci5nZXRNZW1iZXJUcmFpdHMoKS5odHRwUGF5bG9hZCAmJiAhKG5hbWUgaW4gb3V0cHV0KSkge1xuICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlRXJyb3Iob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3JJZGVudGlmaWVyID0gbG9hZFJlc3RKc29uRXJyb3JDb2RlKHJlc3BvbnNlLCBkYXRhT2JqZWN0KSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgeyBlcnJvclNjaGVtYSwgZXJyb3JNZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5taXhpbi5nZXRFcnJvclNjaGVtYU9yVGhyb3dCYXNlRXhjZXB0aW9uKGVycm9ySWRlbnRpZmllciwgdGhpcy5vcHRpb25zLmRlZmF1bHROYW1lc3BhY2UsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSk7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoZXJyb3JTY2hlbWEpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGF0YU9iamVjdC5tZXNzYWdlID8/IGRhdGFPYmplY3QuTWVzc2FnZSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgRXJyb3JDdG9yID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IoZXJyb3JTY2hlbWFbMV0pLmdldEVycm9yQ3RvcihlcnJvclNjaGVtYSkgPz8gRXJyb3I7XG4gICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBFcnJvckN0b3IobWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVzZXJpYWxpemVIdHRwTWVzc2FnZShlcnJvclNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWVtYmVyXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBtZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCkuanNvbk5hbWUgPz8gbmFtZTtcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IHRoaXMuY29kZWMuY3JlYXRlRGVzZXJpYWxpemVyKCkucmVhZE9iamVjdChtZW1iZXIsIGRhdGFPYmplY3RbdGFyZ2V0XSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgdGhpcy5taXhpbi5kZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oT2JqZWN0LmFzc2lnbihleGNlcHRpb24sIGVycm9yTWV0YWRhdGEsIHtcbiAgICAgICAgICAgICRmYXVsdDogbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuZXJyb3IsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICB9LCBvdXRwdXQpLCBkYXRhT2JqZWN0KTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgfVxufVxuXG5jb25zdCBhd3NFeHBlY3RVbmlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJfX3R5cGVcIiBpbiB2YWx1ZSkge1xuICAgICAgICBkZWxldGUgdmFsdWUuX190eXBlO1xuICAgIH1cbiAgICByZXR1cm4gc21pdGh5Q2xpZW50LmV4cGVjdFVuaW9uKHZhbHVlKTtcbn07XG5cbmNsYXNzIFhtbFNoYXBlRGVzZXJpYWxpemVyIGV4dGVuZHMgU2VyZGVDb250ZXh0Q29uZmlnIHtcbiAgICBzZXR0aW5ncztcbiAgICBzdHJpbmdEZXNlcmlhbGl6ZXI7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICAgICB0aGlzLnN0cmluZ0Rlc2VyaWFsaXplciA9IG5ldyBwcm90b2NvbHMuRnJvbVN0cmluZ1NoYXBlRGVzZXJpYWxpemVyKHNldHRpbmdzKTtcbiAgICB9XG4gICAgc2V0U2VyZGVDb250ZXh0KHNlcmRlQ29udGV4dCkge1xuICAgICAgICB0aGlzLnNlcmRlQ29udGV4dCA9IHNlcmRlQ29udGV4dDtcbiAgICAgICAgdGhpcy5zdHJpbmdEZXNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHNlcmRlQ29udGV4dCk7XG4gICAgfVxuICAgIHJlYWQoc2NoZW1hJDEsIGJ5dGVzLCBrZXkpIHtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSk7XG4gICAgICAgIGNvbnN0IG1lbWJlclNjaGVtYXMgPSBucy5nZXRNZW1iZXJTY2hlbWFzKCk7XG4gICAgICAgIGNvbnN0IGlzRXZlbnRQYXlsb2FkID0gbnMuaXNTdHJ1Y3RTY2hlbWEoKSAmJlxuICAgICAgICAgICAgbnMuaXNNZW1iZXJTY2hlbWEoKSAmJlxuICAgICAgICAgICAgISFPYmplY3QudmFsdWVzKG1lbWJlclNjaGVtYXMpLmZpbmQoKG1lbWJlck5zKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhbWVtYmVyTnMuZ2V0TWVtYmVyVHJhaXRzKCkuZXZlbnRQYXlsb2FkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0V2ZW50UGF5bG9hZCkge1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJOYW1lID0gT2JqZWN0LmtleXMobWVtYmVyU2NoZW1hcylbMF07XG4gICAgICAgICAgICBjb25zdCBldmVudE1lbWJlclNjaGVtYSA9IG1lbWJlclNjaGVtYXNbbWVtYmVyTmFtZV07XG4gICAgICAgICAgICBpZiAoZXZlbnRNZW1iZXJTY2hlbWEuaXNCbG9iU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbbWVtYmVyTmFtZV0gPSBieXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG91dHB1dFttZW1iZXJOYW1lXSA9IHRoaXMucmVhZChtZW1iZXJTY2hlbWFzW21lbWJlck5hbWVdLCBieXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHhtbFN0cmluZyA9ICh0aGlzLnNlcmRlQ29udGV4dD8udXRmOEVuY29kZXIgPz8gdXRpbFV0ZjgudG9VdGY4KShieXRlcyk7XG4gICAgICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHRoaXMucGFyc2VYbWwoeG1sU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFNjaGVtYShzY2hlbWEkMSwga2V5ID8gcGFyc2VkT2JqZWN0W2tleV0gOiBwYXJzZWRPYmplY3QpO1xuICAgIH1cbiAgICByZWFkU2NoZW1hKF9zY2hlbWEsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoX3NjaGVtYSk7XG4gICAgICAgIGlmIChucy5pc1VuaXRTY2hlbWEoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYWl0cyA9IG5zLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICBpZiAobnMuaXNMaXN0U2NoZW1hKCkgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkU2NoZW1hKG5zLCBbdmFsdWVdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhdHJhaXRzLnNwYXJzZTtcbiAgICAgICAgICAgIGNvbnN0IGZsYXQgPSAhIXRyYWl0cy54bWxGbGF0dGVuZWQ7XG4gICAgICAgICAgICBpZiAobnMuaXNMaXN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0VmFsdWUgPSBucy5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUtleSA9IGxpc3RWYWx1ZS5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lID8/IFwibWVtYmVyXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZmxhdCA/IHZhbHVlIDogKHZhbHVlWzBdID8/IHZhbHVlKVtzb3VyY2VLZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUFycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogW3NvdXJjZV07XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHNvdXJjZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwgfHwgc3BhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucHVzaCh0aGlzLnJlYWRTY2hlbWEobGlzdFZhbHVlLCB2KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHt9O1xuICAgICAgICAgICAgaWYgKG5zLmlzTWFwU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlOcyA9IG5zLmdldEtleVNjaGVtYSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlck5zID0gbnMuZ2V0VmFsdWVTY2hlbWEoKTtcbiAgICAgICAgICAgICAgICBsZXQgZW50cmllcztcbiAgICAgICAgICAgICAgICBpZiAoZmxhdCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5lbnRyeSkgPyB2YWx1ZS5lbnRyeSA6IFt2YWx1ZS5lbnRyeV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnR5ID0ga2V5TnMuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSA/PyBcImtleVwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlUHJvcGVydHkgPSBtZW1iZXJOcy5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lID8/IFwidmFsdWVcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZW50cnlba2V5UHJvcGVydHldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5W3ZhbHVlUHJvcGVydHldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCBzcGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrZXldID0gdGhpcy5yZWFkU2NoZW1hKG1lbWJlck5zLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChucy5pc1N0cnVjdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbbWVtYmVyTmFtZSwgbWVtYmVyU2NoZW1hXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlclRyYWl0cyA9IG1lbWJlclNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sT2JqZWN0S2V5ID0gIW1lbWJlclRyYWl0cy5odHRwUGF5bG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtZW1iZXJTY2hlbWEuZ2V0TWVtYmVyVHJhaXRzKCkueG1sTmFtZSA/PyBtZW1iZXJOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG1lbWJlclRyYWl0cy54bWxOYW1lID8/IG1lbWJlclNjaGVtYS5nZXROYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVt4bWxPYmplY3RLZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclttZW1iZXJOYW1lXSA9IHRoaXMucmVhZFNjaGVtYShtZW1iZXJTY2hlbWEsIHZhbHVlW3htbE9iamVjdEtleV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobnMuaXNEb2N1bWVudFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIHhtbCBkZXNlcmlhbGl6ZXIgdW5oYW5kbGVkIHNjaGVtYSB0eXBlIGZvciAke25zLmdldE5hbWUodHJ1ZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzTGlzdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzTWFwU2NoZW1hKCkgfHwgbnMuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmluZ0Rlc2VyaWFsaXplci5yZWFkKG5zLCB2YWx1ZSk7XG4gICAgfVxuICAgIHBhcnNlWG1sKHhtbCkge1xuICAgICAgICBpZiAoeG1sLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZE9iajtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkT2JqID0geG1sQnVpbGRlci5wYXJzZVhNTCh4bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiB0eXBlb2YgZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCIkcmVzcG9uc2VCb2R5VGV4dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeG1sLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHROb2RlTmFtZSA9IFwiI3RleHRcIjtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHBhcnNlZE9iailbMF07XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRPYmpUb1JldHVybiA9IHBhcnNlZE9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHBhcnNlZE9ialRvUmV0dXJuW3RleHROb2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBwYXJzZWRPYmpUb1JldHVybltrZXldID0gcGFyc2VkT2JqVG9SZXR1cm5bdGV4dE5vZGVOYW1lXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyc2VkT2JqVG9SZXR1cm5bdGV4dE5vZGVOYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzbWl0aHlDbGllbnQuZ2V0VmFsdWVGcm9tVGV4dE5vZGUocGFyc2VkT2JqVG9SZXR1cm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cbmNsYXNzIFF1ZXJ5U2hhcGVTZXJpYWxpemVyIGV4dGVuZHMgU2VyZGVDb250ZXh0Q29uZmlnIHtcbiAgICBzZXR0aW5ncztcbiAgICBidWZmZXI7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICB3cml0ZShzY2hlbWEkMSwgdmFsdWUsIHByZWZpeCA9IFwiXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKHNjaGVtYSQxKTtcbiAgICAgICAgaWYgKHByZWZpeCAmJiAhcHJlZml4LmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgcHJlZml4ICs9IFwiLlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0Jsb2JTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlS2V5KHByZWZpeCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKCh0aGlzLnNlcmRlQ29udGV4dD8uYmFzZTY0RW5jb2RlciA/PyB1dGlsQmFzZTY0LnRvQmFzZTY0KSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzQm9vbGVhblNjaGVtYSgpIHx8IG5zLmlzTnVtZXJpY1NjaGVtYSgpIHx8IG5zLmlzU3RyaW5nU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUtleShwcmVmaXgpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5zLmlzSWRlbXBvdGVuY3lUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUtleShwcmVmaXgpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShzZXJkZS5nZW5lcmF0ZUlkZW1wb3RlbmN5VG9rZW4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNCaWdJbnRlZ2VyU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUtleShwcmVmaXgpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc0JpZ0RlY2ltYWxTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlS2V5KHByZWZpeCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlIGluc3RhbmNlb2Ygc2VyZGUuTnVtZXJpY1ZhbHVlID8gdmFsdWUuc3RyaW5nIDogU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNUaW1lc3RhbXBTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVLZXkocHJlZml4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBwcm90b2NvbHMuZGV0ZXJtaW5lVGltZXN0YW1wRm9ybWF0KG5zLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodmFsdWUudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiLjAwMFpcIiwgXCJaXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoc21pdGh5Q2xpZW50LmRhdGVUb1V0Y1N0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShTdHJpbmcodmFsdWUuZ2V0VGltZSgpIC8gMTAwMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzRG9jdW1lbnRTY2hlbWEoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIFF1ZXJ5U2VyaWFsaXplciB1bnN1cHBvcnRlZCBkb2N1bWVudCB0eXBlICR7bnMuZ2V0TmFtZSh0cnVlKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc0xpc3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5zZXJpYWxpemVFbXB0eUxpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlS2V5KHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXQgPSB0aGlzLnNldHRpbmdzLmZsYXR0ZW5MaXN0cyB8fCBucy5nZXRNZXJnZWRUcmFpdHMoKS54bWxGbGF0dGVuZWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSB0aGlzLmdldEtleShcIm1lbWJlclwiLCBtZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBmbGF0ID8gYCR7cHJlZml4fSR7aX1gIDogYCR7cHJlZml4fSR7c3VmZml4fS4ke2l9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGUobWVtYmVyLCBpdGVtLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzTWFwU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlTY2hlbWEgPSBucy5nZXRLZXlTY2hlbWEoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJTY2hlbWEgPSBucy5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYXQgPSBucy5nZXRNZXJnZWRUcmFpdHMoKS54bWxGbGF0dGVuZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlTdWZmaXggPSB0aGlzLmdldEtleShcImtleVwiLCBrZXlTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGZsYXQgPyBgJHtwcmVmaXh9JHtpfS4ke2tleVN1ZmZpeH1gIDogYCR7cHJlZml4fWVudHJ5LiR7aX0uJHtrZXlTdWZmaXh9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTdWZmaXggPSB0aGlzLmdldEtleShcInZhbHVlXCIsIG1lbWJlclNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBmbGF0ID8gYCR7cHJlZml4fSR7aX0uJHt2YWx1ZVN1ZmZpeH1gIDogYCR7cHJlZml4fWVudHJ5LiR7aX0uJHt2YWx1ZVN1ZmZpeH1gO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlKGtleVNjaGVtYSwgaywga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZShtZW1iZXJTY2hlbWEsIHYsIHZhbHVlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc1N0cnVjdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbbWVtYmVyTmFtZSwgbWVtYmVyXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVttZW1iZXJOYW1lXSA9PSBudWxsICYmICFtZW1iZXIuaXNJZGVtcG90ZW5jeVRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IHRoaXMuZ2V0S2V5KG1lbWJlck5hbWUsIG1lbWJlci5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYCR7cHJlZml4fSR7c3VmZml4fWA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGUobWVtYmVyLCB2YWx1ZVttZW1iZXJOYW1lXSwga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNVbml0U2NoZW1hKCkpIDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBhd3Mtc2RrL2NvcmUvcHJvdG9jb2xzIC0gUXVlcnlTZXJpYWxpemVyIHVucmVjb2duaXplZCBzY2hlbWEgdHlwZSAke25zLmdldE5hbWUodHJ1ZSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIFF1ZXJ5U2VyaWFsaXplciBjYW5ub3QgZmx1c2ggd2l0aCBub3RoaW5nIHdyaXR0ZW4gdG8gYnVmZmVyLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgZGVsZXRlIHRoaXMuYnVmZmVyO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBnZXRLZXkobWVtYmVyTmFtZSwgeG1sTmFtZSkge1xuICAgICAgICBjb25zdCBrZXkgPSB4bWxOYW1lID8/IG1lbWJlck5hbWU7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLmNhcGl0YWxpemVLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5WzBdLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgd3JpdGVLZXkoa2V5KSB7XG4gICAgICAgIGlmIChrZXkuZW5kc1dpdGgoXCIuXCIpKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyICs9IGAmJHtwcm90b2NvbHMuZXh0ZW5kZWRFbmNvZGVVUklDb21wb25lbnQoa2V5KX09YDtcbiAgICB9XG4gICAgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLmJ1ZmZlciArPSBwcm90b2NvbHMuZXh0ZW5kZWRFbmNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbn1cblxuY2xhc3MgQXdzUXVlcnlQcm90b2NvbCBleHRlbmRzIHByb3RvY29scy5ScGNQcm90b2NvbCB7XG4gICAgb3B0aW9ucztcbiAgICBzZXJpYWxpemVyO1xuICAgIGRlc2VyaWFsaXplcjtcbiAgICBtaXhpbiA9IG5ldyBQcm90b2NvbExpYigpO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZTogb3B0aW9ucy5kZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB0aW1lc3RhbXBGb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICB1c2VUcmFpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGh0dHBCaW5kaW5nczogZmFsc2UsXG4gICAgICAgICAgICB4bWxOYW1lc3BhY2U6IG9wdGlvbnMueG1sTmFtZXNwYWNlLFxuICAgICAgICAgICAgc2VydmljZU5hbWVzcGFjZTogb3B0aW9ucy5kZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICAgICAgc2VyaWFsaXplRW1wdHlMaXN0czogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gbmV3IFF1ZXJ5U2hhcGVTZXJpYWxpemVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZXIgPSBuZXcgWG1sU2hhcGVEZXNlcmlhbGl6ZXIoc2V0dGluZ3MpO1xuICAgIH1cbiAgICBnZXRTaGFwZUlkKCkge1xuICAgICAgICByZXR1cm4gXCJhd3MucHJvdG9jb2xzI2F3c1F1ZXJ5XCI7XG4gICAgfVxuICAgIHNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyLnNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpO1xuICAgICAgICB0aGlzLmRlc2VyaWFsaXplci5zZXRTZXJkZUNvbnRleHQoc2VyZGVDb250ZXh0KTtcbiAgICB9XG4gICAgZ2V0UGF5bG9hZENvZGVjKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBV1NRdWVyeSBwcm90b2NvbCBoYXMgbm8gcGF5bG9hZCBjb2RlYy5cIik7XG4gICAgfVxuICAgIGFzeW5jIHNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgc3VwZXIuc2VyaWFsaXplUmVxdWVzdChvcGVyYXRpb25TY2hlbWEsIGlucHV0LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LnBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnBhdGggKz0gXCIvXCI7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0LmhlYWRlcnMsIHtcbiAgICAgICAgICAgIFwiY29udGVudC10eXBlXCI6IGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNjaGVtYS5kZXJlZihvcGVyYXRpb25TY2hlbWEuaW5wdXQpID09PSBcInVuaXRcIiB8fCAhcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IG9wZXJhdGlvblNjaGVtYS5uYW1lLnNwbGl0KFwiI1wiKVsxXSA/PyBvcGVyYXRpb25TY2hlbWEubmFtZTtcbiAgICAgICAgcmVxdWVzdC5ib2R5ID0gYEFjdGlvbj0ke2FjdGlvbn0mVmVyc2lvbj0ke3RoaXMub3B0aW9ucy52ZXJzaW9ufWAgKyByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkuZW5kc1dpdGgoXCImXCIpKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSByZXF1ZXN0LmJvZHkuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICBhc3luYyBkZXNlcmlhbGl6ZVJlc3BvbnNlKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gdGhpcy5kZXNlcmlhbGl6ZXI7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yob3BlcmF0aW9uU2NoZW1hLm91dHB1dCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3QgPSB7fTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMzAwKSB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IGF3YWl0IHByb3RvY29scy5jb2xsZWN0Qm9keShyZXNwb25zZS5ib2R5LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChieXRlcy5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YU9iamVjdCwgYXdhaXQgZGVzZXJpYWxpemVyLnJlYWQoMTUsIGJ5dGVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIHRoaXMuZGVzZXJpYWxpemVNZXRhZGF0YShyZXNwb25zZSkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UuaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICAgICAgZGVsZXRlIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2hvcnROYW1lID0gb3BlcmF0aW9uU2NoZW1hLm5hbWUuc3BsaXQoXCIjXCIpWzFdID8/IG9wZXJhdGlvblNjaGVtYS5uYW1lO1xuICAgICAgICBjb25zdCBhd3NRdWVyeVJlc3VsdEtleSA9IG5zLmlzU3RydWN0U2NoZW1hKCkgJiYgdGhpcy51c2VOZXN0ZWRSZXN1bHQoKSA/IHNob3J0TmFtZSArIFwiUmVzdWx0XCIgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgcHJvdG9jb2xzLmNvbGxlY3RCb2R5KHJlc3BvbnNlLmJvZHksIGNvbnRleHQpO1xuICAgICAgICBpZiAoYnl0ZXMuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGF0YU9iamVjdCwgYXdhaXQgZGVzZXJpYWxpemVyLnJlYWQobnMsIGJ5dGVzLCBhd3NRdWVyeVJlc3VsdEtleSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgICAgICRtZXRhZGF0YTogdGhpcy5kZXNlcmlhbGl6ZU1ldGFkYXRhKHJlc3BvbnNlKSxcbiAgICAgICAgICAgIC4uLmRhdGFPYmplY3QsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIHVzZU5lc3RlZFJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZUVycm9yKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySWRlbnRpZmllciA9IHRoaXMubG9hZFF1ZXJ5RXJyb3JDb2RlKHJlc3BvbnNlLCBkYXRhT2JqZWN0KSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gdGhpcy5sb2FkUXVlcnlFcnJvcihkYXRhT2JqZWN0KTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubG9hZFF1ZXJ5RXJyb3JNZXNzYWdlKGRhdGFPYmplY3QpO1xuICAgICAgICBlcnJvckRhdGEubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIGVycm9yRGF0YS5FcnJvciA9IHtcbiAgICAgICAgICAgIFR5cGU6IGVycm9yRGF0YS5UeXBlLFxuICAgICAgICAgICAgQ29kZTogZXJyb3JEYXRhLkNvZGUsXG4gICAgICAgICAgICBNZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVycm9yU2NoZW1hLCBlcnJvck1ldGFkYXRhIH0gPSBhd2FpdCB0aGlzLm1peGluLmdldEVycm9yU2NoZW1hT3JUaHJvd0Jhc2VFeGNlcHRpb24oZXJyb3JJZGVudGlmaWVyLCB0aGlzLm9wdGlvbnMuZGVmYXVsdE5hbWVzcGFjZSwgcmVzcG9uc2UsIGVycm9yRGF0YSwgbWV0YWRhdGEsIChyZWdpc3RyeSwgZXJyb3JOYW1lKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RyeS5nZXRTY2hlbWEoZXJyb3JOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmZpbmQoKHNjaGVtYSQxKSA9PiBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSkuZ2V0TWVyZ2VkVHJhaXRzKCkuYXdzUXVlcnlFcnJvcj8uWzBdID09PSBlcnJvck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihlcnJvclNjaGVtYSk7XG4gICAgICAgIGNvbnN0IEVycm9yQ3RvciA9IHNjaGVtYS5UeXBlUmVnaXN0cnkuZm9yKGVycm9yU2NoZW1hWzFdKS5nZXRFcnJvckN0b3IoZXJyb3JTY2hlbWEpID8/IEVycm9yO1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgRXJyb3JDdG9yKG1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgICAgICBFcnJvcjogZXJyb3JEYXRhLkVycm9yLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtZW1iZXJdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG1lbWJlci5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lID8/IG5hbWU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVycm9yRGF0YVt0YXJnZXRdID8/IGRhdGFPYmplY3RbdGFyZ2V0XTtcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IHRoaXMuZGVzZXJpYWxpemVyLnJlYWRTY2hlbWEobWVtYmVyLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgdGhpcy5taXhpbi5kZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oT2JqZWN0LmFzc2lnbihleGNlcHRpb24sIGVycm9yTWV0YWRhdGEsIHtcbiAgICAgICAgICAgICRmYXVsdDogbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuZXJyb3IsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICB9LCBvdXRwdXQpLCBkYXRhT2JqZWN0KTtcbiAgICB9XG4gICAgbG9hZFF1ZXJ5RXJyb3JDb2RlKG91dHB1dCwgZGF0YSkge1xuICAgICAgICBjb25zdCBjb2RlID0gKGRhdGEuRXJyb3JzPy5bMF0/LkVycm9yID8/IGRhdGEuRXJyb3JzPy5FcnJvciA/PyBkYXRhLkVycm9yKT8uQ29kZTtcbiAgICAgICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dHB1dC5zdGF0dXNDb2RlID09IDQwNCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiTm90Rm91bmRcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsb2FkUXVlcnlFcnJvcihkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhLkVycm9ycz8uWzBdPy5FcnJvciA/PyBkYXRhLkVycm9ycz8uRXJyb3IgPz8gZGF0YS5FcnJvcjtcbiAgICB9XG4gICAgbG9hZFF1ZXJ5RXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gdGhpcy5sb2FkUXVlcnlFcnJvcihkYXRhKTtcbiAgICAgICAgcmV0dXJuIGVycm9yRGF0YT8ubWVzc2FnZSA/PyBlcnJvckRhdGE/Lk1lc3NhZ2UgPz8gZGF0YS5tZXNzYWdlID8/IGRhdGEuTWVzc2FnZSA/PyBcIlVua25vd25cIjtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIjtcbiAgICB9XG59XG5cbmNsYXNzIEF3c0VjMlF1ZXJ5UHJvdG9jb2wgZXh0ZW5kcyBBd3NRdWVyeVByb3RvY29sIHtcbiAgICBvcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGVjMlNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2FwaXRhbGl6ZUtleXM6IHRydWUsXG4gICAgICAgICAgICBmbGF0dGVuTGlzdHM6IHRydWUsXG4gICAgICAgICAgICBzZXJpYWxpemVFbXB0eUxpc3RzOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNlcmlhbGl6ZXIuc2V0dGluZ3MsIGVjMlNldHRpbmdzKTtcbiAgICB9XG4gICAgdXNlTmVzdGVkUmVzdWx0KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5jb25zdCBwYXJzZVhtbEJvZHkgPSAoc3RyZWFtQm9keSwgY29udGV4dCkgPT4gY29sbGVjdEJvZHlTdHJpbmcoc3RyZWFtQm9keSwgY29udGV4dCkudGhlbigoZW5jb2RlZCkgPT4ge1xuICAgIGlmIChlbmNvZGVkLmxlbmd0aCkge1xuICAgICAgICBsZXQgcGFyc2VkT2JqO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkT2JqID0geG1sQnVpbGRlci5wYXJzZVhNTChlbmNvZGVkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgJiYgdHlwZW9mIGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCIkcmVzcG9uc2VCb2R5VGV4dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbmNvZGVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0Tm9kZU5hbWUgPSBcIiN0ZXh0XCI7XG4gICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHBhcnNlZE9iailbMF07XG4gICAgICAgIGNvbnN0IHBhcnNlZE9ialRvUmV0dXJuID0gcGFyc2VkT2JqW2tleV07XG4gICAgICAgIGlmIChwYXJzZWRPYmpUb1JldHVyblt0ZXh0Tm9kZU5hbWVdKSB7XG4gICAgICAgICAgICBwYXJzZWRPYmpUb1JldHVybltrZXldID0gcGFyc2VkT2JqVG9SZXR1cm5bdGV4dE5vZGVOYW1lXTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJzZWRPYmpUb1JldHVyblt0ZXh0Tm9kZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbWl0aHlDbGllbnQuZ2V0VmFsdWVGcm9tVGV4dE5vZGUocGFyc2VkT2JqVG9SZXR1cm4pO1xuICAgIH1cbiAgICByZXR1cm4ge307XG59KTtcbmNvbnN0IHBhcnNlWG1sRXJyb3JCb2R5ID0gYXN5bmMgKGVycm9yQm9keSwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFyc2VYbWxCb2R5KGVycm9yQm9keSwgY29udGV4dCk7XG4gICAgaWYgKHZhbHVlLkVycm9yKSB7XG4gICAgICAgIHZhbHVlLkVycm9yLm1lc3NhZ2UgPSB2YWx1ZS5FcnJvci5tZXNzYWdlID8/IHZhbHVlLkVycm9yLk1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG5jb25zdCBsb2FkUmVzdFhtbEVycm9yQ29kZSA9IChvdXRwdXQsIGRhdGEpID0+IHtcbiAgICBpZiAoZGF0YT8uRXJyb3I/LkNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGF0YS5FcnJvci5Db2RlO1xuICAgIH1cbiAgICBpZiAoZGF0YT8uQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkYXRhLkNvZGU7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3RhdHVzQ29kZSA9PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIFwiTm90Rm91bmRcIjtcbiAgICB9XG59O1xuXG5jbGFzcyBYbWxTaGFwZVNlcmlhbGl6ZXIgZXh0ZW5kcyBTZXJkZUNvbnRleHRDb25maWcge1xuICAgIHNldHRpbmdzO1xuICAgIHN0cmluZ0J1ZmZlcjtcbiAgICBieXRlQnVmZmVyO1xuICAgIGJ1ZmZlcjtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgfVxuICAgIHdyaXRlKHNjaGVtYSQxLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKHNjaGVtYSQxKTtcbiAgICAgICAgaWYgKG5zLmlzU3RyaW5nU2NoZW1hKCkgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmluZ0J1ZmZlciA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzQmxvYlNjaGVtYSgpKSB7XG4gICAgICAgICAgICB0aGlzLmJ5dGVCdWZmZXIgPVxuICAgICAgICAgICAgICAgIFwiYnl0ZUxlbmd0aFwiIGluIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiAodGhpcy5zZXJkZUNvbnRleHQ/LmJhc2U2NERlY29kZXIgPz8gdXRpbEJhc2U2NC5mcm9tQmFzZTY0KSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMud3JpdGVTdHJ1Y3QobnMsIHZhbHVlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgdHJhaXRzID0gbnMuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgICAgICBpZiAodHJhaXRzLmh0dHBQYXlsb2FkICYmICF0cmFpdHMueG1sTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLndpdGhOYW1lKG5zLmdldE5hbWUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLmJ5dGVCdWZmZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVCdWZmZXI7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ieXRlQnVmZmVyO1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0cmluZ0J1ZmZlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSB0aGlzLnN0cmluZ0J1ZmZlcjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0cmluZ0J1ZmZlcjtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnhtbE5hbWVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKCFidWZmZXI/LmF0dHJpYnV0ZXM/LltcInhtbG5zXCJdKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyLmFkZEF0dHJpYnV0ZShcInhtbG5zXCIsIHRoaXMuc2V0dGluZ3MueG1sTmFtZXNwYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5idWZmZXI7XG4gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgd3JpdGVTdHJ1Y3QobnMsIHZhbHVlLCBwYXJlbnRYbWxucykge1xuICAgICAgICBjb25zdCB0cmFpdHMgPSBucy5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IG5zLmlzTWVtYmVyU2NoZW1hKCkgJiYgIXRyYWl0cy5odHRwUGF5bG9hZFxuICAgICAgICAgICAgPyBucy5nZXRNZW1iZXJUcmFpdHMoKS54bWxOYW1lID8/IG5zLmdldE1lbWJlck5hbWUoKVxuICAgICAgICAgICAgOiB0cmFpdHMueG1sTmFtZSA/PyBucy5nZXROYW1lKCk7XG4gICAgICAgIGlmICghbmFtZSB8fCAhbnMuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIHhtbCBzZXJpYWxpemVyLCBjYW5ub3Qgd3JpdGUgc3RydWN0IHdpdGggZW1wdHkgbmFtZSBvciBub24tc3RydWN0LCBzY2hlbWE9JHtucy5nZXROYW1lKHRydWUpfS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJ1Y3RYbWxOb2RlID0geG1sQnVpbGRlci5YbWxOb2RlLm9mKG5hbWUpO1xuICAgICAgICBjb25zdCBbeG1sbnNBdHRyLCB4bWxuc10gPSB0aGlzLmdldFhtbG5zQXR0cmlidXRlKG5zLCBwYXJlbnRYbWxucyk7XG4gICAgICAgIGZvciAoY29uc3QgW21lbWJlck5hbWUsIG1lbWJlclNjaGVtYV0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gdmFsdWVbbWVtYmVyTmFtZV07XG4gICAgICAgICAgICBpZiAodmFsICE9IG51bGwgfHwgbWVtYmVyU2NoZW1hLmlzSWRlbXBvdGVuY3lUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lbWJlclNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKS54bWxBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0WG1sTm9kZS5hZGRBdHRyaWJ1dGUobWVtYmVyU2NoZW1hLmdldE1lcmdlZFRyYWl0cygpLnhtbE5hbWUgPz8gbWVtYmVyTmFtZSwgdGhpcy53cml0ZVNpbXBsZShtZW1iZXJTY2hlbWEsIHZhbCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lbWJlclNjaGVtYS5pc0xpc3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTGlzdChtZW1iZXJTY2hlbWEsIHZhbCwgc3RydWN0WG1sTm9kZSwgeG1sbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZW1iZXJTY2hlbWEuaXNNYXBTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlTWFwKG1lbWJlclNjaGVtYSwgdmFsLCBzdHJ1Y3RYbWxOb2RlLCB4bWxucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lbWJlclNjaGVtYS5pc1N0cnVjdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdFhtbE5vZGUuYWRkQ2hpbGROb2RlKHRoaXMud3JpdGVTdHJ1Y3QobWVtYmVyU2NoZW1hLCB2YWwsIHhtbG5zKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJOb2RlID0geG1sQnVpbGRlci5YbWxOb2RlLm9mKG1lbWJlclNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lID8/IG1lbWJlclNjaGVtYS5nZXRNZW1iZXJOYW1lKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2ltcGxlSW50byhtZW1iZXJTY2hlbWEsIHZhbCwgbWVtYmVyTm9kZSwgeG1sbnMpO1xuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RYbWxOb2RlLmFkZENoaWxkTm9kZShtZW1iZXJOb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHhtbG5zKSB7XG4gICAgICAgICAgICBzdHJ1Y3RYbWxOb2RlLmFkZEF0dHJpYnV0ZSh4bWxuc0F0dHIsIHhtbG5zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RydWN0WG1sTm9kZTtcbiAgICB9XG4gICAgd3JpdGVMaXN0KGxpc3RNZW1iZXIsIGFycmF5LCBjb250YWluZXIsIHBhcmVudFhtbG5zKSB7XG4gICAgICAgIGlmICghbGlzdE1lbWJlci5pc01lbWJlclNjaGVtYSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBhd3Mtc2RrL2NvcmUvcHJvdG9jb2xzIC0geG1sIHNlcmlhbGl6ZXIsIGNhbm5vdCB3cml0ZSBub24tbWVtYmVyIGxpc3Q6ICR7bGlzdE1lbWJlci5nZXROYW1lKHRydWUpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpc3RUcmFpdHMgPSBsaXN0TWVtYmVyLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICBjb25zdCBsaXN0VmFsdWVTY2hlbWEgPSBsaXN0TWVtYmVyLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgIGNvbnN0IGxpc3RWYWx1ZVRyYWl0cyA9IGxpc3RWYWx1ZVNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgY29uc3Qgc3BhcnNlID0gISFsaXN0VmFsdWVUcmFpdHMuc3BhcnNlO1xuICAgICAgICBjb25zdCBmbGF0ID0gISFsaXN0VHJhaXRzLnhtbEZsYXR0ZW5lZDtcbiAgICAgICAgY29uc3QgW3htbG5zQXR0ciwgeG1sbnNdID0gdGhpcy5nZXRYbWxuc0F0dHJpYnV0ZShsaXN0TWVtYmVyLCBwYXJlbnRYbWxucyk7XG4gICAgICAgIGNvbnN0IHdyaXRlSXRlbSA9IChjb250YWluZXIsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAobGlzdFZhbHVlU2NoZW1hLmlzTGlzdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3QobGlzdFZhbHVlU2NoZW1hLCBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSwgY29udGFpbmVyLCB4bWxucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaXN0VmFsdWVTY2hlbWEuaXNNYXBTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVNYXAobGlzdFZhbHVlU2NoZW1hLCB2YWx1ZSwgY29udGFpbmVyLCB4bWxucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChsaXN0VmFsdWVTY2hlbWEuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCA9IHRoaXMud3JpdGVTdHJ1Y3QobGlzdFZhbHVlU2NoZW1hLCB2YWx1ZSwgeG1sbnMpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZE5vZGUoc3RydWN0LndpdGhOYW1lKGZsYXQgPyBsaXN0VHJhaXRzLnhtbE5hbWUgPz8gbGlzdE1lbWJlci5nZXRNZW1iZXJOYW1lKCkgOiBsaXN0VmFsdWVUcmFpdHMueG1sTmFtZSA/PyBcIm1lbWJlclwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbU5vZGUgPSB4bWxCdWlsZGVyLlhtbE5vZGUub2YoZmxhdCA/IGxpc3RUcmFpdHMueG1sTmFtZSA/PyBsaXN0TWVtYmVyLmdldE1lbWJlck5hbWUoKSA6IGxpc3RWYWx1ZVRyYWl0cy54bWxOYW1lID8/IFwibWVtYmVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTaW1wbGVJbnRvKGxpc3RWYWx1ZVNjaGVtYSwgdmFsdWUsIGxpc3RJdGVtTm9kZSwgeG1sbnMpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZE5vZGUobGlzdEl0ZW1Ob2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZsYXQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhcnNlIHx8IHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVJdGVtKGNvbnRhaW5lciwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3ROb2RlID0geG1sQnVpbGRlci5YbWxOb2RlLm9mKGxpc3RUcmFpdHMueG1sTmFtZSA/PyBsaXN0TWVtYmVyLmdldE1lbWJlck5hbWUoKSk7XG4gICAgICAgICAgICBpZiAoeG1sbnMpIHtcbiAgICAgICAgICAgICAgICBsaXN0Tm9kZS5hZGRBdHRyaWJ1dGUoeG1sbnNBdHRyLCB4bWxucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYXJzZSB8fCB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlSXRlbShsaXN0Tm9kZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZE5vZGUobGlzdE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdyaXRlTWFwKG1hcE1lbWJlciwgbWFwLCBjb250YWluZXIsIHBhcmVudFhtbG5zLCBjb250YWluZXJJc01hcCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghbWFwTWVtYmVyLmlzTWVtYmVyU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSB4bWwgc2VyaWFsaXplciwgY2Fubm90IHdyaXRlIG5vbi1tZW1iZXIgbWFwOiAke21hcE1lbWJlci5nZXROYW1lKHRydWUpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcFRyYWl0cyA9IG1hcE1lbWJlci5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgY29uc3QgbWFwS2V5U2NoZW1hID0gbWFwTWVtYmVyLmdldEtleVNjaGVtYSgpO1xuICAgICAgICBjb25zdCBtYXBLZXlUcmFpdHMgPSBtYXBLZXlTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgIGNvbnN0IGtleVRhZyA9IG1hcEtleVRyYWl0cy54bWxOYW1lID8/IFwia2V5XCI7XG4gICAgICAgIGNvbnN0IG1hcFZhbHVlU2NoZW1hID0gbWFwTWVtYmVyLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgIGNvbnN0IG1hcFZhbHVlVHJhaXRzID0gbWFwVmFsdWVTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgIGNvbnN0IHZhbHVlVGFnID0gbWFwVmFsdWVUcmFpdHMueG1sTmFtZSA/PyBcInZhbHVlXCI7XG4gICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbWFwVmFsdWVUcmFpdHMuc3BhcnNlO1xuICAgICAgICBjb25zdCBmbGF0ID0gISFtYXBUcmFpdHMueG1sRmxhdHRlbmVkO1xuICAgICAgICBjb25zdCBbeG1sbnNBdHRyLCB4bWxuc10gPSB0aGlzLmdldFhtbG5zQXR0cmlidXRlKG1hcE1lbWJlciwgcGFyZW50WG1sbnMpO1xuICAgICAgICBjb25zdCBhZGRLZXlWYWx1ZSA9IChlbnRyeSwga2V5LCB2YWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleU5vZGUgPSB4bWxCdWlsZGVyLlhtbE5vZGUub2Yoa2V5VGFnLCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgW2tleVhtbG5zQXR0ciwga2V5WG1sbnNdID0gdGhpcy5nZXRYbWxuc0F0dHJpYnV0ZShtYXBLZXlTY2hlbWEsIHhtbG5zKTtcbiAgICAgICAgICAgIGlmIChrZXlYbWxucykge1xuICAgICAgICAgICAgICAgIGtleU5vZGUuYWRkQXR0cmlidXRlKGtleVhtbG5zQXR0ciwga2V5WG1sbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkuYWRkQ2hpbGROb2RlKGtleU5vZGUpO1xuICAgICAgICAgICAgbGV0IHZhbHVlTm9kZSA9IHhtbEJ1aWxkZXIuWG1sTm9kZS5vZih2YWx1ZVRhZyk7XG4gICAgICAgICAgICBpZiAobWFwVmFsdWVTY2hlbWEuaXNMaXN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlTGlzdChtYXBWYWx1ZVNjaGVtYSwgdmFsLCB2YWx1ZU5vZGUsIHhtbG5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcFZhbHVlU2NoZW1hLmlzTWFwU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlTWFwKG1hcFZhbHVlU2NoZW1hLCB2YWwsIHZhbHVlTm9kZSwgeG1sbnMsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwVmFsdWVTY2hlbWEuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlTm9kZSA9IHRoaXMud3JpdGVTdHJ1Y3QobWFwVmFsdWVTY2hlbWEsIHZhbCwgeG1sbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVNpbXBsZUludG8obWFwVmFsdWVTY2hlbWEsIHZhbCwgdmFsdWVOb2RlLCB4bWxucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5hZGRDaGlsZE5vZGUodmFsdWVOb2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZsYXQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYXJzZSB8fCB2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHhtbEJ1aWxkZXIuWG1sTm9kZS5vZihtYXBUcmFpdHMueG1sTmFtZSA/PyBtYXBNZW1iZXIuZ2V0TWVtYmVyTmFtZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkS2V5VmFsdWUoZW50cnksIGtleSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZENoaWxkTm9kZShlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcE5vZGU7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lcklzTWFwKSB7XG4gICAgICAgICAgICAgICAgbWFwTm9kZSA9IHhtbEJ1aWxkZXIuWG1sTm9kZS5vZihtYXBUcmFpdHMueG1sTmFtZSA/PyBtYXBNZW1iZXIuZ2V0TWVtYmVyTmFtZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoeG1sbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwTm9kZS5hZGRBdHRyaWJ1dGUoeG1sbnNBdHRyLCB4bWxucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZE5vZGUobWFwTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFyc2UgfHwgdmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB4bWxCdWlsZGVyLlhtbE5vZGUub2YoXCJlbnRyeVwiKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkS2V5VmFsdWUoZW50cnksIGtleSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5lcklzTWFwID8gY29udGFpbmVyIDogbWFwTm9kZSkuYWRkQ2hpbGROb2RlKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgd3JpdGVTaW1wbGUoX3NjaGVtYSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIChYTUwgc2VyaWFsaXplcikgY2Fubm90IHdyaXRlIG51bGwgdmFsdWUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoX3NjaGVtYSk7XG4gICAgICAgIGxldCBub2RlQ29udGVudHMgPSBudWxsO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAobnMuaXNCbG9iU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBub2RlQ29udGVudHMgPSAodGhpcy5zZXJkZUNvbnRleHQ/LmJhc2U2NEVuY29kZXIgPz8gdXRpbEJhc2U2NC50b0Jhc2U2NCkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnMuaXNUaW1lc3RhbXBTY2hlbWEoKSAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXQgPSBwcm90b2NvbHMuZGV0ZXJtaW5lVGltZXN0YW1wRm9ybWF0KG5zLCB0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlQ29udGVudHMgPSB2YWx1ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoXCIuMDAwWlwiLCBcIlpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gc21pdGh5Q2xpZW50LmRhdGVUb1V0Y1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gU3RyaW5nKHZhbHVlLmdldFRpbWUoKSAvIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJNaXNzaW5nIHRpbWVzdGFtcCBmb3JtYXQsIHVzaW5nIGh0dHAgZGF0ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlQ29udGVudHMgPSBzbWl0aHlDbGllbnQuZGF0ZVRvVXRjU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5zLmlzQmlnRGVjaW1hbFNjaGVtYSgpICYmIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygc2VyZGUuTnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdHJpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnMuaXNNYXBTY2hlbWEoKSB8fCBucy5pc0xpc3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkBhd3Mtc2RrL2NvcmUvcHJvdG9jb2xzIC0geG1sIHNlcmlhbGl6ZXIsIGNhbm5vdCBjYWxsIF93cml0ZSgpIG9uIExpc3QvTWFwIHNjaGVtYSwgY2FsbCB3cml0ZUxpc3Qgb3Igd3JpdGVNYXAoKSBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSB4bWwgc2VyaWFsaXplciwgdW5oYW5kbGVkIHNjaGVtYSB0eXBlIGZvciBvYmplY3QgdmFsdWUgYW5kIHNjaGVtYTogJHtucy5nZXROYW1lKHRydWUpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0Jvb2xlYW5TY2hlbWEoKSB8fCBucy5pc051bWVyaWNTY2hlbWEoKSB8fCBucy5pc0JpZ0ludGVnZXJTY2hlbWEoKSB8fCBucy5pc0JpZ0RlY2ltYWxTY2hlbWEoKSkge1xuICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNTdHJpbmdTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbnMuaXNJZGVtcG90ZW5jeVRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICBub2RlQ29udGVudHMgPSBzZXJkZS5nZW5lcmF0ZUlkZW1wb3RlbmN5VG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGVDb250ZW50cyA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVDb250ZW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgc2NoZW1hLXZhbHVlIHBhaXIgJHtucy5nZXROYW1lKHRydWUpfT0ke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlQ29udGVudHM7XG4gICAgfVxuICAgIHdyaXRlU2ltcGxlSW50byhfc2NoZW1hLCB2YWx1ZSwgaW50bywgcGFyZW50WG1sbnMpIHtcbiAgICAgICAgY29uc3Qgbm9kZUNvbnRlbnRzID0gdGhpcy53cml0ZVNpbXBsZShfc2NoZW1hLCB2YWx1ZSk7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoX3NjaGVtYSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBuZXcgeG1sQnVpbGRlci5YbWxUZXh0KG5vZGVDb250ZW50cyk7XG4gICAgICAgIGNvbnN0IFt4bWxuc0F0dHIsIHhtbG5zXSA9IHRoaXMuZ2V0WG1sbnNBdHRyaWJ1dGUobnMsIHBhcmVudFhtbG5zKTtcbiAgICAgICAgaWYgKHhtbG5zKSB7XG4gICAgICAgICAgICBpbnRvLmFkZEF0dHJpYnV0ZSh4bWxuc0F0dHIsIHhtbG5zKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRvLmFkZENoaWxkTm9kZShjb250ZW50KTtcbiAgICB9XG4gICAgZ2V0WG1sbnNBdHRyaWJ1dGUobnMsIHBhcmVudFhtbG5zKSB7XG4gICAgICAgIGNvbnN0IHRyYWl0cyA9IG5zLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICBjb25zdCBbcHJlZml4LCB4bWxuc10gPSB0cmFpdHMueG1sTmFtZXNwYWNlID8/IFtdO1xuICAgICAgICBpZiAoeG1sbnMgJiYgeG1sbnMgIT09IHBhcmVudFhtbG5zKSB7XG4gICAgICAgICAgICByZXR1cm4gW3ByZWZpeCA/IGB4bWxuczoke3ByZWZpeH1gIDogXCJ4bWxuc1wiLCB4bWxuc107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt2b2lkIDAsIHZvaWQgMF07XG4gICAgfVxufVxuXG5jbGFzcyBYbWxDb2RlYyBleHRlbmRzIFNlcmRlQ29udGV4dENvbmZpZyB7XG4gICAgc2V0dGluZ3M7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICBjcmVhdGVTZXJpYWxpemVyKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFhtbFNoYXBlU2VyaWFsaXplcih0aGlzLnNldHRpbmdzKTtcbiAgICAgICAgc2VyaWFsaXplci5zZXRTZXJkZUNvbnRleHQodGhpcy5zZXJkZUNvbnRleHQpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplcjtcbiAgICB9XG4gICAgY3JlYXRlRGVzZXJpYWxpemVyKCkge1xuICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZXIgPSBuZXcgWG1sU2hhcGVEZXNlcmlhbGl6ZXIodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIGRlc2VyaWFsaXplci5zZXRTZXJkZUNvbnRleHQodGhpcy5zZXJkZUNvbnRleHQpO1xuICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVyO1xuICAgIH1cbn1cblxuY2xhc3MgQXdzUmVzdFhtbFByb3RvY29sIGV4dGVuZHMgcHJvdG9jb2xzLkh0dHBCaW5kaW5nUHJvdG9jb2wge1xuICAgIGNvZGVjO1xuICAgIHNlcmlhbGl6ZXI7XG4gICAgZGVzZXJpYWxpemVyO1xuICAgIG1peGluID0gbmV3IFByb3RvY29sTGliKCk7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB0aW1lc3RhbXBGb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICB1c2VUcmFpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGh0dHBCaW5kaW5nczogdHJ1ZSxcbiAgICAgICAgICAgIHhtbE5hbWVzcGFjZTogb3B0aW9ucy54bWxOYW1lc3BhY2UsXG4gICAgICAgICAgICBzZXJ2aWNlTmFtZXNwYWNlOiBvcHRpb25zLmRlZmF1bHROYW1lc3BhY2UsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29kZWMgPSBuZXcgWG1sQ29kZWMoc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSBuZXcgcHJvdG9jb2xzLkh0dHBJbnRlcmNlcHRpbmdTaGFwZVNlcmlhbGl6ZXIodGhpcy5jb2RlYy5jcmVhdGVTZXJpYWxpemVyKCksIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZXIgPSBuZXcgcHJvdG9jb2xzLkh0dHBJbnRlcmNlcHRpbmdTaGFwZURlc2VyaWFsaXplcih0aGlzLmNvZGVjLmNyZWF0ZURlc2VyaWFsaXplcigpLCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIGdldFBheWxvYWRDb2RlYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29kZWM7XG4gICAgfVxuICAgIGdldFNoYXBlSWQoKSB7XG4gICAgICAgIHJldHVybiBcImF3cy5wcm90b2NvbHMjcmVzdFhtbFwiO1xuICAgIH1cbiAgICBhc3luYyBzZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCk7XG4gICAgICAgIGNvbnN0IGlucHV0U2NoZW1hID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yob3BlcmF0aW9uU2NoZW1hLmlucHV0KTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gdGhpcy5taXhpbi5yZXNvbHZlUmVzdENvbnRlbnRUeXBlKHRoaXMuZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCksIGlucHV0U2NoZW1hKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IGNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPT09IHRoaXMuZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdC5ib2R5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gJzw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PicgKyByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfVxuICAgIGFzeW5jIGRlc2VyaWFsaXplUmVzcG9uc2Uob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZGVzZXJpYWxpemVSZXNwb25zZShvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlKTtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlRXJyb3Iob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3JJZGVudGlmaWVyID0gbG9hZFJlc3RYbWxFcnJvckNvZGUocmVzcG9uc2UsIGRhdGFPYmplY3QpID8/IFwiVW5rbm93blwiO1xuICAgICAgICBjb25zdCB7IGVycm9yU2NoZW1hLCBlcnJvck1ldGFkYXRhIH0gPSBhd2FpdCB0aGlzLm1peGluLmdldEVycm9yU2NoZW1hT3JUaHJvd0Jhc2VFeGNlcHRpb24oZXJyb3JJZGVudGlmaWVyLCB0aGlzLm9wdGlvbnMuZGVmYXVsdE5hbWVzcGFjZSwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhKTtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihlcnJvclNjaGVtYSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhT2JqZWN0LkVycm9yPy5tZXNzYWdlID8/IGRhdGFPYmplY3QuRXJyb3I/Lk1lc3NhZ2UgPz8gZGF0YU9iamVjdC5tZXNzYWdlID8/IGRhdGFPYmplY3QuTWVzc2FnZSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgRXJyb3JDdG9yID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IoZXJyb3JTY2hlbWFbMV0pLmdldEVycm9yQ3RvcihlcnJvclNjaGVtYSkgPz8gRXJyb3I7XG4gICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBFcnJvckN0b3IobWVzc2FnZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVzZXJpYWxpemVIdHRwTWVzc2FnZShlcnJvclNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWVtYmVyXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBtZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSA/PyBuYW1lO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhT2JqZWN0LkVycm9yPy5bdGFyZ2V0XSA/PyBkYXRhT2JqZWN0W3RhcmdldF07XG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSB0aGlzLmNvZGVjLmNyZWF0ZURlc2VyaWFsaXplcigpLnJlYWRTY2hlbWEobWVtYmVyLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgdGhpcy5taXhpbi5kZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oT2JqZWN0LmFzc2lnbihleGNlcHRpb24sIGVycm9yTWV0YWRhdGEsIHtcbiAgICAgICAgICAgICRmYXVsdDogbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuZXJyb3IsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICB9LCBvdXRwdXQpLCBkYXRhT2JqZWN0KTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gXCJhcHBsaWNhdGlvbi94bWxcIjtcbiAgICB9XG59XG5cbmV4cG9ydHMuQVdTU0RLU2lnVjRTaWduZXIgPSBBV1NTREtTaWdWNFNpZ25lcjtcbmV4cG9ydHMuQXdzRWMyUXVlcnlQcm90b2NvbCA9IEF3c0VjMlF1ZXJ5UHJvdG9jb2w7XG5leHBvcnRzLkF3c0pzb24xXzBQcm90b2NvbCA9IEF3c0pzb24xXzBQcm90b2NvbDtcbmV4cG9ydHMuQXdzSnNvbjFfMVByb3RvY29sID0gQXdzSnNvbjFfMVByb3RvY29sO1xuZXhwb3J0cy5Bd3NKc29uUnBjUHJvdG9jb2wgPSBBd3NKc29uUnBjUHJvdG9jb2w7XG5leHBvcnRzLkF3c1F1ZXJ5UHJvdG9jb2wgPSBBd3NRdWVyeVByb3RvY29sO1xuZXhwb3J0cy5Bd3NSZXN0SnNvblByb3RvY29sID0gQXdzUmVzdEpzb25Qcm90b2NvbDtcbmV4cG9ydHMuQXdzUmVzdFhtbFByb3RvY29sID0gQXdzUmVzdFhtbFByb3RvY29sO1xuZXhwb3J0cy5Bd3NTZGtTaWdWNEFTaWduZXIgPSBBd3NTZGtTaWdWNEFTaWduZXI7XG5leHBvcnRzLkF3c1Nka1NpZ1Y0U2lnbmVyID0gQXdzU2RrU2lnVjRTaWduZXI7XG5leHBvcnRzLkF3c1NtaXRoeVJwY1YyQ2JvclByb3RvY29sID0gQXdzU21pdGh5UnBjVjJDYm9yUHJvdG9jb2w7XG5leHBvcnRzLkpzb25Db2RlYyA9IEpzb25Db2RlYztcbmV4cG9ydHMuSnNvblNoYXBlRGVzZXJpYWxpemVyID0gSnNvblNoYXBlRGVzZXJpYWxpemVyO1xuZXhwb3J0cy5Kc29uU2hhcGVTZXJpYWxpemVyID0gSnNvblNoYXBlU2VyaWFsaXplcjtcbmV4cG9ydHMuTk9ERV9BVVRIX1NDSEVNRV9QUkVGRVJFTkNFX09QVElPTlMgPSBOT0RFX0FVVEhfU0NIRU1FX1BSRUZFUkVOQ0VfT1BUSU9OUztcbmV4cG9ydHMuTk9ERV9TSUdWNEFfQ09ORklHX09QVElPTlMgPSBOT0RFX1NJR1Y0QV9DT05GSUdfT1BUSU9OUztcbmV4cG9ydHMuWG1sQ29kZWMgPSBYbWxDb2RlYztcbmV4cG9ydHMuWG1sU2hhcGVEZXNlcmlhbGl6ZXIgPSBYbWxTaGFwZURlc2VyaWFsaXplcjtcbmV4cG9ydHMuWG1sU2hhcGVTZXJpYWxpemVyID0gWG1sU2hhcGVTZXJpYWxpemVyO1xuZXhwb3J0cy5fdG9Cb29sID0gX3RvQm9vbDtcbmV4cG9ydHMuX3RvTnVtID0gX3RvTnVtO1xuZXhwb3J0cy5fdG9TdHIgPSBfdG9TdHI7XG5leHBvcnRzLmF3c0V4cGVjdFVuaW9uID0gYXdzRXhwZWN0VW5pb247XG5leHBvcnRzLmVtaXRXYXJuaW5nSWZVbnN1cHBvcnRlZFZlcnNpb24gPSBlbWl0V2FybmluZ0lmVW5zdXBwb3J0ZWRWZXJzaW9uO1xuZXhwb3J0cy5nZXRCZWFyZXJUb2tlbkVudktleSA9IGdldEJlYXJlclRva2VuRW52S2V5O1xuZXhwb3J0cy5sb2FkUmVzdEpzb25FcnJvckNvZGUgPSBsb2FkUmVzdEpzb25FcnJvckNvZGU7XG5leHBvcnRzLmxvYWRSZXN0WG1sRXJyb3JDb2RlID0gbG9hZFJlc3RYbWxFcnJvckNvZGU7XG5leHBvcnRzLnBhcnNlSnNvbkJvZHkgPSBwYXJzZUpzb25Cb2R5O1xuZXhwb3J0cy5wYXJzZUpzb25FcnJvckJvZHkgPSBwYXJzZUpzb25FcnJvckJvZHk7XG5leHBvcnRzLnBhcnNlWG1sQm9keSA9IHBhcnNlWG1sQm9keTtcbmV4cG9ydHMucGFyc2VYbWxFcnJvckJvZHkgPSBwYXJzZVhtbEVycm9yQm9keTtcbmV4cG9ydHMucmVzb2x2ZUFXU1NES1NpZ1Y0Q29uZmlnID0gcmVzb2x2ZUFXU1NES1NpZ1Y0Q29uZmlnO1xuZXhwb3J0cy5yZXNvbHZlQXdzU2RrU2lnVjRBQ29uZmlnID0gcmVzb2x2ZUF3c1Nka1NpZ1Y0QUNvbmZpZztcbmV4cG9ydHMucmVzb2x2ZUF3c1Nka1NpZ1Y0Q29uZmlnID0gcmVzb2x2ZUF3c1Nka1NpZ1Y0Q29uZmlnO1xuZXhwb3J0cy5zZXRDcmVkZW50aWFsRmVhdHVyZSA9IHNldENyZWRlbnRpYWxGZWF0dXJlO1xuZXhwb3J0cy5zZXRGZWF0dXJlID0gc2V0RmVhdHVyZTtcbmV4cG9ydHMuc2V0VG9rZW5GZWF0dXJlID0gc2V0VG9rZW5GZWF0dXJlO1xuZXhwb3J0cy5zdGF0ZSA9IHN0YXRlO1xuZXhwb3J0cy52YWxpZGF0ZVNpZ25pbmdQcm9wZXJ0aWVzID0gdmFsaWRhdGVTaWduaW5nUHJvcGVydGllcztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29yZSA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZScpO1xudmFyIHV0aWxFbmRwb2ludHMgPSByZXF1aXJlKCdAYXdzLXNkay91dGlsLWVuZHBvaW50cycpO1xudmFyIHByb3RvY29sSHR0cCA9IHJlcXVpcmUoJ0BzbWl0aHkvcHJvdG9jb2wtaHR0cCcpO1xudmFyIGNvcmUkMSA9IHJlcXVpcmUoJ0Bhd3Mtc2RrL2NvcmUnKTtcblxuY29uc3QgREVGQVVMVF9VQV9BUFBfSUQgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBpc1ZhbGlkVXNlckFnZW50QXBwSWQoYXBwSWQpIHtcbiAgICBpZiAoYXBwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBhcHBJZCA9PT0gXCJzdHJpbmdcIiAmJiBhcHBJZC5sZW5ndGggPD0gNTA7XG59XG5mdW5jdGlvbiByZXNvbHZlVXNlckFnZW50Q29uZmlnKGlucHV0KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFwcElkUHJvdmlkZXIgPSBjb3JlLm5vcm1hbGl6ZVByb3ZpZGVyKGlucHV0LnVzZXJBZ2VudEFwcElkID8/IERFRkFVTFRfVUFfQVBQX0lEKTtcbiAgICBjb25zdCB7IGN1c3RvbVVzZXJBZ2VudCB9ID0gaW5wdXQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5wdXQsIHtcbiAgICAgICAgY3VzdG9tVXNlckFnZW50OiB0eXBlb2YgY3VzdG9tVXNlckFnZW50ID09PSBcInN0cmluZ1wiID8gW1tjdXN0b21Vc2VyQWdlbnRdXSA6IGN1c3RvbVVzZXJBZ2VudCxcbiAgICAgICAgdXNlckFnZW50QXBwSWQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFwcElkID0gYXdhaXQgbm9ybWFsaXplZEFwcElkUHJvdmlkZXIoKTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZFVzZXJBZ2VudEFwcElkKGFwcElkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGlucHV0LmxvZ2dlcj8uY29uc3RydWN0b3I/Lm5hbWUgPT09IFwiTm9PcExvZ2dlclwiIHx8ICFpbnB1dC5sb2dnZXIgPyBjb25zb2xlIDogaW5wdXQubG9nZ2VyO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXBwSWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPy53YXJuKFwidXNlckFnZW50QXBwSWQgbXVzdCBiZSBhIHN0cmluZyBvciB1bmRlZmluZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhcHBJZC5sZW5ndGggPiA1MCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXI/Lndhcm4oXCJUaGUgcHJvdmlkZWQgdXNlckFnZW50QXBwSWQgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFwcElkO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5jb25zdCBBQ0NPVU5UX0lEX0VORFBPSU5UX1JFR0VYID0gL1xcZHsxMn1cXC5kZGIvO1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tGZWF0dXJlcyhjb250ZXh0LCBjb25maWcsIGFyZ3MpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXJncy5yZXF1ZXN0O1xuICAgIGlmIChyZXF1ZXN0Py5oZWFkZXJzPy5bXCJzbWl0aHktcHJvdG9jb2xcIl0gPT09IFwicnBjLXYyLWNib3JcIikge1xuICAgICAgICBjb3JlJDEuc2V0RmVhdHVyZShjb250ZXh0LCBcIlBST1RPQ09MX1JQQ19WMl9DQk9SXCIsIFwiTVwiKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmV0cnlTdHJhdGVneSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5U3RyYXRlZ3kgPSBhd2FpdCBjb25maWcucmV0cnlTdHJhdGVneSgpO1xuICAgICAgICBpZiAodHlwZW9mIHJldHJ5U3RyYXRlZ3kuYWNxdWlyZUluaXRpYWxSZXRyeVRva2VuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXRyeVN0cmF0ZWd5LmNvbnN0cnVjdG9yPy5uYW1lPy5pbmNsdWRlcyhcIkFkYXB0aXZlXCIpKSB7XG4gICAgICAgICAgICAgICAgY29yZSQxLnNldEZlYXR1cmUoY29udGV4dCwgXCJSRVRSWV9NT0RFX0FEQVBUSVZFXCIsIFwiRlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvcmUkMS5zZXRGZWF0dXJlKGNvbnRleHQsIFwiUkVUUllfTU9ERV9TVEFOREFSRFwiLCBcIkVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb3JlJDEuc2V0RmVhdHVyZShjb250ZXh0LCBcIlJFVFJZX01PREVfTEVHQUNZXCIsIFwiRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5hY2NvdW50SWRFbmRwb2ludE1vZGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBlbmRwb2ludFYyID0gY29udGV4dC5lbmRwb2ludFYyO1xuICAgICAgICBpZiAoU3RyaW5nKGVuZHBvaW50VjI/LnVybD8uaG9zdG5hbWUpLm1hdGNoKEFDQ09VTlRfSURfRU5EUE9JTlRfUkVHRVgpKSB7XG4gICAgICAgICAgICBjb3JlJDEuc2V0RmVhdHVyZShjb250ZXh0LCBcIkFDQ09VTlRfSURfRU5EUE9JTlRcIiwgXCJPXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYXdhaXQgY29uZmlnLmFjY291bnRJZEVuZHBvaW50TW9kZT8uKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgICAgICAgICAgICAgIGNvcmUkMS5zZXRGZWF0dXJlKGNvbnRleHQsIFwiQUNDT1VOVF9JRF9NT0RFX0RJU0FCTEVEXCIsIFwiUVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJwcmVmZXJyZWRcIjpcbiAgICAgICAgICAgICAgICBjb3JlJDEuc2V0RmVhdHVyZShjb250ZXh0LCBcIkFDQ09VTlRfSURfTU9ERV9QUkVGRVJSRURcIiwgXCJQXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJlcXVpcmVkXCI6XG4gICAgICAgICAgICAgICAgY29yZSQxLnNldEZlYXR1cmUoY29udGV4dCwgXCJBQ0NPVU5UX0lEX01PREVfUkVRVUlSRURcIiwgXCJSXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlkZW50aXR5ID0gY29udGV4dC5fX3NtaXRoeV9jb250ZXh0Py5zZWxlY3RlZEh0dHBBdXRoU2NoZW1lPy5pZGVudGl0eTtcbiAgICBpZiAoaWRlbnRpdHk/LiRzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBpZGVudGl0eTtcbiAgICAgICAgaWYgKGNyZWRlbnRpYWxzLmFjY291bnRJZCkge1xuICAgICAgICAgICAgY29yZSQxLnNldEZlYXR1cmUoY29udGV4dCwgXCJSRVNPTFZFRF9BQ0NPVU5UX0lEXCIsIFwiVFwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjcmVkZW50aWFscy4kc291cmNlID8/IHt9KSkge1xuICAgICAgICAgICAgY29yZSQxLnNldEZlYXR1cmUoY29udGV4dCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IFVTRVJfQUdFTlQgPSBcInVzZXItYWdlbnRcIjtcbmNvbnN0IFhfQU1aX1VTRVJfQUdFTlQgPSBcIngtYW16LXVzZXItYWdlbnRcIjtcbmNvbnN0IFNQQUNFID0gXCIgXCI7XG5jb25zdCBVQV9OQU1FX1NFUEFSQVRPUiA9IFwiL1wiO1xuY29uc3QgVUFfTkFNRV9FU0NBUEVfUkVHRVggPSAvW14hJCUmJyorXFwtLl5fYHx+XFx3XS9nO1xuY29uc3QgVUFfVkFMVUVfRVNDQVBFX1JFR0VYID0gL1teISQlJicqK1xcLS5eX2B8flxcdyNdL2c7XG5jb25zdCBVQV9FU0NBUEVfQ0hBUiA9IFwiLVwiO1xuXG5jb25zdCBCWVRFX0xJTUlUID0gMTAyNDtcbmZ1bmN0aW9uIGVuY29kZUZlYXR1cmVzKGZlYXR1cmVzKSB7XG4gICAgbGV0IGJ1ZmZlciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgdmFsID0gZmVhdHVyZXNba2V5XTtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggKyB2YWwubGVuZ3RoICsgMSA8PSBCWVRFX0xJTUlUKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBcIixcIiArIHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciArPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuY29uc3QgdXNlckFnZW50TWlkZGxld2FyZSA9IChvcHRpb25zKSA9PiAobmV4dCwgY29udGV4dCkgPT4gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgaWYgKCFwcm90b2NvbEh0dHAuSHR0cFJlcXVlc3QuaXNJbnN0YW5jZShyZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gbmV4dChhcmdzKTtcbiAgICB9XG4gICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXF1ZXN0O1xuICAgIGNvbnN0IHVzZXJBZ2VudCA9IGNvbnRleHQ/LnVzZXJBZ2VudD8ubWFwKGVzY2FwZVVzZXJBZ2VudCkgfHwgW107XG4gICAgY29uc3QgZGVmYXVsdFVzZXJBZ2VudCA9IChhd2FpdCBvcHRpb25zLmRlZmF1bHRVc2VyQWdlbnRQcm92aWRlcigpKS5tYXAoZXNjYXBlVXNlckFnZW50KTtcbiAgICBhd2FpdCBjaGVja0ZlYXR1cmVzKGNvbnRleHQsIG9wdGlvbnMsIGFyZ3MpO1xuICAgIGNvbnN0IGF3c0NvbnRleHQgPSBjb250ZXh0O1xuICAgIGRlZmF1bHRVc2VyQWdlbnQucHVzaChgbS8ke2VuY29kZUZlYXR1cmVzKE9iamVjdC5hc3NpZ24oe30sIGNvbnRleHQuX19zbWl0aHlfY29udGV4dD8uZmVhdHVyZXMsIGF3c0NvbnRleHQuX19hd3Nfc2RrX2NvbnRleHQ/LmZlYXR1cmVzKSl9YCk7XG4gICAgY29uc3QgY3VzdG9tVXNlckFnZW50ID0gb3B0aW9ucz8uY3VzdG9tVXNlckFnZW50Py5tYXAoZXNjYXBlVXNlckFnZW50KSB8fCBbXTtcbiAgICBjb25zdCBhcHBJZCA9IGF3YWl0IG9wdGlvbnMudXNlckFnZW50QXBwSWQoKTtcbiAgICBpZiAoYXBwSWQpIHtcbiAgICAgICAgZGVmYXVsdFVzZXJBZ2VudC5wdXNoKGVzY2FwZVVzZXJBZ2VudChbYGFwcGAsIGAke2FwcElkfWBdKSk7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IHV0aWxFbmRwb2ludHMuZ2V0VXNlckFnZW50UHJlZml4KCk7XG4gICAgY29uc3Qgc2RrVXNlckFnZW50VmFsdWUgPSAocHJlZml4ID8gW3ByZWZpeF0gOiBbXSlcbiAgICAgICAgLmNvbmNhdChbLi4uZGVmYXVsdFVzZXJBZ2VudCwgLi4udXNlckFnZW50LCAuLi5jdXN0b21Vc2VyQWdlbnRdKVxuICAgICAgICAuam9pbihTUEFDRSk7XG4gICAgY29uc3Qgbm9ybWFsVUFWYWx1ZSA9IFtcbiAgICAgICAgLi4uZGVmYXVsdFVzZXJBZ2VudC5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24uc3RhcnRzV2l0aChcImF3cy1zZGstXCIpKSxcbiAgICAgICAgLi4uY3VzdG9tVXNlckFnZW50LFxuICAgIF0uam9pbihTUEFDRSk7XG4gICAgaWYgKG9wdGlvbnMucnVudGltZSAhPT0gXCJicm93c2VyXCIpIHtcbiAgICAgICAgaWYgKG5vcm1hbFVBVmFsdWUpIHtcbiAgICAgICAgICAgIGhlYWRlcnNbWF9BTVpfVVNFUl9BR0VOVF0gPSBoZWFkZXJzW1hfQU1aX1VTRVJfQUdFTlRdXG4gICAgICAgICAgICAgICAgPyBgJHtoZWFkZXJzW1VTRVJfQUdFTlRdfSAke25vcm1hbFVBVmFsdWV9YFxuICAgICAgICAgICAgICAgIDogbm9ybWFsVUFWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzW1VTRVJfQUdFTlRdID0gc2RrVXNlckFnZW50VmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBoZWFkZXJzW1hfQU1aX1VTRVJfQUdFTlRdID0gc2RrVXNlckFnZW50VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXh0KHtcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICB9KTtcbn07XG5jb25zdCBlc2NhcGVVc2VyQWdlbnQgPSAodXNlckFnZW50UGFpcikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB1c2VyQWdlbnRQYWlyWzBdXG4gICAgICAgIC5zcGxpdChVQV9OQU1FX1NFUEFSQVRPUilcbiAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC5yZXBsYWNlKFVBX05BTUVfRVNDQVBFX1JFR0VYLCBVQV9FU0NBUEVfQ0hBUikpXG4gICAgICAgIC5qb2luKFVBX05BTUVfU0VQQVJBVE9SKTtcbiAgICBjb25zdCB2ZXJzaW9uID0gdXNlckFnZW50UGFpclsxXT8ucmVwbGFjZShVQV9WQUxVRV9FU0NBUEVfUkVHRVgsIFVBX0VTQ0FQRV9DSEFSKTtcbiAgICBjb25zdCBwcmVmaXhTZXBhcmF0b3JJbmRleCA9IG5hbWUuaW5kZXhPZihVQV9OQU1FX1NFUEFSQVRPUik7XG4gICAgY29uc3QgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgcHJlZml4U2VwYXJhdG9ySW5kZXgpO1xuICAgIGxldCB1YU5hbWUgPSBuYW1lLnN1YnN0cmluZyhwcmVmaXhTZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGlmIChwcmVmaXggPT09IFwiYXBpXCIpIHtcbiAgICAgICAgdWFOYW1lID0gdWFOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBbcHJlZml4LCB1YU5hbWUsIHZlcnNpb25dXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gJiYgaXRlbS5sZW5ndGggPiAwKVxuICAgICAgICAucmVkdWNlKChhY2MsIGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YWNjfS8ke2l0ZW19YDtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2FjY30jJHtpdGVtfWA7XG4gICAgICAgIH1cbiAgICB9LCBcIlwiKTtcbn07XG5jb25zdCBnZXRVc2VyQWdlbnRNaWRkbGV3YXJlT3B0aW9ucyA9IHtcbiAgICBuYW1lOiBcImdldFVzZXJBZ2VudE1pZGRsZXdhcmVcIixcbiAgICBzdGVwOiBcImJ1aWxkXCIsXG4gICAgcHJpb3JpdHk6IFwibG93XCIsXG4gICAgdGFnczogW1wiU0VUX1VTRVJfQUdFTlRcIiwgXCJVU0VSX0FHRU5UXCJdLFxuICAgIG92ZXJyaWRlOiB0cnVlLFxufTtcbmNvbnN0IGdldFVzZXJBZ2VudFBsdWdpbiA9IChjb25maWcpID0+ICh7XG4gICAgYXBwbHlUb1N0YWNrOiAoY2xpZW50U3RhY2spID0+IHtcbiAgICAgICAgY2xpZW50U3RhY2suYWRkKHVzZXJBZ2VudE1pZGRsZXdhcmUoY29uZmlnKSwgZ2V0VXNlckFnZW50TWlkZGxld2FyZU9wdGlvbnMpO1xuICAgIH0sXG59KTtcblxuZXhwb3J0cy5ERUZBVUxUX1VBX0FQUF9JRCA9IERFRkFVTFRfVUFfQVBQX0lEO1xuZXhwb3J0cy5nZXRVc2VyQWdlbnRNaWRkbGV3YXJlT3B0aW9ucyA9IGdldFVzZXJBZ2VudE1pZGRsZXdhcmVPcHRpb25zO1xuZXhwb3J0cy5nZXRVc2VyQWdlbnRQbHVnaW4gPSBnZXRVc2VyQWdlbnRQbHVnaW47XG5leHBvcnRzLnJlc29sdmVVc2VyQWdlbnRDb25maWcgPSByZXNvbHZlVXNlckFnZW50Q29uZmlnO1xuZXhwb3J0cy51c2VyQWdlbnRNaWRkbGV3YXJlID0gdXNlckFnZW50TWlkZGxld2FyZTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBib29sZWFuU2VsZWN0b3IgPSAob2JqLCBrZXksIHR5cGUpID0+IHtcbiAgICBpZiAoIShrZXkgaW4gb2JqKSlcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAob2JqW2tleV0gPT09IFwidHJ1ZVwiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob2JqW2tleV0gPT09IFwiZmFsc2VcIilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGxvYWQgJHt0eXBlfSBcIiR7a2V5fVwiLiBFeHBlY3RlZCBcInRydWVcIiBvciBcImZhbHNlXCIsIGdvdCAke29ialtrZXldfS5gKTtcbn07XG5cbmNvbnN0IG51bWJlclNlbGVjdG9yID0gKG9iaiwga2V5LCB0eXBlKSA9PiB7XG4gICAgaWYgKCEoa2V5IGluIG9iaikpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbnVtYmVyVmFsdWUgPSBwYXJzZUludChvYmpba2V5XSwgMTApO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtYmVyVmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBsb2FkICR7dHlwZX0gJyR7a2V5fScuIEV4cGVjdGVkIG51bWJlciwgZ290ICcke29ialtrZXldfScuYCk7XG4gICAgfVxuICAgIHJldHVybiBudW1iZXJWYWx1ZTtcbn07XG5cbmV4cG9ydHMuU2VsZWN0b3JUeXBlID0gdm9pZCAwO1xuKGZ1bmN0aW9uIChTZWxlY3RvclR5cGUpIHtcbiAgICBTZWxlY3RvclR5cGVbXCJFTlZcIl0gPSBcImVudlwiO1xuICAgIFNlbGVjdG9yVHlwZVtcIkNPTkZJR1wiXSA9IFwic2hhcmVkIGNvbmZpZyBlbnRyeVwiO1xufSkoZXhwb3J0cy5TZWxlY3RvclR5cGUgfHwgKGV4cG9ydHMuU2VsZWN0b3JUeXBlID0ge30pKTtcblxuZXhwb3J0cy5ib29sZWFuU2VsZWN0b3IgPSBib29sZWFuU2VsZWN0b3I7XG5leHBvcnRzLm51bWJlclNlbGVjdG9yID0gbnVtYmVyU2VsZWN0b3I7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxDb25maWdQcm92aWRlciA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC1jb25maWctcHJvdmlkZXInKTtcbnZhciB1dGlsTWlkZGxld2FyZSA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC1taWRkbGV3YXJlJyk7XG52YXIgdXRpbEVuZHBvaW50cyA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC1lbmRwb2ludHMnKTtcblxuY29uc3QgRU5WX1VTRV9EVUFMU1RBQ0tfRU5EUE9JTlQgPSBcIkFXU19VU0VfRFVBTFNUQUNLX0VORFBPSU5UXCI7XG5jb25zdCBDT05GSUdfVVNFX0RVQUxTVEFDS19FTkRQT0lOVCA9IFwidXNlX2R1YWxzdGFja19lbmRwb2ludFwiO1xuY29uc3QgREVGQVVMVF9VU0VfRFVBTFNUQUNLX0VORFBPSU5UID0gZmFsc2U7XG5jb25zdCBOT0RFX1VTRV9EVUFMU1RBQ0tfRU5EUE9JTlRfQ09ORklHX09QVElPTlMgPSB7XG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNlbGVjdG9yOiAoZW52KSA9PiB1dGlsQ29uZmlnUHJvdmlkZXIuYm9vbGVhblNlbGVjdG9yKGVudiwgRU5WX1VTRV9EVUFMU1RBQ0tfRU5EUE9JTlQsIHV0aWxDb25maWdQcm92aWRlci5TZWxlY3RvclR5cGUuRU5WKSxcbiAgICBjb25maWdGaWxlU2VsZWN0b3I6IChwcm9maWxlKSA9PiB1dGlsQ29uZmlnUHJvdmlkZXIuYm9vbGVhblNlbGVjdG9yKHByb2ZpbGUsIENPTkZJR19VU0VfRFVBTFNUQUNLX0VORFBPSU5ULCB1dGlsQ29uZmlnUHJvdmlkZXIuU2VsZWN0b3JUeXBlLkNPTkZJRyksXG4gICAgZGVmYXVsdDogZmFsc2UsXG59O1xuXG5jb25zdCBFTlZfVVNFX0ZJUFNfRU5EUE9JTlQgPSBcIkFXU19VU0VfRklQU19FTkRQT0lOVFwiO1xuY29uc3QgQ09ORklHX1VTRV9GSVBTX0VORFBPSU5UID0gXCJ1c2VfZmlwc19lbmRwb2ludFwiO1xuY29uc3QgREVGQVVMVF9VU0VfRklQU19FTkRQT0lOVCA9IGZhbHNlO1xuY29uc3QgTk9ERV9VU0VfRklQU19FTkRQT0lOVF9DT05GSUdfT1BUSU9OUyA9IHtcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlU2VsZWN0b3I6IChlbnYpID0+IHV0aWxDb25maWdQcm92aWRlci5ib29sZWFuU2VsZWN0b3IoZW52LCBFTlZfVVNFX0ZJUFNfRU5EUE9JTlQsIHV0aWxDb25maWdQcm92aWRlci5TZWxlY3RvclR5cGUuRU5WKSxcbiAgICBjb25maWdGaWxlU2VsZWN0b3I6IChwcm9maWxlKSA9PiB1dGlsQ29uZmlnUHJvdmlkZXIuYm9vbGVhblNlbGVjdG9yKHByb2ZpbGUsIENPTkZJR19VU0VfRklQU19FTkRQT0lOVCwgdXRpbENvbmZpZ1Byb3ZpZGVyLlNlbGVjdG9yVHlwZS5DT05GSUcpLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxufTtcblxuY29uc3QgcmVzb2x2ZUN1c3RvbUVuZHBvaW50c0NvbmZpZyA9IChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IHsgdGxzLCBlbmRwb2ludCwgdXJsUGFyc2VyLCB1c2VEdWFsc3RhY2tFbmRwb2ludCB9ID0gaW5wdXQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5wdXQsIHtcbiAgICAgICAgdGxzOiB0bHMgPz8gdHJ1ZSxcbiAgICAgICAgZW5kcG9pbnQ6IHV0aWxNaWRkbGV3YXJlLm5vcm1hbGl6ZVByb3ZpZGVyKHR5cGVvZiBlbmRwb2ludCA9PT0gXCJzdHJpbmdcIiA/IHVybFBhcnNlcihlbmRwb2ludCkgOiBlbmRwb2ludCksXG4gICAgICAgIGlzQ3VzdG9tRW5kcG9pbnQ6IHRydWUsXG4gICAgICAgIHVzZUR1YWxzdGFja0VuZHBvaW50OiB1dGlsTWlkZGxld2FyZS5ub3JtYWxpemVQcm92aWRlcih1c2VEdWFsc3RhY2tFbmRwb2ludCA/PyBmYWxzZSksXG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXRFbmRwb2ludEZyb21SZWdpb24gPSBhc3luYyAoaW5wdXQpID0+IHtcbiAgICBjb25zdCB7IHRscyA9IHRydWUgfSA9IGlucHV0O1xuICAgIGNvbnN0IHJlZ2lvbiA9IGF3YWl0IGlucHV0LnJlZ2lvbigpO1xuICAgIGNvbnN0IGRuc0hvc3RSZWdleCA9IG5ldyBSZWdFeHAoL14oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSkkLyk7XG4gICAgaWYgKCFkbnNIb3N0UmVnZXgudGVzdChyZWdpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVnaW9uIGluIGNsaWVudCBjb25maWdcIik7XG4gICAgfVxuICAgIGNvbnN0IHVzZUR1YWxzdGFja0VuZHBvaW50ID0gYXdhaXQgaW5wdXQudXNlRHVhbHN0YWNrRW5kcG9pbnQoKTtcbiAgICBjb25zdCB1c2VGaXBzRW5kcG9pbnQgPSBhd2FpdCBpbnB1dC51c2VGaXBzRW5kcG9pbnQoKTtcbiAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSAoYXdhaXQgaW5wdXQucmVnaW9uSW5mb1Byb3ZpZGVyKHJlZ2lvbiwgeyB1c2VEdWFsc3RhY2tFbmRwb2ludCwgdXNlRmlwc0VuZHBvaW50IH0pKSA/PyB7fTtcbiAgICBpZiAoIWhvc3RuYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZXNvbHZlIGhvc3RuYW1lIGZyb20gY2xpZW50IGNvbmZpZ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnVybFBhcnNlcihgJHt0bHMgPyBcImh0dHBzOlwiIDogXCJodHRwOlwifS8vJHtob3N0bmFtZX1gKTtcbn07XG5cbmNvbnN0IHJlc29sdmVFbmRwb2ludHNDb25maWcgPSAoaW5wdXQpID0+IHtcbiAgICBjb25zdCB1c2VEdWFsc3RhY2tFbmRwb2ludCA9IHV0aWxNaWRkbGV3YXJlLm5vcm1hbGl6ZVByb3ZpZGVyKGlucHV0LnVzZUR1YWxzdGFja0VuZHBvaW50ID8/IGZhbHNlKTtcbiAgICBjb25zdCB7IGVuZHBvaW50LCB1c2VGaXBzRW5kcG9pbnQsIHVybFBhcnNlciwgdGxzIH0gPSBpbnB1dDtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbnB1dCwge1xuICAgICAgICB0bHM6IHRscyA/PyB0cnVlLFxuICAgICAgICBlbmRwb2ludDogZW5kcG9pbnRcbiAgICAgICAgICAgID8gdXRpbE1pZGRsZXdhcmUubm9ybWFsaXplUHJvdmlkZXIodHlwZW9mIGVuZHBvaW50ID09PSBcInN0cmluZ1wiID8gdXJsUGFyc2VyKGVuZHBvaW50KSA6IGVuZHBvaW50KVxuICAgICAgICAgICAgOiAoKSA9PiBnZXRFbmRwb2ludEZyb21SZWdpb24oeyAuLi5pbnB1dCwgdXNlRHVhbHN0YWNrRW5kcG9pbnQsIHVzZUZpcHNFbmRwb2ludCB9KSxcbiAgICAgICAgaXNDdXN0b21FbmRwb2ludDogISFlbmRwb2ludCxcbiAgICAgICAgdXNlRHVhbHN0YWNrRW5kcG9pbnQsXG4gICAgfSk7XG59O1xuXG5jb25zdCBSRUdJT05fRU5WX05BTUUgPSBcIkFXU19SRUdJT05cIjtcbmNvbnN0IFJFR0lPTl9JTklfTkFNRSA9IFwicmVnaW9uXCI7XG5jb25zdCBOT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUyA9IHtcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlU2VsZWN0b3I6IChlbnYpID0+IGVudltSRUdJT05fRU5WX05BTUVdLFxuICAgIGNvbmZpZ0ZpbGVTZWxlY3RvcjogKHByb2ZpbGUpID0+IHByb2ZpbGVbUkVHSU9OX0lOSV9OQU1FXSxcbiAgICBkZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlZ2lvbiBpcyBtaXNzaW5nXCIpO1xuICAgIH0sXG59O1xuY29uc3QgTk9ERV9SRUdJT05fQ09ORklHX0ZJTEVfT1BUSU9OUyA9IHtcbiAgICBwcmVmZXJyZWRGaWxlOiBcImNyZWRlbnRpYWxzXCIsXG59O1xuXG5jb25zdCB2YWxpZFJlZ2lvbnMgPSBuZXcgU2V0KCk7XG5jb25zdCBjaGVja1JlZ2lvbiA9IChyZWdpb24sIGNoZWNrID0gdXRpbEVuZHBvaW50cy5pc1ZhbGlkSG9zdExhYmVsKSA9PiB7XG4gICAgaWYgKCF2YWxpZFJlZ2lvbnMuaGFzKHJlZ2lvbikgJiYgIWNoZWNrKHJlZ2lvbikpIHtcbiAgICAgICAgaWYgKHJlZ2lvbiA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQHNtaXRoeS9jb25maWctcmVzb2x2ZXIgV0FSTiAtIFBsZWFzZSB1c2UgdGhlIGNhbGxlciByZWdpb24gaW5zdGVhZCBvZiBcIipcIi4gU2VlIFwic2lndjRhXCIgaW4gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzL2Jsb2IvbWFpbi9zdXBwbGVtZW50YWwtZG9jcy9DTElFTlRTLm1kLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWdpb24gbm90IGFjY2VwdGVkOiByZWdpb249XCIke3JlZ2lvbn1cIiBpcyBub3QgYSB2YWxpZCBob3N0bmFtZSBjb21wb25lbnQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhbGlkUmVnaW9ucy5hZGQocmVnaW9uKTtcbiAgICB9XG59O1xuXG5jb25zdCBpc0ZpcHNSZWdpb24gPSAocmVnaW9uKSA9PiB0eXBlb2YgcmVnaW9uID09PSBcInN0cmluZ1wiICYmIChyZWdpb24uc3RhcnRzV2l0aChcImZpcHMtXCIpIHx8IHJlZ2lvbi5lbmRzV2l0aChcIi1maXBzXCIpKTtcblxuY29uc3QgZ2V0UmVhbFJlZ2lvbiA9IChyZWdpb24pID0+IGlzRmlwc1JlZ2lvbihyZWdpb24pXG4gICAgPyBbXCJmaXBzLWF3cy1nbG9iYWxcIiwgXCJhd3MtZmlwc1wiXS5pbmNsdWRlcyhyZWdpb24pXG4gICAgICAgID8gXCJ1cy1lYXN0LTFcIlxuICAgICAgICA6IHJlZ2lvbi5yZXBsYWNlKC9maXBzLShka3ItfHByb2QtKT98LWZpcHMvLCBcIlwiKVxuICAgIDogcmVnaW9uO1xuXG5jb25zdCByZXNvbHZlUmVnaW9uQ29uZmlnID0gKGlucHV0KSA9PiB7XG4gICAgY29uc3QgeyByZWdpb24sIHVzZUZpcHNFbmRwb2ludCB9ID0gaW5wdXQ7XG4gICAgaWYgKCFyZWdpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVnaW9uIGlzIG1pc3NpbmdcIik7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGlucHV0LCB7XG4gICAgICAgIHJlZ2lvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvdmlkZWRSZWdpb24gPSB0eXBlb2YgcmVnaW9uID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCByZWdpb24oKSA6IHJlZ2lvbjtcbiAgICAgICAgICAgIGNvbnN0IHJlYWxSZWdpb24gPSBnZXRSZWFsUmVnaW9uKHByb3ZpZGVkUmVnaW9uKTtcbiAgICAgICAgICAgIGNoZWNrUmVnaW9uKHJlYWxSZWdpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWdpb247XG4gICAgICAgIH0sXG4gICAgICAgIHVzZUZpcHNFbmRwb2ludDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvdmlkZWRSZWdpb24gPSB0eXBlb2YgcmVnaW9uID09PSBcInN0cmluZ1wiID8gcmVnaW9uIDogYXdhaXQgcmVnaW9uKCk7XG4gICAgICAgICAgICBpZiAoaXNGaXBzUmVnaW9uKHByb3ZpZGVkUmVnaW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB1c2VGaXBzRW5kcG9pbnQgIT09IFwiZnVuY3Rpb25cIiA/IFByb21pc2UucmVzb2x2ZSghIXVzZUZpcHNFbmRwb2ludCkgOiB1c2VGaXBzRW5kcG9pbnQoKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn07XG5cbmNvbnN0IGdldEhvc3RuYW1lRnJvbVZhcmlhbnRzID0gKHZhcmlhbnRzID0gW10sIHsgdXNlRmlwc0VuZHBvaW50LCB1c2VEdWFsc3RhY2tFbmRwb2ludCB9KSA9PiB2YXJpYW50cy5maW5kKCh7IHRhZ3MgfSkgPT4gdXNlRmlwc0VuZHBvaW50ID09PSB0YWdzLmluY2x1ZGVzKFwiZmlwc1wiKSAmJiB1c2VEdWFsc3RhY2tFbmRwb2ludCA9PT0gdGFncy5pbmNsdWRlcyhcImR1YWxzdGFja1wiKSk/Lmhvc3RuYW1lO1xuXG5jb25zdCBnZXRSZXNvbHZlZEhvc3RuYW1lID0gKHJlc29sdmVkUmVnaW9uLCB7IHJlZ2lvbkhvc3RuYW1lLCBwYXJ0aXRpb25Ib3N0bmFtZSB9KSA9PiByZWdpb25Ib3N0bmFtZVxuICAgID8gcmVnaW9uSG9zdG5hbWVcbiAgICA6IHBhcnRpdGlvbkhvc3RuYW1lXG4gICAgICAgID8gcGFydGl0aW9uSG9zdG5hbWUucmVwbGFjZShcIntyZWdpb259XCIsIHJlc29sdmVkUmVnaW9uKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0UmVzb2x2ZWRQYXJ0aXRpb24gPSAocmVnaW9uLCB7IHBhcnRpdGlvbkhhc2ggfSkgPT4gT2JqZWN0LmtleXMocGFydGl0aW9uSGFzaCB8fCB7fSkuZmluZCgoa2V5KSA9PiBwYXJ0aXRpb25IYXNoW2tleV0ucmVnaW9ucy5pbmNsdWRlcyhyZWdpb24pKSA/PyBcImF3c1wiO1xuXG5jb25zdCBnZXRSZXNvbHZlZFNpZ25pbmdSZWdpb24gPSAoaG9zdG5hbWUsIHsgc2lnbmluZ1JlZ2lvbiwgcmVnaW9uUmVnZXgsIHVzZUZpcHNFbmRwb2ludCB9KSA9PiB7XG4gICAgaWYgKHNpZ25pbmdSZWdpb24pIHtcbiAgICAgICAgcmV0dXJuIHNpZ25pbmdSZWdpb247XG4gICAgfVxuICAgIGVsc2UgaWYgKHVzZUZpcHNFbmRwb2ludCkge1xuICAgICAgICBjb25zdCByZWdpb25SZWdleEpzID0gcmVnaW9uUmVnZXgucmVwbGFjZShcIlxcXFxcXFxcXCIsIFwiXFxcXFwiKS5yZXBsYWNlKC9eXFxeL2csIFwiXFxcXC5cIikucmVwbGFjZSgvXFwkJC9nLCBcIlxcXFwuXCIpO1xuICAgICAgICBjb25zdCByZWdpb25SZWdleG1hdGNoQXJyYXkgPSBob3N0bmFtZS5tYXRjaChyZWdpb25SZWdleEpzKTtcbiAgICAgICAgaWYgKHJlZ2lvblJlZ2V4bWF0Y2hBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lvblJlZ2V4bWF0Y2hBcnJheVswXS5zbGljZSgxLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBnZXRSZWdpb25JbmZvID0gKHJlZ2lvbiwgeyB1c2VGaXBzRW5kcG9pbnQgPSBmYWxzZSwgdXNlRHVhbHN0YWNrRW5kcG9pbnQgPSBmYWxzZSwgc2lnbmluZ1NlcnZpY2UsIHJlZ2lvbkhhc2gsIHBhcnRpdGlvbkhhc2gsIH0pID0+IHtcbiAgICBjb25zdCBwYXJ0aXRpb24gPSBnZXRSZXNvbHZlZFBhcnRpdGlvbihyZWdpb24sIHsgcGFydGl0aW9uSGFzaCB9KTtcbiAgICBjb25zdCByZXNvbHZlZFJlZ2lvbiA9IHJlZ2lvbiBpbiByZWdpb25IYXNoID8gcmVnaW9uIDogcGFydGl0aW9uSGFzaFtwYXJ0aXRpb25dPy5lbmRwb2ludCA/PyByZWdpb247XG4gICAgY29uc3QgaG9zdG5hbWVPcHRpb25zID0geyB1c2VGaXBzRW5kcG9pbnQsIHVzZUR1YWxzdGFja0VuZHBvaW50IH07XG4gICAgY29uc3QgcmVnaW9uSG9zdG5hbWUgPSBnZXRIb3N0bmFtZUZyb21WYXJpYW50cyhyZWdpb25IYXNoW3Jlc29sdmVkUmVnaW9uXT8udmFyaWFudHMsIGhvc3RuYW1lT3B0aW9ucyk7XG4gICAgY29uc3QgcGFydGl0aW9uSG9zdG5hbWUgPSBnZXRIb3N0bmFtZUZyb21WYXJpYW50cyhwYXJ0aXRpb25IYXNoW3BhcnRpdGlvbl0/LnZhcmlhbnRzLCBob3N0bmFtZU9wdGlvbnMpO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gZ2V0UmVzb2x2ZWRIb3N0bmFtZShyZXNvbHZlZFJlZ2lvbiwgeyByZWdpb25Ib3N0bmFtZSwgcGFydGl0aW9uSG9zdG5hbWUgfSk7XG4gICAgaWYgKGhvc3RuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbmRwb2ludCByZXNvbHV0aW9uIGZhaWxlZCBmb3I6ICR7eyByZXNvbHZlZFJlZ2lvbiwgdXNlRmlwc0VuZHBvaW50LCB1c2VEdWFsc3RhY2tFbmRwb2ludCB9fWApO1xuICAgIH1cbiAgICBjb25zdCBzaWduaW5nUmVnaW9uID0gZ2V0UmVzb2x2ZWRTaWduaW5nUmVnaW9uKGhvc3RuYW1lLCB7XG4gICAgICAgIHNpZ25pbmdSZWdpb246IHJlZ2lvbkhhc2hbcmVzb2x2ZWRSZWdpb25dPy5zaWduaW5nUmVnaW9uLFxuICAgICAgICByZWdpb25SZWdleDogcGFydGl0aW9uSGFzaFtwYXJ0aXRpb25dLnJlZ2lvblJlZ2V4LFxuICAgICAgICB1c2VGaXBzRW5kcG9pbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGFydGl0aW9uLFxuICAgICAgICBzaWduaW5nU2VydmljZSxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIC4uLihzaWduaW5nUmVnaW9uICYmIHsgc2lnbmluZ1JlZ2lvbiB9KSxcbiAgICAgICAgLi4uKHJlZ2lvbkhhc2hbcmVzb2x2ZWRSZWdpb25dPy5zaWduaW5nU2VydmljZSAmJiB7XG4gICAgICAgICAgICBzaWduaW5nU2VydmljZTogcmVnaW9uSGFzaFtyZXNvbHZlZFJlZ2lvbl0uc2lnbmluZ1NlcnZpY2UsXG4gICAgICAgIH0pLFxuICAgIH07XG59O1xuXG5leHBvcnRzLkNPTkZJR19VU0VfRFVBTFNUQUNLX0VORFBPSU5UID0gQ09ORklHX1VTRV9EVUFMU1RBQ0tfRU5EUE9JTlQ7XG5leHBvcnRzLkNPTkZJR19VU0VfRklQU19FTkRQT0lOVCA9IENPTkZJR19VU0VfRklQU19FTkRQT0lOVDtcbmV4cG9ydHMuREVGQVVMVF9VU0VfRFVBTFNUQUNLX0VORFBPSU5UID0gREVGQVVMVF9VU0VfRFVBTFNUQUNLX0VORFBPSU5UO1xuZXhwb3J0cy5ERUZBVUxUX1VTRV9GSVBTX0VORFBPSU5UID0gREVGQVVMVF9VU0VfRklQU19FTkRQT0lOVDtcbmV4cG9ydHMuRU5WX1VTRV9EVUFMU1RBQ0tfRU5EUE9JTlQgPSBFTlZfVVNFX0RVQUxTVEFDS19FTkRQT0lOVDtcbmV4cG9ydHMuRU5WX1VTRV9GSVBTX0VORFBPSU5UID0gRU5WX1VTRV9GSVBTX0VORFBPSU5UO1xuZXhwb3J0cy5OT0RFX1JFR0lPTl9DT05GSUdfRklMRV9PUFRJT05TID0gTk9ERV9SRUdJT05fQ09ORklHX0ZJTEVfT1BUSU9OUztcbmV4cG9ydHMuTk9ERV9SRUdJT05fQ09ORklHX09QVElPTlMgPSBOT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUztcbmV4cG9ydHMuTk9ERV9VU0VfRFVBTFNUQUNLX0VORFBPSU5UX0NPTkZJR19PUFRJT05TID0gTk9ERV9VU0VfRFVBTFNUQUNLX0VORFBPSU5UX0NPTkZJR19PUFRJT05TO1xuZXhwb3J0cy5OT0RFX1VTRV9GSVBTX0VORFBPSU5UX0NPTkZJR19PUFRJT05TID0gTk9ERV9VU0VfRklQU19FTkRQT0lOVF9DT05GSUdfT1BUSU9OUztcbmV4cG9ydHMuUkVHSU9OX0VOVl9OQU1FID0gUkVHSU9OX0VOVl9OQU1FO1xuZXhwb3J0cy5SRUdJT05fSU5JX05BTUUgPSBSRUdJT05fSU5JX05BTUU7XG5leHBvcnRzLmdldFJlZ2lvbkluZm8gPSBnZXRSZWdpb25JbmZvO1xuZXhwb3J0cy5yZXNvbHZlQ3VzdG9tRW5kcG9pbnRzQ29uZmlnID0gcmVzb2x2ZUN1c3RvbUVuZHBvaW50c0NvbmZpZztcbmV4cG9ydHMucmVzb2x2ZUVuZHBvaW50c0NvbmZpZyA9IHJlc29sdmVFbmRwb2ludHNDb25maWc7XG5leHBvcnRzLnJlc29sdmVSZWdpb25Db25maWcgPSByZXNvbHZlUmVnaW9uQ29uZmlnO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBwcm90b2NvbEh0dHAgPSByZXF1aXJlKCdAc21pdGh5L3Byb3RvY29sLWh0dHAnKTtcblxuY29uc3QgQ09OVEVOVF9MRU5HVEhfSEVBREVSID0gXCJjb250ZW50LWxlbmd0aFwiO1xuZnVuY3Rpb24gY29udGVudExlbmd0aE1pZGRsZXdhcmUoYm9keUxlbmd0aENoZWNrZXIpIHtcbiAgICByZXR1cm4gKG5leHQpID0+IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhcmdzLnJlcXVlc3Q7XG4gICAgICAgIGlmIChwcm90b2NvbEh0dHAuSHR0cFJlcXVlc3QuaXNJbnN0YW5jZShyZXF1ZXN0KSkge1xuICAgICAgICAgICAgY29uc3QgeyBib2R5LCBoZWFkZXJzIH0gPSByZXF1ZXN0O1xuICAgICAgICAgICAgaWYgKGJvZHkgJiZcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChzdHIpID0+IHN0ci50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihDT05URU5UX0xFTkdUSF9IRUFERVIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGJvZHlMZW5ndGhDaGVja2VyKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBbQ09OVEVOVF9MRU5HVEhfSEVBREVSXTogU3RyaW5nKGxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCh7XG4gICAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmNvbnN0IGNvbnRlbnRMZW5ndGhNaWRkbGV3YXJlT3B0aW9ucyA9IHtcbiAgICBzdGVwOiBcImJ1aWxkXCIsXG4gICAgdGFnczogW1wiU0VUX0NPTlRFTlRfTEVOR1RIXCIsIFwiQ09OVEVOVF9MRU5HVEhcIl0sXG4gICAgbmFtZTogXCJjb250ZW50TGVuZ3RoTWlkZGxld2FyZVwiLFxuICAgIG92ZXJyaWRlOiB0cnVlLFxufTtcbmNvbnN0IGdldENvbnRlbnRMZW5ndGhQbHVnaW4gPSAob3B0aW9ucykgPT4gKHtcbiAgICBhcHBseVRvU3RhY2s6IChjbGllbnRTdGFjaykgPT4ge1xuICAgICAgICBjbGllbnRTdGFjay5hZGQoY29udGVudExlbmd0aE1pZGRsZXdhcmUob3B0aW9ucy5ib2R5TGVuZ3RoQ2hlY2tlciksIGNvbnRlbnRMZW5ndGhNaWRkbGV3YXJlT3B0aW9ucyk7XG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLmNvbnRlbnRMZW5ndGhNaWRkbGV3YXJlID0gY29udGVudExlbmd0aE1pZGRsZXdhcmU7XG5leHBvcnRzLmNvbnRlbnRMZW5ndGhNaWRkbGV3YXJlT3B0aW9ucyA9IGNvbnRlbnRMZW5ndGhNaWRkbGV3YXJlT3B0aW9ucztcbmV4cG9ydHMuZ2V0Q29udGVudExlbmd0aFBsdWdpbiA9IGdldENvbnRlbnRMZW5ndGhQbHVnaW47XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFbmRwb2ludFVybENvbmZpZyA9IHZvaWQgMDtcbmNvbnN0IHNoYXJlZF9pbmlfZmlsZV9sb2FkZXJfMSA9IHJlcXVpcmUoXCJAc21pdGh5L3NoYXJlZC1pbmktZmlsZS1sb2FkZXJcIik7XG5jb25zdCBFTlZfRU5EUE9JTlRfVVJMID0gXCJBV1NfRU5EUE9JTlRfVVJMXCI7XG5jb25zdCBDT05GSUdfRU5EUE9JTlRfVVJMID0gXCJlbmRwb2ludF91cmxcIjtcbmNvbnN0IGdldEVuZHBvaW50VXJsQ29uZmlnID0gKHNlcnZpY2VJZCkgPT4gKHtcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlU2VsZWN0b3I6IChlbnYpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZVN1ZmZpeFBhcnRzID0gc2VydmljZUlkLnNwbGl0KFwiIFwiKS5tYXAoKHcpID0+IHcudG9VcHBlckNhc2UoKSk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VFbmRwb2ludFVybCA9IGVudltbRU5WX0VORFBPSU5UX1VSTCwgLi4uc2VydmljZVN1ZmZpeFBhcnRzXS5qb2luKFwiX1wiKV07XG4gICAgICAgIGlmIChzZXJ2aWNlRW5kcG9pbnRVcmwpXG4gICAgICAgICAgICByZXR1cm4gc2VydmljZUVuZHBvaW50VXJsO1xuICAgICAgICBjb25zdCBlbmRwb2ludFVybCA9IGVudltFTlZfRU5EUE9JTlRfVVJMXTtcbiAgICAgICAgaWYgKGVuZHBvaW50VXJsKVxuICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VXJsO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgY29uZmlnRmlsZVNlbGVjdG9yOiAocHJvZmlsZSwgY29uZmlnKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcgJiYgcHJvZmlsZS5zZXJ2aWNlcykge1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZXNTZWN0aW9uID0gY29uZmlnW1tcInNlcnZpY2VzXCIsIHByb2ZpbGUuc2VydmljZXNdLmpvaW4oc2hhcmVkX2luaV9maWxlX2xvYWRlcl8xLkNPTkZJR19QUkVGSVhfU0VQQVJBVE9SKV07XG4gICAgICAgICAgICBpZiAoc2VydmljZXNTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmljZVByZWZpeFBhcnRzID0gc2VydmljZUlkLnNwbGl0KFwiIFwiKS5tYXAoKHcpID0+IHcudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kcG9pbnRVcmwgPSBzZXJ2aWNlc1NlY3Rpb25bW3NlcnZpY2VQcmVmaXhQYXJ0cy5qb2luKFwiX1wiKSwgQ09ORklHX0VORFBPSU5UX1VSTF0uam9pbihzaGFyZWRfaW5pX2ZpbGVfbG9hZGVyXzEuQ09ORklHX1BSRUZJWF9TRVBBUkFUT1IpXTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRVcmwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludFVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmRwb2ludFVybCA9IHByb2ZpbGVbQ09ORklHX0VORFBPSU5UX1VSTF07XG4gICAgICAgIGlmIChlbmRwb2ludFVybClcbiAgICAgICAgICAgIHJldHVybiBlbmRwb2ludFVybDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbn0pO1xuZXhwb3J0cy5nZXRFbmRwb2ludFVybENvbmZpZyA9IGdldEVuZHBvaW50VXJsQ29uZmlnO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RW5kcG9pbnRGcm9tQ29uZmlnID0gdm9pZCAwO1xuY29uc3Qgbm9kZV9jb25maWdfcHJvdmlkZXJfMSA9IHJlcXVpcmUoXCJAc21pdGh5L25vZGUtY29uZmlnLXByb3ZpZGVyXCIpO1xuY29uc3QgZ2V0RW5kcG9pbnRVcmxDb25maWdfMSA9IHJlcXVpcmUoXCIuL2dldEVuZHBvaW50VXJsQ29uZmlnXCIpO1xuY29uc3QgZ2V0RW5kcG9pbnRGcm9tQ29uZmlnID0gYXN5bmMgKHNlcnZpY2VJZCkgPT4gKDAsIG5vZGVfY29uZmlnX3Byb3ZpZGVyXzEubG9hZENvbmZpZykoKDAsIGdldEVuZHBvaW50VXJsQ29uZmlnXzEuZ2V0RW5kcG9pbnRVcmxDb25maWcpKHNlcnZpY2VJZCA/PyBcIlwiKSkoKTtcbmV4cG9ydHMuZ2V0RW5kcG9pbnRGcm9tQ29uZmlnID0gZ2V0RW5kcG9pbnRGcm9tQ29uZmlnO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRFbmRwb2ludEZyb21Db25maWcgPSByZXF1aXJlKCcuL2FkYXB0b3JzL2dldEVuZHBvaW50RnJvbUNvbmZpZycpO1xudmFyIHVybFBhcnNlciA9IHJlcXVpcmUoJ0BzbWl0aHkvdXJsLXBhcnNlcicpO1xudmFyIGNvcmUgPSByZXF1aXJlKCdAc21pdGh5L2NvcmUnKTtcbnZhciB1dGlsTWlkZGxld2FyZSA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC1taWRkbGV3YXJlJyk7XG52YXIgbWlkZGxld2FyZVNlcmRlID0gcmVxdWlyZSgnQHNtaXRoeS9taWRkbGV3YXJlLXNlcmRlJyk7XG5cbmNvbnN0IHJlc29sdmVQYXJhbXNGb3JTMyA9IGFzeW5jIChlbmRwb2ludFBhcmFtcykgPT4ge1xuICAgIGNvbnN0IGJ1Y2tldCA9IGVuZHBvaW50UGFyYW1zPy5CdWNrZXQgfHwgXCJcIjtcbiAgICBpZiAodHlwZW9mIGVuZHBvaW50UGFyYW1zLkJ1Y2tldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlbmRwb2ludFBhcmFtcy5CdWNrZXQgPSBidWNrZXQucmVwbGFjZSgvIy9nLCBlbmNvZGVVUklDb21wb25lbnQoXCIjXCIpKS5yZXBsYWNlKC9cXD8vZywgZW5jb2RlVVJJQ29tcG9uZW50KFwiP1wiKSk7XG4gICAgfVxuICAgIGlmIChpc0FybkJ1Y2tldE5hbWUoYnVja2V0KSkge1xuICAgICAgICBpZiAoZW5kcG9pbnRQYXJhbXMuRm9yY2VQYXRoU3R5bGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGgtc3R5bGUgYWRkcmVzc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIEFSTiBidWNrZXRzXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc0Ruc0NvbXBhdGlibGVCdWNrZXROYW1lKGJ1Y2tldCkgfHxcbiAgICAgICAgKGJ1Y2tldC5pbmRleE9mKFwiLlwiKSAhPT0gLTEgJiYgIVN0cmluZyhlbmRwb2ludFBhcmFtcy5FbmRwb2ludCkuc3RhcnRzV2l0aChcImh0dHA6XCIpKSB8fFxuICAgICAgICBidWNrZXQudG9Mb3dlckNhc2UoKSAhPT0gYnVja2V0IHx8XG4gICAgICAgIGJ1Y2tldC5sZW5ndGggPCAzKSB7XG4gICAgICAgIGVuZHBvaW50UGFyYW1zLkZvcmNlUGF0aFN0eWxlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGVuZHBvaW50UGFyYW1zLkRpc2FibGVNdWx0aVJlZ2lvbkFjY2Vzc1BvaW50cykge1xuICAgICAgICBlbmRwb2ludFBhcmFtcy5kaXNhYmxlTXVsdGlSZWdpb25BY2Nlc3NQb2ludHMgPSB0cnVlO1xuICAgICAgICBlbmRwb2ludFBhcmFtcy5EaXNhYmxlTVJBUCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBlbmRwb2ludFBhcmFtcztcbn07XG5jb25zdCBET01BSU5fUEFUVEVSTiA9IC9eW2EtejAtOV1bYS16MC05XFwuXFwtXXsxLDYxfVthLXowLTldJC87XG5jb25zdCBJUF9BRERSRVNTX1BBVFRFUk4gPSAvKFxcZCtcXC4pezN9XFxkKy87XG5jb25zdCBET1RTX1BBVFRFUk4gPSAvXFwuXFwuLztcbmNvbnN0IGlzRG5zQ29tcGF0aWJsZUJ1Y2tldE5hbWUgPSAoYnVja2V0TmFtZSkgPT4gRE9NQUlOX1BBVFRFUk4udGVzdChidWNrZXROYW1lKSAmJiAhSVBfQUREUkVTU19QQVRURVJOLnRlc3QoYnVja2V0TmFtZSkgJiYgIURPVFNfUEFUVEVSTi50ZXN0KGJ1Y2tldE5hbWUpO1xuY29uc3QgaXNBcm5CdWNrZXROYW1lID0gKGJ1Y2tldE5hbWUpID0+IHtcbiAgICBjb25zdCBbYXJuLCBwYXJ0aXRpb24sIHNlcnZpY2UsICwgLCBidWNrZXRdID0gYnVja2V0TmFtZS5zcGxpdChcIjpcIik7XG4gICAgY29uc3QgaXNBcm4gPSBhcm4gPT09IFwiYXJuXCIgJiYgYnVja2V0TmFtZS5zcGxpdChcIjpcIikubGVuZ3RoID49IDY7XG4gICAgY29uc3QgaXNWYWxpZEFybiA9IEJvb2xlYW4oaXNBcm4gJiYgcGFydGl0aW9uICYmIHNlcnZpY2UgJiYgYnVja2V0KTtcbiAgICBpZiAoaXNBcm4gJiYgIWlzVmFsaWRBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEFSTjogJHtidWNrZXROYW1lfSB3YXMgYW4gaW52YWxpZCBBUk4uYCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkQXJuO1xufTtcblxuY29uc3QgY3JlYXRlQ29uZmlnVmFsdWVQcm92aWRlciA9IChjb25maWdLZXksIGNhbm9uaWNhbEVuZHBvaW50UGFyYW1LZXksIGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGNvbmZpZ1Byb3ZpZGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb25maWdWYWx1ZSA9IGNvbmZpZ1tjb25maWdLZXldID8/IGNvbmZpZ1tjYW5vbmljYWxFbmRwb2ludFBhcmFtS2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgfTtcbiAgICBpZiAoY29uZmlnS2V5ID09PSBcImNyZWRlbnRpYWxTY29wZVwiIHx8IGNhbm9uaWNhbEVuZHBvaW50UGFyYW1LZXkgPT09IFwiQ3JlZGVudGlhbFNjb3BlXCIpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gdHlwZW9mIGNvbmZpZy5jcmVkZW50aWFscyA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgY29uZmlnLmNyZWRlbnRpYWxzKCkgOiBjb25maWcuY3JlZGVudGlhbHM7XG4gICAgICAgICAgICBjb25zdCBjb25maWdWYWx1ZSA9IGNyZWRlbnRpYWxzPy5jcmVkZW50aWFsU2NvcGUgPz8gY3JlZGVudGlhbHM/LkNyZWRlbnRpYWxTY29wZTtcbiAgICAgICAgICAgIHJldHVybiBjb25maWdWYWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ0tleSA9PT0gXCJhY2NvdW50SWRcIiB8fCBjYW5vbmljYWxFbmRwb2ludFBhcmFtS2V5ID09PSBcIkFjY291bnRJZFwiKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjcmVkZW50aWFscyA9IHR5cGVvZiBjb25maWcuY3JlZGVudGlhbHMgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IGNvbmZpZy5jcmVkZW50aWFscygpIDogY29uZmlnLmNyZWRlbnRpYWxzO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnVmFsdWUgPSBjcmVkZW50aWFscz8uYWNjb3VudElkID8/IGNyZWRlbnRpYWxzPy5BY2NvdW50SWQ7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChjb25maWdLZXkgPT09IFwiZW5kcG9pbnRcIiB8fCBjYW5vbmljYWxFbmRwb2ludFBhcmFtS2V5ID09PSBcImVuZHBvaW50XCIpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maWcuaXNDdXN0b21FbmRwb2ludCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBhd2FpdCBjb25maWdQcm92aWRlcigpO1xuICAgICAgICAgICAgaWYgKGVuZHBvaW50ICYmIHR5cGVvZiBlbmRwb2ludCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChcInVybFwiIGluIGVuZHBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludC51cmwuaHJlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFwiaG9zdG5hbWVcIiBpbiBlbmRwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCwgcGF0aCB9ID0gZW5kcG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9JHtwb3J0ID8gXCI6XCIgKyBwb3J0IDogXCJcIn0ke3BhdGh9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjb25maWdQcm92aWRlcjtcbn07XG5cbmNvbnN0IHRvRW5kcG9pbnRWMSA9IChlbmRwb2ludCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW5kcG9pbnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKFwidXJsXCIgaW4gZW5kcG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxQYXJzZXIucGFyc2VVcmwoZW5kcG9pbnQudXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW5kcG9pbnQ7XG4gICAgfVxuICAgIHJldHVybiB1cmxQYXJzZXIucGFyc2VVcmwoZW5kcG9pbnQpO1xufTtcblxuY29uc3QgZ2V0RW5kcG9pbnRGcm9tSW5zdHJ1Y3Rpb25zID0gYXN5bmMgKGNvbW1hbmRJbnB1dCwgaW5zdHJ1Y3Rpb25zU3VwcGxpZXIsIGNsaWVudENvbmZpZywgY29udGV4dCkgPT4ge1xuICAgIGlmICghY2xpZW50Q29uZmlnLmlzQ3VzdG9tRW5kcG9pbnQpIHtcbiAgICAgICAgbGV0IGVuZHBvaW50RnJvbUNvbmZpZztcbiAgICAgICAgaWYgKGNsaWVudENvbmZpZy5zZXJ2aWNlQ29uZmlndXJlZEVuZHBvaW50KSB7XG4gICAgICAgICAgICBlbmRwb2ludEZyb21Db25maWcgPSBhd2FpdCBjbGllbnRDb25maWcuc2VydmljZUNvbmZpZ3VyZWRFbmRwb2ludCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kcG9pbnRGcm9tQ29uZmlnID0gYXdhaXQgZ2V0RW5kcG9pbnRGcm9tQ29uZmlnLmdldEVuZHBvaW50RnJvbUNvbmZpZyhjbGllbnRDb25maWcuc2VydmljZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kcG9pbnRGcm9tQ29uZmlnKSB7XG4gICAgICAgICAgICBjbGllbnRDb25maWcuZW5kcG9pbnQgPSAoKSA9PiBQcm9taXNlLnJlc29sdmUodG9FbmRwb2ludFYxKGVuZHBvaW50RnJvbUNvbmZpZykpO1xuICAgICAgICAgICAgY2xpZW50Q29uZmlnLmlzQ3VzdG9tRW5kcG9pbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVuZHBvaW50UGFyYW1zID0gYXdhaXQgcmVzb2x2ZVBhcmFtcyhjb21tYW5kSW5wdXQsIGluc3RydWN0aW9uc1N1cHBsaWVyLCBjbGllbnRDb25maWcpO1xuICAgIGlmICh0eXBlb2YgY2xpZW50Q29uZmlnLmVuZHBvaW50UHJvdmlkZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb25maWcuZW5kcG9pbnRQcm92aWRlciBpcyBub3Qgc2V0LlwiKTtcbiAgICB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBjbGllbnRDb25maWcuZW5kcG9pbnRQcm92aWRlcihlbmRwb2ludFBhcmFtcywgY29udGV4dCk7XG4gICAgcmV0dXJuIGVuZHBvaW50O1xufTtcbmNvbnN0IHJlc29sdmVQYXJhbXMgPSBhc3luYyAoY29tbWFuZElucHV0LCBpbnN0cnVjdGlvbnNTdXBwbGllciwgY2xpZW50Q29uZmlnKSA9PiB7XG4gICAgY29uc3QgZW5kcG9pbnRQYXJhbXMgPSB7fTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnNTdXBwbGllcj8uZ2V0RW5kcG9pbnRQYXJhbWV0ZXJJbnN0cnVjdGlvbnM/LigpIHx8IHt9O1xuICAgIGZvciAoY29uc3QgW25hbWUsIGluc3RydWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhpbnN0cnVjdGlvbnMpKSB7XG4gICAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0YXRpY0NvbnRleHRQYXJhbXNcIjpcbiAgICAgICAgICAgICAgICBlbmRwb2ludFBhcmFtc1tuYW1lXSA9IGluc3RydWN0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbnRleHRQYXJhbXNcIjpcbiAgICAgICAgICAgICAgICBlbmRwb2ludFBhcmFtc1tuYW1lXSA9IGNvbW1hbmRJbnB1dFtpbnN0cnVjdGlvbi5uYW1lXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjbGllbnRDb250ZXh0UGFyYW1zXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnVpbHRJblBhcmFtc1wiOlxuICAgICAgICAgICAgICAgIGVuZHBvaW50UGFyYW1zW25hbWVdID0gYXdhaXQgY3JlYXRlQ29uZmlnVmFsdWVQcm92aWRlcihpbnN0cnVjdGlvbi5uYW1lLCBuYW1lLCBjbGllbnRDb25maWcpKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwib3BlcmF0aW9uQ29udGV4dFBhcmFtc1wiOlxuICAgICAgICAgICAgICAgIGVuZHBvaW50UGFyYW1zW25hbWVdID0gaW5zdHJ1Y3Rpb24uZ2V0KGNvbW1hbmRJbnB1dCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBlbmRwb2ludCBwYXJhbWV0ZXIgaW5zdHJ1Y3Rpb246IFwiICsgSlNPTi5zdHJpbmdpZnkoaW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbmRwb2ludFBhcmFtcywgY2xpZW50Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFN0cmluZyhjbGllbnRDb25maWcuc2VydmljZUlkKS50b0xvd2VyQ2FzZSgpID09PSBcInMzXCIpIHtcbiAgICAgICAgYXdhaXQgcmVzb2x2ZVBhcmFtc0ZvclMzKGVuZHBvaW50UGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZHBvaW50UGFyYW1zO1xufTtcblxuY29uc3QgZW5kcG9pbnRNaWRkbGV3YXJlID0gKHsgY29uZmlnLCBpbnN0cnVjdGlvbnMsIH0pID0+IHtcbiAgICByZXR1cm4gKG5leHQsIGNvbnRleHQpID0+IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIGlmIChjb25maWcuaXNDdXN0b21FbmRwb2ludCkge1xuICAgICAgICAgICAgY29yZS5zZXRGZWF0dXJlKGNvbnRleHQsIFwiRU5EUE9JTlRfT1ZFUlJJREVcIiwgXCJOXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgZ2V0RW5kcG9pbnRGcm9tSW5zdHJ1Y3Rpb25zKGFyZ3MuaW5wdXQsIHtcbiAgICAgICAgICAgIGdldEVuZHBvaW50UGFyYW1ldGVySW5zdHJ1Y3Rpb25zKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LCB7IC4uLmNvbmZpZyB9LCBjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC5lbmRwb2ludFYyID0gZW5kcG9pbnQ7XG4gICAgICAgIGNvbnRleHQuYXV0aFNjaGVtZXMgPSBlbmRwb2ludC5wcm9wZXJ0aWVzPy5hdXRoU2NoZW1lcztcbiAgICAgICAgY29uc3QgYXV0aFNjaGVtZSA9IGNvbnRleHQuYXV0aFNjaGVtZXM/LlswXTtcbiAgICAgICAgaWYgKGF1dGhTY2hlbWUpIHtcbiAgICAgICAgICAgIGNvbnRleHRbXCJzaWduaW5nX3JlZ2lvblwiXSA9IGF1dGhTY2hlbWUuc2lnbmluZ1JlZ2lvbjtcbiAgICAgICAgICAgIGNvbnRleHRbXCJzaWduaW5nX3NlcnZpY2VcIl0gPSBhdXRoU2NoZW1lLnNpZ25pbmdOYW1lO1xuICAgICAgICAgICAgY29uc3Qgc21pdGh5Q29udGV4dCA9IHV0aWxNaWRkbGV3YXJlLmdldFNtaXRoeUNvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBodHRwQXV0aE9wdGlvbiA9IHNtaXRoeUNvbnRleHQ/LnNlbGVjdGVkSHR0cEF1dGhTY2hlbWU/Lmh0dHBBdXRoT3B0aW9uO1xuICAgICAgICAgICAgaWYgKGh0dHBBdXRoT3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgaHR0cEF1dGhPcHRpb24uc2lnbmluZ1Byb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKGh0dHBBdXRoT3B0aW9uLnNpZ25pbmdQcm9wZXJ0aWVzIHx8IHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25pbmdfcmVnaW9uOiBhdXRoU2NoZW1lLnNpZ25pbmdSZWdpb24sXG4gICAgICAgICAgICAgICAgICAgIHNpZ25pbmdSZWdpb246IGF1dGhTY2hlbWUuc2lnbmluZ1JlZ2lvbixcbiAgICAgICAgICAgICAgICAgICAgc2lnbmluZ19zZXJ2aWNlOiBhdXRoU2NoZW1lLnNpZ25pbmdOYW1lLFxuICAgICAgICAgICAgICAgICAgICBzaWduaW5nTmFtZTogYXV0aFNjaGVtZS5zaWduaW5nTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2lnbmluZ1JlZ2lvblNldDogYXV0aFNjaGVtZS5zaWduaW5nUmVnaW9uU2V0LFxuICAgICAgICAgICAgICAgIH0sIGF1dGhTY2hlbWUucHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgfSk7XG4gICAgfTtcbn07XG5cbmNvbnN0IGVuZHBvaW50TWlkZGxld2FyZU9wdGlvbnMgPSB7XG4gICAgc3RlcDogXCJzZXJpYWxpemVcIixcbiAgICB0YWdzOiBbXCJFTkRQT0lOVF9QQVJBTUVURVJTXCIsIFwiRU5EUE9JTlRfVjJcIiwgXCJFTkRQT0lOVFwiXSxcbiAgICBuYW1lOiBcImVuZHBvaW50VjJNaWRkbGV3YXJlXCIsXG4gICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgcmVsYXRpb246IFwiYmVmb3JlXCIsXG4gICAgdG9NaWRkbGV3YXJlOiBtaWRkbGV3YXJlU2VyZGUuc2VyaWFsaXplck1pZGRsZXdhcmVPcHRpb24ubmFtZSxcbn07XG5jb25zdCBnZXRFbmRwb2ludFBsdWdpbiA9IChjb25maWcsIGluc3RydWN0aW9ucykgPT4gKHtcbiAgICBhcHBseVRvU3RhY2s6IChjbGllbnRTdGFjaykgPT4ge1xuICAgICAgICBjbGllbnRTdGFjay5hZGRSZWxhdGl2ZVRvKGVuZHBvaW50TWlkZGxld2FyZSh7XG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbnN0cnVjdGlvbnMsXG4gICAgICAgIH0pLCBlbmRwb2ludE1pZGRsZXdhcmVPcHRpb25zKTtcbiAgICB9LFxufSk7XG5cbmNvbnN0IHJlc29sdmVFbmRwb2ludENvbmZpZyA9IChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IHRscyA9IGlucHV0LnRscyA/PyB0cnVlO1xuICAgIGNvbnN0IHsgZW5kcG9pbnQsIHVzZUR1YWxzdGFja0VuZHBvaW50LCB1c2VGaXBzRW5kcG9pbnQgfSA9IGlucHV0O1xuICAgIGNvbnN0IGN1c3RvbUVuZHBvaW50UHJvdmlkZXIgPSBlbmRwb2ludCAhPSBudWxsID8gYXN5bmMgKCkgPT4gdG9FbmRwb2ludFYxKGF3YWl0IHV0aWxNaWRkbGV3YXJlLm5vcm1hbGl6ZVByb3ZpZGVyKGVuZHBvaW50KSgpKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc0N1c3RvbUVuZHBvaW50ID0gISFlbmRwb2ludDtcbiAgICBjb25zdCByZXNvbHZlZENvbmZpZyA9IE9iamVjdC5hc3NpZ24oaW5wdXQsIHtcbiAgICAgICAgZW5kcG9pbnQ6IGN1c3RvbUVuZHBvaW50UHJvdmlkZXIsXG4gICAgICAgIHRscyxcbiAgICAgICAgaXNDdXN0b21FbmRwb2ludCxcbiAgICAgICAgdXNlRHVhbHN0YWNrRW5kcG9pbnQ6IHV0aWxNaWRkbGV3YXJlLm5vcm1hbGl6ZVByb3ZpZGVyKHVzZUR1YWxzdGFja0VuZHBvaW50ID8/IGZhbHNlKSxcbiAgICAgICAgdXNlRmlwc0VuZHBvaW50OiB1dGlsTWlkZGxld2FyZS5ub3JtYWxpemVQcm92aWRlcih1c2VGaXBzRW5kcG9pbnQgPz8gZmFsc2UpLFxuICAgIH0pO1xuICAgIGxldCBjb25maWd1cmVkRW5kcG9pbnRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHJlc29sdmVkQ29uZmlnLnNlcnZpY2VDb25maWd1cmVkRW5kcG9pbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChpbnB1dC5zZXJ2aWNlSWQgJiYgIWNvbmZpZ3VyZWRFbmRwb2ludFByb21pc2UpIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyZWRFbmRwb2ludFByb21pc2UgPSBnZXRFbmRwb2ludEZyb21Db25maWcuZ2V0RW5kcG9pbnRGcm9tQ29uZmlnKGlucHV0LnNlcnZpY2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZWRFbmRwb2ludFByb21pc2U7XG4gICAgfTtcbiAgICByZXR1cm4gcmVzb2x2ZWRDb25maWc7XG59O1xuXG5jb25zdCByZXNvbHZlRW5kcG9pbnRSZXF1aXJlZENvbmZpZyA9IChpbnB1dCkgPT4ge1xuICAgIGNvbnN0IHsgZW5kcG9pbnQgfSA9IGlucHV0O1xuICAgIGlmIChlbmRwb2ludCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlucHV0LmVuZHBvaW50ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQHNtaXRoeS9taWRkbGV3YXJlLWVuZHBvaW50OiAoZGVmYXVsdCBlbmRwb2ludFJ1bGVTZXQpIGVuZHBvaW50IGlzIG5vdCBzZXQgLSB5b3UgbXVzdCBjb25maWd1cmUgYW4gZW5kcG9pbnQuXCIpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXQ7XG59O1xuXG5leHBvcnRzLmVuZHBvaW50TWlkZGxld2FyZSA9IGVuZHBvaW50TWlkZGxld2FyZTtcbmV4cG9ydHMuZW5kcG9pbnRNaWRkbGV3YXJlT3B0aW9ucyA9IGVuZHBvaW50TWlkZGxld2FyZU9wdGlvbnM7XG5leHBvcnRzLmdldEVuZHBvaW50RnJvbUluc3RydWN0aW9ucyA9IGdldEVuZHBvaW50RnJvbUluc3RydWN0aW9ucztcbmV4cG9ydHMuZ2V0RW5kcG9pbnRQbHVnaW4gPSBnZXRFbmRwb2ludFBsdWdpbjtcbmV4cG9ydHMucmVzb2x2ZUVuZHBvaW50Q29uZmlnID0gcmVzb2x2ZUVuZHBvaW50Q29uZmlnO1xuZXhwb3J0cy5yZXNvbHZlRW5kcG9pbnRSZXF1aXJlZENvbmZpZyA9IHJlc29sdmVFbmRwb2ludFJlcXVpcmVkQ29uZmlnO1xuZXhwb3J0cy5yZXNvbHZlUGFyYW1zID0gcmVzb2x2ZVBhcmFtcztcbmV4cG9ydHMudG9FbmRwb2ludFYxID0gdG9FbmRwb2ludFYxO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IENMT0NLX1NLRVdfRVJST1JfQ09ERVMgPSBbXG4gICAgXCJBdXRoRmFpbHVyZVwiLFxuICAgIFwiSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvblwiLFxuICAgIFwiUmVxdWVzdEV4cGlyZWRcIixcbiAgICBcIlJlcXVlc3RJblRoZUZ1dHVyZVwiLFxuICAgIFwiUmVxdWVzdFRpbWVUb29Ta2V3ZWRcIixcbiAgICBcIlNpZ25hdHVyZURvZXNOb3RNYXRjaFwiLFxuXTtcbmNvbnN0IFRIUk9UVExJTkdfRVJST1JfQ09ERVMgPSBbXG4gICAgXCJCYW5kd2lkdGhMaW1pdEV4Y2VlZGVkXCIsXG4gICAgXCJFQzJUaHJvdHRsZWRFeGNlcHRpb25cIixcbiAgICBcIkxpbWl0RXhjZWVkZWRFeGNlcHRpb25cIixcbiAgICBcIlByaW9yUmVxdWVzdE5vdENvbXBsZXRlXCIsXG4gICAgXCJQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEV4Y2VwdGlvblwiLFxuICAgIFwiUmVxdWVzdExpbWl0RXhjZWVkZWRcIixcbiAgICBcIlJlcXVlc3RUaHJvdHRsZWRcIixcbiAgICBcIlJlcXVlc3RUaHJvdHRsZWRFeGNlcHRpb25cIixcbiAgICBcIlNsb3dEb3duXCIsXG4gICAgXCJUaHJvdHRsZWRFeGNlcHRpb25cIixcbiAgICBcIlRocm90dGxpbmdcIixcbiAgICBcIlRocm90dGxpbmdFeGNlcHRpb25cIixcbiAgICBcIlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvblwiLFxuICAgIFwiVHJhbnNhY3Rpb25JblByb2dyZXNzRXhjZXB0aW9uXCIsXG5dO1xuY29uc3QgVFJBTlNJRU5UX0VSUk9SX0NPREVTID0gW1wiVGltZW91dEVycm9yXCIsIFwiUmVxdWVzdFRpbWVvdXRcIiwgXCJSZXF1ZXN0VGltZW91dEV4Y2VwdGlvblwiXTtcbmNvbnN0IFRSQU5TSUVOVF9FUlJPUl9TVEFUVVNfQ09ERVMgPSBbNTAwLCA1MDIsIDUwMywgNTA0XTtcbmNvbnN0IE5PREVKU19USU1FT1VUX0VSUk9SX0NPREVTID0gW1wiRUNPTk5SRVNFVFwiLCBcIkVDT05OUkVGVVNFRFwiLCBcIkVQSVBFXCIsIFwiRVRJTUVET1VUXCJdO1xuY29uc3QgTk9ERUpTX05FVFdPUktfRVJST1JfQ09ERVMgPSBbXCJFSE9TVFVOUkVBQ0hcIiwgXCJFTkVUVU5SRUFDSFwiLCBcIkVOT1RGT1VORFwiXTtcblxuY29uc3QgaXNSZXRyeWFibGVCeVRyYWl0ID0gKGVycm9yKSA9PiBlcnJvcj8uJHJldHJ5YWJsZSAhPT0gdW5kZWZpbmVkO1xuY29uc3QgaXNDbG9ja1NrZXdFcnJvciA9IChlcnJvcikgPT4gQ0xPQ0tfU0tFV19FUlJPUl9DT0RFUy5pbmNsdWRlcyhlcnJvci5uYW1lKTtcbmNvbnN0IGlzQ2xvY2tTa2V3Q29ycmVjdGVkRXJyb3IgPSAoZXJyb3IpID0+IGVycm9yLiRtZXRhZGF0YT8uY2xvY2tTa2V3Q29ycmVjdGVkO1xuY29uc3QgaXNCcm93c2VyTmV0d29ya0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlcyA9IG5ldyBTZXQoW1xuICAgICAgICBcIkZhaWxlZCB0byBmZXRjaFwiLFxuICAgICAgICBcIk5ldHdvcmtFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2VcIixcbiAgICAgICAgXCJUaGUgSW50ZXJuZXQgY29ubmVjdGlvbiBhcHBlYXJzIHRvIGJlIG9mZmxpbmVcIixcbiAgICAgICAgXCJMb2FkIGZhaWxlZFwiLFxuICAgICAgICBcIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWRcIixcbiAgICBdKTtcbiAgICBjb25zdCBpc1ZhbGlkID0gZXJyb3IgJiYgZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3I7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yTWVzc2FnZXMuaGFzKGVycm9yLm1lc3NhZ2UpO1xufTtcbmNvbnN0IGlzVGhyb3R0bGluZ0Vycm9yID0gKGVycm9yKSA9PiBlcnJvci4kbWV0YWRhdGE/Lmh0dHBTdGF0dXNDb2RlID09PSA0MjkgfHxcbiAgICBUSFJPVFRMSU5HX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVycm9yLm5hbWUpIHx8XG4gICAgZXJyb3IuJHJldHJ5YWJsZT8udGhyb3R0bGluZyA9PSB0cnVlO1xuY29uc3QgaXNUcmFuc2llbnRFcnJvciA9IChlcnJvciwgZGVwdGggPSAwKSA9PiBpc1JldHJ5YWJsZUJ5VHJhaXQoZXJyb3IpIHx8XG4gICAgaXNDbG9ja1NrZXdDb3JyZWN0ZWRFcnJvcihlcnJvcikgfHxcbiAgICBUUkFOU0lFTlRfRVJST1JfQ09ERVMuaW5jbHVkZXMoZXJyb3IubmFtZSkgfHxcbiAgICBOT0RFSlNfVElNRU9VVF9FUlJPUl9DT0RFUy5pbmNsdWRlcyhlcnJvcj8uY29kZSB8fCBcIlwiKSB8fFxuICAgIE5PREVKU19ORVRXT1JLX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVycm9yPy5jb2RlIHx8IFwiXCIpIHx8XG4gICAgVFJBTlNJRU5UX0VSUk9SX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhlcnJvci4kbWV0YWRhdGE/Lmh0dHBTdGF0dXNDb2RlIHx8IDApIHx8XG4gICAgaXNCcm93c2VyTmV0d29ya0Vycm9yKGVycm9yKSB8fFxuICAgIChlcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkICYmIGRlcHRoIDw9IDEwICYmIGlzVHJhbnNpZW50RXJyb3IoZXJyb3IuY2F1c2UsIGRlcHRoICsgMSkpO1xuY29uc3QgaXNTZXJ2ZXJFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvci4kbWV0YWRhdGE/Lmh0dHBTdGF0dXNDb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLiRtZXRhZGF0YS5odHRwU3RhdHVzQ29kZTtcbiAgICAgICAgaWYgKDUwMCA8PSBzdGF0dXNDb2RlICYmIHN0YXR1c0NvZGUgPD0gNTk5ICYmICFpc1RyYW5zaWVudEVycm9yKGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzQnJvd3Nlck5ldHdvcmtFcnJvciA9IGlzQnJvd3Nlck5ldHdvcmtFcnJvcjtcbmV4cG9ydHMuaXNDbG9ja1NrZXdDb3JyZWN0ZWRFcnJvciA9IGlzQ2xvY2tTa2V3Q29ycmVjdGVkRXJyb3I7XG5leHBvcnRzLmlzQ2xvY2tTa2V3RXJyb3IgPSBpc0Nsb2NrU2tld0Vycm9yO1xuZXhwb3J0cy5pc1JldHJ5YWJsZUJ5VHJhaXQgPSBpc1JldHJ5YWJsZUJ5VHJhaXQ7XG5leHBvcnRzLmlzU2VydmVyRXJyb3IgPSBpc1NlcnZlckVycm9yO1xuZXhwb3J0cy5pc1Rocm90dGxpbmdFcnJvciA9IGlzVGhyb3R0bGluZ0Vycm9yO1xuZXhwb3J0cy5pc1RyYW5zaWVudEVycm9yID0gaXNUcmFuc2llbnRFcnJvcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc2VydmljZUVycm9yQ2xhc3NpZmljYXRpb24gPSByZXF1aXJlKCdAc21pdGh5L3NlcnZpY2UtZXJyb3ItY2xhc3NpZmljYXRpb24nKTtcblxuZXhwb3J0cy5SRVRSWV9NT0RFUyA9IHZvaWQgMDtcbihmdW5jdGlvbiAoUkVUUllfTU9ERVMpIHtcbiAgICBSRVRSWV9NT0RFU1tcIlNUQU5EQVJEXCJdID0gXCJzdGFuZGFyZFwiO1xuICAgIFJFVFJZX01PREVTW1wiQURBUFRJVkVcIl0gPSBcImFkYXB0aXZlXCI7XG59KShleHBvcnRzLlJFVFJZX01PREVTIHx8IChleHBvcnRzLlJFVFJZX01PREVTID0ge30pKTtcbmNvbnN0IERFRkFVTFRfTUFYX0FUVEVNUFRTID0gMztcbmNvbnN0IERFRkFVTFRfUkVUUllfTU9ERSA9IGV4cG9ydHMuUkVUUllfTU9ERVMuU1RBTkRBUkQ7XG5cbmNsYXNzIERlZmF1bHRSYXRlTGltaXRlciB7XG4gICAgc3RhdGljIHNldFRpbWVvdXRGbiA9IHNldFRpbWVvdXQ7XG4gICAgYmV0YTtcbiAgICBtaW5DYXBhY2l0eTtcbiAgICBtaW5GaWxsUmF0ZTtcbiAgICBzY2FsZUNvbnN0YW50O1xuICAgIHNtb290aDtcbiAgICBjdXJyZW50Q2FwYWNpdHkgPSAwO1xuICAgIGVuYWJsZWQgPSBmYWxzZTtcbiAgICBsYXN0TWF4UmF0ZSA9IDA7XG4gICAgbWVhc3VyZWRUeFJhdGUgPSAwO1xuICAgIHJlcXVlc3RDb3VudCA9IDA7XG4gICAgZmlsbFJhdGU7XG4gICAgbGFzdFRocm90dGxlVGltZTtcbiAgICBsYXN0VGltZXN0YW1wID0gMDtcbiAgICBsYXN0VHhSYXRlQnVja2V0O1xuICAgIG1heENhcGFjaXR5O1xuICAgIHRpbWVXaW5kb3cgPSAwO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5iZXRhID0gb3B0aW9ucz8uYmV0YSA/PyAwLjc7XG4gICAgICAgIHRoaXMubWluQ2FwYWNpdHkgPSBvcHRpb25zPy5taW5DYXBhY2l0eSA/PyAxO1xuICAgICAgICB0aGlzLm1pbkZpbGxSYXRlID0gb3B0aW9ucz8ubWluRmlsbFJhdGUgPz8gMC41O1xuICAgICAgICB0aGlzLnNjYWxlQ29uc3RhbnQgPSBvcHRpb25zPy5zY2FsZUNvbnN0YW50ID8/IDAuNDtcbiAgICAgICAgdGhpcy5zbW9vdGggPSBvcHRpb25zPy5zbW9vdGggPz8gMC44O1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZUluU2Vjb25kcyA9IHRoaXMuZ2V0Q3VycmVudFRpbWVJblNlY29uZHMoKTtcbiAgICAgICAgdGhpcy5sYXN0VGhyb3R0bGVUaW1lID0gY3VycmVudFRpbWVJblNlY29uZHM7XG4gICAgICAgIHRoaXMubGFzdFR4UmF0ZUJ1Y2tldCA9IE1hdGguZmxvb3IodGhpcy5nZXRDdXJyZW50VGltZUluU2Vjb25kcygpKTtcbiAgICAgICAgdGhpcy5maWxsUmF0ZSA9IHRoaXMubWluRmlsbFJhdGU7XG4gICAgICAgIHRoaXMubWF4Q2FwYWNpdHkgPSB0aGlzLm1pbkNhcGFjaXR5O1xuICAgIH1cbiAgICBnZXRDdXJyZW50VGltZUluU2Vjb25kcygpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLyAxMDAwO1xuICAgIH1cbiAgICBhc3luYyBnZXRTZW5kVG9rZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbkJ1Y2tldCgxKTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZVRva2VuQnVja2V0KGFtb3VudCkge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmaWxsVG9rZW5CdWNrZXQoKTtcbiAgICAgICAgaWYgKGFtb3VudCA+IHRoaXMuY3VycmVudENhcGFjaXR5KSB7XG4gICAgICAgICAgICBjb25zdCBkZWxheSA9ICgoYW1vdW50IC0gdGhpcy5jdXJyZW50Q2FwYWNpdHkpIC8gdGhpcy5maWxsUmF0ZSkgKiAxMDAwO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IERlZmF1bHRSYXRlTGltaXRlci5zZXRUaW1lb3V0Rm4ocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRDYXBhY2l0eSA9IHRoaXMuY3VycmVudENhcGFjaXR5IC0gYW1vdW50O1xuICAgIH1cbiAgICByZWZpbGxUb2tlbkJ1Y2tldCgpIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRDdXJyZW50VGltZUluU2Vjb25kcygpO1xuICAgICAgICBpZiAoIXRoaXMubGFzdFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0VGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbGxBbW91bnQgPSAodGltZXN0YW1wIC0gdGhpcy5sYXN0VGltZXN0YW1wKSAqIHRoaXMuZmlsbFJhdGU7XG4gICAgICAgIHRoaXMuY3VycmVudENhcGFjaXR5ID0gTWF0aC5taW4odGhpcy5tYXhDYXBhY2l0eSwgdGhpcy5jdXJyZW50Q2FwYWNpdHkgKyBmaWxsQW1vdW50KTtcbiAgICAgICAgdGhpcy5sYXN0VGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgIH1cbiAgICB1cGRhdGVDbGllbnRTZW5kaW5nUmF0ZShyZXNwb25zZSkge1xuICAgICAgICBsZXQgY2FsY3VsYXRlZFJhdGU7XG4gICAgICAgIHRoaXMudXBkYXRlTWVhc3VyZWRSYXRlKCk7XG4gICAgICAgIGlmIChzZXJ2aWNlRXJyb3JDbGFzc2lmaWNhdGlvbi5pc1Rocm90dGxpbmdFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdGVUb1VzZSA9ICF0aGlzLmVuYWJsZWQgPyB0aGlzLm1lYXN1cmVkVHhSYXRlIDogTWF0aC5taW4odGhpcy5tZWFzdXJlZFR4UmF0ZSwgdGhpcy5maWxsUmF0ZSk7XG4gICAgICAgICAgICB0aGlzLmxhc3RNYXhSYXRlID0gcmF0ZVRvVXNlO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUaW1lV2luZG93KCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RUaHJvdHRsZVRpbWUgPSB0aGlzLmdldEN1cnJlbnRUaW1lSW5TZWNvbmRzKCk7XG4gICAgICAgICAgICBjYWxjdWxhdGVkUmF0ZSA9IHRoaXMuY3ViaWNUaHJvdHRsZShyYXRlVG9Vc2UpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVUb2tlbkJ1Y2tldCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUaW1lV2luZG93KCk7XG4gICAgICAgICAgICBjYWxjdWxhdGVkUmF0ZSA9IHRoaXMuY3ViaWNTdWNjZXNzKHRoaXMuZ2V0Q3VycmVudFRpbWVJblNlY29uZHMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UmF0ZSA9IE1hdGgubWluKGNhbGN1bGF0ZWRSYXRlLCAyICogdGhpcy5tZWFzdXJlZFR4UmF0ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlVG9rZW5CdWNrZXRSYXRlKG5ld1JhdGUpO1xuICAgIH1cbiAgICBjYWxjdWxhdGVUaW1lV2luZG93KCkge1xuICAgICAgICB0aGlzLnRpbWVXaW5kb3cgPSB0aGlzLmdldFByZWNpc2UoTWF0aC5wb3coKHRoaXMubGFzdE1heFJhdGUgKiAoMSAtIHRoaXMuYmV0YSkpIC8gdGhpcy5zY2FsZUNvbnN0YW50LCAxIC8gMykpO1xuICAgIH1cbiAgICBjdWJpY1Rocm90dGxlKHJhdGVUb1VzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQcmVjaXNlKHJhdGVUb1VzZSAqIHRoaXMuYmV0YSk7XG4gICAgfVxuICAgIGN1YmljU3VjY2Vzcyh0aW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJlY2lzZSh0aGlzLnNjYWxlQ29uc3RhbnQgKiBNYXRoLnBvdyh0aW1lc3RhbXAgLSB0aGlzLmxhc3RUaHJvdHRsZVRpbWUgLSB0aGlzLnRpbWVXaW5kb3csIDMpICsgdGhpcy5sYXN0TWF4UmF0ZSk7XG4gICAgfVxuICAgIGVuYWJsZVRva2VuQnVja2V0KCkge1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB1cGRhdGVUb2tlbkJ1Y2tldFJhdGUobmV3UmF0ZSkge1xuICAgICAgICB0aGlzLnJlZmlsbFRva2VuQnVja2V0KCk7XG4gICAgICAgIHRoaXMuZmlsbFJhdGUgPSBNYXRoLm1heChuZXdSYXRlLCB0aGlzLm1pbkZpbGxSYXRlKTtcbiAgICAgICAgdGhpcy5tYXhDYXBhY2l0eSA9IE1hdGgubWF4KG5ld1JhdGUsIHRoaXMubWluQ2FwYWNpdHkpO1xuICAgICAgICB0aGlzLmN1cnJlbnRDYXBhY2l0eSA9IE1hdGgubWluKHRoaXMuY3VycmVudENhcGFjaXR5LCB0aGlzLm1heENhcGFjaXR5KTtcbiAgICB9XG4gICAgdXBkYXRlTWVhc3VyZWRSYXRlKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRDdXJyZW50VGltZUluU2Vjb25kcygpO1xuICAgICAgICBjb25zdCB0aW1lQnVja2V0ID0gTWF0aC5mbG9vcih0ICogMikgLyAyO1xuICAgICAgICB0aGlzLnJlcXVlc3RDb3VudCsrO1xuICAgICAgICBpZiAodGltZUJ1Y2tldCA+IHRoaXMubGFzdFR4UmF0ZUJ1Y2tldCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJhdGUgPSB0aGlzLnJlcXVlc3RDb3VudCAvICh0aW1lQnVja2V0IC0gdGhpcy5sYXN0VHhSYXRlQnVja2V0KTtcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZWRUeFJhdGUgPSB0aGlzLmdldFByZWNpc2UoY3VycmVudFJhdGUgKiB0aGlzLnNtb290aCArIHRoaXMubWVhc3VyZWRUeFJhdGUgKiAoMSAtIHRoaXMuc21vb3RoKSk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RDb3VudCA9IDA7XG4gICAgICAgICAgICB0aGlzLmxhc3RUeFJhdGVCdWNrZXQgPSB0aW1lQnVja2V0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFByZWNpc2UobnVtKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG51bS50b0ZpeGVkKDgpKTtcbiAgICB9XG59XG5cbmNvbnN0IERFRkFVTFRfUkVUUllfREVMQVlfQkFTRSA9IDEwMDtcbmNvbnN0IE1BWElNVU1fUkVUUllfREVMQVkgPSAyMCAqIDEwMDA7XG5jb25zdCBUSFJPVFRMSU5HX1JFVFJZX0RFTEFZX0JBU0UgPSA1MDA7XG5jb25zdCBJTklUSUFMX1JFVFJZX1RPS0VOUyA9IDUwMDtcbmNvbnN0IFJFVFJZX0NPU1QgPSA1O1xuY29uc3QgVElNRU9VVF9SRVRSWV9DT1NUID0gMTA7XG5jb25zdCBOT19SRVRSWV9JTkNSRU1FTlQgPSAxO1xuY29uc3QgSU5WT0NBVElPTl9JRF9IRUFERVIgPSBcImFtei1zZGstaW52b2NhdGlvbi1pZFwiO1xuY29uc3QgUkVRVUVTVF9IRUFERVIgPSBcImFtei1zZGstcmVxdWVzdFwiO1xuXG5jb25zdCBnZXREZWZhdWx0UmV0cnlCYWNrb2ZmU3RyYXRlZ3kgPSAoKSA9PiB7XG4gICAgbGV0IGRlbGF5QmFzZSA9IERFRkFVTFRfUkVUUllfREVMQVlfQkFTRTtcbiAgICBjb25zdCBjb21wdXRlTmV4dEJhY2tvZmZEZWxheSA9IChhdHRlbXB0cykgPT4ge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLm1pbihNQVhJTVVNX1JFVFJZX0RFTEFZLCBNYXRoLnJhbmRvbSgpICogMiAqKiBhdHRlbXB0cyAqIGRlbGF5QmFzZSkpO1xuICAgIH07XG4gICAgY29uc3Qgc2V0RGVsYXlCYXNlID0gKGRlbGF5KSA9PiB7XG4gICAgICAgIGRlbGF5QmFzZSA9IGRlbGF5O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcHV0ZU5leHRCYWNrb2ZmRGVsYXksXG4gICAgICAgIHNldERlbGF5QmFzZSxcbiAgICB9O1xufTtcblxuY29uc3QgY3JlYXRlRGVmYXVsdFJldHJ5VG9rZW4gPSAoeyByZXRyeURlbGF5LCByZXRyeUNvdW50LCByZXRyeUNvc3QsIH0pID0+IHtcbiAgICBjb25zdCBnZXRSZXRyeUNvdW50ID0gKCkgPT4gcmV0cnlDb3VudDtcbiAgICBjb25zdCBnZXRSZXRyeURlbGF5ID0gKCkgPT4gTWF0aC5taW4oTUFYSU1VTV9SRVRSWV9ERUxBWSwgcmV0cnlEZWxheSk7XG4gICAgY29uc3QgZ2V0UmV0cnlDb3N0ID0gKCkgPT4gcmV0cnlDb3N0O1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldFJldHJ5Q291bnQsXG4gICAgICAgIGdldFJldHJ5RGVsYXksXG4gICAgICAgIGdldFJldHJ5Q29zdCxcbiAgICB9O1xufTtcblxuY2xhc3MgU3RhbmRhcmRSZXRyeVN0cmF0ZWd5IHtcbiAgICBtYXhBdHRlbXB0cztcbiAgICBtb2RlID0gZXhwb3J0cy5SRVRSWV9NT0RFUy5TVEFOREFSRDtcbiAgICBjYXBhY2l0eSA9IElOSVRJQUxfUkVUUllfVE9LRU5TO1xuICAgIHJldHJ5QmFja29mZlN0cmF0ZWd5ID0gZ2V0RGVmYXVsdFJldHJ5QmFja29mZlN0cmF0ZWd5KCk7XG4gICAgbWF4QXR0ZW1wdHNQcm92aWRlcjtcbiAgICBjb25zdHJ1Y3RvcihtYXhBdHRlbXB0cykge1xuICAgICAgICB0aGlzLm1heEF0dGVtcHRzID0gbWF4QXR0ZW1wdHM7XG4gICAgICAgIHRoaXMubWF4QXR0ZW1wdHNQcm92aWRlciA9IHR5cGVvZiBtYXhBdHRlbXB0cyA9PT0gXCJmdW5jdGlvblwiID8gbWF4QXR0ZW1wdHMgOiBhc3luYyAoKSA9PiBtYXhBdHRlbXB0cztcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZUluaXRpYWxSZXRyeVRva2VuKHJldHJ5VG9rZW5TY29wZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRGVmYXVsdFJldHJ5VG9rZW4oe1xuICAgICAgICAgICAgcmV0cnlEZWxheTogREVGQVVMVF9SRVRSWV9ERUxBWV9CQVNFLFxuICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHJlZnJlc2hSZXRyeVRva2VuRm9yUmV0cnkodG9rZW4sIGVycm9ySW5mbykge1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IGF3YWl0IHRoaXMuZ2V0TWF4QXR0ZW1wdHMoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkUmV0cnkodG9rZW4sIGVycm9ySW5mbywgbWF4QXR0ZW1wdHMpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvckluZm8uZXJyb3JUeXBlO1xuICAgICAgICAgICAgdGhpcy5yZXRyeUJhY2tvZmZTdHJhdGVneS5zZXREZWxheUJhc2UoZXJyb3JUeXBlID09PSBcIlRIUk9UVExJTkdcIiA/IFRIUk9UVExJTkdfUkVUUllfREVMQVlfQkFTRSA6IERFRkFVTFRfUkVUUllfREVMQVlfQkFTRSk7XG4gICAgICAgICAgICBjb25zdCBkZWxheUZyb21FcnJvclR5cGUgPSB0aGlzLnJldHJ5QmFja29mZlN0cmF0ZWd5LmNvbXB1dGVOZXh0QmFja29mZkRlbGF5KHRva2VuLmdldFJldHJ5Q291bnQoKSk7XG4gICAgICAgICAgICBjb25zdCByZXRyeURlbGF5ID0gZXJyb3JJbmZvLnJldHJ5QWZ0ZXJIaW50XG4gICAgICAgICAgICAgICAgPyBNYXRoLm1heChlcnJvckluZm8ucmV0cnlBZnRlckhpbnQuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSB8fCAwLCBkZWxheUZyb21FcnJvclR5cGUpXG4gICAgICAgICAgICAgICAgOiBkZWxheUZyb21FcnJvclR5cGU7XG4gICAgICAgICAgICBjb25zdCBjYXBhY2l0eUNvc3QgPSB0aGlzLmdldENhcGFjaXR5Q29zdChlcnJvclR5cGUpO1xuICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSAtPSBjYXBhY2l0eUNvc3Q7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRGVmYXVsdFJldHJ5VG9rZW4oe1xuICAgICAgICAgICAgICAgIHJldHJ5RGVsYXksXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogdG9rZW4uZ2V0UmV0cnlDb3VudCgpICsgMSxcbiAgICAgICAgICAgICAgICByZXRyeUNvc3Q6IGNhcGFjaXR5Q29zdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHJldHJ5IHRva2VuIGF2YWlsYWJsZVwiKTtcbiAgICB9XG4gICAgcmVjb3JkU3VjY2Vzcyh0b2tlbikge1xuICAgICAgICB0aGlzLmNhcGFjaXR5ID0gTWF0aC5tYXgoSU5JVElBTF9SRVRSWV9UT0tFTlMsIHRoaXMuY2FwYWNpdHkgKyAodG9rZW4uZ2V0UmV0cnlDb3N0KCkgPz8gTk9fUkVUUllfSU5DUkVNRU5UKSk7XG4gICAgfVxuICAgIGdldENhcGFjaXR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXBhY2l0eTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0TWF4QXR0ZW1wdHMoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYXhBdHRlbXB0c1Byb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE1heCBhdHRlbXB0cyBwcm92aWRlciBjb3VsZCBub3QgcmVzb2x2ZS4gVXNpbmcgZGVmYXVsdCBvZiAke0RFRkFVTFRfTUFYX0FUVEVNUFRTfWApO1xuICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfTUFYX0FUVEVNUFRTO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3VsZFJldHJ5KHRva2VuVG9SZW5ldywgZXJyb3JJbmZvLCBtYXhBdHRlbXB0cykge1xuICAgICAgICBjb25zdCBhdHRlbXB0cyA9IHRva2VuVG9SZW5ldy5nZXRSZXRyeUNvdW50KCkgKyAxO1xuICAgICAgICByZXR1cm4gKGF0dGVtcHRzIDwgbWF4QXR0ZW1wdHMgJiZcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPj0gdGhpcy5nZXRDYXBhY2l0eUNvc3QoZXJyb3JJbmZvLmVycm9yVHlwZSkgJiZcbiAgICAgICAgICAgIHRoaXMuaXNSZXRyeWFibGVFcnJvcihlcnJvckluZm8uZXJyb3JUeXBlKSk7XG4gICAgfVxuICAgIGdldENhcGFjaXR5Q29zdChlcnJvclR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yVHlwZSA9PT0gXCJUUkFOU0lFTlRcIiA/IFRJTUVPVVRfUkVUUllfQ09TVCA6IFJFVFJZX0NPU1Q7XG4gICAgfVxuICAgIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3JUeXBlKSB7XG4gICAgICAgIHJldHVybiBlcnJvclR5cGUgPT09IFwiVEhST1RUTElOR1wiIHx8IGVycm9yVHlwZSA9PT0gXCJUUkFOU0lFTlRcIjtcbiAgICB9XG59XG5cbmNsYXNzIEFkYXB0aXZlUmV0cnlTdHJhdGVneSB7XG4gICAgbWF4QXR0ZW1wdHNQcm92aWRlcjtcbiAgICByYXRlTGltaXRlcjtcbiAgICBzdGFuZGFyZFJldHJ5U3RyYXRlZ3k7XG4gICAgbW9kZSA9IGV4cG9ydHMuUkVUUllfTU9ERVMuQURBUFRJVkU7XG4gICAgY29uc3RydWN0b3IobWF4QXR0ZW1wdHNQcm92aWRlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLm1heEF0dGVtcHRzUHJvdmlkZXIgPSBtYXhBdHRlbXB0c1Byb3ZpZGVyO1xuICAgICAgICBjb25zdCB7IHJhdGVMaW1pdGVyIH0gPSBvcHRpb25zID8/IHt9O1xuICAgICAgICB0aGlzLnJhdGVMaW1pdGVyID0gcmF0ZUxpbWl0ZXIgPz8gbmV3IERlZmF1bHRSYXRlTGltaXRlcigpO1xuICAgICAgICB0aGlzLnN0YW5kYXJkUmV0cnlTdHJhdGVneSA9IG5ldyBTdGFuZGFyZFJldHJ5U3RyYXRlZ3kobWF4QXR0ZW1wdHNQcm92aWRlcik7XG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVJbml0aWFsUmV0cnlUb2tlbihyZXRyeVRva2VuU2NvcGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yYXRlTGltaXRlci5nZXRTZW5kVG9rZW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRSZXRyeVN0cmF0ZWd5LmFjcXVpcmVJbml0aWFsUmV0cnlUb2tlbihyZXRyeVRva2VuU2NvcGUpO1xuICAgIH1cbiAgICBhc3luYyByZWZyZXNoUmV0cnlUb2tlbkZvclJldHJ5KHRva2VuVG9SZW5ldywgZXJyb3JJbmZvKSB7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0ZXIudXBkYXRlQ2xpZW50U2VuZGluZ1JhdGUoZXJyb3JJbmZvKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhbmRhcmRSZXRyeVN0cmF0ZWd5LnJlZnJlc2hSZXRyeVRva2VuRm9yUmV0cnkodG9rZW5Ub1JlbmV3LCBlcnJvckluZm8pO1xuICAgIH1cbiAgICByZWNvcmRTdWNjZXNzKHRva2VuKSB7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0ZXIudXBkYXRlQ2xpZW50U2VuZGluZ1JhdGUoe30pO1xuICAgICAgICB0aGlzLnN0YW5kYXJkUmV0cnlTdHJhdGVneS5yZWNvcmRTdWNjZXNzKHRva2VuKTtcbiAgICB9XG59XG5cbmNsYXNzIENvbmZpZ3VyZWRSZXRyeVN0cmF0ZWd5IGV4dGVuZHMgU3RhbmRhcmRSZXRyeVN0cmF0ZWd5IHtcbiAgICBjb21wdXRlTmV4dEJhY2tvZmZEZWxheTtcbiAgICBjb25zdHJ1Y3RvcihtYXhBdHRlbXB0cywgY29tcHV0ZU5leHRCYWNrb2ZmRGVsYXkgPSBERUZBVUxUX1JFVFJZX0RFTEFZX0JBU0UpIHtcbiAgICAgICAgc3VwZXIodHlwZW9mIG1heEF0dGVtcHRzID09PSBcImZ1bmN0aW9uXCIgPyBtYXhBdHRlbXB0cyA6IGFzeW5jICgpID0+IG1heEF0dGVtcHRzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wdXRlTmV4dEJhY2tvZmZEZWxheSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlTmV4dEJhY2tvZmZEZWxheSA9ICgpID0+IGNvbXB1dGVOZXh0QmFja29mZkRlbGF5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlTmV4dEJhY2tvZmZEZWxheSA9IGNvbXB1dGVOZXh0QmFja29mZkRlbGF5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlZnJlc2hSZXRyeVRva2VuRm9yUmV0cnkodG9rZW5Ub1JlbmV3LCBlcnJvckluZm8pIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBzdXBlci5yZWZyZXNoUmV0cnlUb2tlbkZvclJldHJ5KHRva2VuVG9SZW5ldywgZXJyb3JJbmZvKTtcbiAgICAgICAgdG9rZW4uZ2V0UmV0cnlEZWxheSA9ICgpID0+IHRoaXMuY29tcHV0ZU5leHRCYWNrb2ZmRGVsYXkodG9rZW4uZ2V0UmV0cnlDb3VudCgpKTtcbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbn1cblxuZXhwb3J0cy5BZGFwdGl2ZVJldHJ5U3RyYXRlZ3kgPSBBZGFwdGl2ZVJldHJ5U3RyYXRlZ3k7XG5leHBvcnRzLkNvbmZpZ3VyZWRSZXRyeVN0cmF0ZWd5ID0gQ29uZmlndXJlZFJldHJ5U3RyYXRlZ3k7XG5leHBvcnRzLkRFRkFVTFRfTUFYX0FUVEVNUFRTID0gREVGQVVMVF9NQVhfQVRURU1QVFM7XG5leHBvcnRzLkRFRkFVTFRfUkVUUllfREVMQVlfQkFTRSA9IERFRkFVTFRfUkVUUllfREVMQVlfQkFTRTtcbmV4cG9ydHMuREVGQVVMVF9SRVRSWV9NT0RFID0gREVGQVVMVF9SRVRSWV9NT0RFO1xuZXhwb3J0cy5EZWZhdWx0UmF0ZUxpbWl0ZXIgPSBEZWZhdWx0UmF0ZUxpbWl0ZXI7XG5leHBvcnRzLklOSVRJQUxfUkVUUllfVE9LRU5TID0gSU5JVElBTF9SRVRSWV9UT0tFTlM7XG5leHBvcnRzLklOVk9DQVRJT05fSURfSEVBREVSID0gSU5WT0NBVElPTl9JRF9IRUFERVI7XG5leHBvcnRzLk1BWElNVU1fUkVUUllfREVMQVkgPSBNQVhJTVVNX1JFVFJZX0RFTEFZO1xuZXhwb3J0cy5OT19SRVRSWV9JTkNSRU1FTlQgPSBOT19SRVRSWV9JTkNSRU1FTlQ7XG5leHBvcnRzLlJFUVVFU1RfSEVBREVSID0gUkVRVUVTVF9IRUFERVI7XG5leHBvcnRzLlJFVFJZX0NPU1QgPSBSRVRSWV9DT1NUO1xuZXhwb3J0cy5TdGFuZGFyZFJldHJ5U3RyYXRlZ3kgPSBTdGFuZGFyZFJldHJ5U3RyYXRlZ3k7XG5leHBvcnRzLlRIUk9UVExJTkdfUkVUUllfREVMQVlfQkFTRSA9IFRIUk9UVExJTkdfUkVUUllfREVMQVlfQkFTRTtcbmV4cG9ydHMuVElNRU9VVF9SRVRSWV9DT1NUID0gVElNRU9VVF9SRVRSWV9DT1NUO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNTdHJlYW1pbmdQYXlsb2FkID0gdm9pZCAwO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgaXNTdHJlYW1pbmdQYXlsb2FkID0gKHJlcXVlc3QpID0+IHJlcXVlc3Q/LmJvZHkgaW5zdGFuY2VvZiBzdHJlYW1fMS5SZWFkYWJsZSB8fFxuICAgICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09IFwidW5kZWZpbmVkXCIgJiYgcmVxdWVzdD8uYm9keSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKTtcbmV4cG9ydHMuaXNTdHJlYW1pbmdQYXlsb2FkID0gaXNTdHJlYW1pbmdQYXlsb2FkO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlsUmV0cnkgPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtcmV0cnknKTtcbnZhciBwcm90b2NvbEh0dHAgPSByZXF1aXJlKCdAc21pdGh5L3Byb3RvY29sLWh0dHAnKTtcbnZhciBzZXJ2aWNlRXJyb3JDbGFzc2lmaWNhdGlvbiA9IHJlcXVpcmUoJ0BzbWl0aHkvc2VydmljZS1lcnJvci1jbGFzc2lmaWNhdGlvbicpO1xudmFyIHV1aWQgPSByZXF1aXJlKCdAc21pdGh5L3V1aWQnKTtcbnZhciB1dGlsTWlkZGxld2FyZSA9IHJlcXVpcmUoJ0BzbWl0aHkvdXRpbC1taWRkbGV3YXJlJyk7XG52YXIgc21pdGh5Q2xpZW50ID0gcmVxdWlyZSgnQHNtaXRoeS9zbWl0aHktY2xpZW50Jyk7XG52YXIgaXNTdHJlYW1pbmdQYXlsb2FkID0gcmVxdWlyZSgnLi9pc1N0cmVhbWluZ1BheWxvYWQvaXNTdHJlYW1pbmdQYXlsb2FkJyk7XG5cbmNvbnN0IGdldERlZmF1bHRSZXRyeVF1b3RhID0gKGluaXRpYWxSZXRyeVRva2Vucywgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IE1BWF9DQVBBQ0lUWSA9IGluaXRpYWxSZXRyeVRva2VucztcbiAgICBjb25zdCBub1JldHJ5SW5jcmVtZW50ID0gdXRpbFJldHJ5Lk5PX1JFVFJZX0lOQ1JFTUVOVDtcbiAgICBjb25zdCByZXRyeUNvc3QgPSB1dGlsUmV0cnkuUkVUUllfQ09TVDtcbiAgICBjb25zdCB0aW1lb3V0UmV0cnlDb3N0ID0gdXRpbFJldHJ5LlRJTUVPVVRfUkVUUllfQ09TVDtcbiAgICBsZXQgYXZhaWxhYmxlQ2FwYWNpdHkgPSBpbml0aWFsUmV0cnlUb2tlbnM7XG4gICAgY29uc3QgZ2V0Q2FwYWNpdHlBbW91bnQgPSAoZXJyb3IpID0+IChlcnJvci5uYW1lID09PSBcIlRpbWVvdXRFcnJvclwiID8gdGltZW91dFJldHJ5Q29zdCA6IHJldHJ5Q29zdCk7XG4gICAgY29uc3QgaGFzUmV0cnlUb2tlbnMgPSAoZXJyb3IpID0+IGdldENhcGFjaXR5QW1vdW50KGVycm9yKSA8PSBhdmFpbGFibGVDYXBhY2l0eTtcbiAgICBjb25zdCByZXRyaWV2ZVJldHJ5VG9rZW5zID0gKGVycm9yKSA9PiB7XG4gICAgICAgIGlmICghaGFzUmV0cnlUb2tlbnMoZXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXRyeSB0b2tlbiBhdmFpbGFibGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWNpdHlBbW91bnQgPSBnZXRDYXBhY2l0eUFtb3VudChlcnJvcik7XG4gICAgICAgIGF2YWlsYWJsZUNhcGFjaXR5IC09IGNhcGFjaXR5QW1vdW50O1xuICAgICAgICByZXR1cm4gY2FwYWNpdHlBbW91bnQ7XG4gICAgfTtcbiAgICBjb25zdCByZWxlYXNlUmV0cnlUb2tlbnMgPSAoY2FwYWNpdHlSZWxlYXNlQW1vdW50KSA9PiB7XG4gICAgICAgIGF2YWlsYWJsZUNhcGFjaXR5ICs9IGNhcGFjaXR5UmVsZWFzZUFtb3VudCA/PyBub1JldHJ5SW5jcmVtZW50O1xuICAgICAgICBhdmFpbGFibGVDYXBhY2l0eSA9IE1hdGgubWluKGF2YWlsYWJsZUNhcGFjaXR5LCBNQVhfQ0FQQUNJVFkpO1xuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBoYXNSZXRyeVRva2VucyxcbiAgICAgICAgcmV0cmlldmVSZXRyeVRva2VucyxcbiAgICAgICAgcmVsZWFzZVJldHJ5VG9rZW5zLFxuICAgIH0pO1xufTtcblxuY29uc3QgZGVmYXVsdERlbGF5RGVjaWRlciA9IChkZWxheUJhc2UsIGF0dGVtcHRzKSA9PiBNYXRoLmZsb29yKE1hdGgubWluKHV0aWxSZXRyeS5NQVhJTVVNX1JFVFJZX0RFTEFZLCBNYXRoLnJhbmRvbSgpICogMiAqKiBhdHRlbXB0cyAqIGRlbGF5QmFzZSkpO1xuXG5jb25zdCBkZWZhdWx0UmV0cnlEZWNpZGVyID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlRXJyb3JDbGFzc2lmaWNhdGlvbi5pc1JldHJ5YWJsZUJ5VHJhaXQoZXJyb3IpIHx8IHNlcnZpY2VFcnJvckNsYXNzaWZpY2F0aW9uLmlzQ2xvY2tTa2V3RXJyb3IoZXJyb3IpIHx8IHNlcnZpY2VFcnJvckNsYXNzaWZpY2F0aW9uLmlzVGhyb3R0bGluZ0Vycm9yKGVycm9yKSB8fCBzZXJ2aWNlRXJyb3JDbGFzc2lmaWNhdGlvbi5pc1RyYW5zaWVudEVycm9yKGVycm9yKTtcbn07XG5cbmNvbnN0IGFzU2RrRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcilcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCksIGVycm9yKTtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBBV1MgU0RLIGVycm9yIHdyYXBwZXIgZm9yICR7ZXJyb3J9YCk7XG59O1xuXG5jbGFzcyBTdGFuZGFyZFJldHJ5U3RyYXRlZ3kge1xuICAgIG1heEF0dGVtcHRzUHJvdmlkZXI7XG4gICAgcmV0cnlEZWNpZGVyO1xuICAgIGRlbGF5RGVjaWRlcjtcbiAgICByZXRyeVF1b3RhO1xuICAgIG1vZGUgPSB1dGlsUmV0cnkuUkVUUllfTU9ERVMuU1RBTkRBUkQ7XG4gICAgY29uc3RydWN0b3IobWF4QXR0ZW1wdHNQcm92aWRlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLm1heEF0dGVtcHRzUHJvdmlkZXIgPSBtYXhBdHRlbXB0c1Byb3ZpZGVyO1xuICAgICAgICB0aGlzLnJldHJ5RGVjaWRlciA9IG9wdGlvbnM/LnJldHJ5RGVjaWRlciA/PyBkZWZhdWx0UmV0cnlEZWNpZGVyO1xuICAgICAgICB0aGlzLmRlbGF5RGVjaWRlciA9IG9wdGlvbnM/LmRlbGF5RGVjaWRlciA/PyBkZWZhdWx0RGVsYXlEZWNpZGVyO1xuICAgICAgICB0aGlzLnJldHJ5UXVvdGEgPSBvcHRpb25zPy5yZXRyeVF1b3RhID8/IGdldERlZmF1bHRSZXRyeVF1b3RhKHV0aWxSZXRyeS5JTklUSUFMX1JFVFJZX1RPS0VOUyk7XG4gICAgfVxuICAgIHNob3VsZFJldHJ5KGVycm9yLCBhdHRlbXB0cywgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRzIDwgbWF4QXR0ZW1wdHMgJiYgdGhpcy5yZXRyeURlY2lkZXIoZXJyb3IpICYmIHRoaXMucmV0cnlRdW90YS5oYXNSZXRyeVRva2VucyhlcnJvcik7XG4gICAgfVxuICAgIGFzeW5jIGdldE1heEF0dGVtcHRzKCkge1xuICAgICAgICBsZXQgbWF4QXR0ZW1wdHM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXhBdHRlbXB0cyA9IGF3YWl0IHRoaXMubWF4QXR0ZW1wdHNQcm92aWRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbWF4QXR0ZW1wdHMgPSB1dGlsUmV0cnkuREVGQVVMVF9NQVhfQVRURU1QVFM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heEF0dGVtcHRzO1xuICAgIH1cbiAgICBhc3luYyByZXRyeShuZXh0LCBhcmdzLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCByZXRyeVRva2VuQW1vdW50O1xuICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgICBsZXQgdG90YWxEZWxheSA9IDA7XG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gYXdhaXQgdGhpcy5nZXRNYXhBdHRlbXB0cygpO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgICAgIGlmIChwcm90b2NvbEh0dHAuSHR0cFJlcXVlc3QuaXNJbnN0YW5jZShyZXF1ZXN0KSkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzW3V0aWxSZXRyeS5JTlZPQ0FUSU9OX0lEX0hFQURFUl0gPSB1dWlkLnY0KCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5pc0luc3RhbmNlKHJlcXVlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1t1dGlsUmV0cnkuUkVRVUVTVF9IRUFERVJdID0gYGF0dGVtcHQ9JHthdHRlbXB0cyArIDF9OyBtYXg9JHttYXhBdHRlbXB0c31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uYmVmb3JlUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmJlZm9yZVJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXNwb25zZSwgb3V0cHV0IH0gPSBhd2FpdCBuZXh0KGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5hZnRlclJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hZnRlclJlcXVlc3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJldHJ5UXVvdGEucmVsZWFzZVJldHJ5VG9rZW5zKHJldHJ5VG9rZW5BbW91bnQpO1xuICAgICAgICAgICAgICAgIG91dHB1dC4kbWV0YWRhdGEuYXR0ZW1wdHMgPSBhdHRlbXB0cyArIDE7XG4gICAgICAgICAgICAgICAgb3V0cHV0LiRtZXRhZGF0YS50b3RhbFJldHJ5RGVsYXkgPSB0b3RhbERlbGF5O1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3BvbnNlLCBvdXRwdXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gYXNTZGtFcnJvcihlKTtcbiAgICAgICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFJldHJ5KGVyciwgYXR0ZW1wdHMsIG1heEF0dGVtcHRzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRyeVRva2VuQW1vdW50ID0gdGhpcy5yZXRyeVF1b3RhLnJldHJpZXZlUmV0cnlUb2tlbnMoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXlGcm9tRGVjaWRlciA9IHRoaXMuZGVsYXlEZWNpZGVyKHNlcnZpY2VFcnJvckNsYXNzaWZpY2F0aW9uLmlzVGhyb3R0bGluZ0Vycm9yKGVycikgPyB1dGlsUmV0cnkuVEhST1RUTElOR19SRVRSWV9ERUxBWV9CQVNFIDogdXRpbFJldHJ5LkRFRkFVTFRfUkVUUllfREVMQVlfQkFTRSwgYXR0ZW1wdHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxheUZyb21SZXNwb25zZSA9IGdldERlbGF5RnJvbVJldHJ5QWZ0ZXJIZWFkZXIoZXJyLiRyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5tYXgoZGVsYXlGcm9tUmVzcG9uc2UgfHwgMCwgZGVsYXlGcm9tRGVjaWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsRGVsYXkgKz0gZGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVyci4kbWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyLiRtZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnIuJG1ldGFkYXRhLmF0dGVtcHRzID0gYXR0ZW1wdHM7XG4gICAgICAgICAgICAgICAgZXJyLiRtZXRhZGF0YS50b3RhbFJldHJ5RGVsYXkgPSB0b3RhbERlbGF5O1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IGdldERlbGF5RnJvbVJldHJ5QWZ0ZXJIZWFkZXIgPSAocmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXByb3RvY29sSHR0cC5IdHRwUmVzcG9uc2UuaXNJbnN0YW5jZShyZXNwb25zZSkpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCByZXRyeUFmdGVySGVhZGVyTmFtZSA9IE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpLmZpbmQoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IFwicmV0cnktYWZ0ZXJcIik7XG4gICAgaWYgKCFyZXRyeUFmdGVySGVhZGVyTmFtZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSByZXNwb25zZS5oZWFkZXJzW3JldHJ5QWZ0ZXJIZWFkZXJOYW1lXTtcbiAgICBjb25zdCByZXRyeUFmdGVyU2Vjb25kcyA9IE51bWJlcihyZXRyeUFmdGVyKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXRyeUFmdGVyU2Vjb25kcykpXG4gICAgICAgIHJldHVybiByZXRyeUFmdGVyU2Vjb25kcyAqIDEwMDA7XG4gICAgY29uc3QgcmV0cnlBZnRlckRhdGUgPSBuZXcgRGF0ZShyZXRyeUFmdGVyKTtcbiAgICByZXR1cm4gcmV0cnlBZnRlckRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbn07XG5cbmNsYXNzIEFkYXB0aXZlUmV0cnlTdHJhdGVneSBleHRlbmRzIFN0YW5kYXJkUmV0cnlTdHJhdGVneSB7XG4gICAgcmF0ZUxpbWl0ZXI7XG4gICAgY29uc3RydWN0b3IobWF4QXR0ZW1wdHNQcm92aWRlciwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IHJhdGVMaW1pdGVyLCAuLi5zdXBlck9wdGlvbnMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgICAgIHN1cGVyKG1heEF0dGVtcHRzUHJvdmlkZXIsIHN1cGVyT3B0aW9ucyk7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0ZXIgPSByYXRlTGltaXRlciA/PyBuZXcgdXRpbFJldHJ5LkRlZmF1bHRSYXRlTGltaXRlcigpO1xuICAgICAgICB0aGlzLm1vZGUgPSB1dGlsUmV0cnkuUkVUUllfTU9ERVMuQURBUFRJVkU7XG4gICAgfVxuICAgIGFzeW5jIHJldHJ5KG5leHQsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnJldHJ5KG5leHQsIGFyZ3MsIHtcbiAgICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yYXRlTGltaXRlci5nZXRTZW5kVG9rZW4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclJlcXVlc3Q6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmF0ZUxpbWl0ZXIudXBkYXRlQ2xpZW50U2VuZGluZ1JhdGUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5jb25zdCBFTlZfTUFYX0FUVEVNUFRTID0gXCJBV1NfTUFYX0FUVEVNUFRTXCI7XG5jb25zdCBDT05GSUdfTUFYX0FUVEVNUFRTID0gXCJtYXhfYXR0ZW1wdHNcIjtcbmNvbnN0IE5PREVfTUFYX0FUVEVNUFRfQ09ORklHX09QVElPTlMgPSB7XG4gICAgZW52aXJvbm1lbnRWYXJpYWJsZVNlbGVjdG9yOiAoZW52KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZW52W0VOVl9NQVhfQVRURU1QVFNdO1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbWF4QXR0ZW1wdCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihtYXhBdHRlbXB0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnZpcm9ubWVudCB2YXJpYWJsZSAke0VOVl9NQVhfQVRURU1QVFN9IG1hc3QgYmUgYSBudW1iZXIsIGdvdCBcIiR7dmFsdWV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4QXR0ZW1wdDtcbiAgICB9LFxuICAgIGNvbmZpZ0ZpbGVTZWxlY3RvcjogKHByb2ZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9maWxlW0NPTkZJR19NQVhfQVRURU1QVFNdO1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbWF4QXR0ZW1wdCA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihtYXhBdHRlbXB0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZWQgY29uZmlnIGZpbGUgZW50cnkgJHtDT05GSUdfTUFYX0FUVEVNUFRTfSBtYXN0IGJlIGEgbnVtYmVyLCBnb3QgXCIke3ZhbHVlfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heEF0dGVtcHQ7XG4gICAgfSxcbiAgICBkZWZhdWx0OiB1dGlsUmV0cnkuREVGQVVMVF9NQVhfQVRURU1QVFMsXG59O1xuY29uc3QgcmVzb2x2ZVJldHJ5Q29uZmlnID0gKGlucHV0KSA9PiB7XG4gICAgY29uc3QgeyByZXRyeVN0cmF0ZWd5LCByZXRyeU1vZGU6IF9yZXRyeU1vZGUsIG1heEF0dGVtcHRzOiBfbWF4QXR0ZW1wdHMgfSA9IGlucHV0O1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gdXRpbE1pZGRsZXdhcmUubm9ybWFsaXplUHJvdmlkZXIoX21heEF0dGVtcHRzID8/IHV0aWxSZXRyeS5ERUZBVUxUX01BWF9BVFRFTVBUUyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5wdXQsIHtcbiAgICAgICAgbWF4QXR0ZW1wdHMsXG4gICAgICAgIHJldHJ5U3RyYXRlZ3k6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXRyeVN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHJ5U3RyYXRlZ3k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXRyeU1vZGUgPSBhd2FpdCB1dGlsTWlkZGxld2FyZS5ub3JtYWxpemVQcm92aWRlcihfcmV0cnlNb2RlKSgpO1xuICAgICAgICAgICAgaWYgKHJldHJ5TW9kZSA9PT0gdXRpbFJldHJ5LlJFVFJZX01PREVTLkFEQVBUSVZFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB1dGlsUmV0cnkuQWRhcHRpdmVSZXRyeVN0cmF0ZWd5KG1heEF0dGVtcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgdXRpbFJldHJ5LlN0YW5kYXJkUmV0cnlTdHJhdGVneShtYXhBdHRlbXB0cyk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59O1xuY29uc3QgRU5WX1JFVFJZX01PREUgPSBcIkFXU19SRVRSWV9NT0RFXCI7XG5jb25zdCBDT05GSUdfUkVUUllfTU9ERSA9IFwicmV0cnlfbW9kZVwiO1xuY29uc3QgTk9ERV9SRVRSWV9NT0RFX0NPTkZJR19PUFRJT05TID0ge1xuICAgIGVudmlyb25tZW50VmFyaWFibGVTZWxlY3RvcjogKGVudikgPT4gZW52W0VOVl9SRVRSWV9NT0RFXSxcbiAgICBjb25maWdGaWxlU2VsZWN0b3I6IChwcm9maWxlKSA9PiBwcm9maWxlW0NPTkZJR19SRVRSWV9NT0RFXSxcbiAgICBkZWZhdWx0OiB1dGlsUmV0cnkuREVGQVVMVF9SRVRSWV9NT0RFLFxufTtcblxuY29uc3Qgb21pdFJldHJ5SGVhZGVyc01pZGRsZXdhcmUgPSAoKSA9PiAobmV4dCkgPT4gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgaWYgKHByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5pc0luc3RhbmNlKHJlcXVlc3QpKSB7XG4gICAgICAgIGRlbGV0ZSByZXF1ZXN0LmhlYWRlcnNbdXRpbFJldHJ5LklOVk9DQVRJT05fSURfSEVBREVSXTtcbiAgICAgICAgZGVsZXRlIHJlcXVlc3QuaGVhZGVyc1t1dGlsUmV0cnkuUkVRVUVTVF9IRUFERVJdO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dChhcmdzKTtcbn07XG5jb25zdCBvbWl0UmV0cnlIZWFkZXJzTWlkZGxld2FyZU9wdGlvbnMgPSB7XG4gICAgbmFtZTogXCJvbWl0UmV0cnlIZWFkZXJzTWlkZGxld2FyZVwiLFxuICAgIHRhZ3M6IFtcIlJFVFJZXCIsIFwiSEVBREVSU1wiLCBcIk9NSVRfUkVUUllfSEVBREVSU1wiXSxcbiAgICByZWxhdGlvbjogXCJiZWZvcmVcIixcbiAgICB0b01pZGRsZXdhcmU6IFwiYXdzQXV0aE1pZGRsZXdhcmVcIixcbiAgICBvdmVycmlkZTogdHJ1ZSxcbn07XG5jb25zdCBnZXRPbWl0UmV0cnlIZWFkZXJzUGx1Z2luID0gKG9wdGlvbnMpID0+ICh7XG4gICAgYXBwbHlUb1N0YWNrOiAoY2xpZW50U3RhY2spID0+IHtcbiAgICAgICAgY2xpZW50U3RhY2suYWRkUmVsYXRpdmVUbyhvbWl0UmV0cnlIZWFkZXJzTWlkZGxld2FyZSgpLCBvbWl0UmV0cnlIZWFkZXJzTWlkZGxld2FyZU9wdGlvbnMpO1xuICAgIH0sXG59KTtcblxuY29uc3QgcmV0cnlNaWRkbGV3YXJlID0gKG9wdGlvbnMpID0+IChuZXh0LCBjb250ZXh0KSA9PiBhc3luYyAoYXJncykgPT4ge1xuICAgIGxldCByZXRyeVN0cmF0ZWd5ID0gYXdhaXQgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5KCk7XG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBhd2FpdCBvcHRpb25zLm1heEF0dGVtcHRzKCk7XG4gICAgaWYgKGlzUmV0cnlTdHJhdGVneVYyKHJldHJ5U3RyYXRlZ3kpKSB7XG4gICAgICAgIHJldHJ5U3RyYXRlZ3kgPSByZXRyeVN0cmF0ZWd5O1xuICAgICAgICBsZXQgcmV0cnlUb2tlbiA9IGF3YWl0IHJldHJ5U3RyYXRlZ3kuYWNxdWlyZUluaXRpYWxSZXRyeVRva2VuKGNvbnRleHRbXCJwYXJ0aXRpb25faWRcIl0pO1xuICAgICAgICBsZXQgbGFzdEVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgICAgIGxldCB0b3RhbFJldHJ5RGVsYXkgPSAwO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IGFyZ3M7XG4gICAgICAgIGNvbnN0IGlzUmVxdWVzdCA9IHByb3RvY29sSHR0cC5IdHRwUmVxdWVzdC5pc0luc3RhbmNlKHJlcXVlc3QpO1xuICAgICAgICBpZiAoaXNSZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbdXRpbFJldHJ5LklOVk9DQVRJT05fSURfSEVBREVSXSA9IHV1aWQudjQoKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyc1t1dGlsUmV0cnkuUkVRVUVTVF9IRUFERVJdID0gYGF0dGVtcHQ9JHthdHRlbXB0cyArIDF9OyBtYXg9JHttYXhBdHRlbXB0c31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBvdXRwdXQgfSA9IGF3YWl0IG5leHQoYXJncyk7XG4gICAgICAgICAgICAgICAgcmV0cnlTdHJhdGVneS5yZWNvcmRTdWNjZXNzKHJldHJ5VG9rZW4pO1xuICAgICAgICAgICAgICAgIG91dHB1dC4kbWV0YWRhdGEuYXR0ZW1wdHMgPSBhdHRlbXB0cyArIDE7XG4gICAgICAgICAgICAgICAgb3V0cHV0LiRtZXRhZGF0YS50b3RhbFJldHJ5RGVsYXkgPSB0b3RhbFJldHJ5RGVsYXk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2UsIG91dHB1dCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXRyeUVycm9ySW5mbyA9IGdldFJldHJ5RXJyb3JJbmZvKGUpO1xuICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGFzU2RrRXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVxdWVzdCAmJiBpc1N0cmVhbWluZ1BheWxvYWQuaXNTdHJlYW1pbmdQYXlsb2FkKHJlcXVlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmxvZ2dlciBpbnN0YW5jZW9mIHNtaXRoeUNsaWVudC5Ob09wTG9nZ2VyID8gY29uc29sZSA6IGNvbnRleHQubG9nZ2VyKT8ud2FybihcIkFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCBpbiBhIG5vbi1yZXRyeWFibGUgc3RyZWFtaW5nIHJlcXVlc3QuXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5VG9rZW4gPSBhd2FpdCByZXRyeVN0cmF0ZWd5LnJlZnJlc2hSZXRyeVRva2VuRm9yUmV0cnkocmV0cnlUb2tlbiwgcmV0cnlFcnJvckluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAocmVmcmVzaEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGFzdEVycm9yLiRtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yLiRtZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvci4kbWV0YWRhdGEuYXR0ZW1wdHMgPSBhdHRlbXB0cyArIDE7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvci4kbWV0YWRhdGEudG90YWxSZXRyeURlbGF5ID0gdG90YWxSZXRyeURlbGF5O1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF0dGVtcHRzID0gcmV0cnlUb2tlbi5nZXRSZXRyeUNvdW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSByZXRyeVRva2VuLmdldFJldHJ5RGVsYXkoKTtcbiAgICAgICAgICAgICAgICB0b3RhbFJldHJ5RGVsYXkgKz0gZGVsYXk7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0cnlTdHJhdGVneSA9IHJldHJ5U3RyYXRlZ3k7XG4gICAgICAgIGlmIChyZXRyeVN0cmF0ZWd5Py5tb2RlKVxuICAgICAgICAgICAgY29udGV4dC51c2VyQWdlbnQgPSBbLi4uKGNvbnRleHQudXNlckFnZW50IHx8IFtdKSwgW1wiY2ZnL3JldHJ5LW1vZGVcIiwgcmV0cnlTdHJhdGVneS5tb2RlXV07XG4gICAgICAgIHJldHVybiByZXRyeVN0cmF0ZWd5LnJldHJ5KG5leHQsIGFyZ3MpO1xuICAgIH1cbn07XG5jb25zdCBpc1JldHJ5U3RyYXRlZ3lWMiA9IChyZXRyeVN0cmF0ZWd5KSA9PiB0eXBlb2YgcmV0cnlTdHJhdGVneS5hY3F1aXJlSW5pdGlhbFJldHJ5VG9rZW4gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgcmV0cnlTdHJhdGVneS5yZWZyZXNoUmV0cnlUb2tlbkZvclJldHJ5ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgdHlwZW9mIHJldHJ5U3RyYXRlZ3kucmVjb3JkU3VjY2VzcyAhPT0gXCJ1bmRlZmluZWRcIjtcbmNvbnN0IGdldFJldHJ5RXJyb3JJbmZvID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgZXJyb3JJbmZvID0ge1xuICAgICAgICBlcnJvcixcbiAgICAgICAgZXJyb3JUeXBlOiBnZXRSZXRyeUVycm9yVHlwZShlcnJvciksXG4gICAgfTtcbiAgICBjb25zdCByZXRyeUFmdGVySGludCA9IGdldFJldHJ5QWZ0ZXJIaW50KGVycm9yLiRyZXNwb25zZSk7XG4gICAgaWYgKHJldHJ5QWZ0ZXJIaW50KSB7XG4gICAgICAgIGVycm9ySW5mby5yZXRyeUFmdGVySGludCA9IHJldHJ5QWZ0ZXJIaW50O1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JJbmZvO1xufTtcbmNvbnN0IGdldFJldHJ5RXJyb3JUeXBlID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKHNlcnZpY2VFcnJvckNsYXNzaWZpY2F0aW9uLmlzVGhyb3R0bGluZ0Vycm9yKGVycm9yKSlcbiAgICAgICAgcmV0dXJuIFwiVEhST1RUTElOR1wiO1xuICAgIGlmIChzZXJ2aWNlRXJyb3JDbGFzc2lmaWNhdGlvbi5pc1RyYW5zaWVudEVycm9yKGVycm9yKSlcbiAgICAgICAgcmV0dXJuIFwiVFJBTlNJRU5UXCI7XG4gICAgaWYgKHNlcnZpY2VFcnJvckNsYXNzaWZpY2F0aW9uLmlzU2VydmVyRXJyb3IoZXJyb3IpKVxuICAgICAgICByZXR1cm4gXCJTRVJWRVJfRVJST1JcIjtcbiAgICByZXR1cm4gXCJDTElFTlRfRVJST1JcIjtcbn07XG5jb25zdCByZXRyeU1pZGRsZXdhcmVPcHRpb25zID0ge1xuICAgIG5hbWU6IFwicmV0cnlNaWRkbGV3YXJlXCIsXG4gICAgdGFnczogW1wiUkVUUllcIl0sXG4gICAgc3RlcDogXCJmaW5hbGl6ZVJlcXVlc3RcIixcbiAgICBwcmlvcml0eTogXCJoaWdoXCIsXG4gICAgb3ZlcnJpZGU6IHRydWUsXG59O1xuY29uc3QgZ2V0UmV0cnlQbHVnaW4gPSAob3B0aW9ucykgPT4gKHtcbiAgICBhcHBseVRvU3RhY2s6IChjbGllbnRTdGFjaykgPT4ge1xuICAgICAgICBjbGllbnRTdGFjay5hZGQocmV0cnlNaWRkbGV3YXJlKG9wdGlvbnMpLCByZXRyeU1pZGRsZXdhcmVPcHRpb25zKTtcbiAgICB9LFxufSk7XG5jb25zdCBnZXRSZXRyeUFmdGVySGludCA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmICghcHJvdG9jb2xIdHRwLkh0dHBSZXNwb25zZS5pc0luc3RhbmNlKHJlc3BvbnNlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJIZWFkZXJOYW1lID0gT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykuZmluZCgoa2V5KSA9PiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gXCJyZXRyeS1hZnRlclwiKTtcbiAgICBpZiAoIXJldHJ5QWZ0ZXJIZWFkZXJOYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgcmV0cnlBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnNbcmV0cnlBZnRlckhlYWRlck5hbWVdO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gTnVtYmVyKHJldHJ5QWZ0ZXIpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHJldHJ5QWZ0ZXJTZWNvbmRzKSlcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHJldHJ5QWZ0ZXJTZWNvbmRzICogMTAwMCk7XG4gICAgY29uc3QgcmV0cnlBZnRlckRhdGUgPSBuZXcgRGF0ZShyZXRyeUFmdGVyKTtcbiAgICByZXR1cm4gcmV0cnlBZnRlckRhdGU7XG59O1xuXG5leHBvcnRzLkFkYXB0aXZlUmV0cnlTdHJhdGVneSA9IEFkYXB0aXZlUmV0cnlTdHJhdGVneTtcbmV4cG9ydHMuQ09ORklHX01BWF9BVFRFTVBUUyA9IENPTkZJR19NQVhfQVRURU1QVFM7XG5leHBvcnRzLkNPTkZJR19SRVRSWV9NT0RFID0gQ09ORklHX1JFVFJZX01PREU7XG5leHBvcnRzLkVOVl9NQVhfQVRURU1QVFMgPSBFTlZfTUFYX0FUVEVNUFRTO1xuZXhwb3J0cy5FTlZfUkVUUllfTU9ERSA9IEVOVl9SRVRSWV9NT0RFO1xuZXhwb3J0cy5OT0RFX01BWF9BVFRFTVBUX0NPTkZJR19PUFRJT05TID0gTk9ERV9NQVhfQVRURU1QVF9DT05GSUdfT1BUSU9OUztcbmV4cG9ydHMuTk9ERV9SRVRSWV9NT0RFX0NPTkZJR19PUFRJT05TID0gTk9ERV9SRVRSWV9NT0RFX0NPTkZJR19PUFRJT05TO1xuZXhwb3J0cy5TdGFuZGFyZFJldHJ5U3RyYXRlZ3kgPSBTdGFuZGFyZFJldHJ5U3RyYXRlZ3k7XG5leHBvcnRzLmRlZmF1bHREZWxheURlY2lkZXIgPSBkZWZhdWx0RGVsYXlEZWNpZGVyO1xuZXhwb3J0cy5kZWZhdWx0UmV0cnlEZWNpZGVyID0gZGVmYXVsdFJldHJ5RGVjaWRlcjtcbmV4cG9ydHMuZ2V0T21pdFJldHJ5SGVhZGVyc1BsdWdpbiA9IGdldE9taXRSZXRyeUhlYWRlcnNQbHVnaW47XG5leHBvcnRzLmdldFJldHJ5QWZ0ZXJIaW50ID0gZ2V0UmV0cnlBZnRlckhpbnQ7XG5leHBvcnRzLmdldFJldHJ5UGx1Z2luID0gZ2V0UmV0cnlQbHVnaW47XG5leHBvcnRzLm9taXRSZXRyeUhlYWRlcnNNaWRkbGV3YXJlID0gb21pdFJldHJ5SGVhZGVyc01pZGRsZXdhcmU7XG5leHBvcnRzLm9taXRSZXRyeUhlYWRlcnNNaWRkbGV3YXJlT3B0aW9ucyA9IG9taXRSZXRyeUhlYWRlcnNNaWRkbGV3YXJlT3B0aW9ucztcbmV4cG9ydHMucmVzb2x2ZVJldHJ5Q29uZmlnID0gcmVzb2x2ZVJldHJ5Q29uZmlnO1xuZXhwb3J0cy5yZXRyeU1pZGRsZXdhcmUgPSByZXRyeU1pZGRsZXdhcmU7XG5leHBvcnRzLnJldHJ5TWlkZGxld2FyZU9wdGlvbnMgPSByZXRyeU1pZGRsZXdhcmVPcHRpb25zO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMud2FybmluZyA9IHZvaWQgMDtcbmV4cG9ydHMuc3RzUmVnaW9uRGVmYXVsdFJlc29sdmVyID0gc3RzUmVnaW9uRGVmYXVsdFJlc29sdmVyO1xuY29uc3QgY29uZmlnX3Jlc29sdmVyXzEgPSByZXF1aXJlKFwiQHNtaXRoeS9jb25maWctcmVzb2x2ZXJcIik7XG5jb25zdCBub2RlX2NvbmZpZ19wcm92aWRlcl8xID0gcmVxdWlyZShcIkBzbWl0aHkvbm9kZS1jb25maWctcHJvdmlkZXJcIik7XG5mdW5jdGlvbiBzdHNSZWdpb25EZWZhdWx0UmVzb2x2ZXIobG9hZGVyQ29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gKDAsIG5vZGVfY29uZmlnX3Byb3ZpZGVyXzEubG9hZENvbmZpZykoe1xuICAgICAgICAuLi5jb25maWdfcmVzb2x2ZXJfMS5OT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUyxcbiAgICAgICAgYXN5bmMgZGVmYXVsdCgpIHtcbiAgICAgICAgICAgIGlmICghZXhwb3J0cy53YXJuaW5nLnNpbGVuY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJAYXdzLXNkayAtIFdBUk4gLSBkZWZhdWx0IFNUUyByZWdpb24gb2YgdXMtZWFzdC0xIHVzZWQuIFNlZSBAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVycyBSRUFETUUgYW5kIHNldCBhIHJlZ2lvbiBleHBsaWNpdGx5LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcInVzLWVhc3QtMVwiO1xuICAgICAgICB9LFxuICAgIH0sIHsgLi4uY29uZmlnX3Jlc29sdmVyXzEuTk9ERV9SRUdJT05fQ09ORklHX0ZJTEVfT1BUSU9OUywgLi4ubG9hZGVyQ29uZmlnIH0pO1xufVxuZXhwb3J0cy53YXJuaW5nID0ge1xuICAgIHNpbGVuY2U6IGZhbHNlLFxufTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29uZmlnUmVzb2x2ZXIgPSByZXF1aXJlKCdAc21pdGh5L2NvbmZpZy1yZXNvbHZlcicpO1xudmFyIHN0c1JlZ2lvbkRlZmF1bHRSZXNvbHZlciA9IHJlcXVpcmUoJy4vcmVnaW9uQ29uZmlnL3N0c1JlZ2lvbkRlZmF1bHRSZXNvbHZlcicpO1xuXG5jb25zdCBnZXRBd3NSZWdpb25FeHRlbnNpb25Db25maWd1cmF0aW9uID0gKHJ1bnRpbWVDb25maWcpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZXRSZWdpb24ocmVnaW9uKSB7XG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnJlZ2lvbiA9IHJlZ2lvbjtcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWVDb25maWcucmVnaW9uO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuY29uc3QgcmVzb2x2ZUF3c1JlZ2lvbkV4dGVuc2lvbkNvbmZpZ3VyYXRpb24gPSAoYXdzUmVnaW9uRXh0ZW5zaW9uQ29uZmlndXJhdGlvbikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lvbjogYXdzUmVnaW9uRXh0ZW5zaW9uQ29uZmlndXJhdGlvbi5yZWdpb24oKSxcbiAgICB9O1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTk9ERV9SRUdJT05fQ09ORklHX0ZJTEVfT1BUSU9OU1wiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbmZpZ1Jlc29sdmVyLk5PREVfUkVHSU9OX0NPTkZJR19GSUxFX09QVElPTlM7IH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTk9ERV9SRUdJT05fQ09ORklHX09QVElPTlNcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWdSZXNvbHZlci5OT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUzsgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSRUdJT05fRU5WX05BTUVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWdSZXNvbHZlci5SRUdJT05fRU5WX05BTUU7IH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUkVHSU9OX0lOSV9OQU1FXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29uZmlnUmVzb2x2ZXIuUkVHSU9OX0lOSV9OQU1FOyB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlc29sdmVSZWdpb25Db25maWdcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25maWdSZXNvbHZlci5yZXNvbHZlUmVnaW9uQ29uZmlnOyB9XG59KTtcbmV4cG9ydHMuZ2V0QXdzUmVnaW9uRXh0ZW5zaW9uQ29uZmlndXJhdGlvbiA9IGdldEF3c1JlZ2lvbkV4dGVuc2lvbkNvbmZpZ3VyYXRpb247XG5leHBvcnRzLnJlc29sdmVBd3NSZWdpb25FeHRlbnNpb25Db25maWd1cmF0aW9uID0gcmVzb2x2ZUF3c1JlZ2lvbkV4dGVuc2lvbkNvbmZpZ3VyYXRpb247XG5PYmplY3Qua2V5cyhzdHNSZWdpb25EZWZhdWx0UmVzb2x2ZXIpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgaykpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RzUmVnaW9uRGVmYXVsdFJlc29sdmVyW2tdOyB9XG4gICAgfSk7XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb3MgPSByZXF1aXJlKCdvcycpO1xudmFyIHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzJyk7XG52YXIgbWlkZGxld2FyZVVzZXJBZ2VudCA9IHJlcXVpcmUoJ0Bhd3Mtc2RrL21pZGRsZXdhcmUtdXNlci1hZ2VudCcpO1xuXG5jb25zdCBjcnRBdmFpbGFiaWxpdHkgPSB7XG4gICAgaXNDcnRBdmFpbGFibGU6IGZhbHNlLFxufTtcblxuY29uc3QgaXNDcnRBdmFpbGFibGUgPSAoKSA9PiB7XG4gICAgaWYgKGNydEF2YWlsYWJpbGl0eS5pc0NydEF2YWlsYWJsZSkge1xuICAgICAgICByZXR1cm4gW1wibWQvY3J0LWF2YWlsXCJdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGNyZWF0ZURlZmF1bHRVc2VyQWdlbnRQcm92aWRlciA9ICh7IHNlcnZpY2VJZCwgY2xpZW50VmVyc2lvbiB9KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChjb25maWcpID0+IHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbXG4gICAgICAgICAgICBbXCJhd3Mtc2RrLWpzXCIsIGNsaWVudFZlcnNpb25dLFxuICAgICAgICAgICAgW1widWFcIiwgXCIyLjFcIl0sXG4gICAgICAgICAgICBbYG9zLyR7b3MucGxhdGZvcm0oKX1gLCBvcy5yZWxlYXNlKCldLFxuICAgICAgICAgICAgW1wibGFuZy9qc1wiXSxcbiAgICAgICAgICAgIFtcIm1kL25vZGVqc1wiLCBgJHtwcm9jZXNzLnZlcnNpb25zLm5vZGV9YF0sXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGNydEF2YWlsYWJsZSA9IGlzQ3J0QXZhaWxhYmxlKCk7XG4gICAgICAgIGlmIChjcnRBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goY3J0QXZhaWxhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VydmljZUlkKSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKFtgYXBpLyR7c2VydmljZUlkfWAsIGNsaWVudFZlcnNpb25dKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQVdTX0VYRUNVVElPTl9FTlYpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goW2BleGVjLWVudi8ke3Byb2Nlc3MuZW52LkFXU19FWEVDVVRJT05fRU5WfWBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcHBJZCA9IGF3YWl0IGNvbmZpZz8udXNlckFnZW50QXBwSWQ/LigpO1xuICAgICAgICBjb25zdCByZXNvbHZlZFVzZXJBZ2VudCA9IGFwcElkID8gWy4uLnNlY3Rpb25zLCBbYGFwcC8ke2FwcElkfWBdXSA6IFsuLi5zZWN0aW9uc107XG4gICAgICAgIHJldHVybiByZXNvbHZlZFVzZXJBZ2VudDtcbiAgICB9O1xufTtcbmNvbnN0IGRlZmF1bHRVc2VyQWdlbnQgPSBjcmVhdGVEZWZhdWx0VXNlckFnZW50UHJvdmlkZXI7XG5cbmNvbnN0IFVBX0FQUF9JRF9FTlZfTkFNRSA9IFwiQVdTX1NES19VQV9BUFBfSURcIjtcbmNvbnN0IFVBX0FQUF9JRF9JTklfTkFNRSA9IFwic2RrX3VhX2FwcF9pZFwiO1xuY29uc3QgVUFfQVBQX0lEX0lOSV9OQU1FX0RFUFJFQ0FURUQgPSBcInNkay11YS1hcHAtaWRcIjtcbmNvbnN0IE5PREVfQVBQX0lEX0NPTkZJR19PUFRJT05TID0ge1xuICAgIGVudmlyb25tZW50VmFyaWFibGVTZWxlY3RvcjogKGVudikgPT4gZW52W1VBX0FQUF9JRF9FTlZfTkFNRV0sXG4gICAgY29uZmlnRmlsZVNlbGVjdG9yOiAocHJvZmlsZSkgPT4gcHJvZmlsZVtVQV9BUFBfSURfSU5JX05BTUVdID8/IHByb2ZpbGVbVUFfQVBQX0lEX0lOSV9OQU1FX0RFUFJFQ0FURURdLFxuICAgIGRlZmF1bHQ6IG1pZGRsZXdhcmVVc2VyQWdlbnQuREVGQVVMVF9VQV9BUFBfSUQsXG59O1xuXG5leHBvcnRzLk5PREVfQVBQX0lEX0NPTkZJR19PUFRJT05TID0gTk9ERV9BUFBfSURfQ09ORklHX09QVElPTlM7XG5leHBvcnRzLlVBX0FQUF9JRF9FTlZfTkFNRSA9IFVBX0FQUF9JRF9FTlZfTkFNRTtcbmV4cG9ydHMuVUFfQVBQX0lEX0lOSV9OQU1FID0gVUFfQVBQX0lEX0lOSV9OQU1FO1xuZXhwb3J0cy5jcmVhdGVEZWZhdWx0VXNlckFnZW50UHJvdmlkZXIgPSBjcmVhdGVEZWZhdWx0VXNlckFnZW50UHJvdmlkZXI7XG5leHBvcnRzLmNydEF2YWlsYWJpbGl0eSA9IGNydEF2YWlsYWJpbGl0eTtcbmV4cG9ydHMuZGVmYXVsdFVzZXJBZ2VudCA9IGRlZmF1bHRVc2VyQWdlbnQ7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxCdWZmZXJGcm9tID0gcmVxdWlyZSgnQHNtaXRoeS91dGlsLWJ1ZmZlci1mcm9tJyk7XG52YXIgdXRpbFV0ZjggPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtdXRmOCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5jbGFzcyBIYXNoIHtcbiAgICBhbGdvcml0aG1JZGVudGlmaWVyO1xuICAgIHNlY3JldDtcbiAgICBoYXNoO1xuICAgIGNvbnN0cnVjdG9yKGFsZ29yaXRobUlkZW50aWZpZXIsIHNlY3JldCkge1xuICAgICAgICB0aGlzLmFsZ29yaXRobUlkZW50aWZpZXIgPSBhbGdvcml0aG1JZGVudGlmaWVyO1xuICAgICAgICB0aGlzLnNlY3JldCA9IHNlY3JldDtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgICB1cGRhdGUodG9IYXNoLCBlbmNvZGluZykge1xuICAgICAgICB0aGlzLmhhc2gudXBkYXRlKHV0aWxVdGY4LnRvVWludDhBcnJheShjYXN0U291cmNlRGF0YSh0b0hhc2gsIGVuY29kaW5nKSkpO1xuICAgIH1cbiAgICBkaWdlc3QoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5oYXNoLmRpZ2VzdCgpKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuaGFzaCA9IHRoaXMuc2VjcmV0XG4gICAgICAgICAgICA/IGNyeXB0by5jcmVhdGVIbWFjKHRoaXMuYWxnb3JpdGhtSWRlbnRpZmllciwgY2FzdFNvdXJjZURhdGEodGhpcy5zZWNyZXQpKVxuICAgICAgICAgICAgOiBjcnlwdG8uY3JlYXRlSGFzaCh0aGlzLmFsZ29yaXRobUlkZW50aWZpZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNhc3RTb3VyY2VEYXRhKHRvQ2FzdCwgZW5jb2RpbmcpIHtcbiAgICBpZiAoYnVmZmVyLkJ1ZmZlci5pc0J1ZmZlcih0b0Nhc3QpKSB7XG4gICAgICAgIHJldHVybiB0b0Nhc3Q7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdG9DYXN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB1dGlsQnVmZmVyRnJvbS5mcm9tU3RyaW5nKHRvQ2FzdCwgZW5jb2RpbmcpO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHRvQ2FzdCkpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxCdWZmZXJGcm9tLmZyb21BcnJheUJ1ZmZlcih0b0Nhc3QuYnVmZmVyLCB0b0Nhc3QuYnl0ZU9mZnNldCwgdG9DYXN0LmJ5dGVMZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gdXRpbEJ1ZmZlckZyb20uZnJvbUFycmF5QnVmZmVyKHRvQ2FzdCk7XG59XG5cbmV4cG9ydHMuSGFzaCA9IEhhc2g7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIG5vZGVfZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5cbmNvbnN0IGNhbGN1bGF0ZUJvZHlMZW5ndGggPSAoYm9keSkgPT4ge1xuICAgIGlmICghYm9keSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJvZHkuYnl0ZUxlbmd0aCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgYm9keS5zaXplID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBib2R5LnNpemU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBib2R5LnN0YXJ0ID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBib2R5LmVuZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gYm9keS5lbmQgKyAxIC0gYm9keS5zdGFydDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIG5vZGVfZnMuUmVhZFN0cmVhbSkge1xuICAgICAgICBpZiAoYm9keS5wYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlX2ZzLmxzdGF0U3luYyhib2R5LnBhdGgpLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGJvZHkuZmQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlX2ZzLmZzdGF0U3luYyhib2R5LmZkKS5zaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQm9keSBMZW5ndGggY29tcHV0YXRpb24gZmFpbGVkIGZvciAke2JvZHl9YCk7XG59O1xuXG5leHBvcnRzLmNhbGN1bGF0ZUJvZHlMZW5ndGggPSBjYWxjdWxhdGVCb2R5TGVuZ3RoO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBjb25maWdSZXNvbHZlciA9IHJlcXVpcmUoJ0BzbWl0aHkvY29uZmlnLXJlc29sdmVyJyk7XG52YXIgbm9kZUNvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZSgnQHNtaXRoeS9ub2RlLWNvbmZpZy1wcm92aWRlcicpO1xudmFyIHByb3BlcnR5UHJvdmlkZXIgPSByZXF1aXJlKCdAc21pdGh5L3Byb3BlcnR5LXByb3ZpZGVyJyk7XG5cbmNvbnN0IEFXU19FWEVDVVRJT05fRU5WID0gXCJBV1NfRVhFQ1VUSU9OX0VOVlwiO1xuY29uc3QgQVdTX1JFR0lPTl9FTlYgPSBcIkFXU19SRUdJT05cIjtcbmNvbnN0IEFXU19ERUZBVUxUX1JFR0lPTl9FTlYgPSBcIkFXU19ERUZBVUxUX1JFR0lPTlwiO1xuY29uc3QgRU5WX0lNRFNfRElTQUJMRUQgPSBcIkFXU19FQzJfTUVUQURBVEFfRElTQUJMRURcIjtcbmNvbnN0IERFRkFVTFRTX01PREVfT1BUSU9OUyA9IFtcImluLXJlZ2lvblwiLCBcImNyb3NzLXJlZ2lvblwiLCBcIm1vYmlsZVwiLCBcInN0YW5kYXJkXCIsIFwibGVnYWN5XCJdO1xuY29uc3QgSU1EU19SRUdJT05fUEFUSCA9IFwiL2xhdGVzdC9tZXRhLWRhdGEvcGxhY2VtZW50L3JlZ2lvblwiO1xuXG5jb25zdCBBV1NfREVGQVVMVFNfTU9ERV9FTlYgPSBcIkFXU19ERUZBVUxUU19NT0RFXCI7XG5jb25zdCBBV1NfREVGQVVMVFNfTU9ERV9DT05GSUcgPSBcImRlZmF1bHRzX21vZGVcIjtcbmNvbnN0IE5PREVfREVGQVVMVFNfTU9ERV9DT05GSUdfT1BUSU9OUyA9IHtcbiAgICBlbnZpcm9ubWVudFZhcmlhYmxlU2VsZWN0b3I6IChlbnYpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudltBV1NfREVGQVVMVFNfTU9ERV9FTlZdO1xuICAgIH0sXG4gICAgY29uZmlnRmlsZVNlbGVjdG9yOiAocHJvZmlsZSkgPT4ge1xuICAgICAgICByZXR1cm4gcHJvZmlsZVtBV1NfREVGQVVMVFNfTU9ERV9DT05GSUddO1xuICAgIH0sXG4gICAgZGVmYXVsdDogXCJsZWdhY3lcIixcbn07XG5cbmNvbnN0IHJlc29sdmVEZWZhdWx0c01vZGVDb25maWcgPSAoeyByZWdpb24gPSBub2RlQ29uZmlnUHJvdmlkZXIubG9hZENvbmZpZyhjb25maWdSZXNvbHZlci5OT0RFX1JFR0lPTl9DT05GSUdfT1BUSU9OUyksIGRlZmF1bHRzTW9kZSA9IG5vZGVDb25maWdQcm92aWRlci5sb2FkQ29uZmlnKE5PREVfREVGQVVMVFNfTU9ERV9DT05GSUdfT1BUSU9OUyksIH0gPSB7fSkgPT4gcHJvcGVydHlQcm92aWRlci5tZW1vaXplKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtb2RlID0gdHlwZW9mIGRlZmF1bHRzTW9kZSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgZGVmYXVsdHNNb2RlKCkgOiBkZWZhdWx0c01vZGU7XG4gICAgc3dpdGNoIChtb2RlPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgXCJhdXRvXCI6XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU5vZGVEZWZhdWx0c01vZGVBdXRvKHJlZ2lvbik7XG4gICAgICAgIGNhc2UgXCJpbi1yZWdpb25cIjpcbiAgICAgICAgY2FzZSBcImNyb3NzLXJlZ2lvblwiOlxuICAgICAgICBjYXNlIFwibW9iaWxlXCI6XG4gICAgICAgIGNhc2UgXCJzdGFuZGFyZFwiOlxuICAgICAgICBjYXNlIFwibGVnYWN5XCI6XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vZGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJsZWdhY3lcIik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFyYW1ldGVyIGZvciBcImRlZmF1bHRzTW9kZVwiLCBleHBlY3QgJHtERUZBVUxUU19NT0RFX09QVElPTlMuam9pbihcIiwgXCIpfSwgZ290ICR7bW9kZX1gKTtcbiAgICB9XG59KTtcbmNvbnN0IHJlc29sdmVOb2RlRGVmYXVsdHNNb2RlQXV0byA9IGFzeW5jIChjbGllbnRSZWdpb24pID0+IHtcbiAgICBpZiAoY2xpZW50UmVnaW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUmVnaW9uID0gdHlwZW9mIGNsaWVudFJlZ2lvbiA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgY2xpZW50UmVnaW9uKCkgOiBjbGllbnRSZWdpb247XG4gICAgICAgIGNvbnN0IGluZmVycmVkUmVnaW9uID0gYXdhaXQgaW5mZXJQaHlzaWNhbFJlZ2lvbigpO1xuICAgICAgICBpZiAoIWluZmVycmVkUmVnaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJzdGFuZGFyZFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZFJlZ2lvbiA9PT0gaW5mZXJyZWRSZWdpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBcImluLXJlZ2lvblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiY3Jvc3MtcmVnaW9uXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwic3RhbmRhcmRcIjtcbn07XG5jb25zdCBpbmZlclBoeXNpY2FsUmVnaW9uID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudltBV1NfRVhFQ1VUSU9OX0VOVl0gJiYgKHByb2Nlc3MuZW52W0FXU19SRUdJT05fRU5WXSB8fCBwcm9jZXNzLmVudltBV1NfREVGQVVMVF9SRUdJT05fRU5WXSkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52W0FXU19SRUdJT05fRU5WXSA/PyBwcm9jZXNzLmVudltBV1NfREVGQVVMVF9SRUdJT05fRU5WXTtcbiAgICB9XG4gICAgaWYgKCFwcm9jZXNzLmVudltFTlZfSU1EU19ESVNBQkxFRF0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHsgZ2V0SW5zdGFuY2VNZXRhZGF0YUVuZHBvaW50LCBodHRwUmVxdWVzdCB9ID0gYXdhaXQgaW1wb3J0KCdAc21pdGh5L2NyZWRlbnRpYWwtcHJvdmlkZXItaW1kcycpO1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBhd2FpdCBnZXRJbnN0YW5jZU1ldGFkYXRhRW5kcG9pbnQoKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgaHR0cFJlcXVlc3QoeyAuLi5lbmRwb2ludCwgcGF0aDogSU1EU19SRUdJT05fUEFUSCB9KSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0cy5yZXNvbHZlRGVmYXVsdHNNb2RlQ29uZmlnID0gcmVzb2x2ZURlZmF1bHRzTW9kZUNvbmZpZztcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2JvciA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZS9jYm9yJyk7XG52YXIgc2NoZW1hID0gcmVxdWlyZSgnQHNtaXRoeS9jb3JlL3NjaGVtYScpO1xudmFyIHNtaXRoeUNsaWVudCA9IHJlcXVpcmUoJ0BzbWl0aHkvc21pdGh5LWNsaWVudCcpO1xudmFyIHByb3RvY29scyA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZS9wcm90b2NvbHMnKTtcbnZhciBzZXJkZSA9IHJlcXVpcmUoJ0BzbWl0aHkvY29yZS9zZXJkZScpO1xudmFyIHV0aWxCYXNlNjQgPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtYmFzZTY0Jyk7XG52YXIgdXRpbFV0ZjggPSByZXF1aXJlKCdAc21pdGh5L3V0aWwtdXRmOCcpO1xudmFyIHhtbEJ1aWxkZXIgPSByZXF1aXJlKCdAYXdzLXNkay94bWwtYnVpbGRlcicpO1xuXG5jbGFzcyBQcm90b2NvbExpYiB7XG4gICAgcXVlcnlDb21wYXQ7XG4gICAgY29uc3RydWN0b3IocXVlcnlDb21wYXQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnF1ZXJ5Q29tcGF0ID0gcXVlcnlDb21wYXQ7XG4gICAgfVxuICAgIHJlc29sdmVSZXN0Q29udGVudFR5cGUoZGVmYXVsdENvbnRlbnRUeXBlLCBpbnB1dFNjaGVtYSkge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gaW5wdXRTY2hlbWEuZ2V0TWVtYmVyU2NoZW1hcygpO1xuICAgICAgICBjb25zdCBodHRwUGF5bG9hZE1lbWJlciA9IE9iamVjdC52YWx1ZXMobWVtYmVycykuZmluZCgobSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhbS5nZXRNZXJnZWRUcmFpdHMoKS5odHRwUGF5bG9hZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChodHRwUGF5bG9hZE1lbWJlcikge1xuICAgICAgICAgICAgY29uc3QgbWVkaWFUeXBlID0gaHR0cFBheWxvYWRNZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCkubWVkaWFUeXBlO1xuICAgICAgICAgICAgaWYgKG1lZGlhVHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZWRpYVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChodHRwUGF5bG9hZE1lbWJlci5pc1N0cmluZ1NjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidGV4dC9wbGFpblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaHR0cFBheWxvYWRNZW1iZXIuaXNCbG9iU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q29udGVudFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlucHV0U2NoZW1hLmlzVW5pdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNCb2R5ID0gT2JqZWN0LnZhbHVlcyhtZW1iZXJzKS5maW5kKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBodHRwUXVlcnksIGh0dHBRdWVyeVBhcmFtcywgaHR0cEhlYWRlciwgaHR0cExhYmVsLCBodHRwUHJlZml4SGVhZGVycyB9ID0gbS5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBub1ByZWZpeEhlYWRlcnMgPSBodHRwUHJlZml4SGVhZGVycyA9PT0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiAhaHR0cFF1ZXJ5ICYmICFodHRwUXVlcnlQYXJhbXMgJiYgIWh0dHBIZWFkZXIgJiYgIWh0dHBMYWJlbCAmJiBub1ByZWZpeEhlYWRlcnM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChoYXNCb2R5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDb250ZW50VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRFcnJvclNjaGVtYU9yVGhyb3dCYXNlRXhjZXB0aW9uKGVycm9ySWRlbnRpZmllciwgZGVmYXVsdE5hbWVzcGFjZSwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhLCBnZXRFcnJvclNjaGVtYSkge1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gZGVmYXVsdE5hbWVzcGFjZTtcbiAgICAgICAgbGV0IGVycm9yTmFtZSA9IGVycm9ySWRlbnRpZmllcjtcbiAgICAgICAgaWYgKGVycm9ySWRlbnRpZmllci5pbmNsdWRlcyhcIiNcIikpIHtcbiAgICAgICAgICAgIFtuYW1lc3BhY2UsIGVycm9yTmFtZV0gPSBlcnJvcklkZW50aWZpZXIuc3BsaXQoXCIjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAkbWV0YWRhdGE6IG1ldGFkYXRhLFxuICAgICAgICAgICAgJGZhdWx0OiByZXNwb25zZS5zdGF0dXNDb2RlIDwgNTAwID8gXCJjbGllbnRcIiA6IFwic2VydmVyXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IobmFtZXNwYWNlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yU2NoZW1hID0gZ2V0RXJyb3JTY2hlbWE/LihyZWdpc3RyeSwgZXJyb3JOYW1lKSA/PyByZWdpc3RyeS5nZXRTY2hlbWEoZXJyb3JJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yU2NoZW1hLCBlcnJvck1ldGFkYXRhIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRhdGFPYmplY3QubWVzc2FnZSA9IGRhdGFPYmplY3QubWVzc2FnZSA/PyBkYXRhT2JqZWN0Lk1lc3NhZ2UgPz8gXCJVbmtub3duRXJyb3JcIjtcbiAgICAgICAgICAgIGNvbnN0IHN5bnRoZXRpYyA9IHNjaGVtYS5UeXBlUmVnaXN0cnkuZm9yKFwic21pdGh5LnRzLnNkay5zeW50aGV0aWMuXCIgKyBuYW1lc3BhY2UpO1xuICAgICAgICAgICAgY29uc3QgYmFzZUV4Y2VwdGlvblNjaGVtYSA9IHN5bnRoZXRpYy5nZXRCYXNlRXhjZXB0aW9uKCk7XG4gICAgICAgICAgICBpZiAoYmFzZUV4Y2VwdGlvblNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IEVycm9yQ3RvciA9IHN5bnRoZXRpYy5nZXRFcnJvckN0b3IoYmFzZUV4Y2VwdGlvblNjaGVtYSkgPz8gRXJyb3I7XG4gICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5kZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oT2JqZWN0LmFzc2lnbihuZXcgRXJyb3JDdG9yKHsgbmFtZTogZXJyb3JOYW1lIH0pLCBlcnJvck1ldGFkYXRhKSwgZGF0YU9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyB0aGlzLmRlY29yYXRlU2VydmljZUV4Y2VwdGlvbihPYmplY3QuYXNzaWduKG5ldyBFcnJvcihlcnJvck5hbWUpLCBlcnJvck1ldGFkYXRhKSwgZGF0YU9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKGV4Y2VwdGlvbiwgYWRkaXRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucXVlcnlDb21wYXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGV4Y2VwdGlvbi5NZXNzYWdlID8/IGFkZGl0aW9ucy5NZXNzYWdlO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBzbWl0aHlDbGllbnQuZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKGV4Y2VwdGlvbiwgYWRkaXRpb25zKTtcbiAgICAgICAgICAgIGlmIChtc2cpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5NZXNzYWdlID0gbXNnO1xuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBtc2c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNtaXRoeUNsaWVudC5kZWNvcmF0ZVNlcnZpY2VFeGNlcHRpb24oZXhjZXB0aW9uLCBhZGRpdGlvbnMpO1xuICAgIH1cbiAgICBzZXRRdWVyeUNvbXBhdEVycm9yKG91dHB1dCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgcXVlcnlFcnJvckhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnM/LltcIngtYW16bi1xdWVyeS1lcnJvclwiXTtcbiAgICAgICAgaWYgKG91dHB1dCAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5RXJyb3JIZWFkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgW0NvZGUsIFR5cGVdID0gcXVlcnlFcnJvckhlYWRlci5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob3V0cHV0KTtcbiAgICAgICAgICAgIGNvbnN0IEVycm9yID0ge1xuICAgICAgICAgICAgICAgIENvZGUsXG4gICAgICAgICAgICAgICAgVHlwZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgRXJyb3IpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIEVycm9yW2tdID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBFcnJvci5fX3R5cGU7XG4gICAgICAgICAgICBvdXRwdXQuRXJyb3IgPSBFcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWVyeUNvbXBhdE91dHB1dChxdWVyeUNvbXBhdEVycm9yRGF0YSwgZXJyb3JEYXRhKSB7XG4gICAgICAgIGlmIChxdWVyeUNvbXBhdEVycm9yRGF0YS5FcnJvcikge1xuICAgICAgICAgICAgZXJyb3JEYXRhLkVycm9yID0gcXVlcnlDb21wYXRFcnJvckRhdGEuRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5Q29tcGF0RXJyb3JEYXRhLlR5cGUpIHtcbiAgICAgICAgICAgIGVycm9yRGF0YS5UeXBlID0gcXVlcnlDb21wYXRFcnJvckRhdGEuVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnlDb21wYXRFcnJvckRhdGEuQ29kZSkge1xuICAgICAgICAgICAgZXJyb3JEYXRhLkNvZGUgPSBxdWVyeUNvbXBhdEVycm9yRGF0YS5Db2RlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBBd3NTbWl0aHlScGNWMkNib3JQcm90b2NvbCBleHRlbmRzIGNib3IuU21pdGh5UnBjVjJDYm9yUHJvdG9jb2wge1xuICAgIGF3c1F1ZXJ5Q29tcGF0aWJsZTtcbiAgICBtaXhpbjtcbiAgICBjb25zdHJ1Y3Rvcih7IGRlZmF1bHROYW1lc3BhY2UsIGF3c1F1ZXJ5Q29tcGF0aWJsZSwgfSkge1xuICAgICAgICBzdXBlcih7IGRlZmF1bHROYW1lc3BhY2UgfSk7XG4gICAgICAgIHRoaXMuYXdzUXVlcnlDb21wYXRpYmxlID0gISFhd3NRdWVyeUNvbXBhdGlibGU7XG4gICAgICAgIHRoaXMubWl4aW4gPSBuZXcgUHJvdG9jb2xMaWIodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpO1xuICAgIH1cbiAgICBhc3luYyBzZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCk7XG4gICAgICAgIGlmICh0aGlzLmF3c1F1ZXJ5Q29tcGF0aWJsZSkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1wieC1hbXpuLXF1ZXJ5LW1vZGVcIl0gPSBcInRydWVcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlRXJyb3Iob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuYXdzUXVlcnlDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm1peGluLnNldFF1ZXJ5Q29tcGF0RXJyb3IoZGF0YU9iamVjdCwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yTmFtZSA9IGNib3IubG9hZFNtaXRoeVJwY1YyQ2JvckVycm9yQ29kZShyZXNwb25zZSwgZGF0YU9iamVjdCkgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JTY2hlbWEsIGVycm9yTWV0YWRhdGEgfSA9IGF3YWl0IHRoaXMubWl4aW4uZ2V0RXJyb3JTY2hlbWFPclRocm93QmFzZUV4Y2VwdGlvbihlcnJvck5hbWUsIHRoaXMub3B0aW9ucy5kZWZhdWx0TmFtZXNwYWNlLCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEpO1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKGVycm9yU2NoZW1hKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGFPYmplY3QubWVzc2FnZSA/PyBkYXRhT2JqZWN0Lk1lc3NhZ2UgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGNvbnN0IEVycm9yQ3RvciA9IHNjaGVtYS5UeXBlUmVnaXN0cnkuZm9yKGVycm9yU2NoZW1hWzFdKS5nZXRFcnJvckN0b3IoZXJyb3JTY2hlbWEpID8/IEVycm9yO1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgRXJyb3JDdG9yKG1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWVtYmVyXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSB0aGlzLmRlc2VyaWFsaXplci5yZWFkVmFsdWUobWVtYmVyLCBkYXRhT2JqZWN0W25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIHRoaXMubWl4aW4ucXVlcnlDb21wYXRPdXRwdXQoZGF0YU9iamVjdCwgb3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyB0aGlzLm1peGluLmRlY29yYXRlU2VydmljZUV4Y2VwdGlvbihPYmplY3QuYXNzaWduKGV4Y2VwdGlvbiwgZXJyb3JNZXRhZGF0YSwge1xuICAgICAgICAgICAgJGZhdWx0OiBucy5nZXRNZXJnZWRUcmFpdHMoKS5lcnJvcixcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIH0sIG91dHB1dCksIGRhdGFPYmplY3QpO1xuICAgIH1cbn1cblxuY29uc3QgX3RvU3RyID0gKHZhbCkgPT4ge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmcgPSBuZXcgRXJyb3IoYFJlY2VpdmVkIG51bWJlciAke3ZhbH0gd2hlcmUgYSBzdHJpbmcgd2FzIGV4cGVjdGVkLmApO1xuICAgICAgICB3YXJuaW5nLm5hbWUgPSBcIldhcm5pbmdcIjtcbiAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBjb25zdCB3YXJuaW5nID0gbmV3IEVycm9yKGBSZWNlaXZlZCBib29sZWFuICR7dmFsfSB3aGVyZSBhIHN0cmluZyB3YXMgZXhwZWN0ZWQuYCk7XG4gICAgICAgIHdhcm5pbmcubmFtZSA9IFwiV2FybmluZ1wiO1xuICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn07XG5jb25zdCBfdG9Cb29sID0gKHZhbCkgPT4ge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBsb3dlcmNhc2UgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHZhbCAhPT0gXCJcIiAmJiBsb3dlcmNhc2UgIT09IFwiZmFsc2VcIiAmJiBsb3dlcmNhc2UgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nID0gbmV3IEVycm9yKGBSZWNlaXZlZCBzdHJpbmcgXCIke3ZhbH1cIiB3aGVyZSBhIGJvb2xlYW4gd2FzIGV4cGVjdGVkLmApO1xuICAgICAgICAgICAgd2FybmluZy5uYW1lID0gXCJXYXJuaW5nXCI7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbCAhPT0gXCJcIiAmJiBsb3dlcmNhc2UgIT09IFwiZmFsc2VcIjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn07XG5jb25zdCBfdG9OdW0gPSAodmFsKSA9PiB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpO1xuICAgICAgICBpZiAobnVtLnRvU3RyaW5nKCkgIT09IHZhbCkge1xuICAgICAgICAgICAgY29uc3Qgd2FybmluZyA9IG5ldyBFcnJvcihgUmVjZWl2ZWQgc3RyaW5nIFwiJHt2YWx9XCIgd2hlcmUgYSBudW1iZXIgd2FzIGV4cGVjdGVkLmApO1xuICAgICAgICAgICAgd2FybmluZy5uYW1lID0gXCJXYXJuaW5nXCI7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudW07XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG5jbGFzcyBTZXJkZUNvbnRleHRDb25maWcge1xuICAgIHNlcmRlQ29udGV4dDtcbiAgICBzZXRTZXJkZUNvbnRleHQoc2VyZGVDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuc2VyZGVDb250ZXh0ID0gc2VyZGVDb250ZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24ganNvblJldml2ZXIoa2V5LCB2YWx1ZSwgY29udGV4dCkge1xuICAgIGlmIChjb250ZXh0Py5zb3VyY2UpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY1N0cmluZyA9IGNvbnRleHQuc291cmNlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCB2YWx1ZSA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSIHx8IG51bWVyaWNTdHJpbmcgIT09IFN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZyYWN0aW9uYWwgPSBudW1lcmljU3RyaW5nLmluY2x1ZGVzKFwiLlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGcmFjdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc2VyZGUuTnVtZXJpY1ZhbHVlKG51bWVyaWNTdHJpbmcsIFwiYmlnRGVjaW1hbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCaWdJbnQobnVtZXJpY1N0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuY29uc3QgY29sbGVjdEJvZHlTdHJpbmcgPSAoc3RyZWFtQm9keSwgY29udGV4dCkgPT4gc21pdGh5Q2xpZW50LmNvbGxlY3RCb2R5KHN0cmVhbUJvZHksIGNvbnRleHQpLnRoZW4oKGJvZHkpID0+IChjb250ZXh0Py51dGY4RW5jb2RlciA/PyB1dGlsVXRmOC50b1V0ZjgpKGJvZHkpKTtcblxuY29uc3QgcGFyc2VKc29uQm9keSA9IChzdHJlYW1Cb2R5LCBjb250ZXh0KSA9PiBjb2xsZWN0Qm9keVN0cmluZyhzdHJlYW1Cb2R5LCBjb250ZXh0KS50aGVuKChlbmNvZGVkKSA9PiB7XG4gICAgaWYgKGVuY29kZWQubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlbmNvZGVkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGU/Lm5hbWUgPT09IFwiU3ludGF4RXJyb3JcIikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIiRyZXNwb25zZUJvZHlUZXh0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVuY29kZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn0pO1xuY29uc3QgcGFyc2VKc29uRXJyb3JCb2R5ID0gYXN5bmMgKGVycm9yQm9keSwgY29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFyc2VKc29uQm9keShlcnJvckJvZHksIGNvbnRleHQpO1xuICAgIHZhbHVlLm1lc3NhZ2UgPSB2YWx1ZS5tZXNzYWdlID8/IHZhbHVlLk1lc3NhZ2U7XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbmNvbnN0IGxvYWRSZXN0SnNvbkVycm9yQ29kZSA9IChvdXRwdXQsIGRhdGEpID0+IHtcbiAgICBjb25zdCBmaW5kS2V5ID0gKG9iamVjdCwga2V5KSA9PiBPYmplY3Qua2V5cyhvYmplY3QpLmZpbmQoKGspID0+IGsudG9Mb3dlckNhc2UoKSA9PT0ga2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgIGNvbnN0IHNhbml0aXplRXJyb3JDb2RlID0gKHJhd1ZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBjbGVhblZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYW5WYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgY2xlYW5WYWx1ZSA9IGNsZWFuVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYW5WYWx1ZS5pbmRleE9mKFwiLFwiKSA+PSAwKSB7XG4gICAgICAgICAgICBjbGVhblZhbHVlID0gY2xlYW5WYWx1ZS5zcGxpdChcIixcIilbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsZWFuVmFsdWUuaW5kZXhPZihcIjpcIikgPj0gMCkge1xuICAgICAgICAgICAgY2xlYW5WYWx1ZSA9IGNsZWFuVmFsdWUuc3BsaXQoXCI6XCIpWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGVhblZhbHVlLmluZGV4T2YoXCIjXCIpID49IDApIHtcbiAgICAgICAgICAgIGNsZWFuVmFsdWUgPSBjbGVhblZhbHVlLnNwbGl0KFwiI1wiKVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xlYW5WYWx1ZTtcbiAgICB9O1xuICAgIGNvbnN0IGhlYWRlcktleSA9IGZpbmRLZXkob3V0cHV0LmhlYWRlcnMsIFwieC1hbXpuLWVycm9ydHlwZVwiKTtcbiAgICBpZiAoaGVhZGVyS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHNhbml0aXplRXJyb3JDb2RlKG91dHB1dC5oZWFkZXJzW2hlYWRlcktleV0pO1xuICAgIH1cbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb25zdCBjb2RlS2V5ID0gZmluZEtleShkYXRhLCBcImNvZGVcIik7XG4gICAgICAgIGlmIChjb2RlS2V5ICYmIGRhdGFbY29kZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplRXJyb3JDb2RlKGRhdGFbY29kZUtleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhW1wiX190eXBlXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUVycm9yQ29kZShkYXRhW1wiX190eXBlXCJdKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmNsYXNzIEpzb25TaGFwZURlc2VyaWFsaXplciBleHRlbmRzIFNlcmRlQ29udGV4dENvbmZpZyB7XG4gICAgc2V0dGluZ3M7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICBhc3luYyByZWFkKHNjaGVtYSwgZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZChzY2hlbWEsIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShkYXRhLCBqc29uUmV2aXZlcikgOiBhd2FpdCBwYXJzZUpzb25Cb2R5KGRhdGEsIHRoaXMuc2VyZGVDb250ZXh0KSk7XG4gICAgfVxuICAgIHJlYWRPYmplY3Qoc2NoZW1hLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKHNjaGVtYSwgZGF0YSk7XG4gICAgfVxuICAgIF9yZWFkKHNjaGVtYSQxLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBpc09iamVjdCA9IHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSk7XG4gICAgICAgIGlmIChucy5pc0xpc3RTY2hlbWEoKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdE1lbWJlciA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuc3BhcnNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYXJzZSB8fCBpdGVtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2godGhpcy5fcmVhZChsaXN0TWVtYmVyLCBpdGVtKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc01hcFNjaGVtYSgpICYmIGlzT2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBtYXBNZW1iZXIgPSBucy5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgICAgICBjb25zdCBzcGFyc2UgPSAhIW5zLmdldE1lcmdlZFRyYWl0cygpLnNwYXJzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW19rLCBfdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYXJzZSB8fCBfdiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dFtfa10gPSB0aGlzLl9yZWFkKG1hcE1lbWJlciwgX3YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNTdHJ1Y3RTY2hlbWEoKSAmJiBpc09iamVjdCkge1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFttZW1iZXJOYW1lLCBtZW1iZXJTY2hlbWFdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tS2V5ID0gdGhpcy5zZXR0aW5ncy5qc29uTmFtZSA/IG1lbWJlclNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKS5qc29uTmFtZSA/PyBtZW1iZXJOYW1lIDogbWVtYmVyTmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHRoaXMuX3JlYWQobWVtYmVyU2NoZW1hLCB2YWx1ZVtmcm9tS2V5XSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2VyaWFsaXplZFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0W21lbWJlck5hbWVdID0gZGVzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNCbG9iU2NoZW1hKCkgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEJhc2U2NC5mcm9tQmFzZTY0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBucy5nZXRNZXJnZWRUcmFpdHMoKS5tZWRpYVR5cGU7XG4gICAgICAgIGlmIChucy5pc1N0cmluZ1NjaGVtYSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBtZWRpYVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzSnNvbiA9IG1lZGlhVHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9qc29uXCIgfHwgbWVkaWFUeXBlLmVuZHNXaXRoKFwiK2pzb25cIik7XG4gICAgICAgICAgICBpZiAoaXNKc29uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmRlLkxhenlKc29uU3RyaW5nLmZyb20odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc1RpbWVzdGFtcFNjaGVtYSgpICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IHByb3RvY29scy5kZXRlcm1pbmVUaW1lc3RhbXBGb3JtYXQobnMsIHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJkZS5wYXJzZVJmYzMzMzlEYXRlVGltZVdpdGhPZmZzZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcmRlLnBhcnNlUmZjNzIzMURhdGVUaW1lKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJkZS5wYXJzZUVwb2NoVGltZXN0YW1wKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJNaXNzaW5nIHRpbWVzdGFtcCBmb3JtYXQsIHBhcnNpbmcgdmFsdWUgd2l0aCBEYXRlIGNvbnN0cnVjdG9yOlwiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzQmlnSW50ZWdlclNjaGVtYSgpICYmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzQmlnRGVjaW1hbFNjaGVtYSgpICYmIHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygc2VyZGUuTnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdW50eXBlZCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHVudHlwZWQudHlwZSA9PT0gXCJiaWdEZWNpbWFsXCIgJiYgXCJzdHJpbmdcIiBpbiB1bnR5cGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBzZXJkZS5OdW1lcmljVmFsdWUodW50eXBlZC5zdHJpbmcsIHVudHlwZWQudHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IHNlcmRlLk51bWVyaWNWYWx1ZShTdHJpbmcodmFsdWUpLCBcImJpZ0RlY2ltYWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzTnVtZXJpY1NjaGVtYSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJJbmZpbml0eVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIi1JbmZpbml0eVwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgIGNhc2UgXCJOYU5cIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNEb2N1bWVudFNjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFtdIDoge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2Ygc2VyZGUuTnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRba10gPSB2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2tdID0gdGhpcy5fcmVhZChucywgdik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbmNvbnN0IE5VTUVSSUNfQ09OVFJPTF9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZSg5MjUpO1xuY2xhc3MgSnNvblJlcGxhY2VyIHtcbiAgICB2YWx1ZXMgPSBuZXcgTWFwKCk7XG4gICAgY291bnRlciA9IDA7XG4gICAgc3RhZ2UgPSAwO1xuICAgIGNyZWF0ZVJlcGxhY2VyKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSBKc29uUmVwbGFjZXIgYWxyZWFkeSBjcmVhdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGFnZSA9PT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSBKc29uUmVwbGFjZXIgZXhoYXVzdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YWdlID0gMTtcbiAgICAgICAgcmV0dXJuIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBzZXJkZS5OdW1lcmljVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gYCR7TlVNRVJJQ19DT05UUk9MX0NIQVIgKyBcIm52XCIgKyB0aGlzLmNvdW50ZXIrK31fYCArIHZhbHVlLnN0cmluZztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoYFwiJHt2fVwiYCwgdmFsdWUuc3RyaW5nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gYCR7TlVNRVJJQ19DT05UUk9MX0NIQVIgKyBcImJcIiArIHRoaXMuY291bnRlcisrfV9gICsgcztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoYFwiJHt2fVwiYCwgcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlcGxhY2VJbkpzb24oanNvbikge1xuICAgICAgICBpZiAodGhpcy5zdGFnZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSBKc29uUmVwbGFjZXIgbm90IGNyZWF0ZWQgeWV0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGFnZSA9PT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSBKc29uUmVwbGFjZXIgZXhoYXVzdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YWdlID0gMjtcbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy52YWx1ZXMpIHtcbiAgICAgICAgICAgIGpzb24gPSBqc29uLnJlcGxhY2Uoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufVxuXG5jbGFzcyBKc29uU2hhcGVTZXJpYWxpemVyIGV4dGVuZHMgU2VyZGVDb250ZXh0Q29uZmlnIHtcbiAgICBzZXR0aW5ncztcbiAgICBidWZmZXI7XG4gICAgcm9vdFNjaGVtYTtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgfVxuICAgIHdyaXRlKHNjaGVtYSQxLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnJvb3RTY2hlbWEgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSk7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5fd3JpdGUodGhpcy5yb290U2NoZW1hLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdyaXRlRGlzY3JpbWluYXRlZERvY3VtZW50KHNjaGVtYSQxLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLndyaXRlKHNjaGVtYSQxLCB2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5idWZmZXIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyLl9fdHlwZSA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKHNjaGVtYSQxKS5nZXROYW1lKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICBjb25zdCB7IHJvb3RTY2hlbWEgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMucm9vdFNjaGVtYSA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJvb3RTY2hlbWE/LmlzU3RydWN0U2NoZW1hKCkgfHwgcm9vdFNjaGVtYT8uaXNEb2N1bWVudFNjaGVtYSgpKSB7XG4gICAgICAgICAgICBjb25zdCByZXBsYWNlciA9IG5ldyBKc29uUmVwbGFjZXIoKTtcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlci5yZXBsYWNlSW5Kc29uKEpTT04uc3RyaW5naWZ5KHRoaXMuYnVmZmVyLCByZXBsYWNlci5jcmVhdGVSZXBsYWNlcigpLCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICAgIH1cbiAgICBfd3JpdGUoc2NoZW1hJDEsIHZhbHVlLCBjb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yoc2NoZW1hJDEpO1xuICAgICAgICBpZiAobnMuaXNMaXN0U2NoZW1hKCkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RNZW1iZXIgPSBucy5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gW107XG4gICAgICAgICAgICBjb25zdCBzcGFyc2UgPSAhIW5zLmdldE1lcmdlZFRyYWl0cygpLnNwYXJzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFyc2UgfHwgaXRlbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKHRoaXMuX3dyaXRlKGxpc3RNZW1iZXIsIGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzTWFwU2NoZW1hKCkgJiYgaXNPYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcE1lbWJlciA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbnMuZ2V0TWVyZ2VkVHJhaXRzKCkuc3BhcnNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbX2ssIF92XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhcnNlIHx8IF92ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0W19rXSA9IHRoaXMuX3dyaXRlKG1hcE1lbWJlciwgX3YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNTdHJ1Y3RTY2hlbWEoKSAmJiBpc09iamVjdCkge1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFttZW1iZXJOYW1lLCBtZW1iZXJTY2hlbWFdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRLZXkgPSB0aGlzLnNldHRpbmdzLmpzb25OYW1lID8gbWVtYmVyU2NoZW1hLmdldE1lcmdlZFRyYWl0cygpLmpzb25OYW1lID8/IG1lbWJlck5hbWUgOiBtZW1iZXJOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZVZhbHVlID0gdGhpcy5fd3JpdGUobWVtYmVyU2NoZW1hLCB2YWx1ZVttZW1iZXJOYW1lXSwgbnMpO1xuICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemFibGVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dFt0YXJnZXRLZXldID0gc2VyaWFsaXphYmxlVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgY29udGFpbmVyPy5pc1N0cnVjdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICgobnMuaXNCbG9iU2NoZW1hKCkgJiYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpKSB8fFxuICAgICAgICAgICAgKG5zLmlzRG9jdW1lbnRTY2hlbWEoKSAmJiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICBpZiAobnMgPT09IHRoaXMucm9vdFNjaGVtYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAodGhpcy5zZXJkZUNvbnRleHQ/LmJhc2U2NEVuY29kZXIgPz8gdXRpbEJhc2U2NC50b0Jhc2U2NCkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgobnMuaXNUaW1lc3RhbXBTY2hlbWEoKSB8fCBucy5pc0RvY3VtZW50U2NoZW1hKCkpICYmIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gcHJvdG9jb2xzLmRldGVybWluZVRpbWVzdGFtcEZvcm1hdChucywgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkucmVwbGFjZShcIi4wMDBaXCIsIFwiWlwiKTtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJkZS5kYXRlVG9VdGNTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTWlzc2luZyB0aW1lc3RhbXAgZm9ybWF0LCB1c2luZyBlcG9jaCBzZWNvbmRzXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzTnVtZXJpY1NjaGVtYSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlKSA9PT0gSW5maW5pdHkgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzU3RyaW5nU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgJiYgbnMuaXNJZGVtcG90ZW5jeVRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VyZGUuZ2VuZXJhdGVJZGVtcG90ZW5jeVRva2VuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBucy5nZXRNZXJnZWRUcmFpdHMoKS5tZWRpYVR5cGU7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBtZWRpYVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0pzb24gPSBtZWRpYVR5cGUgPT09IFwiYXBwbGljYXRpb24vanNvblwiIHx8IG1lZGlhVHlwZS5lbmRzV2l0aChcIitqc29uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpc0pzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcmRlLkxhenlKc29uU3RyaW5nLmZyb20odmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNEb2N1bWVudFNjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFtdIDoge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2Ygc2VyZGUuTnVtZXJpY1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRba10gPSB2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2tdID0gdGhpcy5fd3JpdGUobnMsIHYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5jbGFzcyBKc29uQ29kZWMgZXh0ZW5kcyBTZXJkZUNvbnRleHRDb25maWcge1xuICAgIHNldHRpbmdzO1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG4gICAgY3JlYXRlU2VyaWFsaXplcigpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBKc29uU2hhcGVTZXJpYWxpemVyKHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBzZXJpYWxpemVyLnNldFNlcmRlQ29udGV4dCh0aGlzLnNlcmRlQ29udGV4dCk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyO1xuICAgIH1cbiAgICBjcmVhdGVEZXNlcmlhbGl6ZXIoKSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplciA9IG5ldyBKc29uU2hhcGVEZXNlcmlhbGl6ZXIodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIGRlc2VyaWFsaXplci5zZXRTZXJkZUNvbnRleHQodGhpcy5zZXJkZUNvbnRleHQpO1xuICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVyO1xuICAgIH1cbn1cblxuY2xhc3MgQXdzSnNvblJwY1Byb3RvY29sIGV4dGVuZHMgcHJvdG9jb2xzLlJwY1Byb3RvY29sIHtcbiAgICBzZXJpYWxpemVyO1xuICAgIGRlc2VyaWFsaXplcjtcbiAgICBzZXJ2aWNlVGFyZ2V0O1xuICAgIGNvZGVjO1xuICAgIG1peGluO1xuICAgIGF3c1F1ZXJ5Q29tcGF0aWJsZTtcbiAgICBjb25zdHJ1Y3Rvcih7IGRlZmF1bHROYW1lc3BhY2UsIHNlcnZpY2VUYXJnZXQsIGF3c1F1ZXJ5Q29tcGF0aWJsZSwgfSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlVGFyZ2V0ID0gc2VydmljZVRhcmdldDtcbiAgICAgICAgdGhpcy5jb2RlYyA9IG5ldyBKc29uQ29kZWMoe1xuICAgICAgICAgICAgdGltZXN0YW1wRm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgdXNlVHJhaXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBqc29uTmFtZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSB0aGlzLmNvZGVjLmNyZWF0ZVNlcmlhbGl6ZXIoKTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZXIgPSB0aGlzLmNvZGVjLmNyZWF0ZURlc2VyaWFsaXplcigpO1xuICAgICAgICB0aGlzLmF3c1F1ZXJ5Q29tcGF0aWJsZSA9ICEhYXdzUXVlcnlDb21wYXRpYmxlO1xuICAgICAgICB0aGlzLm1peGluID0gbmV3IFByb3RvY29sTGliKHRoaXMuYXdzUXVlcnlDb21wYXRpYmxlKTtcbiAgICB9XG4gICAgYXN5bmMgc2VyaWFsaXplUmVxdWVzdChvcGVyYXRpb25TY2hlbWEsIGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBzdXBlci5zZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXJlcXVlc3QucGF0aC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJlcXVlc3QucGF0aCArPSBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3QuaGVhZGVycywge1xuICAgICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogYGFwcGxpY2F0aW9uL3gtYW16LWpzb24tJHt0aGlzLmdldEpzb25ScGNWZXJzaW9uKCl9YCxcbiAgICAgICAgICAgIFwieC1hbXotdGFyZ2V0XCI6IGAke3RoaXMuc2VydmljZVRhcmdldH0uJHtvcGVyYXRpb25TY2hlbWEubmFtZX1gLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuYXdzUXVlcnlDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJ4LWFtem4tcXVlcnktbW9kZVwiXSA9IFwidHJ1ZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEuZGVyZWYob3BlcmF0aW9uU2NoZW1hLmlucHV0KSA9PT0gXCJ1bml0XCIgfHwgIXJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gXCJ7fVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICBnZXRQYXlsb2FkQ29kZWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGVjO1xuICAgIH1cbiAgICBhc3luYyBoYW5kbGVFcnJvcihvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIHRoaXMubWl4aW4uc2V0UXVlcnlDb21wYXRFcnJvcihkYXRhT2JqZWN0LCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JJZGVudGlmaWVyID0gbG9hZFJlc3RKc29uRXJyb3JDb2RlKHJlc3BvbnNlLCBkYXRhT2JqZWN0KSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgeyBlcnJvclNjaGVtYSwgZXJyb3JNZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5taXhpbi5nZXRFcnJvclNjaGVtYU9yVGhyb3dCYXNlRXhjZXB0aW9uKGVycm9ySWRlbnRpZmllciwgdGhpcy5vcHRpb25zLmRlZmF1bHROYW1lc3BhY2UsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSk7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoZXJyb3JTY2hlbWEpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGF0YU9iamVjdC5tZXNzYWdlID8/IGRhdGFPYmplY3QuTWVzc2FnZSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgRXJyb3JDdG9yID0gc2NoZW1hLlR5cGVSZWdpc3RyeS5mb3IoZXJyb3JTY2hlbWFbMV0pLmdldEVycm9yQ3RvcihlcnJvclNjaGVtYSkgPz8gRXJyb3I7XG4gICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBFcnJvckN0b3IobWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtZW1iZXJdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG1lbWJlci5nZXRNZXJnZWRUcmFpdHMoKS5qc29uTmFtZSA/PyBuYW1lO1xuICAgICAgICAgICAgb3V0cHV0W25hbWVdID0gdGhpcy5jb2RlYy5jcmVhdGVEZXNlcmlhbGl6ZXIoKS5yZWFkT2JqZWN0KG1lbWJlciwgZGF0YU9iamVjdFt0YXJnZXRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hd3NRdWVyeUNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgIHRoaXMubWl4aW4ucXVlcnlDb21wYXRPdXRwdXQoZGF0YU9iamVjdCwgb3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyB0aGlzLm1peGluLmRlY29yYXRlU2VydmljZUV4Y2VwdGlvbihPYmplY3QuYXNzaWduKGV4Y2VwdGlvbiwgZXJyb3JNZXRhZGF0YSwge1xuICAgICAgICAgICAgJGZhdWx0OiBucy5nZXRNZXJnZWRUcmFpdHMoKS5lcnJvcixcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIH0sIG91dHB1dCksIGRhdGFPYmplY3QpO1xuICAgIH1cbn1cblxuY2xhc3MgQXdzSnNvbjFfMFByb3RvY29sIGV4dGVuZHMgQXdzSnNvblJwY1Byb3RvY29sIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGRlZmF1bHROYW1lc3BhY2UsIHNlcnZpY2VUYXJnZXQsIGF3c1F1ZXJ5Q29tcGF0aWJsZSwgfSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICAgICAgc2VydmljZVRhcmdldCxcbiAgICAgICAgICAgIGF3c1F1ZXJ5Q29tcGF0aWJsZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFNoYXBlSWQoKSB7XG4gICAgICAgIHJldHVybiBcImF3cy5wcm90b2NvbHMjYXdzSnNvbjFfMFwiO1xuICAgIH1cbiAgICBnZXRKc29uUnBjVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIFwiMS4wXCI7XG4gICAgfVxuICAgIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXBwbGljYXRpb24veC1hbXotanNvbi0xLjBcIjtcbiAgICB9XG59XG5cbmNsYXNzIEF3c0pzb24xXzFQcm90b2NvbCBleHRlbmRzIEF3c0pzb25ScGNQcm90b2NvbCB7XG4gICAgY29uc3RydWN0b3IoeyBkZWZhdWx0TmFtZXNwYWNlLCBzZXJ2aWNlVGFyZ2V0LCBhd3NRdWVyeUNvbXBhdGlibGUsIH0pIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNlcnZpY2VUYXJnZXQsXG4gICAgICAgICAgICBhd3NRdWVyeUNvbXBhdGlibGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRTaGFwZUlkKCkge1xuICAgICAgICByZXR1cm4gXCJhd3MucHJvdG9jb2xzI2F3c0pzb24xXzFcIjtcbiAgICB9XG4gICAgZ2V0SnNvblJwY1ZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiBcIjEuMVwiO1xuICAgIH1cbiAgICBnZXREZWZhdWx0Q29udGVudFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBcImFwcGxpY2F0aW9uL3gtYW16LWpzb24tMS4xXCI7XG4gICAgfVxufVxuXG5jbGFzcyBBd3NSZXN0SnNvblByb3RvY29sIGV4dGVuZHMgcHJvdG9jb2xzLkh0dHBCaW5kaW5nUHJvdG9jb2wge1xuICAgIHNlcmlhbGl6ZXI7XG4gICAgZGVzZXJpYWxpemVyO1xuICAgIGNvZGVjO1xuICAgIG1peGluID0gbmV3IFByb3RvY29sTGliKCk7XG4gICAgY29uc3RydWN0b3IoeyBkZWZhdWx0TmFtZXNwYWNlIH0pIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgZGVmYXVsdE5hbWVzcGFjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgICAgICAgdGltZXN0YW1wRm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgdXNlVHJhaXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogNyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBodHRwQmluZGluZ3M6IHRydWUsXG4gICAgICAgICAgICBqc29uTmFtZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb2RlYyA9IG5ldyBKc29uQ29kZWMoc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnNlcmlhbGl6ZXIgPSBuZXcgcHJvdG9jb2xzLkh0dHBJbnRlcmNlcHRpbmdTaGFwZVNlcmlhbGl6ZXIodGhpcy5jb2RlYy5jcmVhdGVTZXJpYWxpemVyKCksIHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZXIgPSBuZXcgcHJvdG9jb2xzLkh0dHBJbnRlcmNlcHRpbmdTaGFwZURlc2VyaWFsaXplcih0aGlzLmNvZGVjLmNyZWF0ZURlc2VyaWFsaXplcigpLCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIGdldFNoYXBlSWQoKSB7XG4gICAgICAgIHJldHVybiBcImF3cy5wcm90b2NvbHMjcmVzdEpzb24xXCI7XG4gICAgfVxuICAgIGdldFBheWxvYWRDb2RlYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29kZWM7XG4gICAgfVxuICAgIHNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb2RlYy5zZXRTZXJkZUNvbnRleHQoc2VyZGVDb250ZXh0KTtcbiAgICAgICAgc3VwZXIuc2V0U2VyZGVDb250ZXh0KHNlcmRlQ29udGV4dCk7XG4gICAgfVxuICAgIGFzeW5jIHNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgc3VwZXIuc2VyaWFsaXplUmVxdWVzdChvcGVyYXRpb25TY2hlbWEsIGlucHV0LCBjb250ZXh0KTtcbiAgICAgICAgY29uc3QgaW5wdXRTY2hlbWEgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihvcGVyYXRpb25TY2hlbWEuaW5wdXQpO1xuICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLm1peGluLnJlc29sdmVSZXN0Q29udGVudFR5cGUodGhpcy5nZXREZWZhdWx0Q29udGVudFR5cGUoKSwgaW5wdXRTY2hlbWEpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gY29udGVudFR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3QuYm9keSA9PSBudWxsICYmIHJlcXVlc3QuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9PT0gdGhpcy5nZXREZWZhdWx0Q29udGVudFR5cGUoKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gXCJ7fVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICBhc3luYyBkZXNlcmlhbGl6ZVJlc3BvbnNlKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgc3VwZXIuZGVzZXJpYWxpemVSZXNwb25zZShvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yob3BlcmF0aW9uU2NoZW1hLm91dHB1dCk7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1lbWJlcl0gb2Ygb3V0cHV0U2NoZW1hLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgIGlmIChtZW1iZXIuZ2V0TWVtYmVyVHJhaXRzKCkuaHR0cFBheWxvYWQgJiYgIShuYW1lIGluIG91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZUVycm9yKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySWRlbnRpZmllciA9IGxvYWRSZXN0SnNvbkVycm9yQ29kZShyZXNwb25zZSwgZGF0YU9iamVjdCkgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JTY2hlbWEsIGVycm9yTWV0YWRhdGEgfSA9IGF3YWl0IHRoaXMubWl4aW4uZ2V0RXJyb3JTY2hlbWFPclRocm93QmFzZUV4Y2VwdGlvbihlcnJvcklkZW50aWZpZXIsIHRoaXMub3B0aW9ucy5kZWZhdWx0TmFtZXNwYWNlLCByZXNwb25zZSwgZGF0YU9iamVjdCwgbWV0YWRhdGEpO1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKGVycm9yU2NoZW1hKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGFPYmplY3QubWVzc2FnZSA/PyBkYXRhT2JqZWN0Lk1lc3NhZ2UgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGNvbnN0IEVycm9yQ3RvciA9IHNjaGVtYS5UeXBlUmVnaXN0cnkuZm9yKGVycm9yU2NoZW1hWzFdKS5nZXRFcnJvckN0b3IoZXJyb3JTY2hlbWEpID8/IEVycm9yO1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgRXJyb3JDdG9yKG1lc3NhZ2UpO1xuICAgICAgICBhd2FpdCB0aGlzLmRlc2VyaWFsaXplSHR0cE1lc3NhZ2UoZXJyb3JTY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlLCBkYXRhT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1lbWJlcl0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbWVtYmVyLmdldE1lcmdlZFRyYWl0cygpLmpzb25OYW1lID8/IG5hbWU7XG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSB0aGlzLmNvZGVjLmNyZWF0ZURlc2VyaWFsaXplcigpLnJlYWRPYmplY3QobWVtYmVyLCBkYXRhT2JqZWN0W3RhcmdldF0pO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHRoaXMubWl4aW4uZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCBlcnJvck1ldGFkYXRhLCB7XG4gICAgICAgICAgICAkZmF1bHQ6IG5zLmdldE1lcmdlZFRyYWl0cygpLmVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSwgb3V0cHV0KSwgZGF0YU9iamVjdCk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgIH1cbn1cblxuY29uc3QgYXdzRXhwZWN0VW5pb24gPSAodmFsdWUpID0+IHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiX190eXBlXCIgaW4gdmFsdWUpIHtcbiAgICAgICAgZGVsZXRlIHZhbHVlLl9fdHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHNtaXRoeUNsaWVudC5leHBlY3RVbmlvbih2YWx1ZSk7XG59O1xuXG5jbGFzcyBYbWxTaGFwZURlc2VyaWFsaXplciBleHRlbmRzIFNlcmRlQ29udGV4dENvbmZpZyB7XG4gICAgc2V0dGluZ3M7XG4gICAgc3RyaW5nRGVzZXJpYWxpemVyO1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgdGhpcy5zdHJpbmdEZXNlcmlhbGl6ZXIgPSBuZXcgcHJvdG9jb2xzLkZyb21TdHJpbmdTaGFwZURlc2VyaWFsaXplcihzZXR0aW5ncyk7XG4gICAgfVxuICAgIHNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5zZXJkZUNvbnRleHQgPSBzZXJkZUNvbnRleHQ7XG4gICAgICAgIHRoaXMuc3RyaW5nRGVzZXJpYWxpemVyLnNldFNlcmRlQ29udGV4dChzZXJkZUNvbnRleHQpO1xuICAgIH1cbiAgICByZWFkKHNjaGVtYSQxLCBieXRlcywga2V5KSB7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yoc2NoZW1hJDEpO1xuICAgICAgICBjb25zdCBtZW1iZXJTY2hlbWFzID0gbnMuZ2V0TWVtYmVyU2NoZW1hcygpO1xuICAgICAgICBjb25zdCBpc0V2ZW50UGF5bG9hZCA9IG5zLmlzU3RydWN0U2NoZW1hKCkgJiZcbiAgICAgICAgICAgIG5zLmlzTWVtYmVyU2NoZW1hKCkgJiZcbiAgICAgICAgICAgICEhT2JqZWN0LnZhbHVlcyhtZW1iZXJTY2hlbWFzKS5maW5kKChtZW1iZXJOcykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhIW1lbWJlck5zLmdldE1lbWJlclRyYWl0cygpLmV2ZW50UGF5bG9hZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNFdmVudFBheWxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyTmFtZSA9IE9iamVjdC5rZXlzKG1lbWJlclNjaGVtYXMpWzBdO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRNZW1iZXJTY2hlbWEgPSBtZW1iZXJTY2hlbWFzW21lbWJlck5hbWVdO1xuICAgICAgICAgICAgaWYgKGV2ZW50TWVtYmVyU2NoZW1hLmlzQmxvYlNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W21lbWJlck5hbWVdID0gYnl0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbbWVtYmVyTmFtZV0gPSB0aGlzLnJlYWQobWVtYmVyU2NoZW1hc1ttZW1iZXJOYW1lXSwgYnl0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB4bWxTdHJpbmcgPSAodGhpcy5zZXJkZUNvbnRleHQ/LnV0ZjhFbmNvZGVyID8/IHV0aWxVdGY4LnRvVXRmOCkoYnl0ZXMpO1xuICAgICAgICBjb25zdCBwYXJzZWRPYmplY3QgPSB0aGlzLnBhcnNlWG1sKHhtbFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRTY2hlbWEoc2NoZW1hJDEsIGtleSA/IHBhcnNlZE9iamVjdFtrZXldIDogcGFyc2VkT2JqZWN0KTtcbiAgICB9XG4gICAgcmVhZFNjaGVtYShfc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKF9zY2hlbWEpO1xuICAgICAgICBpZiAobnMuaXNVbml0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFpdHMgPSBucy5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgaWYgKG5zLmlzTGlzdFNjaGVtYSgpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFNjaGVtYShucywgW3ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjb25zdCBzcGFyc2UgPSAhIXRyYWl0cy5zcGFyc2U7XG4gICAgICAgICAgICBjb25zdCBmbGF0ID0gISF0cmFpdHMueG1sRmxhdHRlbmVkO1xuICAgICAgICAgICAgaWYgKG5zLmlzTGlzdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdFZhbHVlID0gbnMuZ2V0VmFsdWVTY2hlbWEoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VLZXkgPSBsaXN0VmFsdWUuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSA/PyBcIm1lbWJlclwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGZsYXQgPyB2YWx1ZSA6ICh2YWx1ZVswXSA/PyB2YWx1ZSlbc291cmNlS2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VBcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZSA6IFtzb3VyY2VdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiBzb3VyY2VBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsIHx8IHNwYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2godGhpcy5yZWFkU2NoZW1hKGxpc3RWYWx1ZSwgdikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSB7fTtcbiAgICAgICAgICAgIGlmIChucy5pc01hcFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5TnMgPSBucy5nZXRLZXlTY2hlbWEoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJOcyA9IG5zLmdldFZhbHVlU2NoZW1hKCk7XG4gICAgICAgICAgICAgICAgbGV0IGVudHJpZXM7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW50cmllcyA9IEFycmF5LmlzQXJyYXkodmFsdWUuZW50cnkpID8gdmFsdWUuZW50cnkgOiBbdmFsdWUuZW50cnldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBrZXlQcm9wZXJ0eSA9IGtleU5zLmdldE1lcmdlZFRyYWl0cygpLnhtbE5hbWUgPz8gXCJrZXlcIjtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gbWVtYmVyTnMuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSA/PyBcInZhbHVlXCI7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGVudHJ5W2tleVByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeVt2YWx1ZVByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgfHwgc3BhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJba2V5XSA9IHRoaXMucmVhZFNjaGVtYShtZW1iZXJOcywgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobnMuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW21lbWJlck5hbWUsIG1lbWJlclNjaGVtYV0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJUcmFpdHMgPSBtZW1iZXJTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbE9iamVjdEtleSA9ICFtZW1iZXJUcmFpdHMuaHR0cFBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbWVtYmVyU2NoZW1hLmdldE1lbWJlclRyYWl0cygpLnhtbE5hbWUgPz8gbWVtYmVyTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBtZW1iZXJUcmFpdHMueG1sTmFtZSA/PyBtZW1iZXJTY2hlbWEuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbeG1sT2JqZWN0S2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbbWVtYmVyTmFtZV0gPSB0aGlzLnJlYWRTY2hlbWEobWVtYmVyU2NoZW1hLCB2YWx1ZVt4bWxPYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5zLmlzRG9jdW1lbnRTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSB4bWwgZGVzZXJpYWxpemVyIHVuaGFuZGxlZCBzY2hlbWEgdHlwZSBmb3IgJHtucy5nZXROYW1lKHRydWUpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc0xpc3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChucy5pc01hcFNjaGVtYSgpIHx8IG5zLmlzU3RydWN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdEZXNlcmlhbGl6ZXIucmVhZChucywgdmFsdWUpO1xuICAgIH1cbiAgICBwYXJzZVhtbCh4bWwpIHtcbiAgICAgICAgaWYgKHhtbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWRPYmo7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhcnNlZE9iaiA9IHhtbEJ1aWxkZXIucGFyc2VYTUwoeG1sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgJiYgdHlwZW9mIGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiJHJlc3BvbnNlQm9keVRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhtbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZU5hbWUgPSBcIiN0ZXh0XCI7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhwYXJzZWRPYmopWzBdO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkT2JqVG9SZXR1cm4gPSBwYXJzZWRPYmpba2V5XTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRPYmpUb1JldHVyblt0ZXh0Tm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkT2JqVG9SZXR1cm5ba2V5XSA9IHBhcnNlZE9ialRvUmV0dXJuW3RleHROb2RlTmFtZV07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhcnNlZE9ialRvUmV0dXJuW3RleHROb2RlTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc21pdGh5Q2xpZW50LmdldFZhbHVlRnJvbVRleHROb2RlKHBhcnNlZE9ialRvUmV0dXJuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5jbGFzcyBRdWVyeVNoYXBlU2VyaWFsaXplciBleHRlbmRzIFNlcmRlQ29udGV4dENvbmZpZyB7XG4gICAgc2V0dGluZ3M7XG4gICAgYnVmZmVyO1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG4gICAgd3JpdGUoc2NoZW1hJDEsIHZhbHVlLCBwcmVmaXggPSBcIlwiKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSk7XG4gICAgICAgIGlmIChwcmVmaXggJiYgIXByZWZpeC5lbmRzV2l0aChcIi5cIikpIHtcbiAgICAgICAgICAgIHByZWZpeCArPSBcIi5cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNCbG9iU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUtleShwcmVmaXgpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSgodGhpcy5zZXJkZUNvbnRleHQ/LmJhc2U2NEVuY29kZXIgPz8gdXRpbEJhc2U2NC50b0Jhc2U2NCkodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc0Jvb2xlYW5TY2hlbWEoKSB8fCBucy5pc051bWVyaWNTY2hlbWEoKSB8fCBucy5pc1N0cmluZ1NjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVLZXkocHJlZml4KTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChucy5pc0lkZW1wb3RlbmN5VG9rZW4oKSkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVLZXkocHJlZml4KTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoc2VyZGUuZ2VuZXJhdGVJZGVtcG90ZW5jeVRva2VuKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzQmlnSW50ZWdlclNjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVLZXkocHJlZml4KTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNCaWdEZWNpbWFsU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUtleShwcmVmaXgpO1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSBpbnN0YW5jZW9mIHNlcmRlLk51bWVyaWNWYWx1ZSA/IHZhbHVlLnN0cmluZyA6IFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzVGltZXN0YW1wU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlS2V5KHByZWZpeCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gcHJvdG9jb2xzLmRldGVybWluZVRpbWVzdGFtcEZvcm1hdChucywgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlLnRvSVNPU3RyaW5nKCkucmVwbGFjZShcIi4wMDBaXCIsIFwiWlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHNtaXRoeUNsaWVudC5kYXRlVG9VdGNTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUoU3RyaW5nKHZhbHVlLmdldFRpbWUoKSAvIDEwMDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc0RvY3VtZW50U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSBRdWVyeVNlcmlhbGl6ZXIgdW5zdXBwb3J0ZWQgZG9jdW1lbnQgdHlwZSAke25zLmdldE5hbWUodHJ1ZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNMaXN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2VyaWFsaXplRW1wdHlMaXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUtleShwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXIgPSBucy5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbGF0ID0gdGhpcy5zZXR0aW5ncy5mbGF0dGVuTGlzdHMgfHwgbnMuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sRmxhdHRlbmVkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VmZml4ID0gdGhpcy5nZXRLZXkoXCJtZW1iZXJcIiwgbWVtYmVyLmdldE1lcmdlZFRyYWl0cygpLnhtbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZmxhdCA/IGAke3ByZWZpeH0ke2l9YCA6IGAke3ByZWZpeH0ke3N1ZmZpeH0uJHtpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlKG1lbWJlciwgaXRlbSwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc01hcFNjaGVtYSgpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5U2NoZW1hID0gbnMuZ2V0S2V5U2NoZW1hKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVtYmVyU2NoZW1hID0gbnMuZ2V0VmFsdWVTY2hlbWEoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0ID0gbnMuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sRmxhdHRlbmVkO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5U3VmZml4ID0gdGhpcy5nZXRLZXkoXCJrZXlcIiwga2V5U2NoZW1hLmdldE1lcmdlZFRyYWl0cygpLnhtbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBmbGF0ID8gYCR7cHJlZml4fSR7aX0uJHtrZXlTdWZmaXh9YCA6IGAke3ByZWZpeH1lbnRyeS4ke2l9LiR7a2V5U3VmZml4fWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3VmZml4ID0gdGhpcy5nZXRLZXkoXCJ2YWx1ZVwiLCBtZW1iZXJTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gZmxhdCA/IGAke3ByZWZpeH0ke2l9LiR7dmFsdWVTdWZmaXh9YCA6IGAke3ByZWZpeH1lbnRyeS4ke2l9LiR7dmFsdWVTdWZmaXh9YDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZShrZXlTY2hlbWEsIGssIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGUobWVtYmVyU2NoZW1hLCB2LCB2YWx1ZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnMuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW21lbWJlck5hbWUsIG1lbWJlcl0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbbWVtYmVyTmFtZV0gPT0gbnVsbCAmJiAhbWVtYmVyLmlzSWRlbXBvdGVuY3lUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSB0aGlzLmdldEtleShtZW1iZXJOYW1lLCBtZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGAke3ByZWZpeH0ke3N1ZmZpeH1gO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlKG1lbWJlciwgdmFsdWVbbWVtYmVyTmFtZV0sIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5zLmlzVW5pdFNjaGVtYSgpKSA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIFF1ZXJ5U2VyaWFsaXplciB1bnJlY29nbml6ZWQgc2NoZW1hIHR5cGUgJHtucy5nZXROYW1lKHRydWUpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSBRdWVyeVNlcmlhbGl6ZXIgY2Fubm90IGZsdXNoIHdpdGggbm90aGluZyB3cml0dGVuIHRvIGJ1ZmZlci5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5idWZmZXI7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgZ2V0S2V5KG1lbWJlck5hbWUsIHhtbE5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0geG1sTmFtZSA/PyBtZW1iZXJOYW1lO1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5jYXBpdGFsaXplS2V5cykge1xuICAgICAgICAgICAgcmV0dXJuIGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIHdyaXRlS2V5KGtleSkge1xuICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAga2V5ID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlciArPSBgJiR7cHJvdG9jb2xzLmV4dGVuZGVkRW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PWA7XG4gICAgfVxuICAgIHdyaXRlVmFsdWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gcHJvdG9jb2xzLmV4dGVuZGVkRW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgICB9XG59XG5cbmNsYXNzIEF3c1F1ZXJ5UHJvdG9jb2wgZXh0ZW5kcyBwcm90b2NvbHMuUnBjUHJvdG9jb2wge1xuICAgIG9wdGlvbnM7XG4gICAgc2VyaWFsaXplcjtcbiAgICBkZXNlcmlhbGl6ZXI7XG4gICAgbWl4aW4gPSBuZXcgUHJvdG9jb2xMaWIoKTtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGRlZmF1bHROYW1lc3BhY2U6IG9wdGlvbnMuZGVmYXVsdE5hbWVzcGFjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgICAgICAgdGltZXN0YW1wRm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgdXNlVHJhaXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBodHRwQmluZGluZ3M6IGZhbHNlLFxuICAgICAgICAgICAgeG1sTmFtZXNwYWNlOiBvcHRpb25zLnhtbE5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNlcnZpY2VOYW1lc3BhY2U6IG9wdGlvbnMuZGVmYXVsdE5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZUVtcHR5TGlzdHM6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2VyaWFsaXplciA9IG5ldyBRdWVyeVNoYXBlU2VyaWFsaXplcihzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZGVzZXJpYWxpemVyID0gbmV3IFhtbFNoYXBlRGVzZXJpYWxpemVyKHNldHRpbmdzKTtcbiAgICB9XG4gICAgZ2V0U2hhcGVJZCgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXdzLnByb3RvY29scyNhd3NRdWVyeVwiO1xuICAgIH1cbiAgICBzZXRTZXJkZUNvbnRleHQoc2VyZGVDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplci5zZXRTZXJkZUNvbnRleHQoc2VyZGVDb250ZXh0KTtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHNlcmRlQ29udGV4dCk7XG4gICAgfVxuICAgIGdldFBheWxvYWRDb2RlYygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQVdTUXVlcnkgcHJvdG9jb2wgaGFzIG5vIHBheWxvYWQgY29kZWMuXCIpO1xuICAgIH1cbiAgICBhc3luYyBzZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHN1cGVyLnNlcmlhbGl6ZVJlcXVlc3Qob3BlcmF0aW9uU2NoZW1hLCBpbnB1dCwgY29udGV4dCk7XG4gICAgICAgIGlmICghcmVxdWVzdC5wYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5wYXRoICs9IFwiL1wiO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdC5oZWFkZXJzLCB7XG4gICAgICAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzY2hlbWEuZGVyZWYob3BlcmF0aW9uU2NoZW1hLmlucHV0KSA9PT0gXCJ1bml0XCIgfHwgIXJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3Rpb24gPSBvcGVyYXRpb25TY2hlbWEubmFtZS5zcGxpdChcIiNcIilbMV0gPz8gb3BlcmF0aW9uU2NoZW1hLm5hbWU7XG4gICAgICAgIHJlcXVlc3QuYm9keSA9IGBBY3Rpb249JHthY3Rpb259JlZlcnNpb249JHt0aGlzLm9wdGlvbnMudmVyc2lvbn1gICsgcmVxdWVzdC5ib2R5O1xuICAgICAgICBpZiAocmVxdWVzdC5ib2R5LmVuZHNXaXRoKFwiJlwiKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gcmVxdWVzdC5ib2R5LnNsaWNlKC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgYXN5bmMgZGVzZXJpYWxpemVSZXNwb25zZShvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplciA9IHRoaXMuZGVzZXJpYWxpemVyO1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKG9wZXJhdGlvblNjaGVtYS5vdXRwdXQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0ID0ge307XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID49IDMwMCkge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBhd2FpdCBwcm90b2NvbHMuY29sbGVjdEJvZHkocmVzcG9uc2UuYm9keSwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoYnl0ZXMuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGFPYmplY3QsIGF3YWl0IGRlc2VyaWFsaXplci5yZWFkKDE1LCBieXRlcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFcnJvcihvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCB0aGlzLmRlc2VyaWFsaXplTWV0YWRhdGEocmVzcG9uc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiByZXNwb25zZS5oZWFkZXJzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgIGRlbGV0ZSByZXNwb25zZS5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNob3J0TmFtZSA9IG9wZXJhdGlvblNjaGVtYS5uYW1lLnNwbGl0KFwiI1wiKVsxXSA/PyBvcGVyYXRpb25TY2hlbWEubmFtZTtcbiAgICAgICAgY29uc3QgYXdzUXVlcnlSZXN1bHRLZXkgPSBucy5pc1N0cnVjdFNjaGVtYSgpICYmIHRoaXMudXNlTmVzdGVkUmVzdWx0KCkgPyBzaG9ydE5hbWUgKyBcIlJlc3VsdFwiIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBieXRlcyA9IGF3YWl0IHByb3RvY29scy5jb2xsZWN0Qm9keShyZXNwb25zZS5ib2R5LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGJ5dGVzLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGFPYmplY3QsIGF3YWl0IGRlc2VyaWFsaXplci5yZWFkKG5zLCBieXRlcywgYXdzUXVlcnlSZXN1bHRLZXkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgICAgICAkbWV0YWRhdGE6IHRoaXMuZGVzZXJpYWxpemVNZXRhZGF0YShyZXNwb25zZSksXG4gICAgICAgICAgICAuLi5kYXRhT2JqZWN0LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICB1c2VOZXN0ZWRSZXN1bHQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhc3luYyBoYW5kbGVFcnJvcihvcGVyYXRpb25TY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBlcnJvcklkZW50aWZpZXIgPSB0aGlzLmxvYWRRdWVyeUVycm9yQ29kZShyZXNwb25zZSwgZGF0YU9iamVjdCkgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHRoaXMubG9hZFF1ZXJ5RXJyb3IoZGF0YU9iamVjdCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmxvYWRRdWVyeUVycm9yTWVzc2FnZShkYXRhT2JqZWN0KTtcbiAgICAgICAgZXJyb3JEYXRhLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBlcnJvckRhdGEuRXJyb3IgPSB7XG4gICAgICAgICAgICBUeXBlOiBlcnJvckRhdGEuVHlwZSxcbiAgICAgICAgICAgIENvZGU6IGVycm9yRGF0YS5Db2RlLFxuICAgICAgICAgICAgTWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlcnJvclNjaGVtYSwgZXJyb3JNZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5taXhpbi5nZXRFcnJvclNjaGVtYU9yVGhyb3dCYXNlRXhjZXB0aW9uKGVycm9ySWRlbnRpZmllciwgdGhpcy5vcHRpb25zLmRlZmF1bHROYW1lc3BhY2UsIHJlc3BvbnNlLCBlcnJvckRhdGEsIG1ldGFkYXRhLCAocmVnaXN0cnksIGVycm9yTmFtZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0cnkuZ2V0U2NoZW1hKGVycm9yTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RyeS5maW5kKChzY2hlbWEkMSkgPT4gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2Yoc2NoZW1hJDEpLmdldE1lcmdlZFRyYWl0cygpLmF3c1F1ZXJ5RXJyb3I/LlswXSA9PT0gZXJyb3JOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoZXJyb3JTY2hlbWEpO1xuICAgICAgICBjb25zdCBFcnJvckN0b3IgPSBzY2hlbWEuVHlwZVJlZ2lzdHJ5LmZvcihlcnJvclNjaGVtYVsxXSkuZ2V0RXJyb3JDdG9yKGVycm9yU2NoZW1hKSA/PyBFcnJvcjtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gbmV3IEVycm9yQ3RvcihtZXNzYWdlKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICAgICAgRXJyb3I6IGVycm9yRGF0YS5FcnJvcixcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWVtYmVyXSBvZiBucy5zdHJ1Y3RJdGVyYXRvcigpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBtZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSA/PyBuYW1lO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlcnJvckRhdGFbdGFyZ2V0XSA/PyBkYXRhT2JqZWN0W3RhcmdldF07XG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSB0aGlzLmRlc2VyaWFsaXplci5yZWFkU2NoZW1hKG1lbWJlciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHRoaXMubWl4aW4uZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCBlcnJvck1ldGFkYXRhLCB7XG4gICAgICAgICAgICAkZmF1bHQ6IG5zLmdldE1lcmdlZFRyYWl0cygpLmVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSwgb3V0cHV0KSwgZGF0YU9iamVjdCk7XG4gICAgfVxuICAgIGxvYWRRdWVyeUVycm9yQ29kZShvdXRwdXQsIGRhdGEpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IChkYXRhLkVycm9ycz8uWzBdPy5FcnJvciA/PyBkYXRhLkVycm9ycz8uRXJyb3IgPz8gZGF0YS5FcnJvcik/LkNvZGU7XG4gICAgICAgIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRwdXQuc3RhdHVzQ29kZSA9PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIk5vdEZvdW5kXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9hZFF1ZXJ5RXJyb3IoZGF0YSkge1xuICAgICAgICByZXR1cm4gZGF0YS5FcnJvcnM/LlswXT8uRXJyb3IgPz8gZGF0YS5FcnJvcnM/LkVycm9yID8/IGRhdGEuRXJyb3I7XG4gICAgfVxuICAgIGxvYWRRdWVyeUVycm9yTWVzc2FnZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHRoaXMubG9hZFF1ZXJ5RXJyb3IoZGF0YSk7XG4gICAgICAgIHJldHVybiBlcnJvckRhdGE/Lm1lc3NhZ2UgPz8gZXJyb3JEYXRhPy5NZXNzYWdlID8/IGRhdGEubWVzc2FnZSA/PyBkYXRhLk1lc3NhZ2UgPz8gXCJVbmtub3duXCI7XG4gICAgfVxuICAgIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCI7XG4gICAgfVxufVxuXG5jbGFzcyBBd3NFYzJRdWVyeVByb3RvY29sIGV4dGVuZHMgQXdzUXVlcnlQcm90b2NvbCB7XG4gICAgb3B0aW9ucztcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBlYzJTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGNhcGl0YWxpemVLZXlzOiB0cnVlLFxuICAgICAgICAgICAgZmxhdHRlbkxpc3RzOiB0cnVlLFxuICAgICAgICAgICAgc2VyaWFsaXplRW1wdHlMaXN0czogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5zZXJpYWxpemVyLnNldHRpbmdzLCBlYzJTZXR0aW5ncyk7XG4gICAgfVxuICAgIHVzZU5lc3RlZFJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuY29uc3QgcGFyc2VYbWxCb2R5ID0gKHN0cmVhbUJvZHksIGNvbnRleHQpID0+IGNvbGxlY3RCb2R5U3RyaW5nKHN0cmVhbUJvZHksIGNvbnRleHQpLnRoZW4oKGVuY29kZWQpID0+IHtcbiAgICBpZiAoZW5jb2RlZC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHBhcnNlZE9iajtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlZE9iaiA9IHhtbEJ1aWxkZXIucGFyc2VYTUwoZW5jb2RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlICYmIHR5cGVvZiBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiJHJlc3BvbnNlQm9keVRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW5jb2RlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dE5vZGVOYW1lID0gXCIjdGV4dFwiO1xuICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhwYXJzZWRPYmopWzBdO1xuICAgICAgICBjb25zdCBwYXJzZWRPYmpUb1JldHVybiA9IHBhcnNlZE9ialtrZXldO1xuICAgICAgICBpZiAocGFyc2VkT2JqVG9SZXR1cm5bdGV4dE5vZGVOYW1lXSkge1xuICAgICAgICAgICAgcGFyc2VkT2JqVG9SZXR1cm5ba2V5XSA9IHBhcnNlZE9ialRvUmV0dXJuW3RleHROb2RlTmFtZV07XG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkT2JqVG9SZXR1cm5bdGV4dE5vZGVOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc21pdGh5Q2xpZW50LmdldFZhbHVlRnJvbVRleHROb2RlKHBhcnNlZE9ialRvUmV0dXJuKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufSk7XG5jb25zdCBwYXJzZVhtbEVycm9yQm9keSA9IGFzeW5jIChlcnJvckJvZHksIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhcnNlWG1sQm9keShlcnJvckJvZHksIGNvbnRleHQpO1xuICAgIGlmICh2YWx1ZS5FcnJvcikge1xuICAgICAgICB2YWx1ZS5FcnJvci5tZXNzYWdlID0gdmFsdWUuRXJyb3IubWVzc2FnZSA/PyB2YWx1ZS5FcnJvci5NZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuY29uc3QgbG9hZFJlc3RYbWxFcnJvckNvZGUgPSAob3V0cHV0LCBkYXRhKSA9PiB7XG4gICAgaWYgKGRhdGE/LkVycm9yPy5Db2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuRXJyb3IuQ29kZTtcbiAgICB9XG4gICAgaWYgKGRhdGE/LkNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGF0YS5Db2RlO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LnN0YXR1c0NvZGUgPT0gNDA0KSB7XG4gICAgICAgIHJldHVybiBcIk5vdEZvdW5kXCI7XG4gICAgfVxufTtcblxuY2xhc3MgWG1sU2hhcGVTZXJpYWxpemVyIGV4dGVuZHMgU2VyZGVDb250ZXh0Q29uZmlnIHtcbiAgICBzZXR0aW5ncztcbiAgICBzdHJpbmdCdWZmZXI7XG4gICAgYnl0ZUJ1ZmZlcjtcbiAgICBidWZmZXI7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIH1cbiAgICB3cml0ZShzY2hlbWEkMSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgbnMgPSBzY2hlbWEuTm9ybWFsaXplZFNjaGVtYS5vZihzY2hlbWEkMSk7XG4gICAgICAgIGlmIChucy5pc1N0cmluZ1NjaGVtYSgpICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5zdHJpbmdCdWZmZXIgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChucy5pc0Jsb2JTY2hlbWEoKSkge1xuICAgICAgICAgICAgdGhpcy5ieXRlQnVmZmVyID1cbiAgICAgICAgICAgICAgICBcImJ5dGVMZW5ndGhcIiBpbiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogKHRoaXMuc2VyZGVDb250ZXh0Py5iYXNlNjREZWNvZGVyID8/IHV0aWxCYXNlNjQuZnJvbUJhc2U2NCkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLndyaXRlU3RydWN0KG5zLCB2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYWl0cyA9IG5zLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICAgICAgaWYgKHRyYWl0cy5odHRwUGF5bG9hZCAmJiAhdHJhaXRzLnhtbE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlci53aXRoTmFtZShucy5nZXROYW1lKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5ieXRlQnVmZmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlQnVmZmVyO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnl0ZUJ1ZmZlcjtcbiAgICAgICAgICAgIHJldHVybiBieXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdHJpbmdCdWZmZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5zdHJpbmdCdWZmZXI7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdHJpbmdCdWZmZXI7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy54bWxOYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGlmICghYnVmZmVyPy5hdHRyaWJ1dGVzPy5bXCJ4bWxuc1wiXSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCB0aGlzLnNldHRpbmdzLnhtbE5hbWVzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuYnVmZmVyO1xuICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHdyaXRlU3RydWN0KG5zLCB2YWx1ZSwgcGFyZW50WG1sbnMpIHtcbiAgICAgICAgY29uc3QgdHJhaXRzID0gbnMuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBucy5pc01lbWJlclNjaGVtYSgpICYmICF0cmFpdHMuaHR0cFBheWxvYWRcbiAgICAgICAgICAgID8gbnMuZ2V0TWVtYmVyVHJhaXRzKCkueG1sTmFtZSA/PyBucy5nZXRNZW1iZXJOYW1lKClcbiAgICAgICAgICAgIDogdHJhaXRzLnhtbE5hbWUgPz8gbnMuZ2V0TmFtZSgpO1xuICAgICAgICBpZiAoIW5hbWUgfHwgIW5zLmlzU3RydWN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSB4bWwgc2VyaWFsaXplciwgY2Fubm90IHdyaXRlIHN0cnVjdCB3aXRoIGVtcHR5IG5hbWUgb3Igbm9uLXN0cnVjdCwgc2NoZW1hPSR7bnMuZ2V0TmFtZSh0cnVlKX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RydWN0WG1sTm9kZSA9IHhtbEJ1aWxkZXIuWG1sTm9kZS5vZihuYW1lKTtcbiAgICAgICAgY29uc3QgW3htbG5zQXR0ciwgeG1sbnNdID0gdGhpcy5nZXRYbWxuc0F0dHJpYnV0ZShucywgcGFyZW50WG1sbnMpO1xuICAgICAgICBmb3IgKGNvbnN0IFttZW1iZXJOYW1lLCBtZW1iZXJTY2hlbWFdIG9mIG5zLnN0cnVjdEl0ZXJhdG9yKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHZhbHVlW21lbWJlck5hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsIHx8IG1lbWJlclNjaGVtYS5pc0lkZW1wb3RlbmN5VG9rZW4oKSkge1xuICAgICAgICAgICAgICAgIGlmIChtZW1iZXJTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sQXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdFhtbE5vZGUuYWRkQXR0cmlidXRlKG1lbWJlclNjaGVtYS5nZXRNZXJnZWRUcmFpdHMoKS54bWxOYW1lID8/IG1lbWJlck5hbWUsIHRoaXMud3JpdGVTaW1wbGUobWVtYmVyU2NoZW1hLCB2YWwpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtZW1iZXJTY2hlbWEuaXNMaXN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3QobWVtYmVyU2NoZW1hLCB2YWwsIHN0cnVjdFhtbE5vZGUsIHhtbG5zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWVtYmVyU2NoZW1hLmlzTWFwU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZU1hcChtZW1iZXJTY2hlbWEsIHZhbCwgc3RydWN0WG1sTm9kZSwgeG1sbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZW1iZXJTY2hlbWEuaXNTdHJ1Y3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RYbWxOb2RlLmFkZENoaWxkTm9kZSh0aGlzLndyaXRlU3RydWN0KG1lbWJlclNjaGVtYSwgdmFsLCB4bWxucykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVtYmVyTm9kZSA9IHhtbEJ1aWxkZXIuWG1sTm9kZS5vZihtZW1iZXJTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCkueG1sTmFtZSA/PyBtZW1iZXJTY2hlbWEuZ2V0TWVtYmVyTmFtZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVNpbXBsZUludG8obWVtYmVyU2NoZW1hLCB2YWwsIG1lbWJlck5vZGUsIHhtbG5zKTtcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0WG1sTm9kZS5hZGRDaGlsZE5vZGUobWVtYmVyTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh4bWxucykge1xuICAgICAgICAgICAgc3RydWN0WG1sTm9kZS5hZGRBdHRyaWJ1dGUoeG1sbnNBdHRyLCB4bWxucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cnVjdFhtbE5vZGU7XG4gICAgfVxuICAgIHdyaXRlTGlzdChsaXN0TWVtYmVyLCBhcnJheSwgY29udGFpbmVyLCBwYXJlbnRYbWxucykge1xuICAgICAgICBpZiAoIWxpc3RNZW1iZXIuaXNNZW1iZXJTY2hlbWEoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIHhtbCBzZXJpYWxpemVyLCBjYW5ub3Qgd3JpdGUgbm9uLW1lbWJlciBsaXN0OiAke2xpc3RNZW1iZXIuZ2V0TmFtZSh0cnVlKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaXN0VHJhaXRzID0gbGlzdE1lbWJlci5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgY29uc3QgbGlzdFZhbHVlU2NoZW1hID0gbGlzdE1lbWJlci5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICBjb25zdCBsaXN0VmFsdWVUcmFpdHMgPSBsaXN0VmFsdWVTY2hlbWEuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgIGNvbnN0IHNwYXJzZSA9ICEhbGlzdFZhbHVlVHJhaXRzLnNwYXJzZTtcbiAgICAgICAgY29uc3QgZmxhdCA9ICEhbGlzdFRyYWl0cy54bWxGbGF0dGVuZWQ7XG4gICAgICAgIGNvbnN0IFt4bWxuc0F0dHIsIHhtbG5zXSA9IHRoaXMuZ2V0WG1sbnNBdHRyaWJ1dGUobGlzdE1lbWJlciwgcGFyZW50WG1sbnMpO1xuICAgICAgICBjb25zdCB3cml0ZUl0ZW0gPSAoY29udGFpbmVyLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxpc3RWYWx1ZVNjaGVtYS5pc0xpc3RTY2hlbWEoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVMaXN0KGxpc3RWYWx1ZVNjaGVtYSwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0sIGNvbnRhaW5lciwgeG1sbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGlzdFZhbHVlU2NoZW1hLmlzTWFwU2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlTWFwKGxpc3RWYWx1ZVNjaGVtYSwgdmFsdWUsIGNvbnRhaW5lciwgeG1sbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGlzdFZhbHVlU2NoZW1hLmlzU3RydWN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgPSB0aGlzLndyaXRlU3RydWN0KGxpc3RWYWx1ZVNjaGVtYSwgdmFsdWUsIHhtbG5zKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGROb2RlKHN0cnVjdC53aXRoTmFtZShmbGF0ID8gbGlzdFRyYWl0cy54bWxOYW1lID8/IGxpc3RNZW1iZXIuZ2V0TWVtYmVyTmFtZSgpIDogbGlzdFZhbHVlVHJhaXRzLnhtbE5hbWUgPz8gXCJtZW1iZXJcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW1Ob2RlID0geG1sQnVpbGRlci5YbWxOb2RlLm9mKGZsYXQgPyBsaXN0VHJhaXRzLnhtbE5hbWUgPz8gbGlzdE1lbWJlci5nZXRNZW1iZXJOYW1lKCkgOiBsaXN0VmFsdWVUcmFpdHMueG1sTmFtZSA/PyBcIm1lbWJlclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2ltcGxlSW50byhsaXN0VmFsdWVTY2hlbWEsIHZhbHVlLCBsaXN0SXRlbU5vZGUsIHhtbG5zKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGROb2RlKGxpc3RJdGVtTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwYXJzZSB8fCB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlSXRlbShjb250YWluZXIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0Tm9kZSA9IHhtbEJ1aWxkZXIuWG1sTm9kZS5vZihsaXN0VHJhaXRzLnhtbE5hbWUgPz8gbGlzdE1lbWJlci5nZXRNZW1iZXJOYW1lKCkpO1xuICAgICAgICAgICAgaWYgKHhtbG5zKSB7XG4gICAgICAgICAgICAgICAgbGlzdE5vZGUuYWRkQXR0cmlidXRlKHhtbG5zQXR0ciwgeG1sbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFyc2UgfHwgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZUl0ZW0obGlzdE5vZGUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGROb2RlKGxpc3ROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3cml0ZU1hcChtYXBNZW1iZXIsIG1hcCwgY29udGFpbmVyLCBwYXJlbnRYbWxucywgY29udGFpbmVySXNNYXAgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIW1hcE1lbWJlci5pc01lbWJlclNjaGVtYSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBhd3Mtc2RrL2NvcmUvcHJvdG9jb2xzIC0geG1sIHNlcmlhbGl6ZXIsIGNhbm5vdCB3cml0ZSBub24tbWVtYmVyIG1hcDogJHttYXBNZW1iZXIuZ2V0TmFtZSh0cnVlKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXBUcmFpdHMgPSBtYXBNZW1iZXIuZ2V0TWVyZ2VkVHJhaXRzKCk7XG4gICAgICAgIGNvbnN0IG1hcEtleVNjaGVtYSA9IG1hcE1lbWJlci5nZXRLZXlTY2hlbWEoKTtcbiAgICAgICAgY29uc3QgbWFwS2V5VHJhaXRzID0gbWFwS2V5U2NoZW1hLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICBjb25zdCBrZXlUYWcgPSBtYXBLZXlUcmFpdHMueG1sTmFtZSA/PyBcImtleVwiO1xuICAgICAgICBjb25zdCBtYXBWYWx1ZVNjaGVtYSA9IG1hcE1lbWJlci5nZXRWYWx1ZVNjaGVtYSgpO1xuICAgICAgICBjb25zdCBtYXBWYWx1ZVRyYWl0cyA9IG1hcFZhbHVlU2NoZW1hLmdldE1lcmdlZFRyYWl0cygpO1xuICAgICAgICBjb25zdCB2YWx1ZVRhZyA9IG1hcFZhbHVlVHJhaXRzLnhtbE5hbWUgPz8gXCJ2YWx1ZVwiO1xuICAgICAgICBjb25zdCBzcGFyc2UgPSAhIW1hcFZhbHVlVHJhaXRzLnNwYXJzZTtcbiAgICAgICAgY29uc3QgZmxhdCA9ICEhbWFwVHJhaXRzLnhtbEZsYXR0ZW5lZDtcbiAgICAgICAgY29uc3QgW3htbG5zQXR0ciwgeG1sbnNdID0gdGhpcy5nZXRYbWxuc0F0dHJpYnV0ZShtYXBNZW1iZXIsIHBhcmVudFhtbG5zKTtcbiAgICAgICAgY29uc3QgYWRkS2V5VmFsdWUgPSAoZW50cnksIGtleSwgdmFsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXlOb2RlID0geG1sQnVpbGRlci5YbWxOb2RlLm9mKGtleVRhZywga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IFtrZXlYbWxuc0F0dHIsIGtleVhtbG5zXSA9IHRoaXMuZ2V0WG1sbnNBdHRyaWJ1dGUobWFwS2V5U2NoZW1hLCB4bWxucyk7XG4gICAgICAgICAgICBpZiAoa2V5WG1sbnMpIHtcbiAgICAgICAgICAgICAgICBrZXlOb2RlLmFkZEF0dHJpYnV0ZShrZXlYbWxuc0F0dHIsIGtleVhtbG5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJ5LmFkZENoaWxkTm9kZShrZXlOb2RlKTtcbiAgICAgICAgICAgIGxldCB2YWx1ZU5vZGUgPSB4bWxCdWlsZGVyLlhtbE5vZGUub2YodmFsdWVUYWcpO1xuICAgICAgICAgICAgaWYgKG1hcFZhbHVlU2NoZW1hLmlzTGlzdFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZUxpc3QobWFwVmFsdWVTY2hlbWEsIHZhbCwgdmFsdWVOb2RlLCB4bWxucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBWYWx1ZVNjaGVtYS5pc01hcFNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZU1hcChtYXBWYWx1ZVNjaGVtYSwgdmFsLCB2YWx1ZU5vZGUsIHhtbG5zLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcFZhbHVlU2NoZW1hLmlzU3RydWN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZU5vZGUgPSB0aGlzLndyaXRlU3RydWN0KG1hcFZhbHVlU2NoZW1hLCB2YWwsIHhtbG5zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTaW1wbGVJbnRvKG1hcFZhbHVlU2NoZW1hLCB2YWwsIHZhbHVlTm9kZSwgeG1sbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkuYWRkQ2hpbGROb2RlKHZhbHVlTm9kZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChmbGF0KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMobWFwKSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFyc2UgfHwgdmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB4bWxCdWlsZGVyLlhtbE5vZGUub2YobWFwVHJhaXRzLnhtbE5hbWUgPz8gbWFwTWVtYmVyLmdldE1lbWJlck5hbWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGFkZEtleVZhbHVlKGVudHJ5LCBrZXksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRDaGlsZE5vZGUoZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXBOb2RlO1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXJJc01hcCkge1xuICAgICAgICAgICAgICAgIG1hcE5vZGUgPSB4bWxCdWlsZGVyLlhtbE5vZGUub2YobWFwVHJhaXRzLnhtbE5hbWUgPz8gbWFwTWVtYmVyLmdldE1lbWJlck5hbWUoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHhtbG5zKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcE5vZGUuYWRkQXR0cmlidXRlKHhtbG5zQXR0ciwgeG1sbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGROb2RlKG1hcE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG1hcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BhcnNlIHx8IHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0geG1sQnVpbGRlci5YbWxOb2RlLm9mKFwiZW50cnlcIik7XG4gICAgICAgICAgICAgICAgICAgIGFkZEtleVZhbHVlKGVudHJ5LCBrZXksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIChjb250YWluZXJJc01hcCA/IGNvbnRhaW5lciA6IG1hcE5vZGUpLmFkZENoaWxkTm9kZShlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHdyaXRlU2ltcGxlKF9zY2hlbWEsIHZhbHVlKSB7XG4gICAgICAgIGlmIChudWxsID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQGF3cy1zZGsvY29yZS9wcm90b2NvbHMgLSAoWE1MIHNlcmlhbGl6ZXIpIGNhbm5vdCB3cml0ZSBudWxsIHZhbHVlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKF9zY2hlbWEpO1xuICAgICAgICBsZXQgbm9kZUNvbnRlbnRzID0gbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKG5zLmlzQmxvYlNjaGVtYSgpKSB7XG4gICAgICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gKHRoaXMuc2VyZGVDb250ZXh0Py5iYXNlNjRFbmNvZGVyID8/IHV0aWxCYXNlNjQudG9CYXNlNjQpKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5zLmlzVGltZXN0YW1wU2NoZW1hKCkgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gcHJvdG9jb2xzLmRldGVybWluZVRpbWVzdGFtcEZvcm1hdChucywgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gdmFsdWUudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiLjAwMFpcIiwgXCJaXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVDb250ZW50cyA9IHNtaXRoeUNsaWVudC5kYXRlVG9VdGNTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVDb250ZW50cyA9IFN0cmluZyh2YWx1ZS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiTWlzc2luZyB0aW1lc3RhbXAgZm9ybWF0LCB1c2luZyBodHRwIGRhdGVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gc21pdGh5Q2xpZW50LmRhdGVUb1V0Y1N0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChucy5pc0JpZ0RlY2ltYWxTY2hlbWEoKSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHNlcmRlLk51bWVyaWNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3RyaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5zLmlzTWFwU2NoZW1hKCkgfHwgbnMuaXNMaXN0U2NoZW1hKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAYXdzLXNkay9jb3JlL3Byb3RvY29scyAtIHhtbCBzZXJpYWxpemVyLCBjYW5ub3QgY2FsbCBfd3JpdGUoKSBvbiBMaXN0L01hcCBzY2hlbWEsIGNhbGwgd3JpdGVMaXN0IG9yIHdyaXRlTWFwKCkgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEBhd3Mtc2RrL2NvcmUvcHJvdG9jb2xzIC0geG1sIHNlcmlhbGl6ZXIsIHVuaGFuZGxlZCBzY2hlbWEgdHlwZSBmb3Igb2JqZWN0IHZhbHVlIGFuZCBzY2hlbWE6ICR7bnMuZ2V0TmFtZSh0cnVlKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnMuaXNCb29sZWFuU2NoZW1hKCkgfHwgbnMuaXNOdW1lcmljU2NoZW1hKCkgfHwgbnMuaXNCaWdJbnRlZ2VyU2NoZW1hKCkgfHwgbnMuaXNCaWdEZWNpbWFsU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIG5vZGVDb250ZW50cyA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5zLmlzU3RyaW5nU2NoZW1hKCkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG5zLmlzSWRlbXBvdGVuY3lUb2tlbigpKSB7XG4gICAgICAgICAgICAgICAgbm9kZUNvbnRlbnRzID0gc2VyZGUuZ2VuZXJhdGVJZGVtcG90ZW5jeVRva2VuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlQ29udGVudHMgPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQ29udGVudHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIHNjaGVtYS12YWx1ZSBwYWlyICR7bnMuZ2V0TmFtZSh0cnVlKX09JHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZUNvbnRlbnRzO1xuICAgIH1cbiAgICB3cml0ZVNpbXBsZUludG8oX3NjaGVtYSwgdmFsdWUsIGludG8sIHBhcmVudFhtbG5zKSB7XG4gICAgICAgIGNvbnN0IG5vZGVDb250ZW50cyA9IHRoaXMud3JpdGVTaW1wbGUoX3NjaGVtYSwgdmFsdWUpO1xuICAgICAgICBjb25zdCBucyA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKF9zY2hlbWEpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gbmV3IHhtbEJ1aWxkZXIuWG1sVGV4dChub2RlQ29udGVudHMpO1xuICAgICAgICBjb25zdCBbeG1sbnNBdHRyLCB4bWxuc10gPSB0aGlzLmdldFhtbG5zQXR0cmlidXRlKG5zLCBwYXJlbnRYbWxucyk7XG4gICAgICAgIGlmICh4bWxucykge1xuICAgICAgICAgICAgaW50by5hZGRBdHRyaWJ1dGUoeG1sbnNBdHRyLCB4bWxucyk7XG4gICAgICAgIH1cbiAgICAgICAgaW50by5hZGRDaGlsZE5vZGUoY29udGVudCk7XG4gICAgfVxuICAgIGdldFhtbG5zQXR0cmlidXRlKG5zLCBwYXJlbnRYbWxucykge1xuICAgICAgICBjb25zdCB0cmFpdHMgPSBucy5nZXRNZXJnZWRUcmFpdHMoKTtcbiAgICAgICAgY29uc3QgW3ByZWZpeCwgeG1sbnNdID0gdHJhaXRzLnhtbE5hbWVzcGFjZSA/PyBbXTtcbiAgICAgICAgaWYgKHhtbG5zICYmIHhtbG5zICE9PSBwYXJlbnRYbWxucykge1xuICAgICAgICAgICAgcmV0dXJuIFtwcmVmaXggPyBgeG1sbnM6JHtwcmVmaXh9YCA6IFwieG1sbnNcIiwgeG1sbnNdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdm9pZCAwLCB2b2lkIDBdO1xuICAgIH1cbn1cblxuY2xhc3MgWG1sQ29kZWMgZXh0ZW5kcyBTZXJkZUNvbnRleHRDb25maWcge1xuICAgIHNldHRpbmdzO1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB9XG4gICAgY3JlYXRlU2VyaWFsaXplcigpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBYbWxTaGFwZVNlcmlhbGl6ZXIodGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIHNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHRoaXMuc2VyZGVDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXI7XG4gICAgfVxuICAgIGNyZWF0ZURlc2VyaWFsaXplcigpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemVyID0gbmV3IFhtbFNoYXBlRGVzZXJpYWxpemVyKHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICBkZXNlcmlhbGl6ZXIuc2V0U2VyZGVDb250ZXh0KHRoaXMuc2VyZGVDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplcjtcbiAgICB9XG59XG5cbmNsYXNzIEF3c1Jlc3RYbWxQcm90b2NvbCBleHRlbmRzIHByb3RvY29scy5IdHRwQmluZGluZ1Byb3RvY29sIHtcbiAgICBjb2RlYztcbiAgICBzZXJpYWxpemVyO1xuICAgIGRlc2VyaWFsaXplcjtcbiAgICBtaXhpbiA9IG5ldyBQcm90b2NvbExpYigpO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgICAgICAgdGltZXN0YW1wRm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgdXNlVHJhaXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogNSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBodHRwQmluZGluZ3M6IHRydWUsXG4gICAgICAgICAgICB4bWxOYW1lc3BhY2U6IG9wdGlvbnMueG1sTmFtZXNwYWNlLFxuICAgICAgICAgICAgc2VydmljZU5hbWVzcGFjZTogb3B0aW9ucy5kZWZhdWx0TmFtZXNwYWNlLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvZGVjID0gbmV3IFhtbENvZGVjKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVyID0gbmV3IHByb3RvY29scy5IdHRwSW50ZXJjZXB0aW5nU2hhcGVTZXJpYWxpemVyKHRoaXMuY29kZWMuY3JlYXRlU2VyaWFsaXplcigpLCBzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZGVzZXJpYWxpemVyID0gbmV3IHByb3RvY29scy5IdHRwSW50ZXJjZXB0aW5nU2hhcGVEZXNlcmlhbGl6ZXIodGhpcy5jb2RlYy5jcmVhdGVEZXNlcmlhbGl6ZXIoKSwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBnZXRQYXlsb2FkQ29kZWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGVjO1xuICAgIH1cbiAgICBnZXRTaGFwZUlkKCkge1xuICAgICAgICByZXR1cm4gXCJhd3MucHJvdG9jb2xzI3Jlc3RYbWxcIjtcbiAgICB9XG4gICAgYXN5bmMgc2VyaWFsaXplUmVxdWVzdChvcGVyYXRpb25TY2hlbWEsIGlucHV0LCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBzdXBlci5zZXJpYWxpemVSZXF1ZXN0KG9wZXJhdGlvblNjaGVtYSwgaW5wdXQsIGNvbnRleHQpO1xuICAgICAgICBjb25zdCBpbnB1dFNjaGVtYSA9IHNjaGVtYS5Ob3JtYWxpemVkU2NoZW1hLm9mKG9wZXJhdGlvblNjaGVtYS5pbnB1dCk7XG4gICAgICAgIGlmICghcmVxdWVzdC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHRoaXMubWl4aW4ucmVzb2x2ZVJlc3RDb250ZW50VHlwZSh0aGlzLmdldERlZmF1bHRDb250ZW50VHlwZSgpLCBpbnB1dFNjaGVtYSk7XG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBjb250ZW50VHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdID09PSB0aGlzLmdldERlZmF1bHRDb250ZW50VHlwZSgpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QuYm9keSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuYm9keSA9ICc8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4nICsgcmVxdWVzdC5ib2R5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICBhc3luYyBkZXNlcmlhbGl6ZVJlc3BvbnNlKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmRlc2VyaWFsaXplUmVzcG9uc2Uob3BlcmF0aW9uU2NoZW1hLCBjb250ZXh0LCByZXNwb25zZSk7XG4gICAgfVxuICAgIGFzeW5jIGhhbmRsZUVycm9yKG9wZXJhdGlvblNjaGVtYSwgY29udGV4dCwgcmVzcG9uc2UsIGRhdGFPYmplY3QsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySWRlbnRpZmllciA9IGxvYWRSZXN0WG1sRXJyb3JDb2RlKHJlc3BvbnNlLCBkYXRhT2JqZWN0KSA/PyBcIlVua25vd25cIjtcbiAgICAgICAgY29uc3QgeyBlcnJvclNjaGVtYSwgZXJyb3JNZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5taXhpbi5nZXRFcnJvclNjaGVtYU9yVGhyb3dCYXNlRXhjZXB0aW9uKGVycm9ySWRlbnRpZmllciwgdGhpcy5vcHRpb25zLmRlZmF1bHROYW1lc3BhY2UsIHJlc3BvbnNlLCBkYXRhT2JqZWN0LCBtZXRhZGF0YSk7XG4gICAgICAgIGNvbnN0IG5zID0gc2NoZW1hLk5vcm1hbGl6ZWRTY2hlbWEub2YoZXJyb3JTY2hlbWEpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGF0YU9iamVjdC5FcnJvcj8ubWVzc2FnZSA/PyBkYXRhT2JqZWN0LkVycm9yPy5NZXNzYWdlID8/IGRhdGFPYmplY3QubWVzc2FnZSA/PyBkYXRhT2JqZWN0Lk1lc3NhZ2UgPz8gXCJVbmtub3duXCI7XG4gICAgICAgIGNvbnN0IEVycm9yQ3RvciA9IHNjaGVtYS5UeXBlUmVnaXN0cnkuZm9yKGVycm9yU2NoZW1hWzFdKS5nZXRFcnJvckN0b3IoZXJyb3JTY2hlbWEpID8/IEVycm9yO1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBuZXcgRXJyb3JDdG9yKG1lc3NhZ2UpO1xuICAgICAgICBhd2FpdCB0aGlzLmRlc2VyaWFsaXplSHR0cE1lc3NhZ2UoZXJyb3JTY2hlbWEsIGNvbnRleHQsIHJlc3BvbnNlLCBkYXRhT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1lbWJlcl0gb2YgbnMuc3RydWN0SXRlcmF0b3IoKSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbWVtYmVyLmdldE1lcmdlZFRyYWl0cygpLnhtbE5hbWUgPz8gbmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YU9iamVjdC5FcnJvcj8uW3RhcmdldF0gPz8gZGF0YU9iamVjdFt0YXJnZXRdO1xuICAgICAgICAgICAgb3V0cHV0W25hbWVdID0gdGhpcy5jb2RlYy5jcmVhdGVEZXNlcmlhbGl6ZXIoKS5yZWFkU2NoZW1hKG1lbWJlciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHRoaXMubWl4aW4uZGVjb3JhdGVTZXJ2aWNlRXhjZXB0aW9uKE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCBlcnJvck1ldGFkYXRhLCB7XG4gICAgICAgICAgICAkZmF1bHQ6IG5zLmdldE1lcmdlZFRyYWl0cygpLmVycm9yLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgfSwgb3V0cHV0KSwgZGF0YU9iamVjdCk7XG4gICAgfVxuICAgIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiYXBwbGljYXRpb24veG1sXCI7XG4gICAgfVxufVxuXG5leHBvcnRzLkF3c0VjMlF1ZXJ5UHJvdG9jb2wgPSBBd3NFYzJRdWVyeVByb3RvY29sO1xuZXhwb3J0cy5Bd3NKc29uMV8wUHJvdG9jb2wgPSBBd3NKc29uMV8wUHJvdG9jb2w7XG5leHBvcnRzLkF3c0pzb24xXzFQcm90b2NvbCA9IEF3c0pzb24xXzFQcm90b2NvbDtcbmV4cG9ydHMuQXdzSnNvblJwY1Byb3RvY29sID0gQXdzSnNvblJwY1Byb3RvY29sO1xuZXhwb3J0cy5Bd3NRdWVyeVByb3RvY29sID0gQXdzUXVlcnlQcm90b2NvbDtcbmV4cG9ydHMuQXdzUmVzdEpzb25Qcm90b2NvbCA9IEF3c1Jlc3RKc29uUHJvdG9jb2w7XG5leHBvcnRzLkF3c1Jlc3RYbWxQcm90b2NvbCA9IEF3c1Jlc3RYbWxQcm90b2NvbDtcbmV4cG9ydHMuQXdzU21pdGh5UnBjVjJDYm9yUHJvdG9jb2wgPSBBd3NTbWl0aHlScGNWMkNib3JQcm90b2NvbDtcbmV4cG9ydHMuSnNvbkNvZGVjID0gSnNvbkNvZGVjO1xuZXhwb3J0cy5Kc29uU2hhcGVEZXNlcmlhbGl6ZXIgPSBKc29uU2hhcGVEZXNlcmlhbGl6ZXI7XG5leHBvcnRzLkpzb25TaGFwZVNlcmlhbGl6ZXIgPSBKc29uU2hhcGVTZXJpYWxpemVyO1xuZXhwb3J0cy5YbWxDb2RlYyA9IFhtbENvZGVjO1xuZXhwb3J0cy5YbWxTaGFwZURlc2VyaWFsaXplciA9IFhtbFNoYXBlRGVzZXJpYWxpemVyO1xuZXhwb3J0cy5YbWxTaGFwZVNlcmlhbGl6ZXIgPSBYbWxTaGFwZVNlcmlhbGl6ZXI7XG5leHBvcnRzLl90b0Jvb2wgPSBfdG9Cb29sO1xuZXhwb3J0cy5fdG9OdW0gPSBfdG9OdW07XG5leHBvcnRzLl90b1N0ciA9IF90b1N0cjtcbmV4cG9ydHMuYXdzRXhwZWN0VW5pb24gPSBhd3NFeHBlY3RVbmlvbjtcbmV4cG9ydHMubG9hZFJlc3RKc29uRXJyb3JDb2RlID0gbG9hZFJlc3RKc29uRXJyb3JDb2RlO1xuZXhwb3J0cy5sb2FkUmVzdFhtbEVycm9yQ29kZSA9IGxvYWRSZXN0WG1sRXJyb3JDb2RlO1xuZXhwb3J0cy5wYXJzZUpzb25Cb2R5ID0gcGFyc2VKc29uQm9keTtcbmV4cG9ydHMucGFyc2VKc29uRXJyb3JCb2R5ID0gcGFyc2VKc29uRXJyb3JCb2R5O1xuZXhwb3J0cy5wYXJzZVhtbEJvZHkgPSBwYXJzZVhtbEJvZHk7XG5leHBvcnRzLnBhcnNlWG1sRXJyb3JCb2R5ID0gcGFyc2VYbWxFcnJvckJvZHk7XG4iCiAgXSwKICAibWFwcGluZ3MiOiAid2hCQUVBLEZBQUksRUFFSixHQUFTLEpBQXVCLExBQUMsSkFBTyxMQUNwQyxDQUFPLEVBRVgsSUFBTSxHQUF1QixDQUFDLElBQVksQ0FBQyxJQUFTLE1BQU8sSUFBUyxDQUNoRSxHQUFJLENBQUMsR0FBYSxZQUFZLFdBQVcsRUFBSyxPQUFPLEVBQ2pELE9BQU8sRUFBSyxDQUFJLEVBQ3BCLElBQVEsV0FBWSxHQUNaLGtCQUFrQixJQUFPLEVBQVEsZUFBZSxVQUFZLENBQUMsRUFDckUsR0FBSSxFQUFnQixRQUFRLElBQUksR0FBSyxHQUFLLENBQUMsRUFBUSxRQUFRLGNBQ3ZELE9BQU8sRUFBUSxRQUFRLEtBQ3ZCLEVBQVEsUUFBUSxjQUFnQixFQUFRLFVBQVksRUFBUSxLQUFPLElBQU0sRUFBUSxLQUFPLElBRXZGLFFBQUksQ0FBQyxFQUFRLFFBQVEsS0FBUyxDQUMvQixJQUFJLEVBQU8sRUFBUSxTQUNuQixHQUFJLEVBQVEsTUFBUSxLQUNoQixHQUFRLElBQUksRUFBUSxPQUN4QixFQUFRLFFBQVEsS0FBVSxFQUU5QixPQUFPLEVBQUssQ0FBSSxHQUVkLEdBQThCLENBQ2hDLEtBQU0sdUJBQ04sS0FBTSxRQUNOLFNBQVUsTUFDVixLQUFNLENBQUMsTUFBTSxFQUNiLFNBQVUsRUFDZCxFQUNNLEdBQXNCLENBQUMsS0FBYSxDQUN0QyxhQUFjLENBQUMsSUFBZ0IsQ0FDM0IsRUFBWSxJQUFJLEdBQXFCLENBQU8sRUFBRyxFQUEyQixFQUVsRixHQUVRLHVC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LEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sSUFBTSxFQUFFLEVBQUUsT0FBTyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQWMsRUFBRSxLQUFLLENBQUMsR0FBZCxNQUFrQixFQUFFLENBQUMsdUJBQXVCLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBTSxFQUFFLENBQUMsRUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFjLEVBQUUsS0FBYixXQUFrQixFQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sSUFBSSxHQUFTLEVBQUUsS0FBUixLQUFrQixFQUFFLEVBQUUsS0FBVixLQUFjLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksT0FBTyxFQUFNLEtBQUMsR0FBUyxFQUFFLEtBQVIsSUFBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLE9BQU8sRUFBRSxjQUFjLFNBQVMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQVUsRUFBRSxLQUFSLElBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxHQUFTLEVBQUUsS0FBUixNQUFhLEVBQUUsR0FBRyxLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLFFBQWMsRUFBRSxLQUFSLEtBQWtCLEVBQUUsS0FBUixLQUFtQixFQUFFLEtBQVQsTUFBb0IsRUFBRSxLQUFU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RUFBRSxLQUFWLElBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBWSxRQUFHLEVBQUUsT0FBTyxFQUFFLEdBQVMsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsSUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksR0FBUyxFQUFFLEtBQVIsSUFBVyxJQUFTLFFBQVMsRUFBRSxLQUFSLE1BQWEsSUFBUSxJQUFKLEdBQU8sTUFBVyxRQUFHLEVBQUUsT0FBTyxFQUFFLEdBQVMsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBb0IsRUFBRSxFQUFFLEtBQVYsS0FBYSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLEdBQVMsRUFBRSxLQUFSLEtBQWtCLEVBQUUsRUFBRSxLQUFWLEtBQW9CLEVBQUUsRUFBRSxLQUFWLElBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTSxPQUFPLEVBQUUsSUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBTyxJQUFMLEdBQU8sRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFTLFFBQVMsRUFBRSxLQUFSLEtBQWlCLElBQUwsR0FBTyxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE9BQVcs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QUUsRUFBRSxDQUFDLEVBQUUsSUFBTSxHQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsUUFBUSxLQUFLLEtBQUssRUFBRSxFQUFFLEdBQUcsSUFBSSxPQUFPLEdBQUcsU0FBUyxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLEdBQVMsRUFBRSxLQUFSLEtBQWtCLEVBQUUsS0FBUixLQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFFLENBQUMsRUFBRSxFQUFFLEdBQUUsRUFBRSxDQUFDLEVBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxJQUExQyxTQUE0QyxNQUFVLE1BQU0scUNBQXFDLEVBQUUsR0FBUyxFQUFFLEtBQVIsSUFBVyxNQUFVLE1BQU0sc0NBQXNDLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRSxFQUFFLENBQUMsRUFBRSxJQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEdBQWMsSUFBWCxVQUF5QixJQUFYLFNBQWEsTUFBVSxNQUFNLHFDQUFxQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFjLElBQVgsU0FBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFRLEVBQUUsRUFBRSxHQUFFLEVBQUUsQ0FBQyxLQUFmLEtBQXlCLEVBQUUsS0FBUixNQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLEVBQUUsa0JBQWtCLEdBQVEsUUFBYyxJQUFYLFdBQWUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEdBQUcsTUFBVSxNQUFNLHlEQUF5RCxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFTLEVBQUUsRUFBRSxHQUFHLEdBQVMsSUFBTixLQUFlLElBQU4sSUFBUSxNQUFVLE1BQU0sa0NBQWtDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQVUsTUFBTSxnQkFBZ0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUUsQ0FBQyxFQUFFLE1BQVUsTUFBTSwwQkFBMEIsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQVMsRUFBRSxFQUFFLEdBQUUsRUFBRSxDQUFDLEtBQWYsS0FBbUIsR0FBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBTyxRQUFTLEVBQUUsS0FBUixLQUFZLEdBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQU0sS0FBQyxHQUFTLEVBQUUsS0FBUixJQUFXLE1BQVUsTUFBTSxzQ0FBc0MsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFjLEVBQUUsS0FBUixLQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBUyxFQUFFLEtBQVIsSUFBVyxNQUFVLE1BQU0sNEJBQTRCLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsU0FBUyxFQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQVUsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLElBQU0sR0FBRSx3QkFBd0IsR0FBRSxxQ0FBcUMsR0FBRSxDQUFDLElBQUksR0FBRyxhQUFhLEdBQUcsYUFBYSxJQUFJLFVBQVUsRUFBRSxFQUFRLEdBQUUsMENBQTBDLFNBQVMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxPQUFrQixPQUFPLEdBQW5CLFdBQXFCLEVBQUUsTUFBTSxRQUFRLENBQUMsRUFBRSxLQUFHLENBQUMsUUFBVSxLQUFLLEVBQUUsQ0FBQyxHQUFhLE9BQU8sR0FBakIsVUFBb0IsSUFBSSxFQUFFLE1BQU0sR0FBRyxHQUFHLGFBQWEsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sS0FBSyxJQUFJLEdBQUcsTUFBTSxFQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRSxLQUFLLFlBQVksS0FBSyxLQUFLLGNBQWMsQ0FBQyxFQUFFLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxLQUFLLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxxQkFBcUIsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sbUJBQW1CLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLG1CQUFtQixJQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxxQkFBcUIsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxNQUFNLG9CQUFvQixJQUFJLEdBQUcsRUFBRSxLQUFLLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0saUJBQWlCLElBQUksR0FBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sa0JBQWtCLElBQUksR0FBRyxFQUFFLFVBQVUsQ0FBQyxNQUFNLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxnQkFBZ0IsSUFBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0saUJBQWlCLElBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLG1CQUFtQixJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sY0FBYyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLDBCQUEwQixJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sY0FBYyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxvQkFBb0IsR0FBRSxLQUFLLFNBQVMsR0FBRSxLQUFLLGNBQWMsR0FBRSxLQUFLLGlCQUFpQixHQUFFLEtBQUssbUJBQW1CLEdBQUUsS0FBSyxhQUFhLEdBQUUsS0FBSyxxQkFBcUIsR0FBRSxLQUFLLGlCQUFpQixHQUFFLEtBQUssb0JBQW9CLEdBQUUsS0FBSyxTQUFTLEdBQUUsS0FBSyxtQkFBbUIsR0FBRSxLQUFLLFFBQVEsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQU0sRUFBRSxFQUFFLEdBQUcsS0FBSyxhQUFhLEdBQUcsQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBWSxJQUFKLFNBQVEsS0FBSyxRQUFRLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxxQkFBcUIsQ0FBQyxHQUFHLElBQU0sRUFBRSxLQUFLLFFBQVEsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQWEsR0FBTixLQUFRLEVBQUUsT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFJLEVBQUUsRUFBRSxLQUFLLFFBQVEsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUUsRUFBRSxLQUFLLFFBQVEsY0FBYyxLQUFLLFFBQVEsa0JBQWtCLEVBQUUsR0FBRyxTQUFTLEVBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLFFBQVEsZUFBZSxDQUFDLElBQU0sRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQVEsRUFBRSxPQUFPLENBQUMsSUFBaEIsSUFBa0IsSUFBSSxHQUFHLEdBQWEsRUFBRSxLQUFaLFFBQWUsTUFBTSxHQUFPLEVBQUUsU0FBTixJQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksT0FBTyxFQUFFLElBQU0sR0FBRSxJQUFJLE9BQU8sOENBQStDLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQVEsS0FBSyxRQUFRLG1CQUFsQixJQUE4QyxPQUFPLEdBQWpCLFNBQW1CLENBQUMsSUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFNLEVBQUUsS0FBSyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEtBQUssbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLFNBQVMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxRQUFRLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxPQUFPLEdBQUcsS0FBSyxRQUFRLHlCQUF5QixFQUFFLEtBQUssUUFBUSx1QkFBdUIsQ0FBQyxHQUFpQixJQUFkLGNBQWtCLEVBQUUsY0FBdUIsSUFBSixPQUFNLENBQUMsS0FBSyxRQUFRLGFBQWEsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUsscUJBQXFCLENBQUMsRUFBRSxJQUFNLEVBQUUsS0FBSyxRQUFRLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBUyxHQUFOLEtBQVEsRUFBRSxPQUFPLEdBQUcsT0FBTyxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUUsRUFBRSxLQUFLLFFBQVEsb0JBQW9CLEtBQUssUUFBUSxrQkFBa0IsRUFBTyxVQUFLLFFBQVEseUJBQXlCLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUSxvQkFBb0IsQ0FBQyxJQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLFFBQVEscUJBQXFCLEVBQUUsRUFBRSxPQUFPLEdBQUcsSUFBTSxHQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQVEsU0FBUztBQUFBLENBQUksRUFBRSxJQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLEdBQVMsRUFBRSxLQUFSLElBQVcsR0FBUyxFQUFFLEVBQUUsS0FBVixJQUFhLENBQUMsSUFBTSxFQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLFFBQVEsZUFBZSxDQUFDLElBQU0sRUFBRSxFQUFFLFFBQVEsR0FBRyxFQUFPLElBQUwsS0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLFFBQVEsbUJBQW1CLEVBQUUsS0FBSyxRQUFRLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssb0JBQW9CLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQVEsS0FBSyxRQUFRLGFBQWEsUUFBUSxDQUFDLElBQXhDLEdBQTBDLE1BQVUsTUFBTSxrREFBa0QsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQVEsS0FBSyxRQUFRLGFBQWEsUUFBUSxDQUFDLElBQXhDLElBQTJDLEVBQUUsRUFBRSxZQUFZLElBQUksRUFBRSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxjQUFjLElBQUksR0FBRyxFQUFFLEVBQUUsWUFBWSxHQUFHLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLGNBQWMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQU8sUUFBUyxFQUFFLEVBQUUsS0FBVixJQUFhLENBQUMsSUFBSSxFQUFFLEdBQUUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE1BQVUsTUFBTSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsS0FBSyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLFFBQVEsbUJBQTRCLEVBQUUsVUFBWCxRQUFvQixLQUFLLFFBQVEsY0FBa0IsS0FBQyxJQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxLQUFLLFFBQVEsYUFBYSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sS0FBSyxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEdBQUcsS0FBSyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFPLFFBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQXRCLE1BQXdCLENBQUMsSUFBTSxFQUFFLEdBQUUsRUFBRSxNQUFTLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLEtBQUssUUFBUSxnQkFBZ0IsQ0FBQyxJQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssb0JBQW9CLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEtBQUssUUFBUSxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssUUFBUSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFPLFFBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQXJCLEtBQXVCLENBQUMsSUFBTSxFQUFFLEdBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFPLFFBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQXJCLEtBQXVCLENBQUMsSUFBTSxFQUFFLEdBQUUsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFRLEdBQU4sT0FBVSxFQUFFLElBQUksS0FBSyxRQUFRLGNBQWMsRUFBRSxJQUFJLEtBQUssUUFBUSxjQUFjLENBQUMsRUFBRSxLQUFLLFFBQVEsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxLQUFLLFFBQVEsYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQU0sS0FBQyxJQUFJLEVBQUUsR0FBRSxFQUFFLEVBQUUsS0FBSyxRQUFRLGNBQWMsRUFBRSxFQUFFLEVBQUUsUUFBYyxFQUFFLEVBQUUsV0FBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsZUFBZSxFQUFFLEVBQUUsV0FBVyxLQUFLLFFBQVEsbUJBQW1CLEVBQUUsS0FBSyxRQUFRLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxHQUFZLEVBQUUsVUFBWCxTQUFxQixFQUFFLEtBQUssb0JBQW9CLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFNLEVBQUUsRUFBRSxHQUFRLEtBQUssUUFBUSxhQUFhLFFBQVEsRUFBRSxPQUFPLElBQWhELEtBQW9ELEVBQUUsS0FBSyxjQUFjLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBTSxFQUFFLEVBQUUsR0FBRyxLQUFLLGFBQWEsS0FBSyxRQUFRLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLEVBQUUsWUFBWSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQVEsRUFBRSxFQUFFLE9BQU8sS0FBakIsS0FBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFnQixRQUFRLEtBQUssUUFBUSxhQUFhLFFBQVEsQ0FBQyxJQUF4QyxHQUEwQyxFQUFFLEVBQUUsV0FBZSxLQUFDLElBQU0sRUFBRSxLQUFLLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBVSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsSUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxNQUFNLEtBQUssbUJBQW1CLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssY0FBYyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEtBQUssUUFBUSxhQUFhLENBQUMsRUFBRSxLQUFLLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFNLEtBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxFQUFFLFlBQVksR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQU8sRUFBRSxFQUFFLE9BQU8sS0FBakIsS0FBcUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssUUFBUSxtQkFBbUIsRUFBRSxLQUFLLFFBQVEsaUJBQWlCLENBQUMsR0FBRyxJQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLE1BQU0sS0FBSyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxZQUFZLEdBQUcsQ0FBQyxFQUFNLEtBQUMsSUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxjQUFjLEtBQUssQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsTUFBTSxLQUFLLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQVEsUUFBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sU0FBUyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssUUFBUSxrQkFBa0IsRUFBTyxRQUFHLElBQU0sRUFBRSxLQUFLLFFBQVEsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBTyxJQUFMLEtBQW1CLE9BQU8sR0FBakIsVUFBb0IsRUFBRSxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxJQUFNLEdBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxnQkFBZ0IsQ0FBQyxRQUFRLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxJQUFNLEVBQUUsS0FBSyxnQkFBZ0IsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxLQUFLLEtBQUssYUFBYSxDQUFDLElBQU0sRUFBRSxLQUFLLGFBQWEsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLFFBQVEsYUFBYSxRQUFRLEtBQUssS0FBSyxhQUFhLENBQUMsSUFBTSxFQUFFLEtBQUssYUFBYSxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsUUFBUSxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsR0FBRyxFQUFFLE9BQU8sR0FBRyxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFhLElBQUosU0FBUSxFQUFNLEVBQUUsTUFBTSxTQUFaLElBQThCLEVBQUUsS0FBSyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFXLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxTQUF6QixFQUFnQyxDQUFDLEtBQXZGLFFBQWdHLElBQUwsSUFBUSxFQUFFLElBQUksS0FBSyxRQUFRLGFBQWEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBTSxFQUFFLEtBQUssRUFBRSxRQUFVLEtBQUssRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLE1BQU0sR0FBRyxNQUFNLEdBQUcsU0FBUyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBUSxJQUFMLEdBQU8sTUFBVSxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSSxJQUFJLEVBQUUsSUFBUyxRQUFTLEtBQU4sS0FBZSxLQUFOLElBQVEsRUFBRSxHQUFPLFFBQUcsS0FBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBTSxLQUFPLEtBQVAsT0FBVyxHQUFFLEtBQUssR0FBRyxLQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLElBQVEsS0FBSixFQUFtQixNQUFKLEdBQUUsRUFBUSxFQUFFLEVBQUUsT0FBTyxJQUFJLEVBQU0sRUFBRSxFQUFFLEVBQUUsR0FBUSxJQUFMLEtBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxHQUFHLElBQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFFLFFBQVEsR0FBRyxFQUFPLElBQUwsS0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLElBQUksR0FBUyxFQUFFLEtBQVIsSUFBVyxHQUFTLEVBQUUsRUFBRSxLQUFWLElBQWEsQ0FBQyxJQUFNLEVBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxHQUFHLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBUSxJQUFKLEdBQU8sTUFBTSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBTyxRQUFTLEVBQUUsRUFBRSxLQUFWLElBQWEsRUFBRSxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUseUJBQXlCLEVBQU8sUUFBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBdEIsTUFBd0IsRUFBRSxHQUFFLEVBQUUsTUFBUyxFQUFFLEVBQUUseUJBQXlCLEVBQU8sUUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBckIsS0FBdUIsRUFBRSxHQUFFLEVBQUUsTUFBTSxFQUFFLHlCQUF5QixFQUFFLEVBQU0sS0FBQyxJQUFNLEVBQUUsR0FBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLFdBQVcsR0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLE9BQU8sS0FBL0IsS0FBbUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxTQUFTLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBYSxPQUFPLEdBQWpCLFNBQW1CLENBQUMsSUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQWUsSUFBVCxRQUFzQixJQUFWLFNBQWEsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxPQUFPLENBQUMsRUFBRSxHQUFFLENBQUMsRUFBRSxDQUFDLEdBQWEsT0FBTyxHQUFqQixTQUFtQixPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQVksRUFBRSxXQUFOLFFBQWdCLEVBQUUsU0FBUyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBUyxJQUFOLElBQVEsTUFBTyxHQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLFNBQVMsT0FBTyxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsR0FBRyxRQUFRLE9BQU8sU0FBUyxPQUFPLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFVLE1BQU0sOERBQThELEdBQUcsQ0FBQyxFQUFFLEdBQVEsRUFBRSxPQUFPLFVBQVUsSUFBeEIsR0FBMEIsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxJQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEdBQVMsRUFBTyxFQUFFLEdBQUcsUUFBUSxHQUFHLElBQXJCLEdBQXVCLElBQUksSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQU0sRUFBRSxTQUFOLEdBQWMsQ0FBQyxFQUFFLEdBQUcsV0FBVyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsY0FBYyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxF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