@prisma/studio-core 0.19.1 → 0.19.2

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.
@@ -6,6 +6,6 @@ function require(mod) {
6
6
  if (mod === 'react-dom') return ___react_dom___;
7
7
  throw new Error(`Unknown module ${mod}`);
8
8
  }
9
- import"../../chunk-FJ7M2BJG.js";import{a as he}from"../../chunk-TXNF5KY4.js";import{a as m}from"../../chunk-UQDXNCLC.js";import{c as ee}from"../../chunk-DTFJIWXL.js";import{a as j,c as Y,h as $,i as v,j as z,k as G,l as H}from"../../chunk-PI3N7ZW6.js";import{a as Z}from"../../chunk-N6ZIYSZ5.js";import{A as N,B as J,C as I,D as X,q as g,v as V,w as K,x as W,y as O,z as R}from"../../chunk-TB3YFW43.js";import"../../chunk-6QJ7HVIC.js";var te={bigint:{group:"numeric"},binary:{group:"string"},bit:{group:"raw"},blob:{group:"string"},char:{group:"string"},"char binary":{group:"string"},date:{format:"YYYY-MM-DD",group:"datetime"},datetime:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},dec:{group:"numeric"},decimal:{group:"numeric"},double:{group:"numeric"},"double precision":{group:"numeric"},enum:{group:"enum"},fixed:{group:"numeric"},float:{group:"numeric"},geometry:{group:"raw"},geometrycollection:{group:"raw"},int:{group:"numeric"},integer:{group:"numeric"},json:{group:"json"},linestring:{group:"raw"},long:{group:"string"},"long varchar":{group:"string"},longblob:{group:"string"},longtext:{group:"string"},longvarbinary:{group:"string"},longvarchar:{group:"string"},mediumblob:{group:"string"},mediumint:{group:"numeric"},mediumtext:{group:"string"},multilinestring:{group:"raw"},multipoint:{group:"raw"},multipolygon:{group:"raw"},numeric:{group:"numeric"},point:{group:"raw"},polygon:{group:"raw"},real:{group:"numeric"},set:{group:"raw"},smallint:{group:"numeric"},text:{group:"string"},time:{format:"HH:mm:ss.SSS",group:"time"},timestamp:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},tinyblob:{group:"string"},tinyint:{group:"numeric"},tinytext:{group:"string"},varbinary:{group:"string"},varchar:{group:"string"},"varchar binary":{group:"string"},vector:{group:"raw"},year:{format:"YYYY",group:"numeric"}};function h(n){return W({...n,Adapter:K,QueryCompiler:V})}function re(n,e){let{rows:o,table:{columns:l,name:r}}=n,c=h(e);return R(c.deleteFrom(r).$call(N(o,l)).$castTo())}function Q(n,e){let{rows:o,table:{columns:l,name:r}}=n,c=h(e);return R(c.insertInto(r).values(I({columns:l,context:"insert",supportsDefaultKeyword:!0,values:o})).$castTo())}function C(n,e){let{criteria:o,table:{columns:l,name:r}}=n,c=h(e);return R(c.selectFrom(r).$call(N(o,l)).select(Object.keys(l)).select(se().as("__ps_inserted_at__")))}function ne(n,e){let{changes:o,row:l,table:{columns:r,name:c}}=n,a=h(e);return R(a.selectFrom(c).$call(N([{...l,...o}],r)).select(Object.keys(r)).select(se().as("__ps_updated_at__")))}function oe(n,e){let{filter:o={after:"and",filters:[],kind:"FilterGroup"},fullTableSearchTerm:l,pageIndex:r,pageSize:c,sortOrder:a,table:{columns:u,name:t}}=n,s=h(e),d=X(o.filters,u),y=G({searchTerm:l,table:n.table}),p=y.predicates.length>0?i=>i.and([d(i),H(y,{dialect:"mysql"})(i)]):d,_="__ps_agg__",A="__ps_count__",k=v(l),b=g`/*+ MAX_EXECUTION_TIME(${g.lit(5e3)}) SET_VAR(lock_wait_timeout=${g.lit(1)}) */`,T=s.selectFrom(t).where(p).select(i=>{let f=i.cast(i.fn.coalesce(i.fn.countAll(),g.lit(0)),"char");return k?g`${b} ${f}`.as(A):f.as(A)});return R(s.with(_,()=>T).selectFrom(t).innerJoin(_,i=>i.onTrue()).where(p).select(k?g`${b} ${g.ref(`${_}.${A}`)}`.as(A):`${_}.${A}`).select(Object.keys(u)).$call(i=>a.reduce((f,E)=>f.orderBy(E.column,E.direction),i)).limit(c).offset(g.lit(BigInt(r)*BigInt(c))))}function Oe(){return[{id:1,created_at:new Date("2025-01-27T00:00:00.000Z"),deleted_at:null,role:"admin",name:"Alice",name_role:"Alice_admin",__ps_count__:"2"},{id:2,created_at:new Date("2025-01-26T23:00:00.000Z"),deleted_at:null,role:"member",name:"Bob",name_role:"Bob_member",__ps_count__:"2"}]}function ae(n,e){let{changes:o,row:l,table:{columns:r,name:c,schema:a}}=n,u=h(e);return R(u.withSchema(a).updateTable(c).set(I({columns:r,context:"update",supportsDefaultKeyword:!0,values:o})).$call(N([l],r)).$castTo())}function se(){return g`cast(unix_timestamp(now(3)) * 1000 as unsigned)`}function ue(n){return g`json_object(${g.join(Object.keys(n).flatMap(e=>[g.lit(e),n[e]]))})`}function ie(n){let e=g`database()`,l=h(n).selectFrom("information_schema.columns as c").leftJoin("information_schema.KEY_COLUMN_USAGE as kcu",r=>r.on("kcu.TABLE_SCHEMA","=",e).onRef("kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("kcu.POSITION_IN_UNIQUE_CONSTRAINT","is not",null)).leftJoin("information_schema.KEY_COLUMN_USAGE as pk_kcu",r=>r.on("pk_kcu.TABLE_SCHEMA","=",e).onRef("pk_kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("pk_kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("pk_kcu.CONSTRAINT_NAME","=","PRIMARY")).where("c.TABLE_SCHEMA","=",e).select(["c.COLUMN_DEFAULT as default","c.COLUMN_NAME as name","c.COLUMN_TYPE as datatype","c.ORDINAL_POSITION as position","c.TABLE_NAME","kcu.REFERENCED_TABLE_NAME as fk_table","kcu.REFERENCED_COLUMN_NAME as fk_column","pk_kcu.ORDINAL_POSITION as pk"]).select(r=>[r("c.EXTRA","=","auto_increment").as("autoincrement"),r("c.EXTRA","in",["on update CURRENT_TIMESTAMP","STORED GENERATED","VIRTUAL GENERATED"]).as("computed"),r("c.IS_NULLABLE","=","YES").as("nullable")]);return R(h(n).with("cols",()=>l).selectFrom("information_schema.tables as t").innerJoin("cols as c",r=>r.onRef("c.TABLE_NAME","=","t.TABLE_NAME")).where("t.TABLE_SCHEMA","=",e).where("t.TABLE_TYPE","in",["BASE TABLE","VIEW"]).groupBy([e,"t.TABLE_NAME","t.TABLE_TYPE"]).select([e.as("schema"),"t.TABLE_NAME as name","t.TABLE_TYPE as type"]).$narrowType().select(r=>r.fn("json_arrayagg",[ue({autoincrement:r.ref("c.autoincrement"),computed:r.ref("c.computed"),datatype:r.ref("c.datatype"),default:r.ref("c.default"),fk_column:r.ref("c.fk_column"),fk_table:r.ref("c.fk_table"),name:r.ref("c.name"),position:r.ref("c.position"),pk:r.ref("c.pk"),nullable:r.ref("c.nullable")})]).as("columns")).orderBy("t.TABLE_SCHEMA").orderBy("t.TABLE_NAME").orderBy("t.TABLE_TYPE"))}function le(){return[{columns:[{autoincrement:1,computed:0,datatype:"int",default:null,fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"binary(16)",default:"uuid_to_bin(uuid())",fk_column:null,fk_table:null,name:"uuid",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"varchar(255)",default:null,fk_column:null,fk_table:null,name:"name",nullable:1,pk:null,position:3},{autoincrement:0,computed:1,datatype:"text",default:null,fk_column:null,fk_table:null,name:"id_name",nullable:1,pk:null,position:4}],name:"animals",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:0,computed:0,datatype:"char(36)",default:"uuid()",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"text",default:null,fk_column:null,fk_table:null,name:"name",nullable:0,pk:2,position:2},{autoincrement:0,computed:0,datatype:"timestamp",default:"CURRENT_TIMESTAMP",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:null,position:3}],name:"composite_pk",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:1,computed:0,datatype:"int",default:null,fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"timestamp",default:"current_timestamp",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"timestamp",default:null,fk_column:null,fk_table:null,name:"deleted_at",nullable:1,pk:null,position:3},{autoincrement:0,computed:0,datatype:"text",default:null,fk_column:null,fk_table:null,name:"role",nullable:1,pk:null,position:4},{autoincrement:0,computed:0,datatype:"text",default:null,fk_column:null,fk_table:null,name:"name",nullable:1,pk:null,position:5},{autoincrement:0,computed:1,datatype:"text",default:null,fk_column:null,fk_table:null,name:"name_role",nullable:1,pk:null,position:6}],name:"users",schema:"studio",type:"BASE TABLE"}]}function ce(n){let e=h(n),o=g`@@session.time_zone`;return R(e.selectNoFrom(e.case().when(o,"=","SYSTEM").then(g`@@system_time_zone`).else(o).end().as("timezone")).$narrowType())}function me(){return[{timezone:"UTC"}]}function pe(n){let{error:e,sql:o}=n,l=Math.max(0,n.positionOffset??0),r=Ae(o.length);if(!(e instanceof Error))return[{from:r.from+l,message:"SQL lint failed.",severity:"error",source:"mysql",to:r.to+l}];let c=ge(e),a=be(o,e.message)??r;return[{code:c,from:a.from+l,message:_e({code:c,message:e.message}),severity:"error",source:"mysql",to:a.to+l}]}async function de(n,e,o){let l=ee(e.sql);if(!l.ok)return[null,{diagnostics:[l.diagnostic],schemaVersion:e.schemaVersion}];let r=[];for(let c of l.statements)try{let a=O(`EXPLAIN ${c.statement}`),[u]=await n.execute(a,o);if(!u)continue;r.push(...pe({error:u,positionOffset:c.from,sql:c.statement}))}catch(a){r.push(...pe({error:a,positionOffset:c.from,sql:c.statement}))}return[null,{diagnostics:r,schemaVersion:e.schemaVersion}]}function ge(n){let e=n;return typeof e.code=="string"?e.code:void 0}function _e(n){let{code:e,message:o}=n;return e==="ER_QUERY_TIMEOUT"||e==="ER_QUERY_INTERRUPTED"||o.toLowerCase().includes("maximum statement execution time exceeded")?"Lint query timed out. Simplify the statement and try again.":o}function Ae(n){return n<=0?{from:0,to:0}:{from:0,to:1}}function be(n,e){let o=new Set,l=/'([^']+)'/.exec(e);l?.[1]&&o.add(l[1]);let r=/`([^`]+)`/.exec(e);r?.[1]&&o.add(r[1]);let c=/"([^"]+)"/.exec(e);c?.[1]&&o.add(c[1]);let a=/table\s+'([^']+)'\s+doesn't exist/i.exec(e);a?.[1]&&o.add(a[1]);let u=n.toLowerCase();for(let t of o){let s=t.toLowerCase(),d=u.indexOf(s);if(d>=0)return{from:d,to:Math.min(n.length,d+t.length)};let y=s.split(".").at(-1);if(!y)continue;let p=u.indexOf(y);if(p>=0)return{from:p,to:Math.min(n.length,p+y.length)}}return null}function Je(n){let{executor:e,...o}=n,l=$(),r=typeof e.lintSql=="function";async function c(a){try{let u=ie(n),t=ce(n),[[s,d],[y,p]]=await Promise.all([e.execute(u,a),e.execute(t,a)]);if(s)return m({error:s,query:u});if(y)return m({error:y,query:t});let _=p[0]?.timezone;return _?[null,ye({query:u,tables:d,timezone:_})]:m({error:new Error("Timezone not found"),query:t})}catch(u){return m({error:u})}}return{capabilities:{fullTableSearch:!0,sqlDialect:"mysql",sqlEditorAutocomplete:!0,sqlEditorLint:!0},async delete(a,u){try{let t=re(a,o),[s]=await e.execute(t,u);return s?m({error:s,query:t}):[null,{...a,query:t}]}catch(t){return m({error:t})}},async insert(a,u){try{let{rows:t,table:s}=a,{columns:d}=s,y=Object.values(d).find(i=>i.isAutoincrement),p=t.map(i=>J(i,d)),_=p.some(i=>{let f=Object.values(i);return f.length===0||f.some(E=>E==null)});if(!y&&_)return m({error:new Error("Cannot proceed with the insertion, some rows cannot be refetched after insertion."),query:Q(a,o)});if(!_){let i=Q(a,o),f=C({criteria:p,table:s},o),E=[i,f],[[q],w]=await e.executeSequence(E,u),S=x(E);if(q)return m({error:q,query:S});let[L,M]=w;return L?m({error:new Error("Failed to refetch inserted rows - please refresh.",{cause:L}),query:S}):[null,{rows:M,query:S}]}let A=await Promise.all(t.map(async i=>{let f=Q({rows:[i],table:s},o),[E,q]=await e.execute(f,u);if(E)return m({error:E,query:f});let{name:w}=y,S=i[w]||q[0]?.insertId;if(!S)return m({error:new Error("Could not determine value for autoincrement column to refetch inserted row."),query:f});let L=C({criteria:[{[w]:S}],table:{...s,columns:Object.values(d).reduce((U,P)=>{let{name:F}=P;return U[F]={...P,pkPosition:F===w?1:null},U},{})}},o),[M,Ee]=await e.execute(L,u),B=x([f,L]);if(M)return console.error("Error refetching inserted row:",M),m({error:new Error("Failed to refetch inserted row - please refresh.",{cause:M}),query:B});let[D]=Ee;return D?[null,{row:D,query:B}]:m({error:new Error("Refetch query returned no results for inserted row."),query:B})})),k=[],b=null,T=[];for(let i=0;i<A.length;i++){let[f,E]=A[i];f?(T.push([i,f]),f.query&&(b=b?x([b,f.query]):f.query)):(k.push(E.row),E.query&&(b=b?x([b,E.query]):E.query))}return T.length>0?m({error:new AggregateError(T.map(([,i])=>i),`Row${T.length>1?"s":""} ${T.map(([i])=>i).join(", ")} could not be inserted or refetched.`),query:b}):[null,{rows:k,query:b}]}catch(t){return m({error:t})}},async introspect(a){return await c(a)},async sqlSchema(a,u){let[t,s]=await c(u);return t?[t]:[null,Z({defaultSchema:void 0,dialect:"mysql",introspection:s})]},async sqlLint(a,u){if(r&&typeof e.lintSql=="function")try{let[t,s]=await e.lintSql(a,u);if(!t)return[null,s];if(!fe(t))return m({error:t});r=!1}catch(t){if(!fe(t))return m({error:t});r=!1}return await de(e,a,u)},async raw(a,u){try{let t=O(a.sql),[s,d]=await e.execute(t,u);return s?m({error:s,query:t}):[null,{query:t,rowCount:d.length,rows:d}]}catch(t){return m({error:t})}},async query(a,u){try{let t=oe(a,o),[s,d]=await z({executor:e,options:u,query:t,searchTerm:a.fullTableSearchTerm,state:l});return s?m({error:s,query:t}):[null,{filteredRowCount:d[0]?.__ps_count__||"0",rows:d,query:t}]}catch(t){return m({error:t})}},async update(a,u){try{let t=ae(a,o),s=ne(a,o),[[d],y]=await e.executeSequence([t,s],u);if(d)return m({error:d,query:t});let[p,_]=y;if(p)return m({error:p,query:t});let[A]=_;return A?[null,{row:A,query:t}]:m({error:new Error("Updated row not found"),query:t})}catch(t){return m({error:t})}}}}function fe(n){if(!(n instanceof Error))return!1;let e=n.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 ye(n){let{query:e,tables:o,timezone:l}=n;return o.reduce((r,c)=>{let{schemas:a}=r,{columns:u,name:t,schema:s}=c,d=u.sort((y,p)=>y.position-p.position).reduce((y,p)=>{let{datatype:_,default:A,name:k}=p,b=_.indexOf("("),T=(b>-1?_.substring(0,b):_).trim().toLowerCase(),i=!!p.autoincrement,f=!!p.computed,E=!!p.nullable;return{...y,[k]:{datatype:{...te[T]||{group:"raw"},isArray:!1,isNative:!0,name:T,options:T==="enum"?_.slice(6,-2).split("','"):[],schema:s},defaultValue:A,fkColumn:p.fk_column,fkSchema:s,fkTable:p.fk_table,isAutoincrement:i,isComputed:f,isRequired:!E&&!i&&!f&&A==null,name:k,nullable:E,pkPosition:p.pk,schema:s,table:t}}},{});return a[s]===void 0&&(a[s]={name:s,tables:{}}),a[s].tables[t]={columns:d,name:t,schema:s},r},{filterOperators:Te,query:e,schemas:{},timezone:l})}var Te=["=","!=",">",">=","<","<=","is","is not","like","not like"];function Xe(){let n=le(),[{timezone:e}]=me();return ye({tables:n,timezone:e,query:{parameters:[],sql:"<mocked>"}})}function x(n){let[e,o]=n;return{parameters:e.parameters.concat(o.parameters),sql:`${e.sql};
9
+ import"../../chunk-FJ7M2BJG.js";import{a as he}from"../../chunk-TXNF5KY4.js";import{a as m}from"../../chunk-UQDXNCLC.js";import{a as j,c as Y,h as $,i as v,j as z,k as G,l as H}from"../../chunk-PI3N7ZW6.js";import{a as Z}from"../../chunk-N6ZIYSZ5.js";import{c as ee}from"../../chunk-DTFJIWXL.js";import{A as N,B as J,C as I,D as X,q as g,v as V,w as K,x as W,y as O,z as R}from"../../chunk-TB3YFW43.js";import"../../chunk-6QJ7HVIC.js";var te={bigint:{group:"numeric"},binary:{group:"string"},bit:{group:"raw"},blob:{group:"string"},char:{group:"string"},"char binary":{group:"string"},date:{format:"YYYY-MM-DD",group:"datetime"},datetime:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},dec:{group:"numeric"},decimal:{group:"numeric"},double:{group:"numeric"},"double precision":{group:"numeric"},enum:{group:"enum"},fixed:{group:"numeric"},float:{group:"numeric"},geometry:{group:"raw"},geometrycollection:{group:"raw"},int:{group:"numeric"},integer:{group:"numeric"},json:{group:"json"},linestring:{group:"raw"},long:{group:"string"},"long varchar":{group:"string"},longblob:{group:"string"},longtext:{group:"string"},longvarbinary:{group:"string"},longvarchar:{group:"string"},mediumblob:{group:"string"},mediumint:{group:"numeric"},mediumtext:{group:"string"},multilinestring:{group:"raw"},multipoint:{group:"raw"},multipolygon:{group:"raw"},numeric:{group:"numeric"},point:{group:"raw"},polygon:{group:"raw"},real:{group:"numeric"},set:{group:"raw"},smallint:{group:"numeric"},text:{group:"string"},time:{format:"HH:mm:ss.SSS",group:"time"},timestamp:{format:"YYYY-MM-DD HH:mm:ss.SSS",group:"datetime"},tinyblob:{group:"string"},tinyint:{group:"numeric"},tinytext:{group:"string"},varbinary:{group:"string"},varchar:{group:"string"},"varchar binary":{group:"string"},vector:{group:"raw"},year:{format:"YYYY",group:"numeric"}};function h(n){return W({...n,Adapter:K,QueryCompiler:V})}function re(n,e){let{rows:o,table:{columns:l,name:r}}=n,c=h(e);return R(c.deleteFrom(r).$call(N(o,l)).$castTo())}function Q(n,e){let{rows:o,table:{columns:l,name:r}}=n,c=h(e);return R(c.insertInto(r).values(I({columns:l,context:"insert",supportsDefaultKeyword:!0,values:o})).$castTo())}function C(n,e){let{criteria:o,table:{columns:l,name:r}}=n,c=h(e);return R(c.selectFrom(r).$call(N(o,l)).select(Object.keys(l)).select(se().as("__ps_inserted_at__")))}function ne(n,e){let{changes:o,row:l,table:{columns:r,name:c}}=n,a=h(e);return R(a.selectFrom(c).$call(N([{...l,...o}],r)).select(Object.keys(r)).select(se().as("__ps_updated_at__")))}function oe(n,e){let{filter:o={after:"and",filters:[],kind:"FilterGroup"},fullTableSearchTerm:l,pageIndex:r,pageSize:c,sortOrder:a,table:{columns:u,name:t}}=n,s=h(e),d=X(o.filters,u),y=G({searchTerm:l,table:n.table}),p=y.predicates.length>0?i=>i.and([d(i),H(y,{dialect:"mysql"})(i)]):d,_="__ps_agg__",A="__ps_count__",k=v(l),b=g`/*+ MAX_EXECUTION_TIME(${g.lit(5e3)}) SET_VAR(lock_wait_timeout=${g.lit(1)}) */`,T=s.selectFrom(t).where(p).select(i=>{let f=i.cast(i.fn.coalesce(i.fn.countAll(),g.lit(0)),"char");return k?g`${b} ${f}`.as(A):f.as(A)});return R(s.with(_,()=>T).selectFrom(t).innerJoin(_,i=>i.onTrue()).where(p).select(k?g`${b} ${g.ref(`${_}.${A}`)}`.as(A):`${_}.${A}`).select(Object.keys(u)).$call(i=>a.reduce((f,E)=>f.orderBy(E.column,E.direction),i)).limit(c).offset(g.lit(BigInt(r)*BigInt(c))))}function Oe(){return[{id:1,created_at:new Date("2025-01-27T00:00:00.000Z"),deleted_at:null,role:"admin",name:"Alice",name_role:"Alice_admin",__ps_count__:"2"},{id:2,created_at:new Date("2025-01-26T23:00:00.000Z"),deleted_at:null,role:"member",name:"Bob",name_role:"Bob_member",__ps_count__:"2"}]}function ae(n,e){let{changes:o,row:l,table:{columns:r,name:c,schema:a}}=n,u=h(e);return R(u.withSchema(a).updateTable(c).set(I({columns:r,context:"update",supportsDefaultKeyword:!0,values:o})).$call(N([l],r)).$castTo())}function se(){return g`cast(unix_timestamp(now(3)) * 1000 as unsigned)`}function ue(n){return g`json_object(${g.join(Object.keys(n).flatMap(e=>[g.lit(e),n[e]]))})`}function ie(n){let e=g`database()`,l=h(n).selectFrom("information_schema.columns as c").leftJoin("information_schema.KEY_COLUMN_USAGE as kcu",r=>r.on("kcu.TABLE_SCHEMA","=",e).onRef("kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("kcu.POSITION_IN_UNIQUE_CONSTRAINT","is not",null)).leftJoin("information_schema.KEY_COLUMN_USAGE as pk_kcu",r=>r.on("pk_kcu.TABLE_SCHEMA","=",e).onRef("pk_kcu.TABLE_NAME","=","c.TABLE_NAME").onRef("pk_kcu.COLUMN_NAME","=","c.COLUMN_NAME").on("pk_kcu.CONSTRAINT_NAME","=","PRIMARY")).where("c.TABLE_SCHEMA","=",e).select(["c.COLUMN_DEFAULT as default","c.COLUMN_NAME as name","c.COLUMN_TYPE as datatype","c.ORDINAL_POSITION as position","c.TABLE_NAME","kcu.REFERENCED_TABLE_NAME as fk_table","kcu.REFERENCED_COLUMN_NAME as fk_column","pk_kcu.ORDINAL_POSITION as pk"]).select(r=>[r("c.EXTRA","=","auto_increment").as("autoincrement"),r("c.EXTRA","in",["on update CURRENT_TIMESTAMP","STORED GENERATED","VIRTUAL GENERATED"]).as("computed"),r("c.IS_NULLABLE","=","YES").as("nullable")]);return R(h(n).with("cols",()=>l).selectFrom("information_schema.tables as t").innerJoin("cols as c",r=>r.onRef("c.TABLE_NAME","=","t.TABLE_NAME")).where("t.TABLE_SCHEMA","=",e).where("t.TABLE_TYPE","in",["BASE TABLE","VIEW"]).groupBy([e,"t.TABLE_NAME","t.TABLE_TYPE"]).select([e.as("schema"),"t.TABLE_NAME as name","t.TABLE_TYPE as type"]).$narrowType().select(r=>r.fn("json_arrayagg",[ue({autoincrement:r.ref("c.autoincrement"),computed:r.ref("c.computed"),datatype:r.ref("c.datatype"),default:r.ref("c.default"),fk_column:r.ref("c.fk_column"),fk_table:r.ref("c.fk_table"),name:r.ref("c.name"),position:r.ref("c.position"),pk:r.ref("c.pk"),nullable:r.ref("c.nullable")})]).as("columns")).orderBy("t.TABLE_SCHEMA").orderBy("t.TABLE_NAME").orderBy("t.TABLE_TYPE"))}function le(){return[{columns:[{autoincrement:1,computed:0,datatype:"int",default:null,fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"binary(16)",default:"uuid_to_bin(uuid())",fk_column:null,fk_table:null,name:"uuid",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"varchar(255)",default:null,fk_column:null,fk_table:null,name:"name",nullable:1,pk:null,position:3},{autoincrement:0,computed:1,datatype:"text",default:null,fk_column:null,fk_table:null,name:"id_name",nullable:1,pk:null,position:4}],name:"animals",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:0,computed:0,datatype:"char(36)",default:"uuid()",fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"text",default:null,fk_column:null,fk_table:null,name:"name",nullable:0,pk:2,position:2},{autoincrement:0,computed:0,datatype:"timestamp",default:"CURRENT_TIMESTAMP",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:null,position:3}],name:"composite_pk",schema:"studio",type:"BASE TABLE"},{columns:[{autoincrement:1,computed:0,datatype:"int",default:null,fk_column:null,fk_table:null,name:"id",nullable:0,pk:1,position:1},{autoincrement:0,computed:0,datatype:"timestamp",default:"current_timestamp",fk_column:null,fk_table:null,name:"created_at",nullable:1,pk:null,position:2},{autoincrement:0,computed:0,datatype:"timestamp",default:null,fk_column:null,fk_table:null,name:"deleted_at",nullable:1,pk:null,position:3},{autoincrement:0,computed:0,datatype:"text",default:null,fk_column:null,fk_table:null,name:"role",nullable:1,pk:null,position:4},{autoincrement:0,computed:0,datatype:"text",default:null,fk_column:null,fk_table:null,name:"name",nullable:1,pk:null,position:5},{autoincrement:0,computed:1,datatype:"text",default:null,fk_column:null,fk_table:null,name:"name_role",nullable:1,pk:null,position:6}],name:"users",schema:"studio",type:"BASE TABLE"}]}function ce(n){let e=h(n),o=g`@@session.time_zone`;return R(e.selectNoFrom(e.case().when(o,"=","SYSTEM").then(g`@@system_time_zone`).else(o).end().as("timezone")).$narrowType())}function me(){return[{timezone:"UTC"}]}function pe(n){let{error:e,sql:o}=n,l=Math.max(0,n.positionOffset??0),r=Ae(o.length);if(!(e instanceof Error))return[{from:r.from+l,message:"SQL lint failed.",severity:"error",source:"mysql",to:r.to+l}];let c=ge(e),a=be(o,e.message)??r;return[{code:c,from:a.from+l,message:_e({code:c,message:e.message}),severity:"error",source:"mysql",to:a.to+l}]}async function de(n,e,o){let l=ee(e.sql);if(!l.ok)return[null,{diagnostics:[l.diagnostic],schemaVersion:e.schemaVersion}];let r=[];for(let c of l.statements)try{let a=O(`EXPLAIN ${c.statement}`),[u]=await n.execute(a,o);if(!u)continue;r.push(...pe({error:u,positionOffset:c.from,sql:c.statement}))}catch(a){r.push(...pe({error:a,positionOffset:c.from,sql:c.statement}))}return[null,{diagnostics:r,schemaVersion:e.schemaVersion}]}function ge(n){let e=n;return typeof e.code=="string"?e.code:void 0}function _e(n){let{code:e,message:o}=n;return e==="ER_QUERY_TIMEOUT"||e==="ER_QUERY_INTERRUPTED"||o.toLowerCase().includes("maximum statement execution time exceeded")?"Lint query timed out. Simplify the statement and try again.":o}function Ae(n){return n<=0?{from:0,to:0}:{from:0,to:1}}function be(n,e){let o=new Set,l=/'([^']+)'/.exec(e);l?.[1]&&o.add(l[1]);let r=/`([^`]+)`/.exec(e);r?.[1]&&o.add(r[1]);let c=/"([^"]+)"/.exec(e);c?.[1]&&o.add(c[1]);let a=/table\s+'([^']+)'\s+doesn't exist/i.exec(e);a?.[1]&&o.add(a[1]);let u=n.toLowerCase();for(let t of o){let s=t.toLowerCase(),d=u.indexOf(s);if(d>=0)return{from:d,to:Math.min(n.length,d+t.length)};let y=s.split(".").at(-1);if(!y)continue;let p=u.indexOf(y);if(p>=0)return{from:p,to:Math.min(n.length,p+y.length)}}return null}function Je(n){let{executor:e,...o}=n,l=$(),r=typeof e.lintSql=="function";async function c(a){try{let u=ie(n),t=ce(n),[[s,d],[y,p]]=await Promise.all([e.execute(u,a),e.execute(t,a)]);if(s)return m({error:s,query:u});if(y)return m({error:y,query:t});let _=p[0]?.timezone;return _?[null,ye({query:u,tables:d,timezone:_})]:m({error:new Error("Timezone not found"),query:t})}catch(u){return m({error:u})}}return{capabilities:{fullTableSearch:!0,sqlDialect:"mysql",sqlEditorAutocomplete:!0,sqlEditorLint:!0},async delete(a,u){try{let t=re(a,o),[s]=await e.execute(t,u);return s?m({error:s,query:t}):[null,{...a,query:t}]}catch(t){return m({error:t})}},async insert(a,u){try{let{rows:t,table:s}=a,{columns:d}=s,y=Object.values(d).find(i=>i.isAutoincrement),p=t.map(i=>J(i,d)),_=p.some(i=>{let f=Object.values(i);return f.length===0||f.some(E=>E==null)});if(!y&&_)return m({error:new Error("Cannot proceed with the insertion, some rows cannot be refetched after insertion."),query:Q(a,o)});if(!_){let i=Q(a,o),f=C({criteria:p,table:s},o),E=[i,f],[[q],w]=await e.executeSequence(E,u),S=x(E);if(q)return m({error:q,query:S});let[L,M]=w;return L?m({error:new Error("Failed to refetch inserted rows - please refresh.",{cause:L}),query:S}):[null,{rows:M,query:S}]}let A=await Promise.all(t.map(async i=>{let f=Q({rows:[i],table:s},o),[E,q]=await e.execute(f,u);if(E)return m({error:E,query:f});let{name:w}=y,S=i[w]||q[0]?.insertId;if(!S)return m({error:new Error("Could not determine value for autoincrement column to refetch inserted row."),query:f});let L=C({criteria:[{[w]:S}],table:{...s,columns:Object.values(d).reduce((U,P)=>{let{name:F}=P;return U[F]={...P,pkPosition:F===w?1:null},U},{})}},o),[M,Ee]=await e.execute(L,u),B=x([f,L]);if(M)return console.error("Error refetching inserted row:",M),m({error:new Error("Failed to refetch inserted row - please refresh.",{cause:M}),query:B});let[D]=Ee;return D?[null,{row:D,query:B}]:m({error:new Error("Refetch query returned no results for inserted row."),query:B})})),k=[],b=null,T=[];for(let i=0;i<A.length;i++){let[f,E]=A[i];f?(T.push([i,f]),f.query&&(b=b?x([b,f.query]):f.query)):(k.push(E.row),E.query&&(b=b?x([b,E.query]):E.query))}return T.length>0?m({error:new AggregateError(T.map(([,i])=>i),`Row${T.length>1?"s":""} ${T.map(([i])=>i).join(", ")} could not be inserted or refetched.`),query:b}):[null,{rows:k,query:b}]}catch(t){return m({error:t})}},async introspect(a){return await c(a)},async sqlSchema(a,u){let[t,s]=await c(u);return t?[t]:[null,Z({defaultSchema:void 0,dialect:"mysql",introspection:s})]},async sqlLint(a,u){if(r&&typeof e.lintSql=="function")try{let[t,s]=await e.lintSql(a,u);if(!t)return[null,s];if(!fe(t))return m({error:t});r=!1}catch(t){if(!fe(t))return m({error:t});r=!1}return await de(e,a,u)},async raw(a,u){try{let t=O(a.sql),[s,d]=await e.execute(t,u);return s?m({error:s,query:t}):[null,{query:t,rowCount:d.length,rows:d}]}catch(t){return m({error:t})}},async query(a,u){try{let t=oe(a,o),[s,d]=await z({executor:e,options:u,query:t,searchTerm:a.fullTableSearchTerm,state:l});return s?m({error:s,query:t}):[null,{filteredRowCount:d[0]?.__ps_count__||"0",rows:d,query:t}]}catch(t){return m({error:t})}},async update(a,u){try{let t=ae(a,o),s=ne(a,o),[[d],y]=await e.executeSequence([t,s],u);if(d)return m({error:d,query:t});let[p,_]=y;if(p)return m({error:p,query:t});let[A]=_;return A?[null,{row:A,query:t}]:m({error:new Error("Updated row not found"),query:t})}catch(t){return m({error:t})}}}}function fe(n){if(!(n instanceof Error))return!1;let e=n.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 ye(n){let{query:e,tables:o,timezone:l}=n;return o.reduce((r,c)=>{let{schemas:a}=r,{columns:u,name:t,schema:s}=c,d=u.sort((y,p)=>y.position-p.position).reduce((y,p)=>{let{datatype:_,default:A,name:k}=p,b=_.indexOf("("),T=(b>-1?_.substring(0,b):_).trim().toLowerCase(),i=!!p.autoincrement,f=!!p.computed,E=!!p.nullable;return{...y,[k]:{datatype:{...te[T]||{group:"raw"},isArray:!1,isNative:!0,name:T,options:T==="enum"?_.slice(6,-2).split("','"):[],schema:s},defaultValue:A,fkColumn:p.fk_column,fkSchema:s,fkTable:p.fk_table,isAutoincrement:i,isComputed:f,isRequired:!E&&!i&&!f&&A==null,name:k,nullable:E,pkPosition:p.pk,schema:s,table:t}}},{});return a[s]===void 0&&(a[s]={name:s,tables:{}}),a[s].tables[t]={columns:d,name:t,schema:s},r},{filterOperators:Te,query:e,schemas:{},timezone:l})}var Te=["=","!=",">",">=","<","<=","is","is not","like","not like"];function Xe(){let n=le(),[{timezone:e}]=me();return ye({tables:n,timezone:e,query:{parameters:[],sql:"<mocked>"}})}function x(n){let[e,o]=n;return{parameters:e.parameters.concat(o.parameters),sql:`${e.sql};
10
10
  ${o.sql}`}}export{pe as createLintDiagnosticsFromMySQLError,Je as createMySQLAdapter,he as getCancelQuery,re as getDeleteQuery,Q as getInsertQuery,C as getInsertRefetchQuery,oe as getSelectQuery,ie as getTablesQuery,ce as getTimezoneQuery,ae as getUpdateQuery,ne as getUpdateRefetchQuery,de as lintMySQLWithExplainFallback,Xe as mockIntrospect,Oe as mockSelectQuery,le as mockTablesQuery,me as mockTimezoneQuery};
11
11
  //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9teXNxbC1jb3JlL2RhdGF0eXBlLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9idWlsZGVyLnRzIiwgIi4uLy4uLy4uL2RhdGEvbXlzcWwtY29yZS9kbWwudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vaGVscGVycy9teXNxbC5qcyIsICIuLi8uLi8uLi9kYXRhL215c3FsLWNvcmUvaW50cm9zcGVjdGlvbi50cyIsICIuLi8uLi8uLi9kYXRhL215c3FsLWNvcmUvc3FsLWxpbnQudHMiLCAiLi4vLi4vLi4vZGF0YS9teXNxbC1jb3JlL2FkYXB0ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgRGF0YVR5cGUgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG5leHBvcnQgY29uc3QgTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQTogUmVjb3JkPFxuICBzdHJpbmcsXG4gIFBpY2s8RGF0YVR5cGUsIFwiZm9ybWF0XCIgfCBcImdyb3VwXCI+XG4+ID0ge1xuICBiaWdpbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGJpbmFyeToge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBiaXQ6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgYmxvYjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBjaGFyOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIFwiY2hhciBiaW5hcnlcIjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBkYXRlOiB7XG4gICAgZm9ybWF0OiBcIllZWVktTU0tRERcIixcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICBkYXRldGltZToge1xuICAgIGZvcm1hdDogXCJZWVlZLU1NLUREIEhIOm1tOnNzLlNTU1wiLFxuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIGRlYzoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZGVjaW1hbDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZG91YmxlOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBcImRvdWJsZSBwcmVjaXNpb25cIjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZW51bToge1xuICAgIGdyb3VwOiBcImVudW1cIixcbiAgfSxcbiAgZml4ZWQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGZsb2F0OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBnZW9tZXRyeToge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBnZW9tZXRyeWNvbGxlY3Rpb246IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnRlZ2VyOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBqc29uOiB7XG4gICAgZ3JvdXA6IFwianNvblwiLFxuICB9LFxuICBsaW5lc3RyaW5nOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIGxvbmc6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgXCJsb25nIHZhcmNoYXJcIjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBsb25nYmxvYjoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBsb25ndGV4dDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBsb25ndmFyYmluYXJ5OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGxvbmd2YXJjaGFyOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG1lZGl1bWJsb2I6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgbWVkaXVtaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBtZWRpdW10ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIG11bHRpbGluZXN0cmluZzoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBtdWx0aXBvaW50OiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIG11bHRpcG9seWdvbjoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBudW1lcmljOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBwb2ludDoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBwb2x5Z29uOiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIHJlYWw6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBodHRwczovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi85LjUvZW4vc2V0Lmh0bWxcbiAgICovXG4gIHNldDoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBzbWFsbGludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgdGV4dDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICB0aW1lOiB7XG4gICAgZm9ybWF0OiBcIkhIOm1tOnNzLlNTU1wiLFxuICAgIGdyb3VwOiBcInRpbWVcIixcbiAgfSxcbiAgdGltZXN0YW1wOiB7XG4gICAgZm9ybWF0OiBcIllZWVktTU0tREQgSEg6bW06c3MuU1NTXCIsXG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgdGlueWJsb2I6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdGlueWludDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgdGlueXRleHQ6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdmFyYmluYXJ5OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHZhcmNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgXCJ2YXJjaGFyIGJpbmFyeVwiOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBodHRwczovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi85LjUvZW4vdmVjdG9yLmh0bWxcbiAgICovXG4gIHZlY3Rvcjoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICB5ZWFyOiB7XG4gICAgZm9ybWF0OiBcIllZWVlcIixcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG59O1xuIiwgImltcG9ydCB7IHR5cGUgS3lzZWx5LCBNeXNxbEFkYXB0ZXIsIE15c3FsUXVlcnlDb21waWxlciB9IGZyb20gXCJreXNlbHlcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBnZXRCdWlsZGVyIH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gZ2V0TXlTUUxCdWlsZGVyPERhdGFiYXNlID0gYW55PihcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbik6IEt5c2VseTxEYXRhYmFzZT4ge1xuICByZXR1cm4gZ2V0QnVpbGRlcih7XG4gICAgLi4ucmVxdWlyZW1lbnRzLFxuICAgIEFkYXB0ZXI6IE15c3FsQWRhcHRlcixcbiAgICBRdWVyeUNvbXBpbGVyOiBNeXNxbFF1ZXJ5Q29tcGlsZXIsXG4gIH0pO1xufVxuIiwgImltcG9ydCB7IHR5cGUgSW5mZXJSZXN1bHQsIHR5cGUgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiwgc3FsIH0gZnJvbSBcImt5c2VseVwiO1xuaW1wb3J0IHR5cGUgeyBPa1BhY2tldFBhcmFtcyB9IGZyb20gXCJteXNxbDJcIjtcblxuaW1wb3J0IHR5cGUge1xuICBBZGFwdGVyRGVsZXRlRGV0YWlscyxcbiAgQWRhcHRlclF1ZXJ5RGV0YWlscyxcbiAgQWRhcHRlclVwZGF0ZURldGFpbHMsXG4gIFRhYmxlLFxufSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgYnVpbGRGdWxsVGFibGVTZWFyY2hQbGFuLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9NWVNRTF9MT0NLX1dBSVRfVElNRU9VVF9TRUNPTkRTLFxuICBGVUxMX1RBQkxFX1NFQVJDSF9USU1FT1VUX01TLFxuICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uLFxuICBpc0Z1bGxUYWJsZVNlYXJjaFJlcXVlc3QsXG59IGZyb20gXCIuLi9mdWxsLXRhYmxlLXNlYXJjaFwiO1xuaW1wb3J0IHtcbiAgYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMsXG4gIGFwcGx5VHJhbnNmb3JtYXRpb25zLFxuICB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsXG4gIGNvbXBpbGUsXG4gIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24sXG59IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuaW1wb3J0IHsgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsZXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJEZWxldGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICByb3dzLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID1cbiAgICBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5kZWxldGVGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSlcbiAgICAgIC4kY2FzdFRvPE9rUGFja2V0UGFyYW1zPigpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zZXJ0UXVlcnkoXG4gIGRldGFpbHM6IHsgcm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgdGFibGU6IFRhYmxlIH0sXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPVxuICAgIGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLmluc2VydEludG8odGFibGVOYW1lKVxuICAgICAgLnZhbHVlcyhcbiAgICAgICAgYXBwbHlUcmFuc2Zvcm1hdGlvbnMoe1xuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29udGV4dDogXCJpbnNlcnRcIixcbiAgICAgICAgICBzdXBwb3J0c0RlZmF1bHRLZXl3b3JkOiB0cnVlLFxuICAgICAgICAgIHZhbHVlczogcm93cyxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuJGNhc3RUbzxPa1BhY2tldFBhcmFtcz4oKSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFJlZmV0Y2hRdWVyeShcbiAgZGV0YWlsczogeyBjcml0ZXJpYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgdGFibGU6IFRhYmxlIH0sXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIGNyaXRlcmlhLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID1cbiAgICBnZXRNeVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhjcml0ZXJpYSwgY29sdW1ucykpXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX2luc2VydGVkX2F0X19cIikpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPVxuICAgIGdldE15U1FMQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLnNlbGVjdEZyb20odGFibGVOYW1lKVxuICAgICAgLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFt7IC4uLnJvdywgLi4uY2hhbmdlcyB9XSwgY29sdW1ucykpXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnNlbGVjdChnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX3VwZGF0ZWRfYXRfX1wiKSksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlclF1ZXJ5RGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgZmlsdGVyID0geyBhZnRlcjogXCJhbmRcIiwgZmlsdGVyczogW10sIGtpbmQ6IFwiRmlsdGVyR3JvdXBcIiB9LFxuICAgIGZ1bGxUYWJsZVNlYXJjaFRlcm0sXG4gICAgcGFnZUluZGV4LFxuICAgIHBhZ2VTaXplLFxuICAgIHNvcnRPcmRlcixcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICBjb25zdCBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbiA9IGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oXG4gICAgZmlsdGVyLmZpbHRlcnMsXG4gICAgY29sdW1ucyxcbiAgKTtcbiAgY29uc3QgZnVsbFRhYmxlU2VhcmNoUGxhbiA9IGJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbih7XG4gICAgc2VhcmNoVGVybTogZnVsbFRhYmxlU2VhcmNoVGVybSxcbiAgICB0YWJsZTogZGV0YWlscy50YWJsZSxcbiAgfSk7XG4gIGNvbnN0IGNvbWJpbmVkV2hlcmVFeHByZXNzaW9uID1cbiAgICBmdWxsVGFibGVTZWFyY2hQbGFuLnByZWRpY2F0ZXMubGVuZ3RoID4gMFxuICAgICAgPyAoZWI6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbj4+WzBdKSA9PlxuICAgICAgICAgIGViLmFuZChbXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyRXhwcmVzc2lvbihlYiksXG4gICAgICAgICAgICBnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uKGZ1bGxUYWJsZVNlYXJjaFBsYW4sIHtcbiAgICAgICAgICAgICAgZGlhbGVjdDogXCJteXNxbFwiLFxuICAgICAgICAgICAgfSkoZWIpLFxuICAgICAgICAgIF0pXG4gICAgICA6IGFwcGxpZWRGaWx0ZXJFeHByZXNzaW9uO1xuXG4gIGNvbnN0IEFHR19OQU1FID0gXCJfX3BzX2FnZ19fXCI7XG4gIGNvbnN0IENPVU5UX1JFRiA9IFwiX19wc19jb3VudF9fXCI7XG4gIGNvbnN0IHNob3VsZEFwcGx5U2VhcmNoR3VhcmRyYWlscyA9XG4gICAgaXNGdWxsVGFibGVTZWFyY2hSZXF1ZXN0KGZ1bGxUYWJsZVNlYXJjaFRlcm0pO1xuICBjb25zdCBteXNxbFNlYXJjaE9wdGltaXplckhpbnQgPSBzcWxgLyorIE1BWF9FWEVDVVRJT05fVElNRSgke3NxbC5saXQoRlVMTF9UQUJMRV9TRUFSQ0hfVElNRU9VVF9NUyl9KSBTRVRfVkFSKGxvY2tfd2FpdF90aW1lb3V0PSR7c3FsLmxpdChGVUxMX1RBQkxFX1NFQVJDSF9NWVNRTF9MT0NLX1dBSVRfVElNRU9VVF9TRUNPTkRTKX0pICovYDtcblxuICBjb25zdCBjb3VudFF1ZXJ5ID0gYnVpbGRlclxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgLnNlbGVjdCgoZWIpID0+IHtcbiAgICAgIGNvbnN0IGNvdW50RXhwcmVzc2lvbiA9IGViLmNhc3Q8QmlnSW50U3RyaW5nPihcbiAgICAgICAgZWIuZm4uY29hbGVzY2UoZWIuZm4uY291bnRBbGwoKSwgc3FsLmxpdCgwKSksXG4gICAgICAgIFwiY2hhclwiLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFzaG91bGRBcHBseVNlYXJjaEd1YXJkcmFpbHMpIHtcbiAgICAgICAgcmV0dXJuIGNvdW50RXhwcmVzc2lvbi5hcyhDT1VOVF9SRUYpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3FsPEJpZ0ludFN0cmluZz5gJHtteXNxbFNlYXJjaE9wdGltaXplckhpbnR9ICR7Y291bnRFeHByZXNzaW9ufWAuYXMoXG4gICAgICAgIENPVU5UX1JFRixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoQUdHX05BTUUsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgICAuaW5uZXJKb2luKEFHR19OQU1FLCAoamIpID0+IGpiLm9uVHJ1ZSgpKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoY29tYmluZWRXaGVyZUV4cHJlc3Npb24pXG4gICAgICAuc2VsZWN0KFxuICAgICAgICBzaG91bGRBcHBseVNlYXJjaEd1YXJkcmFpbHNcbiAgICAgICAgICA/IHNxbDxCaWdJbnRTdHJpbmc+YCR7bXlzcWxTZWFyY2hPcHRpbWl6ZXJIaW50fSAke3NxbC5yZWYoXG4gICAgICAgICAgICAgIGAke0FHR19OQU1FfS4ke0NPVU5UX1JFRn1gLFxuICAgICAgICAgICAgKX1gLmFzKENPVU5UX1JFRilcbiAgICAgICAgICA6IChgJHtBR0dfTkFNRX0uJHtDT1VOVF9SRUZ9YCBzYXRpc2ZpZXMgU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbjxcbiAgICAgICAgICAgICAgeyBbQUdHX05BTUVdOiBJbmZlclJlc3VsdDx0eXBlb2YgY291bnRRdWVyeT5bbnVtYmVyXSB9LFxuICAgICAgICAgICAgICB0eXBlb2YgQUdHX05BTUVcbiAgICAgICAgICAgID4pLFxuICAgICAgKVxuICAgICAgLnNlbGVjdChPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC4kY2FsbCgocWIpID0+XG4gICAgICAgIHNvcnRPcmRlci5yZWR1Y2UoXG4gICAgICAgICAgKHFiLCBpdGVtKSA9PiBxYi5vcmRlckJ5KGl0ZW0uY29sdW1uLCBpdGVtLmRpcmVjdGlvbiksXG4gICAgICAgICAgcWIsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAubGltaXQocGFnZVNpemUpXG4gICAgICAvLyB3ZSdyZSBpbmplY3RpbmcgdGhlIG9mZnNldCB2YWx1ZSBoZXJlIHRvIGF2b2lkIHNlcmlhbGl6YXRpb24gY29tcGxleGl0eSAoYGJpZ2ludGAgaXMgYSBuby1nbyBmb3IgYEpTT04uc3RyaW5naWZ5YCkuXG4gICAgICAub2Zmc2V0KHNxbC5saXQoQmlnSW50KHBhZ2VJbmRleCkgKiBCaWdJbnQocGFnZVNpemUpKSksXG4gICk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrU2VsZWN0UXVlcnkoKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgaWQ6IDEsXG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShcIjIwMjUtMDEtMjdUMDA6MDA6MDAuMDAwWlwiKSxcbiAgICAgIGRlbGV0ZWRfYXQ6IG51bGwsXG4gICAgICByb2xlOiBcImFkbWluXCIsXG4gICAgICBuYW1lOiBcIkFsaWNlXCIsXG4gICAgICBuYW1lX3JvbGU6IFwiQWxpY2VfYWRtaW5cIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogMixcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKFwiMjAyNS0wMS0yNlQyMzowMDowMC4wMDBaXCIpLFxuICAgICAgZGVsZXRlZF9hdDogbnVsbCxcbiAgICAgIHJvbGU6IFwibWVtYmVyXCIsXG4gICAgICBuYW1lOiBcIkJvYlwiLFxuICAgICAgbmFtZV9yb2xlOiBcIkJvYl9tZW1iZXJcIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgfSxcbiAgXSBhcyBjb25zdCBzYXRpc2ZpZXMge1xuICAgIC8vIGJlc3QgZWZmb3J0IG5vIG5lZWQgdG8gZ28gb3ZlcmJvYXJkXG4gICAgW0sgaW5cbiAgICAgIHwgUmV0dXJuVHlwZTx0eXBlb2YgbW9ja1RhYmxlc1F1ZXJ5PlsyXVtcImNvbHVtbnNcIl1bbnVtYmVyXVtcIm5hbWVcIl1cbiAgICAgIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzY2hlbWEgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9XG4gICAgZ2V0TXlTUUxCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAudXBkYXRlVGFibGUodGFibGVOYW1lKVxuICAgICAgLnNldChcbiAgICAgICAgYXBwbHlUcmFuc2Zvcm1hdGlvbnMoe1xuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29udGV4dDogXCJ1cGRhdGVcIixcbiAgICAgICAgICBzdXBwb3J0c0RlZmF1bHRLZXl3b3JkOiB0cnVlLFxuICAgICAgICAgIHZhbHVlczogY2hhbmdlcyxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuJGNhbGwoYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMoW3Jvd10sIGNvbHVtbnMpKVxuICAgICAgLiRjYXN0VG88T2tQYWNrZXRQYXJhbXM+KCksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKSB7XG4gIHJldHVybiBzcWw8bnVtYmVyIHwgc3RyaW5nPmBjYXN0KHVuaXhfdGltZXN0YW1wKG5vdygzKSkgKiAxMDAwIGFzIHVuc2lnbmVkKWA7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL215c3FsLmQudHNcIiAvPlxuaW1wb3J0IHsgc3FsIH0gZnJvbSAnLi4vcmF3LWJ1aWxkZXIvc3FsLmpzJztcbmltcG9ydCB7IGdldEpzb25PYmplY3RBcmdzIH0gZnJvbSAnLi4vdXRpbC9qc29uLW9iamVjdC1hcmdzLmpzJztcbi8qKlxuICogQSBNeVNRTCBoZWxwZXIgZm9yIGFnZ3JlZ2F0aW5nIGEgc3VicXVlcnkgaW50byBhIEpTT04gYXJyYXkuXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgaXMgb25seSBndWFyYW50ZWVkIHRvIGZ1bGx5IHdvcmsgd2l0aCB0aGUgYnVpbHQtaW4gYE15c3FsRGlhbGVjdGAuXG4gKiBXaGlsZSB0aGUgcHJvZHVjZWQgU1FMIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgTXlTUUwgZGF0YWJhc2VzLCBzb21lIHRoaXJkLXBhcnR5IGRpYWxlY3RzXG4gKiBtYXkgbm90IHBhcnNlIHRoZSBuZXN0ZWQgSlNPTiBpbnRvIGFycmF5cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9teXNxbCdcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25BcnJheUZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC5vcmRlckJ5KCdwZXQubmFtZScpXG4gKiAgICAgKS5hcygncGV0cycpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/LnBldHNbMF0/LnBldF9pZFxuICogcmVzdWx0WzBdPy5wZXRzWzBdPy5uYW1lXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IGBpZGAsIChcbiAqICAgc2VsZWN0IGNhc3QoY29hbGVzY2UoanNvbl9hcnJheWFnZyhqc29uX29iamVjdChcbiAqICAgICAncGV0X2lkJywgYGFnZ2AuYHBldF9pZGAsXG4gKiAgICAgJ25hbWUnLCBgYWdnYC5gbmFtZWBcbiAqICAgKSksICdbXScpIGFzIGpzb24pIGZyb20gKFxuICogICAgIHNlbGVjdCBgcGV0YC5gaWRgIGFzIGBwZXRfaWRgLCBgcGV0YC5gbmFtZWBcbiAqICAgICBmcm9tIGBwZXRgXG4gKiAgICAgd2hlcmUgYHBldGAuYG93bmVyX2lkYCA9IGBwZXJzb25gLmBpZGBcbiAqICAgICBvcmRlciBieSBgcGV0YC5gbmFtZWBcbiAqICAgKSBhcyBgYWdnYFxuICogKSBhcyBgcGV0c2BcbiAqIGZyb20gYHBlcnNvbmBcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbkFycmF5RnJvbShleHByKSB7XG4gICAgcmV0dXJuIHNxbCBgKHNlbGVjdCBjYXN0KGNvYWxlc2NlKGpzb25fYXJyYXlhZ2coanNvbl9vYmplY3QoJHtzcWwuam9pbihnZXRNeXNxbEpzb25PYmplY3RBcmdzKGV4cHIudG9PcGVyYXRpb25Ob2RlKCksICdhZ2cnKSl9KSksICdbXScpIGFzIGpzb24pIGZyb20gJHtleHByfSBhcyBhZ2cpYDtcbn1cbi8qKlxuICogQSBNeVNRTCBoZWxwZXIgZm9yIHR1cm5pbmcgYSBzdWJxdWVyeSBpbnRvIGEgSlNPTiBvYmplY3QuXG4gKlxuICogVGhlIHN1YnF1ZXJ5IG11c3Qgb25seSByZXR1cm4gb25lIHJvdy5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZnVsbHkgd29yayB3aXRoIHRoZSBidWlsdC1pbiBgTXlzcWxEaWFsZWN0YC5cbiAqIFdoaWxlIHRoZSBwcm9kdWNlZCBTUUwgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBNeVNRTCBkYXRhYmFzZXMsIHNvbWUgdGhpcmQtcGFydHkgZGlhbGVjdHNcbiAqIG1heSBub3QgcGFyc2UgdGhlIG5lc3RlZCBKU09OIGludG8gb2JqZWN0cy4gSW4gdGhlc2UgY2FzZXMgeW91IGNhbiB1c2UgdGhlIGJ1aWx0IGluXG4gKiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAgdG8gcGFyc2UgdGhlIHJlc3VsdHMuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25PYmplY3RGcm9tIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvbXlzcWwnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uT2JqZWN0RnJvbShcbiAqICAgICAgIGViLnNlbGVjdEZyb20oJ3BldCcpXG4gKiAgICAgICAgIC5zZWxlY3QoWydwZXQuaWQgYXMgcGV0X2lkJywgJ3BldC5uYW1lJ10pXG4gKiAgICAgICAgIC53aGVyZVJlZigncGV0Lm93bmVyX2lkJywgJz0nLCAncGVyc29uLmlkJylcbiAqICAgICAgICAgLndoZXJlKCdwZXQuaXNfZmF2b3JpdGUnLCAnPScsIHRydWUpXG4gKiAgICAgKS5hcygnZmF2b3JpdGVfcGV0JylcbiAqICAgXSlcbiAqICAgLmV4ZWN1dGUoKVxuICpcbiAqIHJlc3VsdFswXT8uaWRcbiAqIHJlc3VsdFswXT8uZmF2b3JpdGVfcGV0Py5wZXRfaWRcbiAqIHJlc3VsdFswXT8uZmF2b3JpdGVfcGV0Py5uYW1lXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IGBpZGAsIChcbiAqICAgc2VsZWN0IGpzb25fb2JqZWN0KFxuICogICAgICdwZXRfaWQnLCBgb2JqYC5gcGV0X2lkYCxcbiAqICAgICAnbmFtZScsIGBvYmpgLmBuYW1lYFxuICogICApIGZyb20gKFxuICogICAgIHNlbGVjdCBgcGV0YC5gaWRgIGFzIGBwZXRfaWRgLCBgcGV0YC5gbmFtZWBcbiAqICAgICBmcm9tIGBwZXRgXG4gKiAgICAgd2hlcmUgYHBldGAuYG93bmVyX2lkYCA9IGBwZXJzb25gLmBpZGBcbiAqICAgICBhbmQgYHBldGAuYGlzX2Zhdm9yaXRlYCA9ID9cbiAqICAgKSBhcyBvYmpcbiAqICkgYXMgYGZhdm9yaXRlX3BldGBcbiAqIGZyb20gYHBlcnNvbmBcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbk9iamVjdEZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QganNvbl9vYmplY3QoJHtzcWwuam9pbihnZXRNeXNxbEpzb25PYmplY3RBcmdzKGV4cHIudG9PcGVyYXRpb25Ob2RlKCksICdvYmonKSl9KSBmcm9tICR7ZXhwcn0gYXMgb2JqKWA7XG59XG4vKipcbiAqIFRoZSBNeVNRTCBganNvbl9vYmplY3RgIGZ1bmN0aW9uLlxuICpcbiAqIE5PVEU6IFRoaXMgaGVscGVyIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBmdWxseSB3b3JrIHdpdGggdGhlIGJ1aWx0LWluIGBNeXNxbERpYWxlY3RgLlxuICogV2hpbGUgdGhlIHByb2R1Y2VkIFNRTCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIE15U1FMIGRhdGFiYXNlcywgc29tZSB0aGlyZC1wYXJ0eSBkaWFsZWN0c1xuICogbWF5IG5vdCBwYXJzZSB0aGUgbmVzdGVkIEpTT04gaW50byBvYmplY3RzLiBJbiB0aGVzZSBjYXNlcyB5b3UgY2FuIHVzZSB0aGUgYnVpbHQgaW5cbiAqIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYCB0byBwYXJzZSB0aGUgcmVzdWx0cy5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQnVpbGRPYmplY3Qoe1xuICogICAgICAgZmlyc3Q6IGViLnJlZignZmlyc3RfbmFtZScpLFxuICogICAgICAgbGFzdDogZWIucmVmKCdsYXN0X25hbWUnKSxcbiAqICAgICAgIGZ1bGw6IGViLmZuKCdjb25jYXQnLCBbJ2ZpcnN0X25hbWUnLCBlYi52YWwoJyAnKSwgJ2xhc3RfbmFtZSddKVxuICogICAgIH0pLmFzKCduYW1lJylcbiAqICAgXSlcbiAqICAgLmV4ZWN1dGUoKVxuICpcbiAqIHJlc3VsdFswXT8uaWRcbiAqIHJlc3VsdFswXT8ubmFtZS5maXJzdFxuICogcmVzdWx0WzBdPy5uYW1lLmxhc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5mdWxsXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwganNvbl9vYmplY3QoXG4gKiAgICdmaXJzdCcsIGZpcnN0X25hbWUsXG4gKiAgICdsYXN0JywgbGFzdF9uYW1lLFxuICogICAnZnVsbCcsIGNvbmNhdChgZmlyc3RfbmFtZWAsID8sIGBsYXN0X25hbWVgKVxuICogKSBhcyBcIm5hbWVcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25CdWlsZE9iamVjdChvYmopIHtcbiAgICByZXR1cm4gc3FsIGBqc29uX29iamVjdCgke3NxbC5qb2luKE9iamVjdC5rZXlzKG9iaikuZmxhdE1hcCgoaykgPT4gW3NxbC5saXQoayksIG9ialtrXV0pKX0pYDtcbn1cbmZ1bmN0aW9uIGdldE15c3FsSnNvbk9iamVjdEFyZ3Mobm9kZSwgdGFibGUpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZ2V0SnNvbk9iamVjdEFyZ3Mobm9kZSwgdGFibGUpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXlTUUwganNvbkFycmF5RnJvbSBhbmQganNvbk9iamVjdEZyb20gZnVuY3Rpb25zIGNhbiBvbmx5IGhhbmRsZSBleHBsaWNpdCBzZWxlY3Rpb25zIGR1ZSB0byBsaW1pdGF0aW9ucyBvZiB0aGUganNvbl9vYmplY3QgZnVuY3Rpb24uIHNlbGVjdEFsbCgpIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBzdWJxdWVyeS4nKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBJbmZlclJlc3VsdCwgc3FsIH0gZnJvbSBcImt5c2VseVwiO1xuaW1wb3J0IHsganNvbkJ1aWxkT2JqZWN0IH0gZnJvbSBcImt5c2VseS9oZWxwZXJzL215c3FsXCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgY29tcGlsZSwgdHlwZSBRdWVyeVJlc3VsdCB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHsgZ2V0TXlTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2Uge1xuICAvKiogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOC40L2VuL2luZm9ybWF0aW9uLXNjaGVtYS1rZXktY29sdW1uLXVzYWdlLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEuS0VZX0NPTFVNTl9VU0FHRVwiOiB7XG4gICAgQ09MVU1OX05BTUU6IHN0cmluZztcbiAgICBDT05TVFJBSU5UX05BTUU6IHN0cmluZztcbiAgICBPUkRJTkFMX1BPU0lUSU9OOiBudW1iZXI7XG4gICAgLyoqIG51bGwgLSB3aGVuIHVuaXF1ZSBvciBwcmltYXJ5IGtleSBjb25zdHJhaW50LiAxLW4gLSB3aGVuIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgKi9cbiAgICBQT1NJVElPTl9JTl9VTklRVUVfQ09OU1RSQUlOVDogbnVtYmVyIHwgbnVsbDtcbiAgICBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiBzdHJpbmc7XG4gICAgUkVGRVJFTkNFRF9UQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgVEFCTEVfTkFNRTogc3RyaW5nO1xuICAgIFRBQkxFX1NDSEVNQTogc3RyaW5nO1xuICB9O1xuICAvKiogaHR0cHM6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vOC40L2VuL2luZm9ybWF0aW9uLXNjaGVtYS1jb2x1bW5zLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1uc1wiOiB7XG4gICAgLyoqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY29sdW1uLiBUaGlzIGlzIE5VTEwgaWYgdGhlIGNvbHVtbiBoYXMgYW4gZXhwbGljaXQgZGVmYXVsdCBvZiBOVUxMLCBvciBpZiB0aGUgY29sdW1uIGRlZmluaXRpb24gaW5jbHVkZXMgbm8gREVGQVVMVCBjbGF1c2UuICovXG4gICAgQ09MVU1OX0RFRkFVTFQ6IHN0cmluZyB8IG51bGw7XG4gICAgQ09MVU1OX05BTUU6IHN0cmluZztcbiAgICAvKiogQ29udGFpbnMgdGhlIHR5cGUgbmFtZSBhbmQgcG9zc2libHkgb3RoZXIgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcHJlY2lzaW9uIG9yIGxlbmd0aC4gKi9cbiAgICBDT0xVTU5fVFlQRTogc3RyaW5nO1xuICAgIC8qKiBFeHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICovXG4gICAgRVhUUkE6XG4gICAgICB8IFwiXCJcbiAgICAgIHwgXCJhdXRvX2luY3JlbWVudFwiXG4gICAgICB8IFwib24gdXBkYXRlIENVUlJFTlRfVElNRVNUQU1QXCJcbiAgICAgIHwgXCJTVE9SRUQgR0VORVJBVEVEXCJcbiAgICAgIHwgXCJWSVJUVUFMIEdFTkVSQVRFRFwiXG4gICAgICB8IFwiREVGQVVMVCBHRU5FUkFURURcIjtcbiAgICBJU19OVUxMQUJMRTogXCJZRVNcIiB8IFwiTk9cIjtcbiAgICAvKiogVGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4gd2l0aGluIHRoZSB0YWJsZS4gT1JESU5BTF9QT1NJVElPTiBpcyBuZWNlc3NhcnkgYmVjYXVzZSB5b3UgbWlnaHQgd2FudCB0byBzYXkgT1JERVIgQlkgT1JESU5BTF9QT1NJVElPTi4gVW5saWtlIFNIT1cgQ09MVU1OUywgU0VMRUNUIGZyb20gdGhlIENPTFVNTlMgdGFibGUgZG9lcyBub3QgaGF2ZSBhdXRvbWF0aWMgb3JkZXJpbmcuICovXG4gICAgT1JESU5BTF9QT1NJVElPTjogbnVtYmVyO1xuICAgIFRBQkxFX05BTUU6IHN0cmluZztcbiAgICBUQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgfTtcbiAgLyoqIGh0dHBzOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzguNC9lbi9pbmZvcm1hdGlvbi1zY2hlbWEtdGFibGVzLXRhYmxlLmh0bWwgKi9cbiAgXCJpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzXCI6IHtcbiAgICBUQUJMRV9OQU1FOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBzY2hlbWEgKGRhdGFiYXNlKSB0byB3aGljaCB0aGUgdGFibGUgYmVsb25ncy4gKi9cbiAgICBUQUJMRV9TQ0hFTUE6IHN0cmluZztcbiAgICAvKiogQkFTRSBUQUJMRSBmb3IgYSB0YWJsZSwgVklFVyBmb3IgYSB2aWV3LCBvciBTWVNURU0gVklFVyBmb3IgYW4gSU5GT1JNQVRJT05fU0NIRU1BIHRhYmxlLiAqL1xuICAgIFRBQkxFX1RZUEU6IFwiQkFTRSBUQUJMRVwiIHwgXCJWSUVXXCIgfCBcIlNZU1RFTSBWSUVXXCI7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZXNRdWVyeShcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCBkYXRhYmFzZSA9IHNxbDxzdHJpbmc+YGRhdGFiYXNlKClgO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRNeVNRTEJ1aWxkZXI8RGF0YWJhc2U+KHJlcXVpcmVtZW50cyk7XG5cbiAgY29uc3QgY29sdW1uc1F1ZXJ5ID0gYnVpbGRlclxuICAgIC5zZWxlY3RGcm9tKFwiaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgYXMgY1wiKVxuICAgIC5sZWZ0Sm9pbihcImluZm9ybWF0aW9uX3NjaGVtYS5LRVlfQ09MVU1OX1VTQUdFIGFzIGtjdVwiLCAoamIpID0+XG4gICAgICBqYlxuICAgICAgICAub24oXCJrY3UuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBkYXRhYmFzZSlcbiAgICAgICAgLm9uUmVmKFwia2N1LlRBQkxFX05BTUVcIiwgXCI9XCIsIFwiYy5UQUJMRV9OQU1FXCIpXG4gICAgICAgIC5vblJlZihcImtjdS5DT0xVTU5fTkFNRVwiLCBcIj1cIiwgXCJjLkNPTFVNTl9OQU1FXCIpXG4gICAgICAgIC8vIG9ubHkgZ2V0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzXG4gICAgICAgIC5vbihcImtjdS5QT1NJVElPTl9JTl9VTklRVUVfQ09OU1RSQUlOVFwiLCBcImlzIG5vdFwiLCBudWxsKSxcbiAgICApXG4gICAgLmxlZnRKb2luKFwiaW5mb3JtYXRpb25fc2NoZW1hLktFWV9DT0xVTU5fVVNBR0UgYXMgcGtfa2N1XCIsIChqYikgPT5cbiAgICAgIGpiXG4gICAgICAgIC5vbihcInBrX2tjdS5UQUJMRV9TQ0hFTUFcIiwgXCI9XCIsIGRhdGFiYXNlKVxuICAgICAgICAub25SZWYoXCJwa19rY3UuVEFCTEVfTkFNRVwiLCBcIj1cIiwgXCJjLlRBQkxFX05BTUVcIilcbiAgICAgICAgLm9uUmVmKFwicGtfa2N1LkNPTFVNTl9OQU1FXCIsIFwiPVwiLCBcImMuQ09MVU1OX05BTUVcIilcbiAgICAgICAgLy8gb25seSBnZXQgcHJpbWFyeSBrZXkgY29uc3RyYWludCAtIGd1YXJhbnRlZWQgdG8gYmUgXCJQUklNQVJZXCIgZXZlbiBpZiBhIG5hbWUgd2FzIGdpdmVuIGR1cmluZyBjcmVhdGlvblxuICAgICAgICAub24oXCJwa19rY3UuQ09OU1RSQUlOVF9OQU1FXCIsIFwiPVwiLCBcIlBSSU1BUllcIiksXG4gICAgKVxuICAgIC53aGVyZShcImMuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBkYXRhYmFzZSlcbiAgICAuc2VsZWN0KFtcbiAgICAgIFwiYy5DT0xVTU5fREVGQVVMVCBhcyBkZWZhdWx0XCIsXG4gICAgICBcImMuQ09MVU1OX05BTUUgYXMgbmFtZVwiLFxuICAgICAgXCJjLkNPTFVNTl9UWVBFIGFzIGRhdGF0eXBlXCIsXG4gICAgICBcImMuT1JESU5BTF9QT1NJVElPTiBhcyBwb3NpdGlvblwiLFxuICAgICAgXCJjLlRBQkxFX05BTUVcIixcbiAgICAgIFwia2N1LlJFRkVSRU5DRURfVEFCTEVfTkFNRSBhcyBma190YWJsZVwiLFxuICAgICAgXCJrY3UuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSBhcyBma19jb2x1bW5cIixcbiAgICAgIFwicGtfa2N1Lk9SRElOQUxfUE9TSVRJT04gYXMgcGtcIixcbiAgICBdKVxuICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICBlYihcImMuRVhUUkFcIiwgXCI9XCIsIFwiYXV0b19pbmNyZW1lbnRcIikuYXMoXCJhdXRvaW5jcmVtZW50XCIpLFxuICAgICAgZWIoXCJjLkVYVFJBXCIsIFwiaW5cIiwgW1xuICAgICAgICBcIm9uIHVwZGF0ZSBDVVJSRU5UX1RJTUVTVEFNUFwiLFxuICAgICAgICBcIlNUT1JFRCBHRU5FUkFURURcIixcbiAgICAgICAgXCJWSVJUVUFMIEdFTkVSQVRFRFwiLFxuICAgICAgXSkuYXMoXCJjb21wdXRlZFwiKSxcbiAgICAgIGViKFwiYy5JU19OVUxMQUJMRVwiLCBcIj1cIiwgXCJZRVNcIikuYXMoXCJudWxsYWJsZVwiKSxcbiAgICBdKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBnZXRNeVNRTEJ1aWxkZXI8RGF0YWJhc2U+KHJlcXVpcmVtZW50cylcbiAgICAgIC53aXRoKFwiY29sc1wiLCAoKSA9PiBjb2x1bW5zUXVlcnkpXG4gICAgICAuc2VsZWN0RnJvbShcImluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgYXMgdFwiKVxuICAgICAgLmlubmVySm9pbihcImNvbHMgYXMgY1wiLCAoamIpID0+XG4gICAgICAgIGpiLm9uUmVmKFwiYy5UQUJMRV9OQU1FXCIsIFwiPVwiLCBcInQuVEFCTEVfTkFNRVwiKSxcbiAgICAgIClcbiAgICAgIC53aGVyZShcInQuVEFCTEVfU0NIRU1BXCIsIFwiPVwiLCBkYXRhYmFzZSlcbiAgICAgIC53aGVyZShcInQuVEFCTEVfVFlQRVwiLCBcImluXCIsIFtcIkJBU0UgVEFCTEVcIiwgXCJWSUVXXCJdKVxuICAgICAgLmdyb3VwQnkoW2RhdGFiYXNlLCBcInQuVEFCTEVfTkFNRVwiLCBcInQuVEFCTEVfVFlQRVwiXSlcbiAgICAgIC5zZWxlY3QoW1xuICAgICAgICBkYXRhYmFzZS5hcyhcInNjaGVtYVwiKSxcbiAgICAgICAgXCJ0LlRBQkxFX05BTUUgYXMgbmFtZVwiLFxuICAgICAgICBcInQuVEFCTEVfVFlQRSBhcyB0eXBlXCIsXG4gICAgICBdKVxuICAgICAgLiRuYXJyb3dUeXBlPHsgdHlwZTogXCJCQVNFIFRBQkxFXCIgfCBcIlZJRVdcIiB9PigpXG4gICAgICAuc2VsZWN0KChlYikgPT5cbiAgICAgICAgZWJcbiAgICAgICAgICAuZm48T21pdDxJbmZlclJlc3VsdDx0eXBlb2YgY29sdW1uc1F1ZXJ5PltudW1iZXJdLCBcIlRBQkxFX05BTUVcIj5bXT4oXG4gICAgICAgICAgICBcImpzb25fYXJyYXlhZ2dcIixcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAgICAgICAgICAgICAgICBhdXRvaW5jcmVtZW50OiBlYi5yZWYoXCJjLmF1dG9pbmNyZW1lbnRcIiksXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IGViLnJlZihcImMuY29tcHV0ZWRcIiksXG4gICAgICAgICAgICAgICAgZGF0YXR5cGU6IGViLnJlZihcImMuZGF0YXR5cGVcIiksXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZWIucmVmKFwiYy5kZWZhdWx0XCIpLFxuICAgICAgICAgICAgICAgIGZrX2NvbHVtbjogZWIucmVmKFwiYy5ma19jb2x1bW5cIiksXG4gICAgICAgICAgICAgICAgZmtfdGFibGU6IGViLnJlZihcImMuZmtfdGFibGVcIiksXG4gICAgICAgICAgICAgICAgbmFtZTogZWIucmVmKFwiYy5uYW1lXCIpLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlYi5yZWYoXCJjLnBvc2l0aW9uXCIpLFxuICAgICAgICAgICAgICAgIHBrOiBlYi5yZWYoXCJjLnBrXCIpLFxuICAgICAgICAgICAgICAgIG51bGxhYmxlOiBlYi5yZWYoXCJjLm51bGxhYmxlXCIpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hcyhcImNvbHVtbnNcIiksXG4gICAgICApXG4gICAgICAub3JkZXJCeShcInQuVEFCTEVfU0NIRU1BXCIpXG4gICAgICAub3JkZXJCeShcInQuVEFCTEVfTkFNRVwiKVxuICAgICAgLm9yZGVyQnkoXCJ0LlRBQkxFX1RZUEVcIiksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVGFibGVzUXVlcnkoKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luY3JlbWVudDogMSxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBkYXRhdHlwZTogXCJpbnRcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgcG9zaXRpb246IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImJpbmFyeSgxNilcIixcbiAgICAgICAgICBkZWZhdWx0OiBcInV1aWRfdG9fYmluKHV1aWQoKSlcIixcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJ1dWlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IDIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInZhcmNoYXIoMjU1KVwiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiAzLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luY3JlbWVudDogMCxcbiAgICAgICAgICBjb21wdXRlZDogMSxcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJpZF9uYW1lXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IDQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbmFtZTogXCJhbmltYWxzXCIsXG4gICAgICBzY2hlbWE6IFwic3R1ZGlvXCIsXG4gICAgICB0eXBlOiBcIkJBU0UgVEFCTEVcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiY2hhcigzNilcIixcbiAgICAgICAgICBkZWZhdWx0OiBcInV1aWQoKVwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgcG9zaXRpb246IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBwazogMixcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogMyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBuYW1lOiBcImNvbXBvc2l0ZV9wa1wiLFxuICAgICAgc2NoZW1hOiBcInN0dWRpb1wiLFxuICAgICAgdHlwZTogXCJCQVNFIFRBQkxFXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImludFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBwb3NpdGlvbjogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJjdXJyZW50X3RpbWVzdGFtcFwiLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogMixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJkZWxldGVkX2F0XCIsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgcGs6IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IDMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdXRvaW5jcmVtZW50OiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInRleHRcIixcbiAgICAgICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBuYW1lOiBcInJvbGVcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogNCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGF1dG9pbmNyZW1lbnQ6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIGRlZmF1bHQ6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIHBrOiBudWxsLFxuICAgICAgICAgIHBvc2l0aW9uOiA1LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYXV0b2luY3JlbWVudDogMCxcbiAgICAgICAgICBjb21wdXRlZDogMSxcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgbmFtZTogXCJuYW1lX3JvbGVcIixcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBwazogbnVsbCxcbiAgICAgICAgICBwb3NpdGlvbjogNixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBuYW1lOiBcInVzZXJzXCIsXG4gICAgICBzY2hlbWE6IFwic3R1ZGlvXCIsXG4gICAgICB0eXBlOiBcIkJBU0UgVEFCTEVcIixcbiAgICB9LFxuICBdIGFzIGNvbnN0IHNhdGlzZmllcyBRdWVyeVJlc3VsdDx0eXBlb2YgZ2V0VGFibGVzUXVlcnk+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVRdWVyeShcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCBidWlsZGVyID0gZ2V0TXlTUUxCdWlsZGVyKHJlcXVpcmVtZW50cyk7XG5cbiAgY29uc3Qgc2Vzc2lvblR6ID0gc3FsPFwiU1lTVEVNXCIgfCAoc3RyaW5nICYge30pPmBAQHNlc3Npb24udGltZV96b25lYDtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAuc2VsZWN0Tm9Gcm9tKFxuICAgICAgICBidWlsZGVyXG4gICAgICAgICAgLmNhc2UoKVxuICAgICAgICAgIC53aGVuKHNlc3Npb25UeiwgXCI9XCIsIFwiU1lTVEVNXCIpXG4gICAgICAgICAgLnRoZW4oc3FsPHN0cmluZz5gQEBzeXN0ZW1fdGltZV96b25lYClcbiAgICAgICAgICAuZWxzZShzZXNzaW9uVHopXG4gICAgICAgICAgLmVuZCgpXG4gICAgICAgICAgLmFzKFwidGltZXpvbmVcIiksXG4gICAgICApXG4gICAgICAuJG5hcnJvd1R5cGU8eyB0aW1lem9uZTogc3RyaW5nIH0+KCksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVGltZXpvbmVRdWVyeSgpIHtcbiAgcmV0dXJuIFt7IHRpbWV6b25lOiBcIlVUQ1wiIH1dIGFzIGNvbnN0IHNhdGlzZmllcyBRdWVyeVJlc3VsdDxcbiAgICB0eXBlb2YgZ2V0VGltZXpvbmVRdWVyeVxuICA+O1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgQWRhcHRlcixcbiAgQWRhcHRlckVycm9yLFxuICBBZGFwdGVyU3FsTGludERldGFpbHMsXG4gIEFkYXB0ZXJTcWxMaW50RGlhZ25vc3RpYyxcbiAgQWRhcHRlclNxbExpbnRSZXN1bHQsXG59IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dG9yXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZVNxbEZvckxpbnQgfSBmcm9tIFwiLi4vcG9zdGdyZXMtY29yZS9zcWwtbGludFwiO1xuaW1wb3J0IHsgYXNRdWVyeSB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBFaXRoZXIgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGludERpYWdub3N0aWNzRnJvbU15U1FMRXJyb3IoYXJnczoge1xuICBlcnJvcjogdW5rbm93bjtcbiAgcG9zaXRpb25PZmZzZXQ/OiBudW1iZXI7XG4gIHNxbDogc3RyaW5nO1xufSk6IEFkYXB0ZXJTcWxMaW50RGlhZ25vc3RpY1tdIHtcbiAgY29uc3QgeyBlcnJvciwgc3FsIH0gPSBhcmdzO1xuICBjb25zdCBwb3NpdGlvbk9mZnNldCA9IE1hdGgubWF4KDAsIGFyZ3MucG9zaXRpb25PZmZzZXQgPz8gMCk7XG4gIGNvbnN0IGZhbGxiYWNrUmFuZ2UgPSBnZXRGYWxsYmFja1JhbmdlKHNxbC5sZW5ndGgpO1xuXG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZnJvbTogZmFsbGJhY2tSYW5nZS5mcm9tICsgcG9zaXRpb25PZmZzZXQsXG4gICAgICAgIG1lc3NhZ2U6IFwiU1FMIGxpbnQgZmFpbGVkLlwiLFxuICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICBzb3VyY2U6IFwibXlzcWxcIixcbiAgICAgICAgdG86IGZhbGxiYWNrUmFuZ2UudG8gKyBwb3NpdGlvbk9mZnNldCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGNvZGUgPSBnZXRNeVNRTEVycm9yQ29kZShlcnJvcik7XG4gIGNvbnN0IGluZmVycmVkUmFuZ2UgPVxuICAgIGluZmVyUmFuZ2VGcm9tTWVzc2FnZShzcWwsIGVycm9yLm1lc3NhZ2UpID8/IGZhbGxiYWNrUmFuZ2U7XG5cbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBjb2RlLFxuICAgICAgZnJvbTogaW5mZXJyZWRSYW5nZS5mcm9tICsgcG9zaXRpb25PZmZzZXQsXG4gICAgICBtZXNzYWdlOiB0b015U1FMTGludE1lc3NhZ2UoeyBjb2RlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pLFxuICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgIHNvdXJjZTogXCJteXNxbFwiLFxuICAgICAgdG86IGluZmVycmVkUmFuZ2UudG8gKyBwb3NpdGlvbk9mZnNldCxcbiAgICB9LFxuICBdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludE15U1FMV2l0aEV4cGxhaW5GYWxsYmFjayhcbiAgZXhlY3V0b3I6IEV4ZWN1dG9yLFxuICBkZXRhaWxzOiBBZGFwdGVyU3FsTGludERldGFpbHMsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8Tm9uTnVsbGFibGU8QWRhcHRlcltcInNxbExpbnRcIl0+PlsxXSxcbik6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclNxbExpbnRSZXN1bHQ+PiB7XG4gIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVNxbEZvckxpbnQoZGV0YWlscy5zcWwpO1xuXG4gIGlmICghdmFsaWRhdGlvbi5vaykge1xuICAgIHJldHVybiBbXG4gICAgICBudWxsLFxuICAgICAge1xuICAgICAgICBkaWFnbm9zdGljczogW3ZhbGlkYXRpb24uZGlhZ25vc3RpY10sXG4gICAgICAgIHNjaGVtYVZlcnNpb246IGRldGFpbHMuc2NoZW1hVmVyc2lvbixcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGRpYWdub3N0aWNzOiBBZGFwdGVyU3FsTGludFJlc3VsdFtcImRpYWdub3N0aWNzXCJdID0gW107XG5cbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgdmFsaWRhdGlvbi5zdGF0ZW1lbnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4cGxhaW5RdWVyeSA9IGFzUXVlcnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBgRVhQTEFJTiAke3N0YXRlbWVudC5zdGF0ZW1lbnR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShleHBsYWluUXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBkaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICAuLi5jcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tTXlTUUxFcnJvcih7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcG9zaXRpb25PZmZzZXQ6IHN0YXRlbWVudC5mcm9tLFxuICAgICAgICAgIHNxbDogc3RhdGVtZW50LnN0YXRlbWVudCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBkaWFnbm9zdGljcy5wdXNoKFxuICAgICAgICAuLi5jcmVhdGVMaW50RGlhZ25vc3RpY3NGcm9tTXlTUUxFcnJvcih7XG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgcG9zaXRpb25PZmZzZXQ6IHN0YXRlbWVudC5mcm9tLFxuICAgICAgICAgIHNxbDogc3RhdGVtZW50LnN0YXRlbWVudCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbXG4gICAgbnVsbCxcbiAgICB7XG4gICAgICBkaWFnbm9zdGljcyxcbiAgICAgIHNjaGVtYVZlcnNpb246IGRldGFpbHMuc2NoZW1hVmVyc2lvbixcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXRNeVNRTEVycm9yQ29kZShlcnJvcjogRXJyb3IpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB3aXRoQ29kZSA9IGVycm9yIGFzIEVycm9yICYgeyBjb2RlPzogdW5rbm93biB9O1xuICByZXR1cm4gdHlwZW9mIHdpdGhDb2RlLmNvZGUgPT09IFwic3RyaW5nXCIgPyB3aXRoQ29kZS5jb2RlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b015U1FMTGludE1lc3NhZ2UoYXJnczogeyBjb2RlPzogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gYXJncztcblxuICBpZiAoXG4gICAgY29kZSA9PT0gXCJFUl9RVUVSWV9USU1FT1VUXCIgfHxcbiAgICBjb2RlID09PSBcIkVSX1FVRVJZX0lOVEVSUlVQVEVEXCIgfHxcbiAgICBtZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJtYXhpbXVtIHN0YXRlbWVudCBleGVjdXRpb24gdGltZSBleGNlZWRlZFwiKVxuICApIHtcbiAgICByZXR1cm4gXCJMaW50IHF1ZXJ5IHRpbWVkIG91dC4gU2ltcGxpZnkgdGhlIHN0YXRlbWVudCBhbmQgdHJ5IGFnYWluLlwiO1xuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGdldEZhbGxiYWNrUmFuZ2Uoc3FsTGVuZ3RoOiBudW1iZXIpOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHtcbiAgaWYgKHNxbExlbmd0aCA8PSAwKSB7XG4gICAgcmV0dXJuIHsgZnJvbTogMCwgdG86IDAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGZyb206IDAsIHRvOiAxIH07XG59XG5cbmZ1bmN0aW9uIGluZmVyUmFuZ2VGcm9tTWVzc2FnZShcbiAgc3FsOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbik6IHsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgY29uc3QgdG9rZW5DYW5kaWRhdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgcXVvdGVkTWF0Y2ggPSAvJyhbXiddKyknLy5leGVjKG1lc3NhZ2UpO1xuICBpZiAocXVvdGVkTWF0Y2g/LlsxXSkge1xuICAgIHRva2VuQ2FuZGlkYXRlcy5hZGQocXVvdGVkTWF0Y2hbMV0pO1xuICB9XG5cbiAgY29uc3QgYmFja3RpY2tNYXRjaCA9IC9gKFteYF0rKWAvLmV4ZWMobWVzc2FnZSk7XG4gIGlmIChiYWNrdGlja01hdGNoPy5bMV0pIHtcbiAgICB0b2tlbkNhbmRpZGF0ZXMuYWRkKGJhY2t0aWNrTWF0Y2hbMV0pO1xuICB9XG5cbiAgY29uc3QgZG91YmxlUXVvdGVkTWF0Y2ggPSAvXCIoW15cIl0rKVwiLy5leGVjKG1lc3NhZ2UpO1xuICBpZiAoZG91YmxlUXVvdGVkTWF0Y2g/LlsxXSkge1xuICAgIHRva2VuQ2FuZGlkYXRlcy5hZGQoZG91YmxlUXVvdGVkTWF0Y2hbMV0pO1xuICB9XG5cbiAgY29uc3QgbWlzc2luZ1RhYmxlTWF0Y2ggPSAvdGFibGVcXHMrJyhbXiddKyknXFxzK2RvZXNuJ3QgZXhpc3QvaS5leGVjKG1lc3NhZ2UpO1xuICBpZiAobWlzc2luZ1RhYmxlTWF0Y2g/LlsxXSkge1xuICAgIHRva2VuQ2FuZGlkYXRlcy5hZGQobWlzc2luZ1RhYmxlTWF0Y2hbMV0pO1xuICB9XG5cbiAgY29uc3QgbG93ZXJTcWwgPSBzcWwudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VuQ2FuZGlkYXRlcykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUb2tlbiA9IHRva2VuLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZGlyZWN0SW5kZXggPSBsb3dlclNxbC5pbmRleE9mKG5vcm1hbGl6ZWRUb2tlbik7XG5cbiAgICBpZiAoZGlyZWN0SW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogZGlyZWN0SW5kZXgsXG4gICAgICAgIHRvOiBNYXRoLm1pbihzcWwubGVuZ3RoLCBkaXJlY3RJbmRleCArIHRva2VuLmxlbmd0aCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0VG9rZW4gPSBub3JtYWxpemVkVG9rZW4uc3BsaXQoXCIuXCIpLmF0KC0xKTtcblxuICAgIGlmICghc3BsaXRUb2tlbikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRJbmRleCA9IGxvd2VyU3FsLmluZGV4T2Yoc3BsaXRUb2tlbik7XG5cbiAgICBpZiAoc3BsaXRJbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBzcGxpdEluZGV4LFxuICAgICAgICB0bzogTWF0aC5taW4oc3FsLmxlbmd0aCwgc3BsaXRJbmRleCArIHNwbGl0VG9rZW4ubGVuZ3RoKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBBZGFwdGVyLFxuICB0eXBlIEFkYXB0ZXJEZWxldGVSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckVycm9yLFxuICB0eXBlIEFkYXB0ZXJJbnNlcnRSZXN1bHQsXG4gIHR5cGUgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJSYXdSZXN1bHQsXG4gIHR5cGUgQWRhcHRlclJlcXVpcmVtZW50cyxcbiAgdHlwZSBBZGFwdGVyU3FsTGludFJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyU3FsU2NoZW1hUmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJVcGRhdGVSZXN1bHQsXG4gIHR5cGUgQ29sdW1uLFxuICBjcmVhdGVBZGFwdGVyRXJyb3IsXG4gIHR5cGUgRmlsdGVyT3BlcmF0b3IsXG4gIHR5cGUgVGFibGUsXG59IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcXVlbmNlRXhlY3V0b3IgfSBmcm9tIFwiLi4vZXhlY3V0b3JcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlLFxuICBleGVjdXRlUXVlcnlXaXRoRnVsbFRhYmxlU2VhcmNoR3VhcmRyYWlscyxcbn0gZnJvbSBcIi4uL2Z1bGwtdGFibGUtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBhc1F1ZXJ5LFxuICBpbmZlckZpbHRlck9iamVjdCxcbiAgdHlwZSBRdWVyeSxcbiAgdHlwZSBRdWVyeVJlc3VsdCxcbn0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBjcmVhdGVTcWxFZGl0b3JTY2hlbWFGcm9tSW50cm9zcGVjdGlvbiB9IGZyb20gXCIuLi9zcWwtZWRpdG9yLXNjaGVtYVwiO1xuaW1wb3J0IHR5cGUgeyBFaXRoZXIgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSB9IGZyb20gXCIuL2RhdGF0eXBlXCI7XG5pbXBvcnQge1xuICBnZXREZWxldGVRdWVyeSxcbiAgZ2V0SW5zZXJ0UXVlcnksXG4gIGdldEluc2VydFJlZmV0Y2hRdWVyeSxcbiAgZ2V0U2VsZWN0UXVlcnksXG4gIGdldFVwZGF0ZVF1ZXJ5LFxuICBnZXRVcGRhdGVSZWZldGNoUXVlcnksXG59IGZyb20gXCIuL2RtbFwiO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVzUXVlcnksXG4gIGdldFRpbWV6b25lUXVlcnksXG4gIG1vY2tUYWJsZXNRdWVyeSxcbiAgbW9ja1RpbWV6b25lUXVlcnksXG59IGZyb20gXCIuL2ludHJvc3BlY3Rpb25cIjtcbmltcG9ydCB7IGxpbnRNeVNRTFdpdGhFeHBsYWluRmFsbGJhY2sgfSBmcm9tIFwiLi9zcWwtbGludFwiO1xuXG5leHBvcnQgdHlwZSBNeVNRTEFkYXB0ZXJSZXF1aXJlbWVudHMgPSBPbWl0PEFkYXB0ZXJSZXF1aXJlbWVudHMsIFwiZXhlY3V0b3JcIj4gJiB7XG4gIGV4ZWN1dG9yOiBTZXF1ZW5jZUV4ZWN1dG9yO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU15U1FMQWRhcHRlcihcbiAgcmVxdWlyZW1lbnRzOiBNeVNRTEFkYXB0ZXJSZXF1aXJlbWVudHMsXG4pOiBBZGFwdGVyIHtcbiAgY29uc3QgeyBleGVjdXRvciwgLi4ub3RoZXJSZXF1aXJlbWVudHMgfSA9IHJlcXVpcmVtZW50cztcbiAgY29uc3QgZnVsbFRhYmxlU2VhcmNoU3RhdGUgPSBjcmVhdGVGdWxsVGFibGVTZWFyY2hFeGVjdXRpb25TdGF0ZSgpO1xuICBsZXQgY2FuVXNlRXhlY3V0b3JMaW50VHJhbnNwb3J0ID0gdHlwZW9mIGV4ZWN1dG9yLmxpbnRTcWwgPT09IFwiZnVuY3Rpb25cIjtcblxuICBhc3luYyBmdW5jdGlvbiBpbnRyb3NwZWN0RGF0YWJhc2UoXG4gICAgb3B0aW9uczogUGFyYW1ldGVyczxBZGFwdGVyW1wiaW50cm9zcGVjdFwiXT5bMF0sXG4gICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhYmxlc1F1ZXJ5ID0gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lUXVlcnkgPSBnZXRUaW1lem9uZVF1ZXJ5KHJlcXVpcmVtZW50cyk7XG5cbiAgICAgIGNvbnN0IFtbdGFibGVzRXJyb3IsIHRhYmxlc10sIFt0aW1lem9uZUVycm9yLCB0aW1lem9uZXNdXSA9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhYmxlc1F1ZXJ5LCBvcHRpb25zKSxcbiAgICAgICAgICBleGVjdXRvci5leGVjdXRlKHRpbWV6b25lUXVlcnksIG9wdGlvbnMpLFxuICAgICAgICBdKTtcblxuICAgICAgaWYgKHRhYmxlc0Vycm9yKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogdGFibGVzRXJyb3IsIHF1ZXJ5OiB0YWJsZXNRdWVyeSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWV6b25lRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgZXJyb3I6IHRpbWV6b25lRXJyb3IsXG4gICAgICAgICAgcXVlcnk6IHRpbWV6b25lUXVlcnksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lem9uZSA9IHRpbWV6b25lc1swXT8udGltZXpvbmU7XG5cbiAgICAgIGlmICghdGltZXpvbmUpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlRpbWV6b25lIG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICBxdWVyeTogdGltZXpvbmVRdWVyeSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeTogdGFibGVzUXVlcnksIHRhYmxlcywgdGltZXpvbmUgfSksXG4gICAgICBdO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICBmdWxsVGFibGVTZWFyY2g6IHRydWUsXG4gICAgICBzcWxEaWFsZWN0OiBcIm15c3FsXCIsXG4gICAgICBzcWxFZGl0b3JBdXRvY29tcGxldGU6IHRydWUsXG4gICAgICBzcWxFZGl0b3JMaW50OiB0cnVlLFxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGUoXG4gICAgICBkZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJEZWxldGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldERlbGV0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyAuLi5kZXRhaWxzLCBxdWVyeSB9XTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGluc2VydChcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckluc2VydFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgcm93cywgdGFibGUgfSA9IGRldGFpbHM7XG4gICAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gdGFibGU7XG5cbiAgICAgICAgY29uc3QgYXV0b2luY3JlbWVudENvbHVtbjogQ29sdW1uIHwgdW5kZWZpbmVkID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICApLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uLmlzQXV0b2luY3JlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyT2JqZWN0cyA9IHJvd3MubWFwKChyb3cpID0+XG4gICAgICAgICAgaW5mZXJGaWx0ZXJPYmplY3Qocm93LCBjb2x1bW5zKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cyA9IGZpbHRlck9iamVjdHMuc29tZSgoZmlsdGVyT2JqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJPYmplY3QpO1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGZpbHRlclZhbHVlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIGZpbHRlclZhbHVlcy5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgPT0gbnVsbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgY2xhc3NpYyBwYXJ0aWFsIGZpbHRlciBvYmplY3QgY2FzZXMgKGUuZy4gdXVpZCkgaGVyZSBvciBiZWZvcmUgcmVxdWVzdGluZyBmcm9tIGFkYXB0ZXIuXG4gICAgICAgIGlmICghYXV0b2luY3JlbWVudENvbHVtbiAmJiBoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJDYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSBpbnNlcnRpb24sIHNvbWUgcm93cyBjYW5ub3QgYmUgcmVmZXRjaGVkIGFmdGVyIGluc2VydGlvbi5cIixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBxdWVyeTogZ2V0SW5zZXJ0UXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNQYXJ0aWFsRmlsdGVyT2JqZWN0cykge1xuICAgICAgICAgIGNvbnN0IGluc2VydFF1ZXJ5ID0gZ2V0SW5zZXJ0UXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICAgIGNvbnN0IHJlZmV0Y2hRdWVyeSA9IGdldEluc2VydFJlZmV0Y2hRdWVyeShcbiAgICAgICAgICAgIHsgY3JpdGVyaWE6IGZpbHRlck9iamVjdHMsIHRhYmxlIH0sXG4gICAgICAgICAgICBvdGhlclJlcXVpcmVtZW50cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNlcXVlbmNlID0gW2luc2VydFF1ZXJ5LCByZWZldGNoUXVlcnldIGFzIGNvbnN0O1xuXG4gICAgICAgICAgY29uc3QgW1tpbnNlcnRFcnJvcl0sIG1heWJlUmVmZXRjaFJlc3VsdF0gPVxuICAgICAgICAgICAgYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZVNlcXVlbmNlKHNlcXVlbmNlLCBvcHRpb25zKTtcblxuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gam9pblNlcXVlbmNlKHNlcXVlbmNlKTtcblxuICAgICAgICAgIGlmIChpbnNlcnRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBpbnNlcnRFcnJvciwgcXVlcnkgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gbWF5YmVSZWZldGNoUmVzdWx0ITtcblxuICAgICAgICAgIGlmIChyZWZldGNoRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3Ioe1xuICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93cyAtIHBsZWFzZSByZWZyZXNoLlwiLFxuICAgICAgICAgICAgICAgIHsgY2F1c2U6IHJlZmV0Y2hFcnJvciB9LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbbnVsbCwgeyByb3dzOiByZWZldGNoUmVzdWx0cywgcXVlcnkgfV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYXMgYXV0b2luY3JlbWVudCBjb2x1bW4gLSBpbnNlcnQgcm93cyBvbmUgYnkgb25lIGFuZCByZWZldGNoLCB0YWtpbmcgYWR2YW50YWdlIG9mIGBpbnNlcnRJZGAgaWYgaW5zZXJ0ZWQgcm93IGhhcyBubyB2YWx1ZSBmb3IgdGhpcyBjb2x1bW4uXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICByb3dzLm1hcChhc3luYyAocm93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRRdWVyeSA9IGdldEluc2VydFF1ZXJ5KFxuICAgICAgICAgICAgICB7IHJvd3M6IFtyb3ddLCB0YWJsZSB9LFxuICAgICAgICAgICAgICBvdGhlclJlcXVpcmVtZW50cyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUoXG4gICAgICAgICAgICAgIGluc2VydFF1ZXJ5LFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnk6IGluc2VydFF1ZXJ5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7IG5hbWU6IGF1dG9pbmNyZW1lbnRDb2x1bW5OYW1lIH0gPSBhdXRvaW5jcmVtZW50Q29sdW1uITtcblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbYXV0b2luY3JlbWVudENvbHVtbk5hbWVdIHx8IHJlc3VsdFswXT8uaW5zZXJ0SWQ7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiQ291bGQgbm90IGRldGVybWluZSB2YWx1ZSBmb3IgYXV0b2luY3JlbWVudCBjb2x1bW4gdG8gcmVmZXRjaCBpbnNlcnRlZCByb3cuXCIsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBxdWVyeTogaW5zZXJ0UXVlcnksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRJbnNlcnRSZWZldGNoUXVlcnkoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjcml0ZXJpYTogW3sgW2F1dG9pbmNyZW1lbnRDb2x1bW5OYW1lXTogdmFsdWUgfV0sXG4gICAgICAgICAgICAgICAgdGFibGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGRpcnR5IGhhY2sgdG8gbWFyayBhdXRvaW5jcmVtZW50IGNvbHVtbiBhcyBUSEUgcHJpbWFyeSBrZXkgZm9yIHJlZmV0Y2hpbmcuXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zOiBPYmplY3QudmFsdWVzKGNvbHVtbnMpLnJlZHVjZShcbiAgICAgICAgICAgICAgICAgICAgKGFjYywgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lOiBjb2x1bW5OYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgICAgICAgICAgICAgICAgICBhY2NbY29sdW1uTmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBwa1Bvc2l0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lID09PSBhdXRvaW5jcmVtZW50Q29sdW1uTmFtZSA/IDEgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG90aGVyUmVxdWlyZW1lbnRzLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgW3JlZmV0Y2hFcnJvciwgcmVmZXRjaFJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShcbiAgICAgICAgICAgICAgcmVmZXRjaFF1ZXJ5LFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBqb2luU2VxdWVuY2UoW2luc2VydFF1ZXJ5LCByZWZldGNoUXVlcnldKTtcblxuICAgICAgICAgICAgaWYgKHJlZmV0Y2hFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVmZXRjaGluZyBpbnNlcnRlZCByb3c6XCIsIHJlZmV0Y2hFcnJvcik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIHJlZmV0Y2ggaW5zZXJ0ZWQgcm93IC0gcGxlYXNlIHJlZnJlc2guXCIsXG4gICAgICAgICAgICAgICAgICB7IGNhdXNlOiByZWZldGNoRXJyb3IgfSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW3JlZmV0Y2hlZFJvd10gPSByZWZldGNoUmVzdWx0cztcblxuICAgICAgICAgICAgaWYgKCFyZWZldGNoZWRSb3cpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiUmVmZXRjaCBxdWVyeSByZXR1cm5lZCBubyByZXN1bHRzIGZvciBpbnNlcnRlZCByb3cuXCIsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgeyByb3c6IHJlZmV0Y2hlZFJvdywgcXVlcnkgfV0gYXMgY29uc3Q7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0ZWRSb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICAgIGxldCBxdWVyeTogUXVlcnk8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBbbnVtYmVyLCBBZGFwdGVyRXJyb3JdW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSByZXN1bHRzW2ldITtcblxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goW2ksIGVycm9yXSk7XG5cbiAgICAgICAgICAgIGlmIChlcnJvci5xdWVyeSkge1xuICAgICAgICAgICAgICBxdWVyeSA9ICFxdWVyeSA/IGVycm9yLnF1ZXJ5IDogam9pblNlcXVlbmNlKFtxdWVyeSwgZXJyb3IucXVlcnldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zZXJ0ZWRSb3dzLnB1c2gocmVzdWx0LnJvdyk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQucXVlcnkpIHtcbiAgICAgICAgICAgICAgcXVlcnkgPSAhcXVlcnlcbiAgICAgICAgICAgICAgICA/IHJlc3VsdC5xdWVyeVxuICAgICAgICAgICAgICAgIDogam9pblNlcXVlbmNlKFtxdWVyeSwgcmVzdWx0LnF1ZXJ5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7XG4gICAgICAgICAgICBlcnJvcjogbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgICBlcnJvcnMubWFwKChbLCBlcnJvcl0pID0+IGVycm9yKSxcbiAgICAgICAgICAgICAgYFJvdyR7ZXJyb3JzLmxlbmd0aCA+IDEgPyBcInNcIiA6IFwiXCJ9ICR7ZXJyb3JzLm1hcCgoW2luZGV4XSkgPT4gaW5kZXgpLmpvaW4oXCIsIFwiKX0gY291bGQgbm90IGJlIGluc2VydGVkIG9yIHJlZmV0Y2hlZC5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBxdWVyeSEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93czogaW5zZXJ0ZWRSb3dzLCBxdWVyeTogcXVlcnkhIH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaW50cm9zcGVjdChcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICAgIHJldHVybiBhd2FpdCBpbnRyb3NwZWN0RGF0YWJhc2Uob3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNxbFNjaGVtYShcbiAgICAgIF9kZXRhaWxzLFxuICAgICAgb3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJTcWxTY2hlbWFSZXN1bHQ+PiB7XG4gICAgICBjb25zdCBbZXJyb3IsIGludHJvc3BlY3Rpb25dID0gYXdhaXQgaW50cm9zcGVjdERhdGFiYXNlKG9wdGlvbnMpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvcl07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNyZWF0ZVNxbEVkaXRvclNjaGVtYUZyb21JbnRyb3NwZWN0aW9uKHtcbiAgICAgICAgICBkZWZhdWx0U2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgICAgZGlhbGVjdDogXCJteXNxbFwiLFxuICAgICAgICAgIGludHJvc3BlY3Rpb24sXG4gICAgICAgIH0pLFxuICAgICAgXTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc3FsTGludChcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclNxbExpbnRSZXN1bHQ+PiB7XG4gICAgICBpZiAoY2FuVXNlRXhlY3V0b3JMaW50VHJhbnNwb3J0ICYmIHR5cGVvZiBleGVjdXRvci5saW50U3FsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCBleGVjdXRvci5saW50U3FsKGRldGFpbHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhblVzZUV4ZWN1dG9yTGludFRyYW5zcG9ydCA9IGZhbHNlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGlmICghc2hvdWxkRmFsbGJhY2tUb0V4cGxhaW5MaW50KGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYW5Vc2VFeGVjdXRvckxpbnRUcmFuc3BvcnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgbGludE15U1FMV2l0aEV4cGxhaW5GYWxsYmFjayhleGVjdXRvciwgZGV0YWlscywgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJhdyhcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclJhd1Jlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXNRdWVyeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oZGV0YWlscy5zcWwpO1xuICAgICAgICBjb25zdCBbZXJyb3IsIHJvd3NdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgICAgICAgIHJvd3M6IHJvd3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHF1ZXJ5KFxuICAgICAgZGV0YWlscyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyUXVlcnlSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFNlbGVjdFF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9XG4gICAgICAgICAgYXdhaXQgZXhlY3V0ZVF1ZXJ5V2l0aEZ1bGxUYWJsZVNlYXJjaEd1YXJkcmFpbHMoe1xuICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICBzZWFyY2hUZXJtOiBkZXRhaWxzLmZ1bGxUYWJsZVNlYXJjaFRlcm0sXG4gICAgICAgICAgICBzdGF0ZTogZnVsbFRhYmxlU2VhcmNoU3RhdGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWx0ZXJlZFJvd0NvdW50OiByZXN1bHRzWzBdPy5fX3BzX2NvdW50X18gfHwgXCIwXCIsXG4gICAgICAgICAgICByb3dzOiByZXN1bHRzLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZShcbiAgICAgIGRldGFpbHMsXG4gICAgICBvcHRpb25zLFxuICAgICk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlclVwZGF0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5ID0gZ2V0VXBkYXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICBjb25zdCByZWZldGNoUXVlcnkgPSBnZXRVcGRhdGVSZWZldGNoUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtbdXBkYXRlRXJyb3JdLCByZWZldGNoUmVzdWx0XSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGVTZXF1ZW5jZShcbiAgICAgICAgICBbdXBkYXRlUXVlcnksIHJlZmV0Y2hRdWVyeV0sXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodXBkYXRlRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHVwZGF0ZUVycm9yLCBxdWVyeTogdXBkYXRlUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcmVmZXRjaEVycm9yLCByZXN1bHRzXSA9IHJlZmV0Y2hSZXN1bHQhO1xuXG4gICAgICAgIGlmIChyZWZldGNoRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgIGVycm9yOiByZWZldGNoRXJyb3IsXG4gICAgICAgICAgICBxdWVyeTogdXBkYXRlUXVlcnksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHtcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJVcGRhdGVkIHJvdyBub3QgZm91bmRcIiksXG4gICAgICAgICAgICBxdWVyeTogdXBkYXRlUXVlcnksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgcm93LCBxdWVyeTogdXBkYXRlUXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNob3VsZEZhbGxiYWNrVG9FeHBsYWluTGludChlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIChcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW52YWxpZCBwcm9jZWR1cmVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwidW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3JcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwiaW50ZXJuYWwgc2VydmVyIGVycm9yXCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcImJhZCBnYXRld2F5XCIpIHx8XG4gICAgbWVzc2FnZS5pbmNsdWRlcyhcInNlcnZpY2UgdW5hdmFpbGFibGVcIikgfHxcbiAgICBtZXNzYWdlLmluY2x1ZGVzKFwibm90IHN1cHBvcnRlZFwiKSB8fFxuICAgIG1lc3NhZ2UuaW5jbHVkZXMoXCJtZXRob2Qgbm90IGFsbG93ZWRcIilcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW50cm9zcGVjdGlvbihhcmdzOiB7XG4gIHF1ZXJ5OiBRdWVyeTtcbiAgdGFibGVzOiBRdWVyeVJlc3VsdDx0eXBlb2YgZ2V0VGFibGVzUXVlcnk+O1xuICB0aW1lem9uZTogc3RyaW5nO1xufSk6IEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0IHtcbiAgY29uc3QgeyBxdWVyeSwgdGFibGVzLCB0aW1lem9uZSB9ID0gYXJncztcblxuICByZXR1cm4gdGFibGVzLnJlZHVjZShcbiAgICAocmVzdWx0LCB0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgeyBzY2hlbWFzIH0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hIH0gPSB0YWJsZTtcblxuICAgICAgY29uc3QgY29sdW1uc1JlY29yZCA9IGNvbHVtbnNcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEucG9zaXRpb24gLSBiLnBvc2l0aW9uKVxuICAgICAgICAucmVkdWNlKFxuICAgICAgICAgIChjb2x1bW5zLCBjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YXR5cGUsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgbmFtZTogY29sdW1uTmFtZSxcbiAgICAgICAgICAgIH0gPSBjb2x1bW47XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZQYXJlbnRoZXNpcyA9IGRhdGF0eXBlLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyaXBwZWREYXRhVHlwZSA9IChcbiAgICAgICAgICAgICAgaW5kZXhPZlBhcmVudGhlc2lzID4gLTFcbiAgICAgICAgICAgICAgICA/IGRhdGF0eXBlLnN1YnN0cmluZygwLCBpbmRleE9mUGFyZW50aGVzaXMpXG4gICAgICAgICAgICAgICAgOiBkYXRhdHlwZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0F1dG9pbmNyZW1lbnQgPSBCb29sZWFuKGNvbHVtbi5hdXRvaW5jcmVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29tcHV0ZWQgPSBCb29sZWFuKGNvbHVtbi5jb21wdXRlZCk7XG4gICAgICAgICAgICBjb25zdCBudWxsYWJsZSA9IEJvb2xlYW4oY29sdW1uLm51bGxhYmxlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1ucyxcbiAgICAgICAgICAgICAgW2NvbHVtbk5hbWVdOiB7XG4gICAgICAgICAgICAgICAgZGF0YXR5cGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihNWVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBW3N0cmlwcGVkRGF0YVR5cGVdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6IFwicmF3XCIsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgaXNOYXRpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBzdHJpcHBlZERhdGFUeXBlLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWREYXRhVHlwZSA9PT0gXCJlbnVtXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IGRhdGF0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShgZW51bSgnYC5sZW5ndGgsIC1gJylgLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KGAnLCdgKVxuICAgICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgICAgZmtDb2x1bW46IGNvbHVtbi5ma19jb2x1bW4sXG4gICAgICAgICAgICAgICAgZmtTY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgICAgICAgICBma1RhYmxlOiBjb2x1bW4uZmtfdGFibGUsXG4gICAgICAgICAgICAgICAgaXNBdXRvaW5jcmVtZW50LFxuICAgICAgICAgICAgICAgIGlzQ29tcHV0ZWQsXG4gICAgICAgICAgICAgICAgaXNSZXF1aXJlZDpcbiAgICAgICAgICAgICAgICAgICFudWxsYWJsZSAmJlxuICAgICAgICAgICAgICAgICAgIWlzQXV0b2luY3JlbWVudCAmJlxuICAgICAgICAgICAgICAgICAgIWlzQ29tcHV0ZWQgJiZcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9PSBudWxsLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgbnVsbGFibGUsXG4gICAgICAgICAgICAgICAgcGtQb3NpdGlvbjogY29sdW1uLnBrLFxuICAgICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICB9IGFzIGNvbnN0IHNhdGlzZmllcyBDb2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgVGFibGVbXCJjb2x1bW5zXCJdLFxuICAgICAgICApO1xuXG4gICAgICBpZiAoc2NoZW1hc1tzY2hlbWFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2NoZW1hc1tzY2hlbWFdID0geyBuYW1lOiBzY2hlbWEsIHRhYmxlczoge30gfTtcbiAgICAgIH1cblxuICAgICAgc2NoZW1hc1tzY2hlbWFdLnRhYmxlc1t0YWJsZU5hbWVdID0ge1xuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zUmVjb3JkLFxuICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICB7XG4gICAgICBmaWx0ZXJPcGVyYXRvcnMsXG4gICAgICBxdWVyeSxcbiAgICAgIHNjaGVtYXM6IHt9LFxuICAgICAgdGltZXpvbmUsXG4gICAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQgYXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQsXG4gICk7XG59XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuXSBzYXRpc2ZpZXMgRmlsdGVyT3BlcmF0b3JbXTtcblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tJbnRyb3NwZWN0KCkge1xuICBjb25zdCB0YWJsZXMgPSBtb2NrVGFibGVzUXVlcnkoKTtcbiAgY29uc3QgW3sgdGltZXpvbmUgfV0gPSBtb2NrVGltZXpvbmVRdWVyeSgpO1xuICBjb25zdCBxdWVyeSA9IHsgcGFyYW1ldGVyczogW10sIHNxbDogXCI8bW9ja2VkPlwiIH0gYXMgUXVlcnk7XG5cbiAgcmV0dXJuIGNyZWF0ZUludHJvc3BlY3Rpb24oeyB0YWJsZXMsIHRpbWV6b25lLCBxdWVyeSB9KSBhcyB7XG4gICAgLy8gYmVzdCBlZmZvcnQsIG5vIG5lZWQgZ28gb3ZlcmJvYXJkLlxuICAgIHNjaGVtYXM6IHtcbiAgICAgIFtLIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wic2NoZW1hXCJdXToge1xuICAgICAgICBuYW1lOiBLO1xuICAgICAgICB0YWJsZXM6IHtcbiAgICAgICAgICBbVCBpbiAodHlwZW9mIHRhYmxlcylbbnVtYmVyXVtcIm5hbWVcIl1dOiBUYWJsZTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfTtcbiAgICB0aW1lem9uZTogdHlwZW9mIHRpbWV6b25lO1xuICAgIGZpbHRlck9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXTtcbiAgICBxdWVyeTogUXVlcnk7XG4gIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0O1xufVxuXG5mdW5jdGlvbiBqb2luU2VxdWVuY2UoXG4gIHNlcXVlbmNlOiByZWFkb25seSBbUXVlcnk8dW5rbm93bj4sIFF1ZXJ5PHVua25vd24+XSxcbik6IFF1ZXJ5PHVua25vd24+IHtcbiAgY29uc3QgW3F1ZXJ5MCwgcXVlcnkxXSA9IHNlcXVlbmNlO1xuXG4gIHJldHVybiB7XG4gICAgcGFyYW1ldGVyczogcXVlcnkwLnBhcmFtZXRlcnMuY29uY2F0KHF1ZXJ5MS5wYXJhbWV0ZXJzKSxcbiAgICBzcWw6IGAke3F1ZXJ5MC5zcWx9O1xcbiR7cXVlcnkxLnNxbH1gLFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7bWJBRU8sSUFBTUEsR0FHVCxDQUNGLE9BQVEsQ0FDTixNQUFPLFNBQ1QsRUFDQSxPQUFRLENBQ04sTUFBTyxRQUNULEVBQ0EsSUFBSyxDQUNILE1BQU8sS0FDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFDQSxLQUFNLENBQ0osTUFBTyxRQUNULEVBQ0EsY0FBZSxDQUNiLE1BQU8sUUFDVCxFQUNBLEtBQU0sQ0FDSixPQUFRLGFBQ1IsTUFBTyxVQUNULEVBQ0EsU0FBVSxDQUNSLE9BQVEsMEJBQ1IsTUFBTyxVQUNULEVBQ0EsSUFBSyxDQUNILE1BQU8sU0FDVCxFQUNBLFFBQVMsQ0FDUCxNQUFPLFNBQ1QsRUFDQSxPQUFRLENBQ04sTUFBTyxTQUNULEVBQ0EsbUJBQW9CLENBQ2xCLE1BQU8sU0FDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLE1BQ1QsRUFDQSxNQUFPLENBQ0wsTUFBTyxTQUNULEVBQ0EsTUFBTyxDQUNMLE1BQU8sU0FDVCxFQUNBLFNBQVUsQ0FDUixNQUFPLEtBQ1QsRUFDQSxtQkFBb0IsQ0FDbEIsTUFBTyxLQUNULEVBQ0EsSUFBSyxDQUNILE1BQU8sU0FDVCxFQUNBLFFBQVMsQ0FDUCxNQUFPLFNBQ1QsRUFDQSxLQUFNLENBQ0osTUFBTyxNQUNULEVBQ0EsV0FBWSxDQUNWLE1BQU8sS0FDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFDQSxlQUFnQixDQUNkLE1BQU8sUUFDVCxFQUNBLFNBQVUsQ0FDUixNQUFPLFFBQ1QsRUFDQSxTQUFVLENBQ1IsTUFBTyxRQUNULEVBQ0EsY0FB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QSxTQUFTeUIsRUFDUEgsRUFDZ0IsQ0FDaEIsR0FBTSxDQUFDZ0QsRUFBUUMsQ0FBTSxFQUFJakQsRUFFekIsTUFBTyxDQUNMLFdBQVlnRCxFQUFPLFdBQVcsT0FBT0MsRUFBTyxVQUFVLEVBQ3RELElBQUssR0FBR0QsRUFBTyxHQUFHO0FBQUEsRUFBTUMsRUFBTyxHQUFHLEVBQ3BDLENBQ0YiLAogICJuYW1lcyI6IFsiTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJnZXRNeVNRTEJ1aWxkZXIiLCAicmVxdWlyZW1lbnRzIiwgImdldEJ1aWxkZXIiLCAiTXlzcWxBZGFwdGVyIiwgIk15c3FsUXVlcnlDb21waWxlciIsICJnZXREZWxldGVRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJyb3dzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgImJ1aWxkZXIiLCAiZ2V0TXlTUUxCdWlsZGVyIiwgImNvbXBpbGUiLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAiYXBwbHlUcmFuc2Zvcm1hdGlvbnMiLCAiZ2V0SW5zZXJ0UmVmZXRjaFF1ZXJ5IiwgImNyaXRlcmlhIiwgImdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMiLCAiZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5IiwgImNoYW5nZXMiLCAicm93IiwgImdldFNlbGVjdFF1ZXJ5IiwgImZpbHRlciIsICJmdWxsVGFibGVTZWFyY2hUZXJtIiwgInBhZ2VJbmRleCIsICJwYWdlU2l6ZSIsICJzb3J0T3JkZXIiLCAiYXBwbGllZEZpbHRlckV4cHJlc3Npb24iLCAiZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiIsICJmdWxsVGFibGVTZWFyY2hQbGFuIiwgImJ1aWxkRnVsbFRhYmxlU2VhcmNoUGxhbiIsICJjb21iaW5lZFdoZXJlRXhwcmVzc2lvbiIsICJlYiIsICJnZXRGdWxsVGFibGVTZWFyY2hFeHByZXNzaW9uIiwgIkFHR19OQU1FIiwgIkNPVU5UX1JFRiIsICJzaG91bGRBcHBseVNlYXJjaEd1YXJkcmFpbHMiLCAiaXNGdWxsVGFibGVTZWFyY2hSZXF1ZXN0IiwgIm15c3FsU2VhcmNoT3B0aW1pemVySGludCIsICJzcWwiLCAiY291bnRRdWVyeSIsICJjb3VudEV4cHJlc3Npb24iLCAiamIiLCAicWIiLCAiaXRlbSIsICJtb2NrU2VsZWN0UXVlcnkiLCAiZ2V0VXBkYXRlUXVlcnkiLCAic2NoZW1hIiwgImpzb25CdWlsZE9iamVjdCIsICJvYmoiLCAic3FsIiwgImsiLCAiZ2V0VGFibGVzUXVlcnkiLCAicmVxdWlyZW1lbnRzIiwgImRhdGFiYXNlIiwgInNxbCIsICJjb2x1bW5zUXVlcnkiLCAiZ2V0TXlTUUxCdWlsZGVyIiwgImpiIiwgImViIiwgImNvbXBpbGUiLCAianNvbkJ1aWxkT2JqZWN0IiwgIm1vY2tUYWJsZXNRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgImJ1aWxkZXIiLCAic2Vzc2lvblR6IiwgIm1vY2tUaW1lem9uZVF1ZXJ5IiwgImNyZWF0ZUxpbnREaWFnbm9zdGljc0Zyb21NeVNRTEVycm9yIiwgImFyZ3MiLCAiZXJyb3IiLCAic3FsIiwgInBvc2l0aW9uT2Zmc2V0IiwgImZhbGxiYWNrUmFuZ2UiLCAiZ2V0RmFsbGJhY2tSYW5nZSIsICJjb2RlIiwgImdldE15U1FMRXJyb3JDb2RlIiwgImluZmVycmVkUmFuZ2UiLCAiaW5mZXJSYW5nZUZyb21NZXNzYWdlIiwgInRvTXlTUUxMaW50TWVzc2FnZSIsICJsaW50TXlTUUxXaXRoRXhwbGFpbkZhbGxiYWNrIiwgImV4ZWN1dG9yIiwgImRldGFpbHMiLCAib3B0aW9ucyIsICJ2YWxpZGF0aW9uIiwgInZhbGlkYXRlU3FsRm9yTGludCIsICJkaWFnbm9zdGljcyIsICJzdGF0ZW1lbnQiLCAiZXhwbGFpblF1ZXJ5IiwgImFzUXVlcnkiLCAid2l0aENvZGUiLCAibWVzc2FnZSIsICJzcWxMZW5ndGgiLCAidG9rZW5DYW5kaWRhdGVzIiwgInF1b3RlZE1hdGNoIiwgImJhY2t0aWNrTWF0Y2giLCAiZG91YmxlUXVvdGVkTWF0Y2giLCAibWlzc2luZ1RhYmxlTWF0Y2giLCAibG93ZXJTcWwiLCAidG9rZW4iLCAibm9ybWFsaXplZFRva2VuIiwgImRpcmVjdEluZGV4IiwgInNwbGl0VG9rZW4iLCAic3BsaXRJbmRleCIsICJjcmVhdGVNeVNRTEFkYXB0ZXIiLCAicmVxdWlyZW1lbnRzIiwgImV4ZWN1dG9yIiwgIm90aGVyUmVxdWlyZW1lbnRzIiwgImZ1bGxUYWJsZVNlYXJjaFN0YXRlIiwgImNyZWF0ZUZ1bGxUYWJsZVNlYXJjaEV4ZWN1dGlvblN0YXRlIiwgImNhblVzZUV4ZWN1dG9yTGludFRyYW5zcG9ydCIsICJpbnRyb3NwZWN0RGF0YWJhc2UiLCAib3B0aW9ucyIsICJ0YWJsZXNRdWVyeSIsICJnZXRUYWJsZXNRdWVyeSIsICJ0aW1lem9uZVF1ZXJ5IiwgImdldFRpbWV6b25lUXVlcnkiLCAidGFibGVzRXJyb3IiLCAidGFibGVzIiwgInRpbWV6b25lRXJyb3IiLCAidGltZXpvbmVzIiwgImNyZWF0ZUFkYXB0ZXJFcnJvciIsICJ0aW1lem9uZSIsICJjcmVhdGVJbnRyb3NwZWN0aW9uIiwgImVycm9yIiwgImRldGFpbHMiLCAicXVlcnkiLCAiZ2V0RGVsZXRlUXVlcnkiLCAicm93cyIsICJ0YWJsZSIsICJjb2x1bW5zIiwgImF1dG9pbmNyZW1lbnRDb2x1bW4iLCAiY29sdW1uIiwgImZpbHRlck9iamVjdHMiLCAicm93IiwgImluZmVyRmlsdGVyT2JqZWN0IiwgImhhc1BhcnRpYWxGaWx0ZXJPYmplY3RzIiwgImZpbHRlck9iamVjdCIsICJmaWx0ZXJWYWx1ZXMiLCAidmFsdWUiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAiaW5zZXJ0UXVlcnkiLCAicmVmZXRjaFF1ZXJ5IiwgImdldEluc2VydFJlZmV0Y2hRdWVyeSIsICJzZXF1ZW5jZSIsICJpbnNlcnRFcnJvciIsICJtYXliZVJlZmV0Y2hSZXN1bHQiLCAiam9pblNlcXVlbmNlIiwgInJlZmV0Y2hFcnJvciIsICJyZWZldGNoUmVzdWx0cyIsICJyZXN1bHRzIiwgInJlc3VsdCIsICJhdXRvaW5jcmVtZW50Q29sdW1uTmFtZSIsICJhY2MiLCAiY29sdW1uTmFtZSIsICJyZWZldGNoZWRSb3ciLCAiaW5zZXJ0ZWRSb3dzIiwgImVycm9ycyIsICJpbmRleCIsICJfZGV0YWlscyIsICJpbnRyb3NwZWN0aW9uIiwgImNyZWF0ZVNxbEVkaXRvclNjaGVtYUZyb21JbnRyb3NwZWN0aW9uIiwgInNob3VsZEZhbGxiYWNrVG9FeHBsYWluTGludCIsICJsaW50TXlTUUxXaXRoRXhwbGFpbkZhbGxiYWNrIiwgImFzUXVlcnkiLCAiZ2V0U2VsZWN0UXVlcnkiLCAiZXhlY3V0ZVF1ZXJ5V2l0aEZ1bGxUYWJsZVNlYXJjaEd1YXJkcmFpbHMiLCAidXBkYXRlUXVlcnkiLCAiZ2V0VXBkYXRlUXVlcnkiLCAiZ2V0VXBkYXRlUmVmZXRjaFF1ZXJ5IiwgInVwZGF0ZUVycm9yIiwgInJlZmV0Y2hSZXN1bHQiLCAibWVzc2FnZSIsICJhcmdzIiwgInNjaGVtYXMiLCAidGFibGVOYW1lIiwgInNjaGVtYSIsICJjb2x1bW5zUmVjb3JkIiwgImEiLCAiYiIsICJkYXRhdHlwZSIsICJkZWZhdWx0VmFsdWUiLCAiaW5kZXhPZlBhcmVudGhlc2lzIiwgInN0cmlwcGVkRGF0YVR5cGUiLCAiaXNBdXRvaW5jcmVtZW50IiwgImlzQ29tcHV0ZWQiLCAibnVsbGFibGUiLCAiTVlTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJmaWx0ZXJPcGVyYXRvcnMiLCAibW9ja0ludHJvc3BlY3QiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgIm1vY2tUaW1lem9uZVF1ZXJ5IiwgInF1ZXJ5MCIsICJxdWVyeTEiXQp9Cg==