import * as ___react___ from 'react'; import * as ___react_dom___ from 'react-dom'; function require(mod) { if (mod === 'react') return ___react___; if (mod === 'react-dom') return ___react_dom___; throw new Error(`Unknown module ${mod}`); } import{a as R}from"./chunk-IZGN5R76.js";import{c as J,d as U}from"./chunk-GKER6YAU.js";import{a as w,b as q,d as C,e as N,h as D,i as L,j as Q,k as z,l as F}from"./chunk-PI3N7ZW6.js";import{a as $}from"./chunk-N6ZIYSZ5.js";import{A as P,B as k,C as I,E as B,F as G,p as H,q as d,t as j,u as v,z as Y}from"./chunk-LR52PZTP.js";var K={bool:{group:"boolean"},boolean:{group:"boolean"},bytea:{group:"string"},char:{group:"string"},citext:{group:"string"},date:{format:"YYYY-MM-DD",group:"datetime"},interval:{group:"string"},name:{group:"string"},varchar:{group:"string"},text:{group:"string"},time:{format:"HH:mm:ss.SSS",group:"time"},timestamp:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},timestamptz:{format:"YYYY-MM-DD HH:mm:ss.SSSZZ",group:"datetime"},"timestamp without time zone":{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},"timestamp with time zone":{format:"YYYY-MM-DD HH:mm:ss.SSSZZ",group:"datetime"},timetz:{format:"HH:mm:ss.SSSZZ",group:"time"},"time without time zone":{format:"HH:mm:ss.SSS",group:"time"},"time with time zone":{format:"HH:mm:ss.SSSZZ",group:"time"},uuid:{format:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",group:"raw"},int2:{group:"numeric"},int4:{group:"numeric"},int8:{group:"numeric"},smallint:{group:"numeric"},integer:{group:"numeric"},bigint:{group:"numeric"},decimal:{group:"numeric"},numeric:{group:"numeric"},real:{group:"numeric"},float4:{group:"numeric"},float8:{group:"numeric"},"double precision":{group:"numeric"},json:{group:"json"},jsonb:{group:"json"}};function T(r){return Y({...r,Adapter:v,QueryCompiler:j})}function Z(r){let e=z(r),a=e.normalizedSearchTerm;if(a.length<2)return e;let o=new Set(e.predicates.flatMap(f=>f.kind==="text-like"?[f.column]:[])),i=64-o.size;if(i<=0)return e;let n=`%${ue(a)}%`,p=[];for(let f of Object.values(r.table.columns))if(!o.has(f.name)&&(p.push({column:f.name,kind:"text-like",pattern:n}),p.length>=i))break;return p.length===0?e:{...e,predicates:[...e.predicates,...p]}}function ue(r){return r.replaceAll("%","\\%").replaceAll("_","\\_")}function W(r,e){let{rows:a,table:{columns:o,name:i,schema:n}}=r,p=T(e);return k(p.withSchema(n).insertInto(i).values(B({columns:o,context:"insert",supportsDefaultKeyword:!0,values:a})).returning(Object.keys(o)).returning(M().as("__ps_inserted_at__")))}function V(r,e){let{filter:a={after:"and",filters:[],kind:"FilterGroup"},fullTableSearchTerm:o,pageIndex:i,pageSize:n,sortOrder:p,table:{columns:f,name:l,schema:s}}=r,t=T(e),u=G(a.filters,f),m=Z({searchTerm:o,table:r.table}),_=m.predicates.length>0?c=>c.and([u(c),F(m,{dialect:"postgres"})(c)]):u,g="__ps_agg__",b="__ps_count__",A="__ps_search_guardrails__";if(L(o))return k(t.with(A,c=>c.selectNoFrom(y=>[y.fn("set_config",[d.lit("statement_timeout"),d.lit(`${5e3}ms`),d.lit(!0)]).as("__ps_statement_timeout__"),y.fn("set_config",[d.lit("lock_timeout"),d.lit(`${100}ms`),d.lit(!0)]).as("__ps_lock_timeout__")])).with(g,c=>c.withSchema(s).selectFrom(l).innerJoin(d.table(A).as(A),y=>y.onTrue()).where(_).select(y=>y.cast(y.fn.coalesce(y.fn.countAll(),d.lit(0)),"text").as(b))).withSchema(s).selectFrom(l).innerJoin(A,c=>c.onTrue()).innerJoin(g,c=>c.onTrue()).where(_).select(`${g}.${b}`).select(Object.keys(f)).$call(c=>p.reduce((y,h)=>{let S=f[h.column];return S?.datatype.group==="numeric"&&!S.datatype.isArray?y.orderBy(d`cast(${d.ref(h.column)} as numeric)`,h.direction):y.orderBy(h.column,h.direction)},c)).limit(n).offset(d.lit(BigInt(i)*BigInt(n))));let E=t.withSchema(s).selectFrom(l).where(_).select(c=>c.cast(c.fn.coalesce(c.fn.countAll(),d.lit(0)),"text").as(b));return k(t.with(g,()=>E).withSchema(s).selectFrom(l).innerJoin(g,c=>c.onTrue()).where(_).select(`${g}.${b}`).select(Object.keys(f)).$call(c=>p.reduce((y,h)=>{let S=f[h.column];return S?.datatype.group==="numeric"&&!S.datatype.isArray?y.orderBy(d`cast(${d.ref(h.column)} as numeric)`,h.direction):y.orderBy(h.column,h.direction)},c)).limit(n).offset(d.lit(BigInt(i)*BigInt(n))))}function De(){return[{created_at:new Date("2025-01-26T21:56:12.345Z"),deleted_at:null,id:1,name:"John Doe",__ps_count__:"2",role:"admin",name_role:"Jonn Doe - admin"},{created_at:new Date("2025-01-26T20:56:12.345Z"),deleted_at:null,id:2,name:"Jane Doe",__ps_count__:"2",role:"poweruser",name_role:"Jane Doe - poweruser"}]}function O(r,e){let{changes:a,row:o,table:{columns:i,name:n,schema:p}}=r,f=T(e);return k(f.withSchema(p).updateTable(n).set(B({columns:i,context:"update",supportsDefaultKeyword:!0,values:a})).$call(I([o],i)).returning(Object.keys(i)).returning(M().as("__ps_updated_at__")))}function X(r,e){let{rows:a,table:{columns:o,name:i,schema:n}}=r,p=T(e);return k(p.withSchema(n).deleteFrom(i).$call(I(a,o)).returning(Object.keys(o)).returning(M().as("__ps_deleted_at__")))}function M(){let r=H();return r.cast(r.fn("floor",[r(r.fn("extract",[d`epoch from now()`]),"*",1e3)]),"text")}function ee(r){return d`(select coalesce(json_agg(agg), '[]') from ${r} as agg)`}var ie="r",ce="v",pe=[ie,ce];function te(r){return k(T(r).selectFrom("pg_catalog.pg_class as cls").innerJoin("pg_catalog.pg_namespace as ns","cls.relnamespace","ns.oid").$call(me).where("cls.relkind","in",pe).select(e=>["ns.nspname as schema","cls.relname as name",ee(e.selectFrom("pg_catalog.pg_attribute as att").innerJoin("pg_catalog.pg_type as typ","typ.oid","att.atttypid").innerJoin("pg_catalog.pg_namespace as tns","tns.oid","typ.typnamespace").leftJoin("pg_catalog.pg_constraint as pk_con",a=>a.on("pk_con.contype","=","p").onRef("pk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("pk_con.conkey")))).leftJoin("pg_catalog.pg_constraint as fk_con",a=>a.on("fk_con.contype","=","f").onRef("fk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("fk_con.conkey")))).leftJoin("pg_catalog.pg_class as fk_cls","fk_cls.oid","fk_con.confrelid").leftJoin("pg_catalog.pg_namespace as fk_ns","fk_ns.oid","fk_cls.relnamespace").leftJoin("pg_catalog.pg_attribute as fk_att",a=>a.onRef("fk_att.attrelid","=","fk_cls.oid").on(o=>o("fk_att.attnum","=",o.fn.any("fk_con.confkey")))).leftJoin("pg_catalog.pg_attrdef as def",a=>a.onRef("def.adrelid","=","att.attrelid").onRef("def.adnum","=","att.attnum")).whereRef("att.attrelid","=","cls.oid").where("att.attnum",">=",0).where("att.attisdropped","!=",!0).select(["att.attname as name","fk_att.attname as fk_column","fk_cls.relname as fk_table","fk_ns.nspname as fk_schema","tns.nspname as datatype_schema","typ.typname as datatype"]).select(a=>[a("att.attidentity","!=","").or(a("def.adbin","is not",null).and(a.fn("pg_get_expr",["def.adbin","def.adrelid"]),"like","nextval(%")).$castTo().as("autoinc"),a("att.attgenerated","!=","").$castTo().as("computed"),a.fn("pg_get_expr",["def.adbin","def.adrelid"]).as("default"),a("att.attnotnull","!=",!0).$castTo().as("nullable"),a.fn.coalesce(a.selectFrom("pg_catalog.pg_enum as enm").whereRef("enm.enumtypid","=","typ.oid").select(o=>o.fn.jsonAgg(o.ref("enm.enumlabel")).as("o")),d`'[]'`).as("options"),a.fn("array_position",["pk_con.conkey","att.attnum"]).as("pk")])).as("columns")]))}function re(){return[{schema:"zoo",name:"animals",columns:[{autoinc:!0,computed:!1,datatype:"int4",datatype_schema:"pg_catalog",default:"nextval('zoo.animals_id_seq'::regclass)",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:null}]},{schema:"public",name:"users",columns:[{autoinc:!0,computed:!1,datatype:"int4",datatype_schema:"pg_catalog",default:"nextval('users_id_seq'::regclass)",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:"CURRENT_TIMESTAMP",fk_column:null,fk_schema:null,fk_table:null,name:"created_at",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"deleted_at",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"varchar",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"role",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!1,datatype:"varchar",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:null},{autoinc:!1,computed:!0,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name_role",nullable:!1,options:[],pk:null}]},{schema:"public",name:"composite_pk",columns:[{autoinc:!1,computed:!1,datatype:"uuid",datatype_schema:"pg_catalog",default:"gen_random_uuid()",fk_column:null,fk_schema:null,fk_table:null,name:"id",nullable:!1,options:[],pk:1},{autoinc:!1,computed:!1,datatype:"text",datatype_schema:"pg_catalog",default:null,fk_column:null,fk_schema:null,fk_table:null,name:"name",nullable:!0,options:[],pk:2},{autoinc:!1,computed:!1,datatype:"timestamp",datatype_schema:"pg_catalog",default:"now()",fk_column:null,fk_schema:null,fk_table:null,name:"created_at",nullable:!0,options:[],pk:null}]}]}function ae(){let r=T();return k(r.selectNoFrom(r.fn("current_setting",[d.lit("timezone")]).as("timezone")))}function ne(){return[{timezone:"UTC"}]}function me(r){return r.where("ns.nspname","!~","^pg_").where("ns.nspname","!=","information_schema")}function $e(r){let{executor:e,...a}=r,o=D(),i=typeof e.lintSql=="function",n=l=>R({...l,adapterSource:"postgresql"});async function p(l,s){let t=l.map(u=>O(u,a));try{if(typeof e.executeTransaction=="function"){let[m,_]=await e.executeTransaction(t,s);if(m)return n({error:m,query:t[0]});let g=[];for(let[b,A]of _.entries()){let[x]=A;if(!x)return n({error:new Error("Update failed"),query:t[b]});g.push(x)}return[null,{rows:g,queries:t}]}let u=[];for(let[m,_]of t.entries()){let[g,b]=await e.execute(_,s);if(g)return n({error:g,query:_});let[A]=b;if(!A)return n({error:new Error("Update failed"),query:t[m]});u.push(A)}return[null,{rows:u,queries:t}]}catch(u){return n({error:u})}}async function f(l){try{let s=te(a),t=ae(),[[u,m],[_,g]]=await Promise.all([e.execute(s,l),e.execute(t,l)]);if(u)return n({error:u,query:s});let b=_?"UTC":g[0]?.timezone??"UTC";return[null,le({query:s,tables:m,timezone:b})]}catch(s){return n({error:s})}}return{defaultSchema:"public",capabilities:{fullTableSearch:!0,sqlDialect:"postgresql",sqlEditorAutocomplete:!0,sqlEditorLint:!0},async introspect(l){return await f(l)},async query(l,s){try{let t=V(l,a),[u,m]=await Q({executor:e,options:s,query:t,searchTerm:l.fullTableSearchTerm,state:o});return u?n({error:u,query:t}):[null,{filteredRowCount:m[0]?.__ps_count__||"0",rows:m,query:t}]}catch(t){return n({error:t})}},async raw(l,s){return await fe(e,l,s)},async sqlSchema(l,s){let[t,u]=await f(s);return t?[t]:[null,$({defaultSchema:"public",dialect:"postgresql",introspection:u})]},async sqlLint(l,s){if(i&&typeof e.lintSql=="function")try{let[t,u]=await e.lintSql(l,s);if(!t)return[null,u];if(!oe(t))return n({error:t});se(t)&&(i=!1)}catch(t){if(!oe(t))return n({error:t});se(t)&&(i=!1)}return await de(e,l,s)},async insert(l,s){try{let t=W(l,a),[u,m]=await e.execute(t,s);return u?n({error:u,query:t}):[null,{rows:m,query:t}]}catch(t){return n({error:t})}},async update(l,s){try{let t=O(l,a),[u,m]=await e.execute(t,s);if(u)return n({error:u,query:t});let[_]=m;return _?[null,{row:_,query:t}]:n({error:new Error("Update failed"),query:t})}catch(t){return n({error:t})}},async updateMany(l,s){return await p(l.updates,s)},async delete(l,s){try{let t=X(l,a),[u]=await e.execute(t,s);return u?n({error:u,query:t}):[null,{...l,query:t}]}catch(t){return n({error:t})}}}}function oe(r){if(!(r instanceof Error))return!1;let e=r.message.toLowerCase();return e.includes("invalid procedure")||e.includes("unexpected server error")||e.includes("internal server error")||e.includes("bad gateway")||e.includes("service unavailable")||e.includes("not supported")||e.includes("method not allowed")}function se(r){if(!(r instanceof Error))return!1;let e=r.message.toLowerCase();return e.includes("invalid procedure")||e.includes("unexpected server error")||e.includes("internal server error")||e.includes("not supported")||e.includes("method not allowed")}async function de(r,e,a){let o=J(e.sql);if(!o.ok)return[null,{diagnostics:[o.diagnostic],schemaVersion:e.schemaVersion}];let i=[];for(let n of o.statements)try{let p=P(`EXPLAIN ${n.statement}`),[f]=await r.execute(p,a);if(!f)continue;i.push(...U({error:f,positionOffset:n.from,sql:n.statement}))}catch(p){i.push(...U({error:p,positionOffset:n.from,sql:n.statement}))}return[null,{diagnostics:i,schemaVersion:e.schemaVersion}]}async function fe(r,e,a){try{let o=P(e.sql),[i,n]=await r.execute(o,a);return i?R({adapterSource:"postgresql",error:i,query:o}):[null,{query:o,rowCount:n.length,rows:n}]}catch(o){return R({adapterSource:"postgresql",error:o})}}function le(r){let{query:e,tables:a,timezone:o}=r;return a.reduce((i,n)=>{let{schemas:p}=i,{columns:f,name:l,schema:s}=n,t=f.reduce((u,m)=>{let{autoinc:_,computed:g,datatype:b,datatype_schema:A,default:x,name:E,options:c,nullable:y}=m,h=b.startsWith("_"),S=h?b.slice(1):b;return{...u,[E]:{datatype:{...K[S]||{group:c.length>0?"enum":"raw"},isArray:h,isNative:A==="pg_catalog",name:h?`${S}[]`:S,options:c,schema:A},defaultValue:x,fkColumn:m.fk_column,fkSchema:m.fk_schema,fkTable:m.fk_table,isAutoincrement:_,isComputed:g,isRequired:!y&&!_&&!g&&x==null,name:E,nullable:y,pkPosition:m.pk,schema:s,table:l}}},{});return p[s]===void 0&&(p[s]={name:s,tables:{}}),p[s].tables[l]={columns:t,name:l,schema:s},i},{filterOperators:_e,query:e,schemas:{public:{name:"public",tables:{}}},timezone:o})}var _e=["=","!=",">",">=","<","<=","is","is not","like","not like","ilike","not ilike"];function Je(){let r=re(),[{timezone:e}]=ne();return le({tables:r,timezone:e,query:{parameters:[],sql:""}})}export{Z as a,W as b,V as c,De as d,O as e,X as f,te as g,re as h,ae as i,ne as j,$e as k,Je as l}; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2RhdGF0eXBlLnRzIiwgIi4uL2RhdGEvcG9zdGdyZXMtY29yZS9idWlsZGVyLnRzIiwgIi4uL2RhdGEvcG9zdGdyZXMtY29yZS9mdWxsLXRhYmxlLXNlYXJjaC50cyIsICIuLi9kYXRhL3Bvc3RncmVzLWNvcmUvZG1sLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2hlbHBlcnMvcG9zdGdyZXMuanMiLCAiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2ludHJvc3BlY3Rpb24udHMiLCAiLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2FkYXB0ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBOiBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgUGljazxEYXRhVHlwZSwgXCJmb3JtYXRcIiB8IFwiZ3JvdXBcIj5cbj4gPSB7XG4gIGJvb2w6IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJ5dGVhOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgY2l0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCdcbiAgICovXG4gIGRhdGU6IHtcbiAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERFwiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMSBkYXkgMiBob3VycydcbiAgICovXG4gIGludGVydmFsOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG5hbWU6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdmFyY2hhcjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lIHdpdGhvdXQgdGltZSB6b25lYC5cbiAgICpcbiAgICogQGV4YW1wbGUgJzE0OjMwOjAwJ1xuICAgKi9cbiAgdGltZToge1xuICAgIGZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIHRpbWVzdGFtcDoge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1wiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCswMCdcbiAgICovXG4gIHRpbWVzdGFtcHR6OiB7XG4gICAgZm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW06c3MuU1NTWlpcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1lc3RhbXBgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCI6IHtcbiAgICBmb3JtYXQ6IFwiWVlZWS1NTS1ERCBISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1lc3RhbXB0emAuXG4gICAqXG4gICAqIEBleGFtcGxlICcyMDI1LTA0LTE0IDE0OjMwOjAwKzAwJ1xuICAgKi9cbiAgXCJ0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVcIjoge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1paXCIsXG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgLyoqXG4gICAqIHNob3J0IGZvcm0gb2YgYHRpbWUgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMTQ6MzA6MDArMDAnXG4gICAqL1xuICB0aW1ldHo6IHtcbiAgICBmb3JtYXQ6IFwiSEg6bW06c3MuU1NTWlpcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBsb25nIGZvcm0gb2YgYHRpbWVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMTQ6MzA6MDAnXG4gICAqL1xuICBcInRpbWUgd2l0aG91dCB0aW1lIHpvbmVcIjoge1xuICAgIGZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBsb25nIGZvcm0gb2YgYHRpbWV0emAuXG4gICAqXG4gICAqIEBleGFtcGxlICcxNDozMDowMCswMCdcbiAgICovXG4gIFwidGltZSB3aXRoIHRpbWUgem9uZVwiOiB7XG4gICAgZm9ybWF0OiBcIkhIOm1tOnNzLlNTU1paXCIsXG4gICAgZ3JvdXA6IFwidGltZVwiLFxuICB9LFxuICB1dWlkOiB7XG4gICAgZm9ybWF0OiBcInh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eFwiLFxuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBpbnQyOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnQ0OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnQ4OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBzbWFsbGludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgaW50ZWdlcjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgYmlnaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBkZWNpbWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBudW1lcmljOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICByZWFsOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBmbG9hdDQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGZsb2F0ODoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgXCJkb3VibGUgcHJlY2lzaW9uXCI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGpzb246IHtcbiAgICBncm91cDogXCJqc29uXCIsXG4gIH0sXG4gIGpzb25iOiB7XG4gICAgZ3JvdXA6IFwianNvblwiLFxuICB9LFxufTtcbiIsICJpbXBvcnQgeyB0eXBlIEt5c2VseSwgUG9zdGdyZXNBZGFwdGVyLCBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgZ2V0QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc3RncmVTUUxCdWlsZGVyPERhdGFiYXNlID0gYW55PihcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbik6IEt5c2VseTxEYXRhYmFzZT4ge1xuICByZXR1cm4gZ2V0QnVpbGRlcih7XG4gICAgLi4ucmVxdWlyZW1lbnRzLFxuICAgIEFkYXB0ZXI6IFBvc3RncmVzQWRhcHRlcixcbiAgICBRdWVyeUNvbXBpbGVyOiBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIsXG4gIH0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuIGFzIGJ1aWxkQmFzZUZ1bGxUYWJsZVNlYXJjaFBsYW4sXG4gIGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlLFxuICBleGVjdXRlUXVlcnlXaXRoRnVsbFRhYmxlU2VhcmNoR3VhcmRyYWlscyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTUFYX1RFWFRfQ09MVU1OUyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTUlOX1FVRVJZX0xFTkdUSCxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfTVlTUUxfTE9DS19XQUlUX1RJTUVPVVRfU0VDT05EUyxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfUE9TVEdSRVNfTE9DS19USU1FT1VUX01TLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01FU1NBR0UsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTVMsXG4gIHR5cGUgRnVsbFRhYmxlU2VhcmNoUGxhbixcbiAgdHlwZSBGdWxsVGFibGVTZWFyY2hQcmVkaWNhdGUsXG4gIEZ1bGxUYWJsZVNlYXJjaFRpbWVvdXRFcnJvcixcbiAgZ2V0RnVsbFRhYmxlU2VhcmNoRXhwcmVzc2lvbixcbiAgaXNGdWxsVGFibGVTZWFyY2hSZXF1ZXN0LFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcblxuZXhwb3J0IHtcbiAgY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUsXG4gIGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NQVhfVEVYVF9DT0xVTU5TLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NSU5fUVVFUllfTEVOR1RILFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NWVNRTF9MT0NLX1dBSVRfVElNRU9VVF9TRUNPTkRTLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9QT1NUR1JFU19MT0NLX1RJTUVPVVRfTVMsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTUVTU0FHRSxcbiAgRlVMTF9UQUJMRV9TRUFSQ0hfVElNRU9VVF9NUyxcbiAgRnVsbFRhYmxlU2VhcmNoVGltZW91dEVycm9yLFxuICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uLFxuICBpc0Z1bGxUYWJsZVNlYXJjaFJlcXVlc3QsXG59O1xuZXhwb3J0IHR5cGUge1xuICBGdWxsVGFibGVTZWFyY2hEaWFsZWN0LFxuICBGdWxsVGFibGVTZWFyY2hFeGVjdXRpb25TdGF0ZSxcbiAgRnVsbFRhYmxlU2VhcmNoUHJlZGljYXRlLFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbihhcmdzOiB7XG4gIHNlYXJjaFRlcm06IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdGFibGU6IFRhYmxlO1xufSk6IEZ1bGxUYWJsZVNlYXJjaFBsYW4ge1xuICBjb25zdCBiYXNlUGxhbiA9IGJ1aWxkQmFzZUZ1bGxUYWJsZVNlYXJjaFBsYW4oYXJncyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2hUZXJtID0gYmFzZVBsYW4ubm9ybWFsaXplZFNlYXJjaFRlcm07XG5cbiAgaWYgKG5vcm1hbGl6ZWRTZWFyY2hUZXJtLmxlbmd0aCA8IEZVTExfVEFCTEVfU0VBUkNIX01JTl9RVUVSWV9MRU5HVEgpIHtcbiAgICByZXR1cm4gYmFzZVBsYW47XG4gIH1cblxuICBjb25zdCBleGlzdGluZ1RleHRDb2x1bW5zID0gbmV3IFNldChcbiAgICBiYXNlUGxhbi5wcmVkaWNhdGVzLmZsYXRNYXAoKHByZWRpY2F0ZSkgPT5cbiAgICAgIHByZWRpY2F0ZS5raW5kID09PSBcInRleHQtbGlrZVwiID8gW3ByZWRpY2F0ZS5jb2x1bW5dIDogW10sXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgcmVtYWluaW5nVGV4dFNsb3RzID1cbiAgICBGVUxMX1RBQkxFX1NFQVJDSF9NQVhfVEVYVF9DT0xVTU5TIC0gZXhpc3RpbmdUZXh0Q29sdW1ucy5zaXplO1xuXG4gIGlmIChyZW1haW5pbmdUZXh0U2xvdHMgPD0gMCkge1xuICAgIHJldHVybiBiYXNlUGxhbjtcbiAgfVxuXG4gIGNvbnN0IHBhdHRlcm4gPSBgJSR7ZXNjYXBlTGlrZVBhdHRlcm4obm9ybWFsaXplZFNlYXJjaFRlcm0pfSVgO1xuICBjb25zdCBzdXBwbGVtZW50YWxQcmVkaWNhdGVzOiBGdWxsVGFibGVTZWFyY2hQcmVkaWNhdGVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoYXJncy50YWJsZS5jb2x1bW5zKSkge1xuICAgIGlmIChleGlzdGluZ1RleHRDb2x1bW5zLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN1cHBsZW1lbnRhbFByZWRpY2F0ZXMucHVzaCh7XG4gICAgICBjb2x1bW46IGNvbHVtbi5uYW1lLFxuICAgICAga2luZDogXCJ0ZXh0LWxpa2VcIixcbiAgICAgIHBhdHRlcm4sXG4gICAgfSk7XG5cbiAgICBpZiAoc3VwcGxlbWVudGFsUHJlZGljYXRlcy5sZW5ndGggPj0gcmVtYWluaW5nVGV4dFNsb3RzKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcGxlbWVudGFsUHJlZGljYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYmFzZVBsYW47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmJhc2VQbGFuLFxuICAgIHByZWRpY2F0ZXM6IFsuLi5iYXNlUGxhbi5wcmVkaWNhdGVzLCAuLi5zdXBwbGVtZW50YWxQcmVkaWNhdGVzXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlTGlrZVBhdHRlcm4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKFwiJVwiLCBcIlxcXFwlXCIpLnJlcGxhY2VBbGwoXCJfXCIsIFwiXFxcXF9cIik7XG59XG4iLCAiaW1wb3J0IHtcbiAgZXhwcmVzc2lvbkJ1aWxkZXIsXG4gIHR5cGUgSW5mZXJSZXN1bHQsXG4gIHR5cGUgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbixcbiAgc3FsLFxufSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIEFkYXB0ZXJJbnNlcnREZXRhaWxzLFxuICBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7XG4gIGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzLFxuICBhcHBseVRyYW5zZm9ybWF0aW9ucyxcbiAgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLFxuICBjb21waWxlLFxuICBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uLFxufSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgQmlnSW50U3RyaW5nIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IGdldFBvc3RncmVTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9QT1NUR1JFU19MT0NLX1RJTUVPVVRfTVMsXG4gIEZVTExfVEFCTEVfU0VBUkNIX1RJTUVPVVRfTVMsXG4gIGdldEZ1bGxUYWJsZVNlYXJjaEV4cHJlc3Npb24sXG4gIGlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdCxcbn0gZnJvbSBcIi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG4vKipcbiAqIEluc2VydHMgb25lIG9yIG1vcmUgcm93cyBpbnRvIGEgdGFibGUgYW5kIHJldHVybnMgdGhlIGluc2VydGVkIHJvd3MgYWxvbmcgd2l0aCB0aGVpciBgY3RpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnNlcnRRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckluc2VydERldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgIC5pbnNlcnRJbnRvKHRhYmxlTmFtZSlcbiAgICAgIC52YWx1ZXMoXG4gICAgICAgIGFwcGx5VHJhbnNmb3JtYXRpb25zKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbnRleHQ6IFwiaW5zZXJ0XCIsXG4gICAgICAgICAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZXM6IHJvd3MsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnJldHVybmluZyhPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpLmFzKFwiX19wc19pbnNlcnRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBzZWxlY3RzIGFsbCBjb2x1bW5zIGZyb20gYSB0YWJsZSwgYWxvbmcgd2l0aCBhbiB1bmJvdW5kIHJvdyBjb3VudCBhcyBgX19wc19jb3VudF9fYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBmaWx0ZXIgPSB7IGFmdGVyOiBcImFuZFwiLCBmaWx0ZXJzOiBbXSwga2luZDogXCJGaWx0ZXJHcm91cFwiIH0sXG4gICAgZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPVxuICAgIGdldFBvc3RncmVTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbiA9IGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oXG4gICAgZmlsdGVyLmZpbHRlcnMsXG4gICAgY29sdW1ucyxcbiAgKTtcbiAgY29uc3QgZnVsbFRhYmxlU2VhcmNoUGxhbiA9IGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbih7XG4gICAgc2VhcmNoVGVybTogZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICB0YWJsZTogZGV0YWlscy50YWJsZSxcbiAgfSk7XG4gIGNvbnN0IGNvbWJpbmVkV2hlcmVFeHByZXNzaW9uID1cbiAgICBmdWxsVGFibGVTZWFyY2hQbGFuLnByZWRpY2F0ZXMubGVuZ3RoID4gMFxuICAgICAgPyAoZWI6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbj4+WzBdKSA9PlxuICAgICAgICAgIGViLmFuZChbXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbihlYiksXG4gICAgICAgICAgICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uKGZ1bGxUYWJsZVNlYXJjaFBsYW4sIHtcbiAgICAgICAgICAgICAgZGlhbGVjdDogXCJwb3N0Z3Jlc1wiLFxuICAgICAgICAgICAgfSkoZWIpLFxuICAgICAgICAgIF0pXG4gICAgICA6IGFwcGxpZWRGaWx0ZXJFeHByZXNzaW9uO1xuXG4gIGNvbnN0IEFHR19OQU1FID0gXCJfX3BzX2FnZ19fXCI7XG4gIGNvbnN0IENPVU5UX1JFRiA9IFwiX19wc19jb3VudF9fXCI7XG4gIGNvbnN0IFNFQVJDSF9HVUFSRFJBSUxTX05BTUUgPSBcIl9fcHNfc2VhcmNoX2d1YXJkcmFpbHNfX1wiO1xuICBjb25zdCBzaG91bGRBcHBseVNlYXJjaEd1YXJkcmFpbHMgPVxuICAgIGlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdChmdWxsVGFibGVTZWFyY2hUZXJtKTtcbiAgaWYgKHNob3VsZEFwcGx5U2VhcmNoR3VhcmRyYWlscykge1xuICAgIHJldHVybiBjb21waWxlKFxuICAgICAgYnVpbGRlclxuICAgICAgICAud2l0aChTRUFSQ0hfR1VBUkRSQUlMU19OQU1FLCAocWIpID0+XG4gICAgICAgICAgcWIuc2VsZWN0Tm9Gcm9tKChlYikgPT4gW1xuICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgLmZuPHN0cmluZz4oXCJzZXRfY29uZmlnXCIsIFtcbiAgICAgICAgICAgICAgICBzcWwubGl0KFwic3RhdGVtZW50X3RpbWVvdXRcIiksXG4gICAgICAgICAgICAgICAgc3FsLmxpdChgJHtGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01TfW1zYCksXG4gICAgICAgICAgICAgICAgc3FsLmxpdCh0cnVlKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmFzKFwiX19wc19zdGF0ZW1lbnRfdGltZW91dF9fXCIpLFxuICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgLmZuPHN0cmluZz4oXCJzZXRfY29uZmlnXCIsIFtcbiAgICAgICAgICAgICAgICBzcWwubGl0KFwibG9ja190aW1lb3V0XCIpLFxuICAgICAgICAgICAgICAgIHNxbC5saXQoYCR7RlVMTF9UQUJMRV9TRUFSQ0hfUE9TVEdSRVNfTE9DS19USU1FT1VUX01TfW1zYCksXG4gICAgICAgICAgICAgICAgc3FsLmxpdCh0cnVlKSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgLmFzKFwiX19wc19sb2NrX3RpbWVvdXRfX1wiKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKVxuICAgICAgICAud2l0aChBR0dfTkFNRSwgKHFiKSA9PlxuICAgICAgICAgIHFiXG4gICAgICAgICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAgICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFxuICAgICAgICAgICAgICBzcWwudGFibGUoU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSkuYXMoU0VBUkNIX0dVQVJEUkFJTFNfTkFNRSksXG4gICAgICAgICAgICAgIChqYikgPT4gamIub25UcnVlKCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAuY2FzdDxCaWdJbnRTdHJpbmc+KFxuICAgICAgICAgICAgICAgICAgZWIuZm4uY29hbGVzY2UoZWIuZm4uY291bnRBbGwoKSwgc3FsLmxpdCgwKSksXG4gICAgICAgICAgICAgICAgICBcInRleHRcIixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFzKENPVU5UX1JFRiksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgICAgLnNlbGVjdEZyb20odGFibGVOYW1lKVxuICAgICAgICAuaW5uZXJKb2luKFNFQVJDSF9HVUFSRFJBSUxTX05BTUUsIChqYikgPT4gamIub25UcnVlKCkpXG4gICAgICAgIC5pbm5lckpvaW4oQUdHX05BTUUsIChqYikgPT4gamIub25UcnVlKCkpXG4gICAgICAgIC8vIFRPRE86IGN1cnNvciBwYWdpbmF0aW9uP1xuICAgICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAgIC5zZWxlY3QoXG4gICAgICAgICAgYCR7QUdHX05BTUV9LiR7Q09VTlRfUkVGfWAgc2F0aXNmaWVzIFNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb248XG4gICAgICAgICAgICB7IFtBR0dfTkFNRV06IHsgW0NPVU5UX1JFRl06IEJpZ0ludFN0cmluZyB9IH0sXG4gICAgICAgICAgICB0eXBlb2YgQUdHX05BTUVcbiAgICAgICAgICA+LFxuICAgICAgICApXG4gICAgICAgIC5zZWxlY3QoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAgIC4kY2FsbCgocWIpID0+IHtcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyLnJlZHVjZSgoY3VycmVudFF1ZXJ5LCBpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zW2l0ZW0uY29sdW1uXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjb2x1bW4/LmRhdGF0eXBlLmdyb3VwID09PSBcIm51bWVyaWNcIiAmJlxuICAgICAgICAgICAgICAhY29sdW1uLmRhdGF0eXBlLmlzQXJyYXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoXG4gICAgICAgICAgICAgICAgc3FsYGNhc3QoJHtzcWwucmVmKGl0ZW0uY29sdW1uKX0gYXMgbnVtZXJpYylgLFxuICAgICAgICAgICAgICAgIGl0ZW0uZGlyZWN0aW9uLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoaXRlbS5jb2x1bW4sIGl0ZW0uZGlyZWN0aW9uKTtcbiAgICAgICAgICB9LCBxYik7XG4gICAgICAgIH0pXG4gICAgICAgIC5saW1pdChwYWdlU2l6ZSlcbiAgICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGNvdW50UXVlcnkgPSBidWlsZGVyXG4gICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgLnNlbGVjdCgoZWIpID0+XG4gICAgICBlYlxuICAgICAgICAuY2FzdDxCaWdJbnRTdHJpbmc+KFxuICAgICAgICAgIGViLmZuLmNvYWxlc2NlKGViLmZuLmNvdW50QWxsKCksIHNxbC5saXQoMCkpLFxuICAgICAgICAgIFwidGV4dFwiLFxuICAgICAgICApXG4gICAgICAgIC5hcyhDT1VOVF9SRUYpLFxuICAgICk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoQUdHX05BTUUsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAuaW5uZXJKb2luKEFHR19OQU1FLCAoamIpID0+IGpiLm9uVHJ1ZSgpKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAuc2VsZWN0KFxuICAgICAgICBgJHtBR0dfTkFNRX0uJHtDT1VOVF9SRUZ9YCBzYXRpc2ZpZXMgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbjxcbiAgICAgICAgICB7IFtBR0dfTkFNRV06IEluZmVyUmVzdWx0PHR5cGVvZiBjb3VudFF1ZXJ5PltudW1iZXJdIH0sXG4gICAgICAgICAgdHlwZW9mIEFHR19OQU1FXG4gICAgICAgID4sXG4gICAgICApXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLiRjYWxsKChxYikgPT4ge1xuICAgICAgICByZXR1cm4gc29ydE9yZGVyLnJlZHVjZSgoY3VycmVudFF1ZXJ5LCBpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1tpdGVtLmNvbHVtbl07XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb2x1bW4/LmRhdGF0eXBlLmdyb3VwID09PSBcIm51bWVyaWNcIiAmJlxuICAgICAgICAgICAgIWNvbHVtbi5kYXRhdHlwZS5pc0FycmF5XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFF1ZXJ5Lm9yZGVyQnkoXG4gICAgICAgICAgICAgIHNxbGBjYXN0KCR7c3FsLnJlZihpdGVtLmNvbHVtbil9IGFzIG51bWVyaWMpYCxcbiAgICAgICAgICAgICAgaXRlbS5kaXJlY3Rpb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjdXJyZW50UXVlcnkub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pO1xuICAgICAgICB9LCBxYik7XG4gICAgICB9KVxuICAgICAgLmxpbWl0KHBhZ2VTaXplKVxuICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgLm9mZnNldChzcWwubGl0KEJpZ0ludChwYWdlSW5kZXgpICogQmlnSW50KHBhZ2VTaXplKSkpLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1NlbGVjdFF1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKFwiMjAyNS0wMS0yNlQyMTo1NjoxMi4zNDVaXCIpLFxuICAgICAgZGVsZXRlZF9hdDogbnVsbCxcbiAgICAgIGlkOiAxLFxuICAgICAgbmFtZTogXCJKb2huIERvZVwiLFxuICAgICAgX19wc19jb3VudF9fOiBcIjJcIixcbiAgICAgIHJvbGU6IFwiYWRtaW5cIixcbiAgICAgIG5hbWVfcm9sZTogXCJKb25uIERvZSAtIGFkbWluXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShcIjIwMjUtMDEtMjZUMjA6NTY6MTIuMzQ1WlwiKSxcbiAgICAgIGRlbGV0ZWRfYXQ6IG51bGwsXG4gICAgICBpZDogMixcbiAgICAgIG5hbWU6IFwiSmFuZSBEb2VcIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgICByb2xlOiBcInBvd2VydXNlclwiLFxuICAgICAgbmFtZV9yb2xlOiBcIkphbmUgRG9lIC0gcG93ZXJ1c2VyXCIsXG4gICAgfSxcbiAgXSBhcyBjb25zdCBzYXRpc2ZpZXMge1xuICAgIC8vIGJlc3QgZWZmb3J0IG5vIG5lZWQgdG8gZ28gb3ZlcmJvYXJkXG4gICAgW0sgaW5cbiAgICAgIHwgUmV0dXJuVHlwZTx0eXBlb2YgbW9ja1RhYmxlc1F1ZXJ5PlsxXVtcImNvbHVtbnNcIl1bbnVtYmVyXVtcIm5hbWVcIl1cbiAgICAgIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCB1cGRhdGVzIGEgZ2l2ZW4gcm93IGluIGEgdGFibGUgd2l0aCBnaXZlbiBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIHJvdyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID1cbiAgICBnZXRQb3N0Z3JlU1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGhTY2hlbWEoc2NoZW1hKVxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoXG4gICAgICAgIGFwcGx5VHJhbnNmb3JtYXRpb25zKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbnRleHQ6IFwidXBkYXRlXCIsXG4gICAgICAgICAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZXM6IGNoYW5nZXMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFtyb3ddLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfdXBkYXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBkZWxldGVzIGEgZ2l2ZW4gc2V0IG9mIHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAgIC5kZWxldGVGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfZGVsZXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpIHtcbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcigpO1xuXG4gIHJldHVybiBlYi5jYXN0PEJpZ0ludFN0cmluZz4oXG4gICAgZWIuZm4oXCJmbG9vclwiLCBbZWIoZWIuZm4oXCJleHRyYWN0XCIsIFtzcWxgZXBvY2ggZnJvbSBub3coKWBdKSwgXCIqXCIsIDFfMDAwKV0pLFxuICAgIFwidGV4dFwiLFxuICApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wb3N0Z3Jlcy5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG4vKipcbiAqIEEgcG9zdGdyZXMgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IChvciBvdGhlciBleHByZXNzaW9uKSBpbnRvIGEgSlNPTkIgYXJyYXkuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogPCEtLSBzaXRlRXhhbXBsZShcInNlbGVjdFwiLCBcIk5lc3RlZCBhcnJheVwiLCAxMTApIC0tPlxuICpcbiAqIFdoaWxlIGt5c2VseSBpcyBub3QgYW4gT1JNIGFuZCBpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2YgcmVsYXRpb25zLCB3ZSBkbyBwcm92aWRlXG4gKiBoZWxwZXJzIGZvciBmZXRjaGluZyBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzIGluIGEgc2luZ2xlIHF1ZXJ5LiBJbiB0aGlzIGV4YW1wbGUgd2VcbiAqIHVzZSB0aGUgYGpzb25BcnJheUZyb21gIGhlbHBlciB0byBmZXRjaCBwZXJzb24ncyBwZXRzIGFsb25nIHdpdGggdGhlIHBlcnNvbidzIGlkLlxuICpcbiAqIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgaGVscGVycyB1bmRlciB0aGUgYGt5c2VseS9oZWxwZXJzYCBmb2xkZXIsIGluY2x1ZGluZ1xuICogYGpzb25BcnJheUZyb21gLCBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayB3aXRoIHRoaXJkIHBhcnR5IGRpYWxlY3RzLiBJbiBvcmRlciBmb3JcbiAqIHRoZW0gdG8gd29yaywgdGhlIGRpYWxlY3QgbXVzdCBhdXRvbWF0aWNhbGx5IHBhcnNlIHRoZSBganNvbmAgZGF0YSB0eXBlIGludG9cbiAqIEphdmFTY3JpcHQgSlNPTiB2YWx1ZXMgbGlrZSBvYmplY3RzIGFuZCBhcnJheXMuIFNvbWUgZGlhbGVjdHMgbWlnaHQgc2ltcGx5IHJldHVyblxuICogdGhlIGRhdGEgYXMgYSBKU09OIHN0cmluZy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYFxuICogdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9wb3N0Z3JlcydcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25BcnJheUZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC5vcmRlckJ5KCdwZXQubmFtZScpXG4gKiAgICAgKS5hcygncGV0cycpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIChcbiAqICAgc2VsZWN0IGNvYWxlc2NlKGpzb25fYWdnKGFnZyksICdbXScpIGZyb20gKFxuICogICAgIHNlbGVjdCBcInBldFwiLlwiaWRcIiBhcyBcInBldF9pZFwiLCBcInBldFwiLlwibmFtZVwiXG4gKiAgICAgZnJvbSBcInBldFwiXG4gKiAgICAgd2hlcmUgXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICogICAgIG9yZGVyIGJ5IFwicGV0XCIuXCJuYW1lXCJcbiAqICAgKSBhcyBhZ2dcbiAqICkgYXMgXCJwZXRzXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQXJyYXlGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGNvYWxlc2NlKGpzb25fYWdnKGFnZyksICdbXScpIGZyb20gJHtleHByfSBhcyBhZ2cpYDtcbn1cbi8qKlxuICogQSBwb3N0Z3JlcyBoZWxwZXIgZm9yIHR1cm5pbmcgYSBzdWJxdWVyeSAob3Igb3RoZXIgZXhwcmVzc2lvbikgaW50byBhIEpTT04gb2JqZWN0LlxuICpcbiAqIFRoZSBzdWJxdWVyeSBtdXN0IG9ubHkgcmV0dXJuIG9uZSByb3cuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogPCEtLSBzaXRlRXhhbXBsZShcInNlbGVjdFwiLCBcIk5lc3RlZCBvYmplY3RcIiwgMTIwKSAtLT5cbiAqXG4gKiBXaGlsZSBreXNlbHkgaXMgbm90IGFuIE9STSBhbmQgaXQgZG9lc24ndCBoYXZlIHRoZSBjb25jZXB0IG9mIHJlbGF0aW9ucywgd2UgZG8gcHJvdmlkZVxuICogaGVscGVycyBmb3IgZmV0Y2hpbmcgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5cyBpbiBhIHNpbmdsZSBxdWVyeS4gSW4gdGhpcyBleGFtcGxlIHdlXG4gKiB1c2UgdGhlIGBqc29uT2JqZWN0RnJvbWAgaGVscGVyIHRvIGZldGNoIHBlcnNvbidzIGZhdm9yaXRlIHBldCBhbG9uZyB3aXRoIHRoZSBwZXJzb24ncyBpZC5cbiAqXG4gKiBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGhlbHBlcnMgdW5kZXIgdGhlIGBreXNlbHkvaGVscGVyc2AgZm9sZGVyLCBpbmNsdWRpbmdcbiAqIGBqc29uT2JqZWN0RnJvbWAsIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGggdGhpcmQtcGFydHkgZGlhbGVjdHMuIEluIG9yZGVyIGZvclxuICogdGhlbSB0byB3b3JrLCB0aGUgZGlhbGVjdCBtdXN0IGF1dG9tYXRpY2FsbHkgcGFyc2UgdGhlIGBqc29uYCBkYXRhIHR5cGUgaW50b1xuICogSmF2YVNjcmlwdCBKU09OIHZhbHVlcyBsaWtlIG9iamVjdHMgYW5kIGFycmF5cy4gU29tZSBkaWFsZWN0cyBtaWdodCBzaW1wbHkgcmV0dXJuXG4gKiB0aGUgZGF0YSBhcyBhIEpTT04gc3RyaW5nLiBJbiB0aGVzZSBjYXNlcyB5b3UgY2FuIHVzZSB0aGUgYnVpbHQgaW4gYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gXG4gKiB0byBwYXJzZSB0aGUgcmVzdWx0cy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsganNvbk9iamVjdEZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9wb3N0Z3JlcydcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25PYmplY3RGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAud2hlcmUoJ3BldC5pc19mYXZvcml0ZScsICc9JywgdHJ1ZSlcbiAqICAgICApLmFzKCdmYXZvcml0ZV9wZXQnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gKlxuICogYGBgc3FsXG4gKiBzZWxlY3QgXCJpZFwiLCAoXG4gKiAgIHNlbGVjdCB0b19qc29uKG9iaikgZnJvbSAoXG4gKiAgICAgc2VsZWN0IFwicGV0XCIuXCJpZFwiIGFzIFwicGV0X2lkXCIsIFwicGV0XCIuXCJuYW1lXCJcbiAqICAgICBmcm9tIFwicGV0XCJcbiAqICAgICB3aGVyZSBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gKiAgICAgYW5kIFwicGV0XCIuXCJpc19mYXZvcml0ZVwiID0gJDFcbiAqICAgKSBhcyBvYmpcbiAqICkgYXMgXCJmYXZvcml0ZV9wZXRcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25PYmplY3RGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IHRvX2pzb24ob2JqKSBmcm9tICR7ZXhwcn0gYXMgb2JqKWA7XG59XG4vKipcbiAqIFRoZSBQb3N0Z3JlU1FMIGBqc29uX2J1aWxkX29iamVjdGAgZnVuY3Rpb24uXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYFBvc3RncmVzRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgUG9zdGdyZVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB7IGpzb25CdWlsZE9iamVjdCB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBzcWw8c3RyaW5nPmBmaXJzdF9uYW1lIHx8XHUwMEEwJyAnIHx8IGxhc3RfbmFtZWBcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwganNvbl9idWlsZF9vYmplY3QoXG4gKiAgICdmaXJzdCcsIGZpcnN0X25hbWUsXG4gKiAgICdsYXN0JywgbGFzdF9uYW1lLFxuICogICAnZnVsbCcsIGZpcnN0X25hbWUgfHwgJyAnIHx8IGxhc3RfbmFtZVxuICogKSBhcyBcIm5hbWVcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25CdWlsZE9iamVjdChvYmopIHtcbiAgICByZXR1cm4gc3FsIGBqc29uX2J1aWxkX29iamVjdCgke3NxbC5qb2luKE9iamVjdC5rZXlzKG9iaikuZmxhdE1hcCgoaykgPT4gW3NxbC5saXQoayksIG9ialtrXV0pKX0pYDtcbn1cbi8qKlxuICogVGhlIFBvc3RncmVTUUwgYG1lcmdlX2FjdGlvbmAgZnVuY3Rpb24uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhIGByZXR1cm5pbmdgIGNsYXVzZSB0byBnZXQgdGhlIGFjdGlvbiB0aGF0IHdhc1xuICogcGVyZm9ybWVkIGluIGEgYG1lcmdlSW50b2AgcXVlcnkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiB0aGUgZm9sbG93aW5nXG4gKiBzdHJpbmdzOiBgJ0lOU0VSVCdgLCBgJ1VQREFURSdgLCBvciBgJ0RFTEVURSdgLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtZXJnZUFjdGlvbiB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5tZXJnZUludG8oJ3BlcnNvbiBhcyBwJylcbiAqICAgLnVzaW5nKCdwZXJzb25fYmFja3VwIGFzIHBiJywgJ3AuaWQnLCAncGIuaWQnKVxuICogICAud2hlbk1hdGNoZWQoKVxuICogICAudGhlblVwZGF0ZVNldCgoeyByZWYgfSkgPT4gKHtcbiAqICAgICBmaXJzdF9uYW1lOiByZWYoJ3BiLmZpcnN0X25hbWUnKSxcbiAqICAgICB1cGRhdGVkX2F0OiByZWYoJ3BiLnVwZGF0ZWRfYXQnKS4kY2FzdFRvPHN0cmluZyB8IG51bGw+KCksXG4gKiAgIH0pKVxuICogICAud2hlbk5vdE1hdGNoZWQoKVxuICogICAudGhlbkluc2VydFZhbHVlcygoeyByZWZ9KSA9PiAoe1xuICogICAgIGlkOiByZWYoJ3BiLmlkJyksXG4gKiAgICAgZmlyc3RfbmFtZTogcmVmKCdwYi5maXJzdF9uYW1lJyksXG4gKiAgICAgY3JlYXRlZF9hdDogcmVmKCdwYi51cGRhdGVkX2F0JyksXG4gKiAgICAgdXBkYXRlZF9hdDogcmVmKCdwYi51cGRhdGVkX2F0JykuJGNhc3RUbzxzdHJpbmcgfCBudWxsPigpLFxuICogICB9KSlcbiAqICAgLnJldHVybmluZyhbbWVyZ2VBY3Rpb24oKS5hcygnYWN0aW9uJyksICdwLmlkJywgJ3AudXBkYXRlZF9hdCddKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdLmFjdGlvblxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogbWVyZ2UgaW50byBcInBlcnNvblwiIGFzIFwicFwiXG4gKiB1c2luZyBcInBlcnNvbl9iYWNrdXBcIiBhcyBcInBiXCIgb24gXCJwXCIuXCJpZFwiID0gXCJwYlwiLlwiaWRcIlxuICogd2hlbiBtYXRjaGVkIHRoZW4gdXBkYXRlIHNldFxuICogICBcImZpcnN0X25hbWVcIiA9IFwicGJcIi5cImZpcnN0X25hbWVcIixcbiAqICAgXCJ1cGRhdGVkX2F0XCIgPSBcInBiXCIuXCJ1cGRhdGVkX2F0XCI6OnRleHRcbiAqIHdoZW4gbm90IG1hdGNoZWQgdGhlbiBpbnNlcnQgdmFsdWVzIChcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImNyZWF0ZWRfYXRcIiwgXCJ1cGRhdGVkX2F0XCIpXG4gKiB2YWx1ZXMgKFwicGJcIi5cImlkXCIsIFwicGJcIi5cImZpcnN0X25hbWVcIiwgXCJwYlwiLlwidXBkYXRlZF9hdFwiLCBcInBiXCIuXCJ1cGRhdGVkX2F0XCIpXG4gKiByZXR1cm5pbmcgbWVyZ2VfYWN0aW9uKCkgYXMgXCJhY3Rpb25cIiwgXCJwXCIuXCJpZFwiLCBcInBcIi5cInVwZGF0ZWRfYXRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFjdGlvbigpIHtcbiAgICByZXR1cm4gc3FsIGBtZXJnZV9hY3Rpb24oKWA7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBTZWxlY3RRdWVyeUJ1aWxkZXIsIHNxbCB9IGZyb20gXCJreXNlbHlcIjtcbmltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tIFwia3lzZWx5L2hlbHBlcnMvcG9zdGdyZXNcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBjb21waWxlLCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBnZXRQb3N0Z3JlU1FMQnVpbGRlciB9IGZyb20gXCIuL2J1aWxkZXJcIjtcblxuY29uc3QgUkVHVUxBUl9UQUJMRV9LSU5EID0gXCJyXCI7XG5jb25zdCBWSUVXX1RBQkxFX0tJTkQgPSBcInZcIjtcbmNvbnN0IFRBQkxFX0tJTkRTID0gW1JFR1VMQVJfVEFCTEVfS0lORCwgVklFV19UQUJMRV9LSU5EXSBhcyBjb25zdDtcbnR5cGUgVGFibGVLaW5kID0gKHR5cGVvZiBUQUJMRV9LSU5EUylbbnVtYmVyXTtcblxuaW50ZXJmYWNlIERhdGFiYXNlIHtcbiAgLyoqIGNvbHVtbiBkZWZhdWx0cyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmRlZlwiOiB7XG4gICAgLyoqIGRlZmF1bHQgZXhwcmVzc2lvbiBhcyBhIG5vZGUgdHJlZSwgdXNlIHBnX2dldF9leHByKGFkYmluLCBhZHJlbGlkKSAqL1xuICAgIGFkYmluOiBzdHJpbmc7XG4gICAgLyoqIGNvbHVtbiBudW1iZXIgKi9cbiAgICBhZG51bTogbnVtYmVyO1xuICAgIC8qKiB0YWJsZSBpZGVudGlmaWVyICovXG4gICAgYWRyZWxpZDogbnVtYmVyO1xuICB9O1xuICAvKiogY29sdW1ucyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmlidXRlXCI6IHtcbiAgICAvKipcbiAgICAgKiBnZW5lcmF0aW9uIGZsYWcgZm9yIGNvbXB1dGVkIGNvbHVtbnM6XG4gICAgICogJycgKGVtcHR5KSBmb3IgcmVndWxhciBjb2x1bW5zLFxuICAgICAqICdzJyBmb3IgU1RPUkVEIGdlbmVyYXRlZCBjb2x1bW5zIChQb3N0Z3JlcyBHRU5FUkFURUQgQUxXQVlTIEFTKS5cbiAgICAgKi9cbiAgICBhdHRnZW5lcmF0ZWQ6IFwiXCIgfCBcInNcIjtcbiAgICAvKipcbiAgICAgKiBpZGVudGl0eSBjb2x1bW4gZmxhZzpcbiAgICAgKiAnJyAoZW1wdHkpIGZvciByZWd1bGFyIGNvbHVtbnMsXG4gICAgICogJ2EnIGZvciBBTFdBWVMgKEdFTkVSQVRFRCBBTFdBWVMgQVMgSURFTlRJVFkpLFxuICAgICAqICdkJyBmb3IgQlkgREVGQVVMVCAoR0VORVJBVEVEIEJZIERFRkFVTFQgQVMgSURFTlRJVFkpLlxuICAgICAqL1xuICAgIGF0dGlkZW50aXR5OiBcIlwiIHwgXCJhXCIgfCBcImRcIjtcbiAgICAvKiogd2FzIHRoZSBjb2x1bW4gZHJvcHBlZC4gZHJvcHBlZCBjb2x1bW5zIG1pZ2h0IG5vdCBiZSAxMDAlIHJlbW92ZWQgaW1tZWRpYXRlbHkuICovXG4gICAgYXR0aXNkcm9wcGVkOiBib29sZWFuO1xuICAgIC8qKiBjb2x1bW4gbmFtZSAqL1xuICAgIGF0dG5hbWU6IHN0cmluZztcbiAgICAvKiogTk9UIE5VTEwgY29uc3RyYWludDogdHJ1ZSBpZiB0aGUgY29sdW1uIGhhcyBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgKi9cbiAgICBhdHRub3RudWxsOiBib29sZWFuO1xuICAgIC8qKiBjb2x1bW4gb3JkZXIgbnVtYmVyIGluIGl0cyB0YWJsZSAqL1xuICAgIGF0dG51bTogbnVtYmVyO1xuICAgIC8qKiB0YWJsZS92aWV3IGlkZW50aWZpZXIgKi9cbiAgICBhdHRyZWxpZDogc3RyaW5nO1xuICAgIC8qKiBjb2x1bW4gZGF0YXR5cGUgaWRlbnRpZmllciAqL1xuICAgIGF0dHR5cGlkOiBzdHJpbmc7XG4gIH07XG4gIC8qKiByZXNvdXJjZXMsIGUuZy4gdGFibGVzLCBzZXF1ZW5jZXMsIGV0Yy4gKi9cbiAgXCJwZ19jYXRhbG9nLnBnX2NsYXNzXCI6IHtcbiAgICAvKiogcmVzb3VyY2UgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogcmVzb3VyY2Uga2luZDogcmVndWxhciB0YWJsZSwgdmlldyAqL1xuICAgIHJlbGtpbmQ6IFRhYmxlS2luZDtcbiAgICAvKiogcmVzb3VyY2UgbmFtZSAqL1xuICAgIHJlbG5hbWU6IHN0cmluZztcbiAgICAvKiogc2NoZW1hIGlkICovXG4gICAgcmVsbmFtZXNwYWNlOiBudW1iZXI7XG4gIH07XG4gIC8qKiBjb25zdHJhaW50cyAqL1xuICBcInBnX2NhdGFsb2cucGdfY29uc3RyYWludFwiOiB7XG4gICAgLyoqIGlmIGEgZm9yZWlnbiBrZXksIHRoZSByZWZlcmVuY2VkIGNvbHVtbnMgKi9cbiAgICBjb25ma2V5OiBudW1iZXJbXTtcbiAgICAvKiogaWYgYSBmb3JlaWduIGtleSwgdGhlIHJlZmVyZW5jZWQgdGFibGUgKi9cbiAgICBjb25mcmVsaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBhbiBvcmRlcmVkIGFycmF5IG9mIGNvbHVtbnMgaW5jbHVkZWQgaW4gdGhlIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiB0aGUgY29sdW1ucyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlaXIgb3JkaW5hbCBudW1iZXIgKGBhdHRudW1gKSBpbiB0aGVpciByZWxhdGlvbiAodGFibGUpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgYCd7MSwzfSdgIC0gYSBjb25zdHJhaW50IHdpdGggMiBjb2x1bW5zLCB0aGUgMXN0ICYgM3JkIGluIHRoZWlyIHRhYmxlLlxuICAgICAqL1xuICAgIGNvbmtleTogbnVtYmVyW107XG4gICAgLyoqIHJlbGF0aW9uICh0YWJsZSkgaWQgd2hpY2ggdGhpcyBjb25zdHJhaW50IHdhcyBjcmVhdGVkIGZvciAqL1xuICAgIGNvbnJlbGlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogY29uc3RyYWludCB0eXBlLlxuICAgICAqXG4gICAgICogYCdwJ2AgLSBwcmltYXJ5IGtleSBjb25zdHJhaW50LlxuICAgICAqIGAnZidgIC0gZm9yZWlnbiBrZXkgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBjb250eXBlOiBcInBcIiB8IFwiZlwiIHwgKHN0cmluZyAmIHt9KTtcbiAgfTtcbiAgLyoqIGVudW0gdHlwZXMnIHZhbHVlcyAqL1xuICBcInBnX2NhdGFsb2cucGdfZW51bVwiOiB7XG4gICAgLyoqIGVudW0gdmFsdWUgKi9cbiAgICBlbnVtbGFiZWw6IHN0cmluZztcbiAgICAvKiogZW51bSdzIHR5cGUgaWQgKi9cbiAgICBlbnVtdHlwaWQ6IG51bWJlcjtcbiAgfTtcbiAgLyoqIHNjaGVtYXMgKi9cbiAgXCJwZ19jYXRhbG9nLnBnX25hbWVzcGFjZVwiOiB7XG4gICAgLyoqIHNjaGVtYSBuYW1lICovXG4gICAgbnNwbmFtZTogc3RyaW5nO1xuICAgIC8qKiBzY2hlbWEgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgfTtcbiAgLyoqIGRhdGF0eXBlcyAqL1xuICBcInBnX2NhdGFsb2cucGdfdHlwZVwiOiB7XG4gICAgLyoqIHR5cGUgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogdHlwZSBuYW1lICovXG4gICAgdHlwbmFtZTogc3RyaW5nO1xuICAgIC8qKiB0eXBlJ3Mgc2NoZW1hIChha2EgbmFtZXNwYWNlKSBpZCAqL1xuICAgIHR5cG5hbWVzcGFjZTogbnVtYmVyO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IHJldHVybnMgbWV0YWRhdGEgZm9yIGFsbCB1c2VyLWRlZmluZWQgdGFibGVzIGFuZCB2aWV3cyBpbiB0aGUgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZXNRdWVyeShcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICByZXR1cm4gY29tcGlsZShcbiAgICBnZXRQb3N0Z3JlU1FMQnVpbGRlcjxEYXRhYmFzZT4ocmVxdWlyZW1lbnRzKVxuICAgICAgLnNlbGVjdEZyb20oXCJwZ19jYXRhbG9nLnBnX2NsYXNzIGFzIGNsc1wiKVxuICAgICAgLmlubmVySm9pbihcInBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGFzIG5zXCIsIFwiY2xzLnJlbG5hbWVzcGFjZVwiLCBcIm5zLm9pZFwiKVxuICAgICAgLiRjYWxsKGV4Y2x1ZGVTeXN0ZW1UYWJsZXMpXG4gICAgICAvLyByZWd1bGFyIHRhYmxlcyBvciB2aWV3c1xuICAgICAgLndoZXJlKFwiY2xzLnJlbGtpbmRcIiwgXCJpblwiLCBUQUJMRV9LSU5EUylcbiAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgIFwibnMubnNwbmFtZSBhcyBzY2hlbWFcIixcbiAgICAgICAgXCJjbHMucmVsbmFtZSBhcyBuYW1lXCIsXG4gICAgICAgIGpzb25BcnJheUZyb20oXG4gICAgICAgICAgZWJcbiAgICAgICAgICAgIC5zZWxlY3RGcm9tKFwicGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYXMgYXR0XCIpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFwicGdfY2F0YWxvZy5wZ190eXBlIGFzIHR5cFwiLCBcInR5cC5vaWRcIiwgXCJhdHQuYXR0dHlwaWRcIilcbiAgICAgICAgICAgIC5pbm5lckpvaW4oXG4gICAgICAgICAgICAgIFwicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgYXMgdG5zXCIsXG4gICAgICAgICAgICAgIFwidG5zLm9pZFwiLFxuICAgICAgICAgICAgICBcInR5cC50eXBuYW1lc3BhY2VcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5sZWZ0Sm9pbihcInBnX2NhdGFsb2cucGdfY29uc3RyYWludCBhcyBwa19jb25cIiwgKGpiKSA9PlxuICAgICAgICAgICAgICBqYlxuICAgICAgICAgICAgICAgIC5vbihcInBrX2Nvbi5jb250eXBlXCIsIFwiPVwiLCBcInBcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJwa19jb24uY29ucmVsaWRcIiwgXCI9XCIsIFwiY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC5vbigoZWIpID0+IGViKFwiYXR0LmF0dG51bVwiLCBcIj1cIiwgZWIuZm4uYW55KFwicGtfY29uLmNvbmtleVwiKSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19jb25zdHJhaW50IGFzIGZrX2NvblwiLCAoamIpID0+XG4gICAgICAgICAgICAgIGpiXG4gICAgICAgICAgICAgICAgLm9uKFwiZmtfY29uLmNvbnR5cGVcIiwgXCI9XCIsIFwiZlwiKVxuICAgICAgICAgICAgICAgIC5vblJlZihcImZrX2Nvbi5jb25yZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAgICAgLm9uKChlYikgPT4gZWIoXCJhdHQuYXR0bnVtXCIsIFwiPVwiLCBlYi5mbi5hbnkoXCJma19jb24uY29ua2V5XCIpKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXG4gICAgICAgICAgICAgIFwicGdfY2F0YWxvZy5wZ19jbGFzcyBhcyBma19jbHNcIixcbiAgICAgICAgICAgICAgXCJma19jbHMub2lkXCIsXG4gICAgICAgICAgICAgIFwiZmtfY29uLmNvbmZyZWxpZFwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFxuICAgICAgICAgICAgICBcInBnX2NhdGFsb2cucGdfbmFtZXNwYWNlIGFzIGZrX25zXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMub2lkXCIsXG4gICAgICAgICAgICAgIFwiZmtfY2xzLnJlbG5hbWVzcGFjZVwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19hdHRyaWJ1dGUgYXMgZmtfYXR0XCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJma19hdHQuYXR0cmVsaWRcIiwgXCI9XCIsIFwiZmtfY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC8vIFVzZSBhIGNhbGxiYWNrIGZvciB0aGUgLm9uKCkgY29uZGl0aW9uIHRvIGVuc3VyZSBjb3JyZWN0IGNvbnRleHQgZm9yIHR5cGVzXG4gICAgICAgICAgICAgICAgLm9uKChvbl9lYikgPT5cbiAgICAgICAgICAgICAgICAgIG9uX2ViKFwiZmtfYXR0LmF0dG51bVwiLCBcIj1cIiwgb25fZWIuZm4uYW55KFwiZmtfY29uLmNvbmZrZXlcIikpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJwZ19jYXRhbG9nLnBnX2F0dHJkZWYgYXMgZGVmXCIsIChqYikgPT5cbiAgICAgICAgICAgICAgamJcbiAgICAgICAgICAgICAgICAub25SZWYoXCJkZWYuYWRyZWxpZFwiLCBcIj1cIiwgXCJhdHQuYXR0cmVsaWRcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJkZWYuYWRudW1cIiwgXCI9XCIsIFwiYXR0LmF0dG51bVwiKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC53aGVyZVJlZihcImF0dC5hdHRyZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAvLyBleGNsdWRlIHN5c3RlbSBjb2x1bW5zXG4gICAgICAgICAgICAud2hlcmUoXCJhdHQuYXR0bnVtXCIsIFwiPj1cIiwgMClcbiAgICAgICAgICAgIC53aGVyZShcImF0dC5hdHRpc2Ryb3BwZWRcIiwgXCIhPVwiLCB0cnVlKVxuICAgICAgICAgICAgLnNlbGVjdChbXG4gICAgICAgICAgICAgIFwiYXR0LmF0dG5hbWUgYXMgbmFtZVwiLFxuICAgICAgICAgICAgICBcImZrX2F0dC5hdHRuYW1lIGFzIGZrX2NvbHVtblwiLFxuICAgICAgICAgICAgICBcImZrX2Nscy5yZWxuYW1lIGFzIGZrX3RhYmxlXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMubnNwbmFtZSBhcyBma19zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJ0bnMubnNwbmFtZSBhcyBkYXRhdHlwZV9zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJ0eXAudHlwbmFtZSBhcyBkYXRhdHlwZVwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgICAgICAgIGViKFwiYXR0LmF0dGlkZW50aXR5XCIsIFwiIT1cIiwgXCJcIilcbiAgICAgICAgICAgICAgICAub3IoXG4gICAgICAgICAgICAgICAgICBlYihcImRlZi5hZGJpblwiLCBcImlzIG5vdFwiLCBudWxsKS5hbmQoXG4gICAgICAgICAgICAgICAgICAgIGViLmZuKFwicGdfZ2V0X2V4cHJcIiwgW1wiZGVmLmFkYmluXCIsIFwiZGVmLmFkcmVsaWRcIl0pLFxuICAgICAgICAgICAgICAgICAgICBcImxpa2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJuZXh0dmFsKCVcIixcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC4kY2FzdFRvPGJvb2xlYW4+KClcbiAgICAgICAgICAgICAgICAuYXMoXCJhdXRvaW5jXCIpLFxuICAgICAgICAgICAgICBlYihcImF0dC5hdHRnZW5lcmF0ZWRcIiwgXCIhPVwiLCBcIlwiKVxuICAgICAgICAgICAgICAgIC4kY2FzdFRvPGJvb2xlYW4+KClcbiAgICAgICAgICAgICAgICAuYXMoXCJjb21wdXRlZFwiKSxcbiAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAuZm48c3RyaW5nIHwgbnVsbD4oXCJwZ19nZXRfZXhwclwiLCBbXCJkZWYuYWRiaW5cIiwgXCJkZWYuYWRyZWxpZFwiXSlcbiAgICAgICAgICAgICAgICAuYXMoXCJkZWZhdWx0XCIpLFxuICAgICAgICAgICAgICBlYihcImF0dC5hdHRub3RudWxsXCIsIFwiIT1cIiwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAuJGNhc3RUbzxib29sZWFuPigpXG4gICAgICAgICAgICAgICAgLmFzKFwibnVsbGFibGVcIiksXG4gICAgICAgICAgICAgIGViLmZuXG4gICAgICAgICAgICAgICAgLmNvYWxlc2NlKFxuICAgICAgICAgICAgICAgICAgZWJcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEZyb20oXCJwZ19jYXRhbG9nLnBnX2VudW0gYXMgZW5tXCIpXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZVJlZihcImVubS5lbnVtdHlwaWRcIiwgXCI9XCIsIFwidHlwLm9pZFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgICAgICAgICAgICAgICBlYi5mbi5qc29uQWdnKGViLnJlZihcImVubS5lbnVtbGFiZWxcIikpLmFzKFwib1wiKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHNxbDxzdHJpbmdbXT5gJ1tdJ2AsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5hcyhcIm9wdGlvbnNcIiksXG4gICAgICAgICAgICAgIGViXG4gICAgICAgICAgICAgICAgLmZuPFxuICAgICAgICAgICAgICAgICAgbnVtYmVyIHwgbnVsbFxuICAgICAgICAgICAgICAgID4oXCJhcnJheV9wb3NpdGlvblwiLCBbXCJwa19jb24uY29ua2V5XCIsIFwiYXR0LmF0dG51bVwiXSlcbiAgICAgICAgICAgICAgICAuYXMoXCJwa1wiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApLmFzKFwiY29sdW1uc1wiKSxcbiAgICAgIF0pLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RhYmxlc1F1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHNjaGVtYTogXCJ6b29cIixcbiAgICAgIG5hbWU6IFwiYW5pbWFsc1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogdHJ1ZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiaW50NFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJuZXh0dmFsKCd6b28uYW5pbWFsc19pZF9zZXEnOjpyZWdjbGFzcylcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNjaGVtYTogXCJwdWJsaWNcIixcbiAgICAgIG5hbWU6IFwidXNlcnNcIixcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmM6IHRydWUsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludDRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwibmV4dHZhbCgndXNlcnNfaWRfc2VxJzo6cmVnY2xhc3MpXCIsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgZGF0YXR5cGVfc2NoZW1hOiBcInBnX2NhdGFsb2dcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJkZWxldGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhclwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwicm9sZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmM6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiB0cnVlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVfcm9sZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzY2hlbWE6IFwicHVibGljXCIsXG4gICAgICBuYW1lOiBcImNvbXBvc2l0ZV9wa1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInV1aWRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgIGRlZmF1bHQ6IFwiZ2VuX3JhbmRvbV91dWlkKClcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIHBrOiAyLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luYzogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRpbWVzdGFtcFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJub3coKVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma19zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCB0aW1lem9uZSBzZXR0aW5nIG9mIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVRdWVyeSgpIHtcbiAgY29uc3QgYnVpbGRlciA9IGdldFBvc3RncmVTUUxCdWlsZGVyKCk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlci5zZWxlY3ROb0Zyb20oXG4gICAgICBidWlsZGVyXG4gICAgICAgIC5mbjxzdHJpbmc+KFwiY3VycmVudF9zZXR0aW5nXCIsIFtzcWwubGl0KFwidGltZXpvbmVcIildKVxuICAgICAgICAuYXMoXCJ0aW1lem9uZVwiKSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1RpbWV6b25lUXVlcnkoKSB7XG4gIHJldHVybiBbeyB0aW1lem9uZTogXCJVVENcIiB9XSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8XG4gICAgdHlwZW9mIGdldFRpbWV6b25lUXVlcnlcbiAgPjtcbn1cblxuLyoqXG4gKiBXZSBkb24ndCB3YW50IFBvc3RncmVTUUwgaW50ZXJuYWxzIGluIGludHJvc3BlY3Rpb24gcmVzdWx0cy4gVG8gYmUgdXNlZCBpbiBgJGNhbGxgLlxuICovXG5mdW5jdGlvbiBleGNsdWRlU3lzdGVtVGFibGVzPFxuICBUIGV4dGVuZHMgU2VsZWN0UXVlcnlCdWlsZGVyPFxuICAgIERhdGFiYXNlICYge1xuICAgICAgbnM6IERhdGFiYXNlW1wicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2VcIl07XG4gICAgICBjbHM6IERhdGFiYXNlW1wicGdfY2F0YWxvZy5wZ19jbGFzc1wiXTtcbiAgICB9LFxuICAgIFwibnNcIiB8IFwiY2xzXCIsXG4gICAgb2JqZWN0XG4gID4sXG4+KHFiOiBUKTogVCB7XG4gIHJldHVybiBxYlxuICAgIC53aGVyZShgbnMubnNwbmFtZWAsIGAhfmAsIGBecGdfYClcbiAgICAud2hlcmUoYG5zLm5zcG5hbWVgLCBgIT1gLCBgaW5mb3JtYXRpb25fc2NoZW1hYCkgYXMgbmV2ZXI7XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICB0eXBlIEFkYXB0ZXJEZWxldGVSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckVycm9yLFxuICB0eXBlIEFkYXB0ZXJJbnNlcnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJSYXdEZXRhaWxzLFxuICB0eXBlIEFkYXB0ZXJSYXdSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclJlcXVpcmVtZW50cyxcbiAgdHlwZSBBZGFwdGVyU3FsTGludERldGFpbHMsXG4gIHR5cGUgQWRhcHRlclNxbExpbnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclNxbFNjaGVtYVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyVXBkYXRlTWFueVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyVXBkYXRlUmVzdWx0LFxuICB0eXBlIENvbHVtbixcbiAgY3JlYXRlQWRhcHRlckVycm9yLFxuICB0eXBlIEZpbHRlck9wZXJhdG9yLFxuICB0eXBlIFRhYmxlLFxufSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlRnVsbFRhYmxlU2VhcmNoRXhlY3V0aW9uU3RhdGUsXG4gIGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzLFxufSBmcm9tIFwiLi4vZnVsbC10YWJsZS1zZWFyY2hcIjtcbmltcG9ydCB7IGFzUXVlcnksIHR5cGUgUXVlcnksIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBjcmVhdGVTcWxFZGl0b3JTY2hlbWFGcm9tSW50cm9zcGVjdGlvbiB9IGZyb20gXCIuLi9zcWwtZWRpdG9yLXNjaGVtYVwiO1xuaW1wb3J0IHR5cGUgeyBFaXRoZXIgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIH0gZnJvbSBcIi4vZGF0YXR5cGVcIjtcbmltcG9ydCB7XG4gIGdldERlbGV0ZVF1ZXJ5LFxuICBnZXRJbnNlcnRRdWVyeSxcbiAgZ2V0U2VsZWN0UXVlcnksXG4gIGdldFVwZGF0ZVF1ZXJ5LFxufSBmcm9tIFwiLi9kbWxcIjtcbmltcG9ydCB7XG4gIGdldFRhYmxlc1F1ZXJ5LFxuICBnZXRUaW1lem9uZVF1ZXJ5LFxuICBtb2NrVGFibGVzUXVlcnksXG4gIG1vY2tUaW1lem9uZVF1ZXJ5LFxufSBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5pbXBvcnQge1xuICBjcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcixcbiAgdmFsaWRhdGVTcWxGb3JMaW50LFxufSBmcm9tIFwiLi9zcWwtbGludFwiO1xuXG5leHBvcnQgdHlwZSBQb3N0Z3Jlc0FkYXB0ZXJSZXF1aXJlbWVudHMgPSBBZGFwdGVyUmVxdWlyZW1lbnRzO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9zdGdyZXNBZGFwdGVyKFxuICByZXF1aXJlbWVudHM6IFBvc3RncmVzQWRhcHRlclJlcXVpcmVtZW50cyxcbik6IEFkYXB0ZXIge1xuICBjb25zdCB7IGV4ZWN1dG9yLCAuLi5vdGhlclJlcXVpcmVtZW50cyB9ID0gcmVxdWlyZW1lbnRzO1xuICBjb25zdCBmdWxsVGFibGVTZWFyY2hTdGF0ZSA9IGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlKCk7XG4gIGxldCBjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgPSB0eXBlb2YgZXhlY3V0b3IubGludFNxbCA9PT0gXCJmdW5jdGlvblwiO1xuICBjb25zdCBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvciA9IChcbiAgICBhcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBjcmVhdGVBZGFwdGVyRXJyb3I+WzBdLFxuICApID0+IGNyZWF0ZUFkYXB0ZXJFcnJvcih7IC4uLmFyZ3MsIGFkYXB0ZXJTb3VyY2U6IFwicG9zdGdyZXNxbFwiIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVVcGRhdGVUcmFuc2FjdGlvbihcbiAgICB1cGRhdGVzOiBBZGFwdGVyVXBkYXRlRGV0YWlsc1tdLFxuICAgIG9wdGlvbnM6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8QWRhcHRlcltcInVwZGF0ZVwiXT4+WzFdLFxuICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJVcGRhdGVNYW55UmVzdWx0Pj4ge1xuICAgIGNvbnN0IHF1ZXJpZXMgPSB1cGRhdGVzLm1hcCgodXBkYXRlKSA9PlxuICAgICAgZ2V0VXBkYXRlUXVlcnkodXBkYXRlLCBvdGhlclJlcXVpcmVtZW50cyksXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIGV4ZWN1dG9yLmV4ZWN1dGVUcmFuc2FjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0c10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgcXVlcmllcyxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeTogcXVlcmllc1swXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvd3M6IEFkYXB0ZXJVcGRhdGVSZXN1bHRbXCJyb3dcIl1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCByZXN1bHRdIG9mIHJlc3VsdHMuZW50cmllcygpKSB7XG4gICAgICAgICAgY29uc3QgW3Jvd10gPSByZXN1bHQ7XG5cbiAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlVwZGF0ZSBmYWlsZWRcIiksXG4gICAgICAgICAgICAgIHF1ZXJ5OiBxdWVyaWVzW2luZGV4XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvd3MucHVzaChyb3cgYXMgQWRhcHRlclVwZGF0ZVJlc3VsdFtcInJvd1wiXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93cywgcXVlcmllcyB9XTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93czogQWRhcHRlclVwZGF0ZVJlc3VsdFtcInJvd1wiXVtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBxdWVyeV0gb2YgcXVlcmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtyb3ddID0gcmVzdWx0cztcblxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiVXBkYXRlIGZhaWxlZFwiKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyaWVzW2luZGV4XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd3MucHVzaChyb3cgYXMgQWRhcHRlclVwZGF0ZVJlc3VsdFtcInJvd1wiXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbbnVsbCwgeyByb3dzLCBxdWVyaWVzIH1dO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gY3JlYXRlUG9zdGdyZXNBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW50cm9zcGVjdERhdGFiYXNlKFxuICAgIG9wdGlvbnM6IFBhcmFtZXRlcnM8QWRhcHRlcltcImludHJvc3BlY3RcIl0+WzBdLFxuICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YWJsZXNRdWVyeSA9IGdldFRhYmxlc1F1ZXJ5KG90aGVyUmVxdWlyZW1lbnRzKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lUXVlcnkgPSBnZXRUaW1lem9uZVF1ZXJ5KCk7XG5cbiAgICAgIGNvbnN0IFtbdGFibGVzRXJyb3IsIHRhYmxlc10sIFt0aW1lem9uZUVycm9yLCB0aW1lem9uZXNdXSA9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhYmxlc1F1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgICBleGVjdXRvci5leGVjdXRlKHRpbWV6b25lUXVlcnksIG9wdGlvbnMpLFxuICAgICAgICBdKTtcblxuICAgICAgaWYgKHRhYmxlc0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgZXJyb3I6IHRhYmxlc0Vycm9yLFxuICAgICAgICAgIHF1ZXJ5OiB0YWJsZXNRdWVyeSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWV6b25lID0gdGltZXpvbmVFcnJvclxuICAgICAgICA/IFwiVVRDXCJcbiAgICAgICAgOiAodGltZXpvbmVzWzBdPy50aW1lem9uZSA/PyBcIlVUQ1wiKTtcblxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY3JlYXRlSW50cm9zcGVjdGlvbih7IHF1ZXJ5OiB0YWJsZXNRdWVyeSwgdGFibGVzLCB0aW1lem9uZSB9KSxcbiAgICAgIF07XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRlZmF1bHRTY2hlbWE6IFwicHVibGljXCIsXG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICBmdWxsVGFibGVTZWFyY2g6IHRydWUsXG4gICAgICBzcWxEaWFsZWN0OiBcInBvc3RncmVzcWxcIixcbiAgICAgIHNxbEVkaXRvckF1dG9jb21wbGV0ZTogdHJ1ZSxcbiAgICAgIHNxbEVkaXRvckxpbnQ6IHRydWUsXG4gICAgfSxcblxuICAgIGFzeW5jIGludHJvc3BlY3QoXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ+PiB7XG4gICAgICByZXR1cm4gYXdhaXQgaW50cm9zcGVjdERhdGFiYXNlKG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBxdWVyeShcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0c10gPVxuICAgICAgICAgIGF3YWl0IGV4ZWN1dGVRdWVyeVdpdGhGdWxsVGFibGVTZWFyY2hHdWFyZHJhaWxzKHtcbiAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoVGVybTogZGV0YWlscy5mdWxsVGFibGVTZWFyY2hUZXJtLFxuICAgICAgICAgICAgc3RhdGU6IGZ1bGxUYWJsZVNlYXJjaFN0YXRlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWx0ZXJlZFJvd0NvdW50OiByZXN1bHRzWzBdPy5fX3BzX2NvdW50X18gfHwgXCIwXCIsXG4gICAgICAgICAgICByb3dzOiByZXN1bHRzLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmF3KFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyUmF3UmVzdWx0Pj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVSYXdRdWVyeShleGVjdXRvciwgZGV0YWlscywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNxbFNjaGVtYShcbiAgICAgIF9kZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJTcWxTY2hlbWFSZXN1bHQ+PiB7XG4gICAgICBjb25zdCBbZXJyb3IsIGludHJvc3BlY3Rpb25dID0gYXdhaXQgaW50cm9zcGVjdERhdGFiYXNlKG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvcl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNyZWF0ZVNxbEVkaXRvclNjaGVtYUZyb21JbnRyb3NwZWN0aW9uKHtcbiAgICAgICAgICBkZWZhdWx0U2NoZW1hOiBcInB1YmxpY1wiLFxuICAgICAgICAgIGRpYWxlY3Q6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgICAgIGludHJvc3BlY3Rpb24sXG4gICAgICAgIH0pLFxuICAgICAgXTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3FsTGludChcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclNxbExpbnRSZXN1bHQ+PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGNhblVzZUV4ZWN1dG9yTGludFRyYW5zcG9ydCAmJlxuICAgICAgICB0eXBlb2YgZXhlY3V0b3IubGludFNxbCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCBleGVjdXRvci5saW50U3FsKGRldGFpbHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHsgZXJyb3IgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZERpc2FibGVMaW50VHJhbnNwb3J0KGVycm9yKSkge1xuICAgICAgICAgICAgY2FuVXNlRXhlY3V0b3JMaW50VHJhbnNwb3J0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmICghc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGREaXNhYmxlTGludFRyYW5zcG9ydChlcnJvcikpIHtcbiAgICAgICAgICAgIGNhblVzZUV4ZWN1dG9yTGludFRyYW5zcG9ydCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgbGludFdpdGhFeHBsYWluRmFsbGJhY2soZXhlY3V0b3IsIGRldGFpbHMsIG9wdGlvbnMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbnNlcnQoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJJbnNlcnRSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldEluc2VydFF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJvd3NdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHsgZXJyb3IsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvd3MsIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGUoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJVcGRhdGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFVwZGF0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHsgZXJyb3IsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW3Jvd10gPSByZXN1bHRzO1xuXG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvc3RncmVzQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJVcGRhdGUgZmFpbGVkXCIpLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93LCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlTWFueShkZXRhaWxzLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVVwZGF0ZVRyYW5zYWN0aW9uKGRldGFpbHMudXBkYXRlcywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZShcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckRlbGV0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0RGVsZXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlUG9zdGdyZXNBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgLi4uZGV0YWlscywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlUG9zdGdyZXNBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gKFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJpbnZhbGlkIHByb2NlZHVyZVwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJ1bmV4cGVjdGVkIHNlcnZlciBlcnJvclwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiYmFkIGdhdGV3YXlcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwic2VydmljZSB1bmF2YWlsYWJsZVwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJub3Qgc3VwcG9ydGVkXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIm1ldGhvZCBub3QgYWxsb3dlZFwiKVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGREaXNhYmxlTGludFRyYW5zcG9ydChlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW52YWxpZCBwcm9jZWR1cmVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwidW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3JcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW50ZXJuYWwgc2VydmVyIGVycm9yXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcIm5vdCBzdXBwb3J0ZWRcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwibWV0aG9kIG5vdCBhbGxvd2VkXCIpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpbnRXaXRoRXhwbGFpbkZhbGxiYWNrKFxuICBleGVjdXRvcjogQWRhcHRlclJlcXVpcmVtZW50c1tcImV4ZWN1dG9yXCJdLFxuICBkZXRhaWxzOiBBZGFwdGVyU3FsTGludERldGFpbHMsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8QWRhcHRlcltcInNxbExpbnRcIl0+PlsxXSxcbik6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclNxbExpbnRSZXN1bHQ+PiB7XG4gIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVNxbEZvckxpbnQoZGV0YWlscy5zcWwpO1xuXG4gIGlmICghdmFsaWRhdGlvbi5vaykge1xuICAgIHJldHVybiBbXG4gICAgICBudWxsLFxuICAgICAge1xuICAgICAgICBkaWFnbm9zdGljczogW3ZhbGlkYXRpb24uZGlhZ25vc3RpY10sXG4gICAgICAgIHNjaGVtYVZlcnNpb246IGRldGFpbHMuc2NoZW1hVmVyc2lvbixcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGRpYWdub3N0aWNzOiBBZGFwdGVyU3FsTGludFJlc3VsdFtcImRpYWdub3N0aWNzXCJdID0gW107XG5cbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgdmFsaWRhdGlvbi5zdGF0ZW1lbnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4cGxhaW5RdWVyeSA9IGFzUXVlcnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBgRVhQTEFJTiAke3N0YXRlbWVudC5zdGF0ZW1lbnR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShleHBsYWluUXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICAuLi5jcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcih7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcG9zaXRpb25PZmZzZXQ6IHN0YXRlbWVudC5mcm9tLFxuICAgICAgICAgIHNxbDogc3RhdGVtZW50LnN0YXRlbWVudCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBkaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICAuLi5jcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tUG9zdGdyZXNFcnJvcih7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcG9zaXRpb25PZmZzZXQ6IHN0YXRlbWVudC5mcm9tLFxuICAgICAgICAgIHNxbDogc3RhdGVtZW50LnN0YXRlbWVudCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbXG4gICAgbnVsbCxcbiAgICB7XG4gICAgICBkaWFnbm9zdGljcyxcbiAgICAgIHNjaGVtYVZlcnNpb246IGRldGFpbHMuc2NoZW1hVmVyc2lvbixcbiAgICB9LFxuICBdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlUmF3UXVlcnkoXG4gIGV4ZWN1dG9yOiBBZGFwdGVyUmVxdWlyZW1lbnRzW1wiZXhlY3V0b3JcIl0sXG4gIGRldGFpbHM6IEFkYXB0ZXJSYXdEZXRhaWxzLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPEFkYXB0ZXJbXCJyYXdcIl0+WzFdLFxuKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyUmF3UmVzdWx0Pj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYXNRdWVyeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZGV0YWlscy5zcWwpO1xuICAgIGNvbnN0IFtlcnJvciwgcm93c10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgIGFkYXB0ZXJTb3VyY2U6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgcXVlcnksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgbnVsbCxcbiAgICAgIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgICAgcm93czogcm93cyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgIGFkYXB0ZXJTb3VyY2U6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgZXJyb3I6IGVycm9yIGFzIEVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUludHJvc3BlY3Rpb24oYXJnczoge1xuICBxdWVyeTogUXVlcnk7XG4gIHRhYmxlczogUXVlcnlSZXN1bHQ8dHlwZW9mIGdldFRhYmxlc1F1ZXJ5PjtcbiAgdGltZXpvbmU6IHN0cmluZztcbn0pOiBBZGFwdGVySW50cm9zcGVjdFJlc3VsdCB7XG4gIGNvbnN0IHsgcXVlcnksIHRhYmxlcywgdGltZXpvbmUgfSA9IGFyZ3M7XG5cbiAgcmV0dXJuIHRhYmxlcy5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgdGFibGUpID0+IHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hcyB9ID0gcmVzdWx0O1xuICAgICAgY29uc3QgeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9ID0gdGFibGU7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnNSZWNvcmQgPSBjb2x1bW5zLnJlZHVjZShcbiAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGF1dG9pbmMsXG4gICAgICAgICAgICBjb21wdXRlZCxcbiAgICAgICAgICAgIGRhdGF0eXBlLFxuICAgICAgICAgICAgZGF0YXR5cGVfc2NoZW1hLFxuICAgICAgICAgICAgZGVmYXVsdDogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgbmFtZTogY29sdW1uTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBudWxsYWJsZSxcbiAgICAgICAgICB9ID0gY29sdW1uO1xuXG4gICAgICAgICAgY29uc3QgaXNBcnJheSA9IGRhdGF0eXBlLnN0YXJ0c1dpdGgoXCJfXCIpO1xuICAgICAgICAgIGNvbnN0IHN0cmlwcGVkRGF0YVR5cGUgPSBpc0FycmF5ID8gZGF0YXR5cGUuc2xpY2UoMSkgOiBkYXRhdHlwZTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgW2NvbHVtbk5hbWVdOiB7XG4gICAgICAgICAgICAgIGRhdGF0eXBlOiB7XG4gICAgICAgICAgICAgICAgLi4uKFBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQVtzdHJpcHBlZERhdGFUeXBlXSB8fCB7XG4gICAgICAgICAgICAgICAgICBncm91cDogb3B0aW9ucy5sZW5ndGggPiAwID8gXCJlbnVtXCIgOiBcInJhd1wiLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgICAgICAgaXNOYXRpdmU6IGRhdGF0eXBlX3NjaGVtYSA9PT0gXCJwZ19jYXRhbG9nXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogaXNBcnJheSA/IGAke3N0cmlwcGVkRGF0YVR5cGV9W11gIDogc3RyaXBwZWREYXRhVHlwZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogZGF0YXR5cGVfc2NoZW1hLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgIGZrQ29sdW1uOiBjb2x1bW4uZmtfY29sdW1uLFxuICAgICAgICAgICAgICBma1NjaGVtYTogY29sdW1uLmZrX3NjaGVtYSxcbiAgICAgICAgICAgICAgZmtUYWJsZTogY29sdW1uLmZrX3RhYmxlLFxuICAgICAgICAgICAgICBpc0F1dG9pbmNyZW1lbnQ6IGF1dG9pbmMsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IGNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc1JlcXVpcmVkOlxuICAgICAgICAgICAgICAgICFudWxsYWJsZSAmJiAhYXV0b2luYyAmJiAhY29tcHV0ZWQgJiYgZGVmYXVsdFZhbHVlID09IG51bGwsXG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgIG51bGxhYmxlLFxuICAgICAgICAgICAgICBwa1Bvc2l0aW9uOiBjb2x1bW4ucGssXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgIH0gYXMgY29uc3Qgc2F0aXNmaWVzIENvbHVtbixcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICApO1xuXG4gICAgICBpZiAoc2NoZW1hc1tzY2hlbWFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NoZW1hc1tzY2hlbWFdID0geyBuYW1lOiBzY2hlbWEsIHRhYmxlczoge30gfTtcbiAgICAgIH1cblxuICAgICAgc2NoZW1hc1tzY2hlbWFdLnRhYmxlc1t0YWJsZU5hbWVdID0ge1xuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zUmVjb3JkLFxuICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICB7XG4gICAgICBmaWx0ZXJPcGVyYXRvcnMsXG4gICAgICBxdWVyeSxcbiAgICAgIHNjaGVtYXM6IHsgcHVibGljOiB7IG5hbWU6IFwicHVibGljXCIsIHRhYmxlczoge30gfSB9LFxuICAgICAgdGltZXpvbmUsXG4gICAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQgYXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gICk7XG59XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuICBcImlsaWtlXCIsXG4gIFwibm90IGlsaWtlXCIsXG5dIHNhdGlzZmllcyBGaWx0ZXJPcGVyYXRvcltdO1xuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja0ludHJvc3BlY3QoKSB7XG4gIGNvbnN0IHRhYmxlcyA9IG1vY2tUYWJsZXNRdWVyeSgpO1xuICBjb25zdCBbeyB0aW1lem9uZSB9XSA9IG1vY2tUaW1lem9uZVF1ZXJ5KCk7XG4gIGNvbnN0IHF1ZXJ5ID0geyBwYXJhbWV0ZXJzOiBbXSwgc3FsOiBcIjxtb2NrZWQ+XCIgfSBhcyBRdWVyeTtcblxuICByZXR1cm4gY3JlYXRlSW50cm9zcGVjdGlvbih7IHRhYmxlcywgdGltZXpvbmUsIHF1ZXJ5IH0pIGFzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCwgbm8gbmVlZCBnbyBvdmVyYm9hcmQuXG4gICAgc2NoZW1hczoge1xuICAgICAgW0sgaW4gKHR5cGVvZiB0YWJsZXMpW251bWJlcl1bXCJzY2hlbWFcIl1dOiB7XG4gICAgICAgIG5hbWU6IEs7XG4gICAgICAgIHRhYmxlczoge1xuICAgICAgICAgIFtUIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wibmFtZVwiXV06IFRhYmxlO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRpbWV6b25lOiB0eXBlb2YgdGltZXpvbmU7XG4gICAgZmlsdGVyT3BlcmF0b3JzOiBGaWx0ZXJPcGVyYXRvcltdO1xuICAgIHF1ZXJ5OiBRdWVyeTtcbiAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztzVUFFTyxJQUFNQSxFQUdULENBQ0YsS0FBTSxDQUNKLE1BQU8sU0FDVCxFQUNBLFFBQVMsQ0FDUCxNQUFPLFNBQ1QsRUFDQSxNQUFPLENBQ0wsTUFBTyxRQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sUUFDVCxFQUNBLE9BQVEsQ0FDTixNQUFPLFFBQ1QsRUFJQSxLQUFNLENBQ0osT0FBUSxhQUNSLE1BQU8sVUFDVCxFQUlBLFNBQVUsQ0FDUixNQUFPLFFBQ1QsRUFDQSxLQUFNLENBQ0osTUFBTyxRQUNULEVBQ0EsUUFBUyxDQUNQLE1BQU8sUUFDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFNQSxLQUFNLENBQ0osT0FBUSxlQUNSLE1BQU8sTUFDVCxFQU1BLFVBQVcsQ0FDVCxPQUFRLDBCQUNSLE1BQU8sVUFDVCxFQU1BLFlBQWEsQ0FDWCxPQUFRLDRCQUNSLE1BQU8sVUFDVCxFQU1BLDhCQUErQixDQUM3QixPQUFRLDBCQUNSLE1BQU8sVUFDVCxFQU1BLDJCQUE0QixDQUMxQixPQUFRLDRCQUNSLE1BQU8sVUFDVCxFQU1BLE9BQVEsQ0FDTixPQUFRLGlCQUNSLE1BQU8sTUFDVCxFQU1BLHlCQUEwQixDQUN4QixPQUFRLGVBQ1IsTUFBTyxNQUNULEVBTUEsc0JBQXVCLENBQ3JCLE9BQVEsaUJBQ1IsTUFBTyxNQUNULEVBQ0EsS0FBTSxDQUNKLE9BQVEsdUNBQ1IsTUFBTyxLQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sU0FDVCxF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RUFDbEQsU0FBQVUsQ0FDRixDQUNGLENBQ0YsQ0FFQSxJQUFNdUMsR0FBa0IsQ0FDdEIsSUFDQSxLQUNBLElBQ0EsS0FDQSxJQUNBLEtBQ0EsS0FDQSxTQUNBLE9BQ0EsV0FDQSxRQUNBLFdBQ0YsRUFLTyxTQUFTQyxJQUFpQixDQUMvQixJQUFNM0MsRUFBUzRDLEdBQWdCLEVBQ3pCLENBQUMsQ0FBRSxTQUFBekMsQ0FBUyxDQUFDLEVBQUkwQyxHQUFrQixFQUd6QyxPQUFPekMsR0FBb0IsQ0FBRSxPQUFBSixFQUFRLFNBQUFHLEVBQVUsTUFGakMsQ0FBRSxXQUFZLENBQUMsRUFBRyxJQUFLLFVBQVcsQ0FFSyxDQUFDLENBY3hEIiwKICAibmFtZXMiOiBbIlBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJnZXRQb3N0Z3JlU1FMQnVpbGRlciIsICJyZXF1aXJlbWVudHMiLCAiZ2V0QnVpbGRlciIsICJQb3N0Z3Jlc0FkYXB0ZXIiLCAiUG9zdGdyZXNRdWVyeUNvbXBpbGVyIiwgImJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbiIsICJhcmdzIiwgImJhc2VQbGFuIiwgIm5vcm1hbGl6ZWRTZWFyY2hUZXJtIiwgImV4aXN0aW5nVGV4dENvbHVtbnMiLCAicHJlZGljYXRlIiwgInJlbWFpbmluZ1RleHRTbG90cyIsICJwYXR0ZXJuIiwgImVzY2FwZUxpa2VQYXR0ZXJuIiwgInN1cHBsZW1lbnRhbFByZWRpY2F0ZXMiLCAiY29sdW1uIiwgInZhbHVlIiwgImdldEluc2VydFF1ZXJ5IiwgImRldGFpbHMiLCAicmVxdWlyZW1lbnRzIiwgInJvd3MiLCAiY29sdW1ucyIsICJ0YWJsZU5hbWUiLCAic2NoZW1hIiwgImJ1aWxkZXIiLCAiZ2V0UG9zdGdyZVNRTEJ1aWxkZXIiLCAiY29tcGlsZSIsICJhcHBseVRyYW5zZm9ybWF0aW9ucyIsICJnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzIiwgImdldFNlbGVjdFF1ZXJ5IiwgImZpbHRlciIsICJmdWxsVGFibGVTZWFyY2hUZXJtIiwgInBhZ2VJbmRleCIsICJwYWdlU2l6ZSIsICJzb3J0T3JkZXIiLCAiYXBwbGllZEZpbHRlckV4cHJlc3Npb24iLCAiZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiIsICJmdWxsVGFibGVTZWFyY2hQbGFuIiwgImJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbiIsICJjb21iaW5lZFdoZXJlRXhwcmVzc2lvbiIsICJlYiIsICJnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uIiwgIkFHR19OQU1FIiwgIkNPVU5UX1JFRiIsICJTRUFSQ0hfR1VBUkRSQUlMU19OQU1FIiwgImlzRnVsbFRhYmxlU2VhcmNoUmVxdWVzdCIsICJxYiIsICJzcWwiLCAiamIiLCAiY3VycmVudFF1ZXJ5IiwgIml0ZW0iLCAiY29sdW1uIiwgImNvdW50UXVlcnkiLCAibW9ja1NlbGVjdFF1ZXJ5IiwgImdldFVwZGF0ZVF1ZXJ5IiwgImNoYW5nZXMiLCAicm93IiwgImFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzIiwgImdldERlbGV0ZVF1ZXJ5IiwgImV4cHJlc3Npb25CdWlsZGVyIiwgImpzb25BcnJheUZyb20iLCAiZXhwciIsICJzcWwiLCAiUkVHVUxBUl9UQUJMRV9LSU5EIiwgIlZJRVdfVEFCTEVfS0lORCIsICJUQUJMRV9LSU5EUyIsICJnZXRUYWJsZXNRdWVyeSIsICJyZXF1aXJlbWVudHMiLCAiY29tcGlsZSIsICJnZXRQb3N0Z3JlU1FMQnVpbGRlciIsICJleGNsdWRlU3lzdGVtVGFibGVzIiwgImViIiwgImpzb25BcnJheUZyb20iLCAiamIiLCAib25fZWIiLCAic3FsIiwgIm1vY2tUYWJsZXNRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgImJ1aWxkZXIiLCAibW9ja1RpbWV6b25lUXVlcnkiLCAicWIiLCAiY3JlYXRlUG9zdGdyZXNBZGFwdGVyIiwgInJlcXVpcmVtZW50cyIsICJleGVjdXRvciIsICJvdGhlclJlcXVpcmVtZW50cyIsICJmdWxsVGFibGVTZWFyY2hTdGF0ZSIsICJjcmVhdGVGdWxsVGFibGVTZWFyY2hFeGVjdXRpb25TdGF0ZSIsICJjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQiLCAiY3JlYXRlUG9zdGdyZXNBZGFwdGVyRXJyb3IiLCAiYXJncyIsICJjcmVhdGVBZGFwdGVyRXJyb3IiLCAiZXhlY3V0ZVVwZGF0ZVRyYW5zYWN0aW9uIiwgInVwZGF0ZXMiLCAib3B0aW9ucyIsICJxdWVyaWVzIiwgInVwZGF0ZSIsICJnZXRVcGRhdGVRdWVyeSIsICJlcnJvciIsICJyZXN1bHRzIiwgInJvd3MiLCAiaW5kZXgiLCAicmVzdWx0IiwgInJvdyIsICJxdWVyeSIsICJpbnRyb3NwZWN0RGF0YWJhc2UiLCAidGFibGVzUXVlcnkiLCAiZ2V0VGFibGVzUXVlcnkiLCAidGltZXpvbmVRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgInRhYmxlc0Vycm9yIiwgInRhYmxlcyIsICJ0aW1lem9uZUVycm9yIiwgInRpbWV6b25lcyIsICJ0aW1lem9uZSIsICJjcmVhdGVJbnRyb3NwZWN0aW9uIiwgImRldGFpbHMiLCAiZ2V0U2VsZWN0UXVlcnkiLCAiZXhlY3V0ZVF1ZXJ5V2l0aEZ1bGxUYWJsZVNlYXJjaEd1YXJkcmFpbHMiLCAiZXhlY3V0ZVJhd1F1ZXJ5IiwgIl9kZXRhaWxzIiwgImludHJvc3BlY3Rpb24iLCAiY3JlYXRlU3FsRWRpdG9yU2NoZW1hRnJvbUludHJvc3BlY3Rpb24iLCAic2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50IiwgInNob3VsZERpc2FibGVMaW50VHJhbnNwb3J0IiwgImxpbnRXaXRoRXhwbGFpbkZhbGxiYWNrIiwgImdldEluc2VydFF1ZXJ5IiwgImdldERlbGV0ZVF1ZXJ5IiwgIm1lc3NhZ2UiLCAidmFsaWRhdGlvbiIsICJ2YWxpZGF0ZVNxbEZvckxpbnQiLCAiZGlhZ25vc3RpY3MiLCAic3RhdGVtZW50IiwgImV4cGxhaW5RdWVyeSIsICJhc1F1ZXJ5IiwgImNyZWF0ZUxpbnREaWFnbm9zdGljc0Zyb21Qb3N0Z3Jlc0Vycm9yIiwgInRhYmxlIiwgInNjaGVtYXMiLCAiY29sdW1ucyIsICJ0YWJsZU5hbWUiLCAic2NoZW1hIiwgImNvbHVtbnNSZWNvcmQiLCAiY29sdW1uIiwgImF1dG9pbmMiLCAiY29tcHV0ZWQiLCAiZGF0YXR5cGUiLCAiZGF0YXR5cGVfc2NoZW1hIiwgImRlZmF1bHRWYWx1ZSIsICJjb2x1bW5OYW1lIiwgIm51bGxhYmxlIiwgImlzQXJyYXkiLCAic3RyaXBwZWREYXRhVHlwZSIsICJQT1NUR1JFU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEEiLCAiZmlsdGVyT3BlcmF0b3JzIiwgIm1vY2tJbnRyb3NwZWN0IiwgIm1vY2tUYWJsZXNRdWVyeSIsICJtb2NrVGltZXpvbmVRdWVyeSJdCn0K