lfi
Version:
A lazy functional iteration library supporting sync, async, and concurrent iteration.
2 lines • 197 kB
JavaScript
const t=t=>t,e=t=>()=>t,o=t=>({[Symbol.iterator]:t}),r=t=>({[Symbol.asyncIterator]:t}),s=t=>{const{t:e,o:o}=n();return Promise.race([e,t(o)])},n=()=>{let t;return{t:new Promise((e=>{t=e})),o:t}},a=t=>Boolean(t&&"function"==typeof t.then),i=t=>{if(t.length<=1||p.has(t))return t;const e=c(t,((...e)=>e.length<t.length?i(t.bind(null,...e)):t(...e)));return p.add(e),e},c=(t,e)=>Object.defineProperties(e,{length:{value:t.length},name:{value:t.name}}),p=/*@__PURE__*/new WeakSet,x=/*@__PURE__*/i(((t,e)=>o((function*(){for(const o of e)yield t(o)})))),f=/*@__PURE__*/i(((t,e)=>r((async function*(){for await(const o of e)yield t(o)})))),l=/*@__PURE__*/i(((t,e)=>o=>e((async e=>o(await t(e)))))),y=/*@__PURE__*/i(((t,e)=>o((function*(){for(const o of e)yield*t(o)})))),u=/*@__PURE__*/i(((t,e)=>r((async function*(){for await(const o of e)yield*await t(o)})))),d=/*@__PURE__*/i(((t,e)=>o=>e((async e=>k(await t(e))(o))))),w=/*@__PURE__*/y(t),m=/*@__PURE__*/u(t),b=/*@__PURE__*/d(t),_=/*@__PURE__*/i((t=>o((function*(){let e=0;for(const o of t)yield[e++,o]})))),S=/*@__PURE__*/i((t=>r((async function*(){let e=0;for await(const o of t)yield[e++,o]})))),v=/*@__PURE__*/i((t=>async e=>{let o=0;await t((t=>e([o++,t])))})),h=(t,...e)=>e.reduce(((t,e)=>e(t)),t),g=t=>t[Symbol.asyncIterator]?t:r(t[Symbol.iterator]?()=>t[Symbol.iterator]():async function*(){let e,o=[],r=!1,s=n();for(t((t=>{if(o.push(t),s){const t=s;s=null,t.o()}})).then((()=>{r=!0,s?.o()})).catch((t=>{e=t,s?.o()}));!r;){if(e)throw yield*o,e;if(!o.length){await s.t;continue}const t=o;o=[],s=n(),yield*t}}),k=t=>"function"==typeof t?t:t[Symbol.iterator]?async e=>{await Promise.all(x(e,t))}:async e=>{const o=[];for await(const r of t){const t=e(r);a(t)&&o.push(t)}await Promise.all(o)},z={done:!0},P={next:()=>z},E={next:()=>Promise.resolve(z)},j=/*@__PURE__*/o((()=>P)),O=/*@__PURE__*/r((()=>E)),W=()=>Promise.resolve(),M=t=>o((()=>t[Symbol.iterator]())),A=/*@__PURE__*/i(((t,e)=>{const o=e[Symbol.iterator](),{done:r,value:s}=o.next();return r||!o.next().done?t():s})),N=/*@__PURE__*/i((async(t,e)=>{const o=e[Symbol.asyncIterator](),{done:r,value:s}=await o.next();return r||!(await o.next()).done?t():s})),$=/*@__PURE__*/i(((t,e)=>s((async o=>{let r,s;await e((async e=>{s?r||(r=!0,o(await t())):s={value:e}})),r||o(s?s.value:await t())})))),B=()=>{throw new Error("Did not contain exactly one value")},D=/*@__PURE__*/A(B),I=/*@__PURE__*/N(B),q=/*@__PURE__*/$(B),C=/*@__PURE__*/i((t=>{const e=t[Symbol.iterator](),{done:r,value:s}=e.next();return r?[j,j]:[M([s]),o((()=>e))]})),F=/*@__PURE__*/i((async t=>{const e=t[Symbol.asyncIterator](),{done:o,value:s}=await e.next();return o?[O,O]:[g([s]),r((()=>e))]})),G=/*@__PURE__*/i(((t,e)=>{const{finish:o,...r}=J(e);return{...r,finish:e=>t(o(e))}})),H=/*@__PURE__*/i(((t,e)=>{const{finish:o,...r}=J(e);return{...r,finish:async e=>t(await o(e))}})),J=e=>{const o={finish:t};if("function"==typeof e)return o.add=e,o;for(const t of K){const r=e[t];r&&(o[t]=r.bind(e))}return o},K=["create","add","get","finish","combine"],L={},Q=/*@__PURE__*/i(((t,e)=>{const{create:r,add:s,finish:n}=J(t);return r?R(r(),s,n,e):o((function*(){const[t,o]=C(e);yield*x((t=>R(t,s,n,o)),t)}))})),R=(t,e,o,r)=>{for(const o of r)t=e(t,o);return o(t)},T=/*@__PURE__*/i(((t,e)=>{const{create:o,add:s,combine:n,finish:a}=J(t),i=k(e);return o?n?X(o,s,n,a,i):Y(o,s,a,i):r((async function*(){yield*await V(s,a,i)}))})),U=/*@__PURE__*/i(((t,e)=>{const{create:o,add:r,combine:s,finish:n}=J(t);return o?s?X(o,r,s,n,e):Y(o,r,n,e):async t=>{const o=await V(r,n,e);o.length&&await t(o[0])}})),V=async(t,e,o)=>{const r=[];return await o((async e=>{for(;r.length;)e=await t(e,r.pop());r.push(e)})),r.length?[await e(r[0])]:r},X=async(t,e,o,r,s)=>{const n=[t()];return await s((async r=>{let s=await e(await(n.length?n.pop():t()),r);for(;n.length;)s=await o(s,n.pop());n.push(s)})),r(await n[0])},Y=async(t,e,o,r)=>{let s=Promise.resolve(t());return await r((t=>{s=s.then((o=>e(o,t)))})),o(await s)},Z=/*@__PURE__*/e(/*@__PURE__*/J({create:()=>[],add:(t,e)=>(t.push(e),t)})),tt=(t,e)=>t.add(e),et=/*@__PURE__*/e(/*@__PURE__*/J({create:()=>new Set,add:tt})),ot=/*@__PURE__*/e(/*@__PURE__*/J({create:()=>new WeakSet,add:tt})),rt=/*@__PURE__*/e(/*@__PURE__*/J({create:()=>({}),add:(t,[e,o])=>Object.defineProperty(t,e,{configurable:!0,enumerable:!0,writable:!0,value:o}),get:(t,e)=>st.call(t,e)?t[e]:L})),st=/*@__PURE__*/(()=>({}.hasOwnProperty))(),nt={add:(t,[e,o])=>t.set(e,o),get:(t,e)=>t.has(e)?t.get(e):L},at=/*@__PURE__*/e(/*@__PURE__*/J(/*@__PURE__*/(()=>({create:()=>new Map,...nt}))())),it=/*@__PURE__*/e(/*@__PURE__*/J(/*@__PURE__*/(()=>({create:()=>new WeakMap,...nt}))())),ct=/*@__PURE__*/i(((t,e)=>{const{create:o,add:r,finish:s}=J(t),{create:n,add:a,get:i}=J(e);return{create:()=>({i:n(),p:[]}),add:(t,[e,s])=>{let n=i(t.i,e);return n===L?(n=o?r(o(),s):s,t.p.push(e)):n=r(n,s),t.i=a(t.i,[e,n]),t},finish:({i:t,p:e})=>e.reduce(((t,e)=>a(t,[e,s(i(t,e))])),t)}})),pt=t=>{const e=Array.isArray(t)?e=>Q(Z(),x((([,t])=>e(t)),t)):e=>Q(rt(),x((([t,o])=>[t,e(o)]),t));t=Object.entries(t).map((([t,e])=>[t,J(e)]));const o=(e,o)=>{for(const[r,s]of t)e[r]=o(e[r],s);return e},r=(t,e)=>o(t,((t,{add:o})=>o(t,e))),s=t=>o(t,((t,{finish:e})=>e(t)));return t.every((([,{create:t}])=>t))?{create:()=>e((({create:t})=>t())),add:r,finish:s}:{add:(t,o)=>r(ft(t,e),o),finish:t=>(t=s(ft(t,e)),xt.delete(t),t)}},xt=/*@__PURE__*/new WeakSet,ft=(t,e)=>{if(xt.has(t))return t;const o=e((({create:e,add:o})=>e?o(e(),t):t));return xt.add(o),o},lt=t=>({create:()=>{},add:(e,o)=>void 0===e?String(o):String(e)+t+String(o),finish:t=>t??""}),yt=t=>i(((e,o)=>t(lt(e),o))),ut=/*@__PURE__*/yt(Q),dt=/*@__PURE__*/yt(T),wt=/*@__PURE__*/yt(U),mt=/*@__PURE__*/i(((t,e)=>y((e=>t(e)?[e]:[]),e))),bt=t=>i(((e,o)=>t((async t=>await e(t)?[t]:[]),o))),_t=/*@__PURE__*/bt(u),St=/*@__PURE__*/bt(d),vt=/*@__PURE__*/i(((t,e)=>y((e=>gt(t(e))),e))),ht=t=>i(((e,o)=>t((async t=>gt(await e(t))),o))),gt=t=>null==t?[]:[t],kt=/*@__PURE__*/ht(u),zt=/*@__PURE__*/ht(d),Pt=t=>i(((e,o)=>{const r=new Set(e);return t((t=>!r.has(t)),o)})),Et=/*@__PURE__*/Pt(mt),jt=/*@__PURE__*/Pt(_t),Ot=/*@__PURE__*/Pt(St),Wt=/*@__PURE__*/i(((t,e)=>o((function*(){const o=new Set;for(const r of e){const e=t(r);o.has(e)||(o.add(e),yield r)}})))),Mt=/*@__PURE__*/i(((t,e)=>r((async function*(){const o=new Set;for await(const r of e){const e=await t(r);o.has(e)||(o.add(e),yield r)}})))),At=/*@__PURE__*/i(((t,e)=>o=>{const r=new Set;return e((async e=>{const s=await t(e);r.has(s)||(r.add(s),await o(e))}))})),Nt=/*@__PURE__*/Wt(t),$t=/*@__PURE__*/Mt(t),Bt=/*@__PURE__*/At(t),Dt=/*@__PURE__*/i(((t,e)=>o((function*(){for(const o of e)if(t(o))return void(yield o)})))),It=/*@__PURE__*/i(((t,e)=>r((async function*(){for await(const o of e)if(await t(o))return void(yield o)})))),qt=/*@__PURE__*/i(((t,e)=>o=>s((async r=>{let s=!1;await e((async e=>{s||!await t(e)||s||(s=!0,await o(e),r())}))})))),Ct=/*@__PURE__*/i(((t,e)=>o((function*(){let o;for(const r of e)t(r)&&(o={value:r});o&&(yield o.value)})))),Ft=/*@__PURE__*/i(((t,e)=>r((async function*(){let o;for await(const r of e)await t(r)&&(o={value:r});o&&(yield o.value)})))),Gt=/*@__PURE__*/i(((t,e)=>async o=>{let r;await e((async e=>{await t(e)&&(r={value:e})})),r&&await o(r.value)})),Ht=({l:t,u:e})=>o=>Object.entries(o).every((([o,r])=>t(o,r)||Jt(`\`${o}\` must be ${e}: ${r}`))),Jt=t=>{throw new Error(t)},Kt=/*@__PURE__*/Ht({l:(t,e)=>Number.isSafeInteger(e),u:"an integer"}),Lt=/*@__PURE__*/Ht({l:(t,e)=>Kt({[t]:e})&&e>=0,u:"a non-negative integer"}),Qt=/*@__PURE__*/Ht({l:(t,e)=>Kt({[t]:e})&&e>0,u:"a positive integer"}),Rt=/*@__PURE__*/Ht({l:(t,{m:e,_:o})=>e[o]()!=e[o](),u:"a pure iterable"}),Tt=/*@__PURE__*/Ht({l:(t,[e,o])=>e<=o,u:"a range"}),Ut=t=>e=>o((()=>(e[t]?.()??Object[t](e))[Symbol.iterator]())),Vt=/*@__PURE__*/Ut("keys"),Xt=/*@__PURE__*/Ut("values"),Yt=/*@__PURE__*/Ut("entries"),Zt=/*@__PURE__*/i(((t,e)=>o((function*(){for(let o=e;null!=o;o=t(o))yield o})))),te=/*@__PURE__*/i(((t,e)=>r((async function*(){for(let o=e;null!=o;o=await t(o))yield o})))),ee=t=>i(((e,o)=>{Kt({start:e,end:o});const r=t(e,o,1);return r.step=r=>(Qt({step:r}),t(e,o,r)),r})),oe=/*@__PURE__*/ee(((t,e,r)=>o(t<e?function*(){for(let o=t;o<e;o+=r)yield o}:function*(){for(let o=t;o>e;o-=r)yield o}))),re=/*@__PURE__*/ee(((t,e,r)=>o(t<e?function*(){for(let o=t;o<=e;o+=r)yield o}:function*(){for(let o=t;o>=e;o-=r)yield o}))),se=/*@__PURE__*/i(((t,e)=>{for(const o of e)if(!t(o))return!1;return!0})),ne=/*@__PURE__*/i((async(t,e)=>{for await(const o of e)if(!await t(o))return!1;return!0})),ae=/*@__PURE__*/i(((t,e)=>s((async o=>{let r=!1;return await e((async e=>{r||await t(e)||r||(r=!0,o(!1))})),!0})))),ie=/*@__PURE__*/i(((t,e)=>{for(const o of e)if(t(o))return!0;return!1})),ce=/*@__PURE__*/i((async(t,e)=>{for await(const o of e)if(await t(o))return!0;return!1})),pe=/*@__PURE__*/i(((t,e)=>s((async o=>{let r=!1;return await e((async e=>{r||!await t(e)||r||(r=!0,o(!0))})),!1})))),xe=/*@__PURE__*/i(((t,e)=>!ie(t,e))),fe=t=>i((async(e,o)=>!await t(e,o))),le=/*@__PURE__*/fe(ce),ye=/*@__PURE__*/fe(pe),ue=t=>i(((e,o)=>t((t=>Object.is(t,e)),o))),de=/*@__PURE__*/ue(ie),we=/*@__PURE__*/ue(ce),me=/*@__PURE__*/ue(pe),be=/*@__PURE__*/i(((t,e)=>x((e=>(t(e),e)),e))),_e=t=>i(((e,o)=>t((async t=>(await e(t),t)),o))),Se=/*@__PURE__*/_e(f),ve=/*@__PURE__*/_e(l),he=/*@__PURE__*/i(((t,e)=>{for(const o of e)t(o)})),ge=/*@__PURE__*/i((async(t,e)=>{for await(const o of e)await t(o)})),ke=/*@__PURE__*/i(((t,e)=>e(t))),ze=t=>e=>t((()=>{}),e),Pe=/*@__PURE__*/ze(he),Ee=/*@__PURE__*/ze(ge),je=/*@__PURE__*/ze(ke),Oe=/*@__PURE__*/i(((t,e)=>o((function*(){let o=!0;for(const r of e)o&&t(r)||(o=!1,yield r)})))),We=/*@__PURE__*/i(((t,e)=>r((async function*(){let o=!0;for await(const r of e)o&&await t(r)&&o||(o=!1,yield r)})))),Me=/*@__PURE__*/i(((t,e)=>o=>{let r=!0;return e((async e=>{r&&await t(e)&&r||(r=!1,await o(e))}))})),Ae=/*@__PURE__*/i(((t,e)=>o((function*(){for(const o of e){if(!t(o))break;yield o}})))),Ne=/*@__PURE__*/i(((t,e)=>r((async function*(){for await(const o of e){if(!await t(o))break;yield o}})))),$e=/*@__PURE__*/i(((t,e)=>o=>s((r=>{let s=!0;return e((async e=>{s&&await t(e)&&s?await o(e):(s=!1,r())}))})))),Be=(t,e,o)=>i(((r,s)=>(Lt({count:r}),h(o(s),t((([t])=>t<r)),e((([,t])=>t)))))),De=/*@__PURE__*/Be(Oe,x,_),Ie=/*@__PURE__*/Be(We,f,S),qe=/*@__PURE__*/Be(Me,l,v),Ce=/*@__PURE__*/Be(Ae,x,_),Fe=/*@__PURE__*/Be(Ne,f,S),Ge=/*@__PURE__*/Be($e,l,v),He=/*@__PURE__*/Ce(1),Je=/*@__PURE__*/Fe(1),Ke=/*@__PURE__*/Ge(1),Le=/*@__PURE__*/Ct((()=>!0)),Qe=/*@__PURE__*/Ft((()=>!0)),Re=/*@__PURE__*/Gt((()=>!0)),Te=(t,e,o)=>i(((r,s,n)=>(Lt({start:r}),Lt({end:s}),Tt({"start,end":[r,s]}),r===s?t:h(n,e(r),o(s-r))))),Ue=/*@__PURE__*/Te(j,De,Ce),Ve=/*@__PURE__*/Te(O,Ie,Fe),Xe=/*@__PURE__*/Te(W,qe,Ge),Ye=t=>i(((e,o)=>(Lt({index:e}),t(e,e+1,o)))),Ze=/*@__PURE__*/Ye(Ue),to=/*@__PURE__*/Ye(Ve),eo=/*@__PURE__*/Ye(Xe),oo=/*@__PURE__*/i(((t,e)=>(Qt({size:t}),o((function*(){let o=[];for(const r of e)o.push(r),o.length<t||(yield o,o=[]);o.length&&(yield o)}))))),ro=/*@__PURE__*/i(((t,e)=>(Qt({size:t}),r((async function*(){let o=[];for await(const r of e)o.push(r),o.length<t||(yield o,o=[]);o.length&&(yield o)}))))),so=/*@__PURE__*/i(((t,e)=>(Qt({size:t}),async o=>{let r=[];await e((async e=>{if(r.push(e),r.length<t)return;const s=r;r=[],await o(s)})),r.length&&await o(r)}))),no=/*@__PURE__*/i(((t,e)=>{const{S:r,v:s,h:n}=co(t);return Qt({size:r}),o((function*(){const t=po(r);for(const o of e)(t.k(o)===r||s)&&(yield t.P());n&&(yield*t.h(s))}))})),ao=/*@__PURE__*/i(((t,e)=>{const{S:o,v:s,h:n}=co(t);return Qt({size:o}),r((async function*(){const t=po(o);for await(const r of e)(t.k(r)===o||s)&&(yield t.P());n&&(yield*t.h(s))}))})),io=/*@__PURE__*/i(((t,e)=>{const{S:o,v:r,h:s}=co(t);return Qt({size:o}),async t=>{const n=po(o);await e((async e=>{(n.k(e)===o||r)&&await t(n.P())})),s&&await Promise.all(x(t,n.h(r)))}})),co=t=>{const{size:e,partialStart:o=!1,partialEnd:r=!1}="number"==typeof t?{size:t}:t;return{S:e,v:o,h:r}},po=t=>{let e=0,o=0;const r=Array.from({length:t});return{k:s=>(r[e]=s,e=(e+1)%t,o=Math.min(o+1,t),o),P:(s=0)=>{const n=t-o+e+s;return Array.from({length:o-s},((e,o)=>r[(n+o)%t]))},*h(e){for(let r=o<t&&!e?0:1;r<o;r++)yield this.P(r)}}},xo=/*@__PURE__*/e({create:()=>0,add:t=>t+1}),fo=/*@__PURE__*/Q(/*@__PURE__*/xo()),lo=/*@__PURE__*/T(/*@__PURE__*/xo()),yo=/*@__PURE__*/U(/*@__PURE__*/xo()),uo=/*@__PURE__*/e({create:()=>0,add:(t,e)=>t+e}),wo=/*@__PURE__*/Q(/*@__PURE__*/uo()),mo=/*@__PURE__*/T(/*@__PURE__*/uo()),bo=/*@__PURE__*/U(/*@__PURE__*/uo()),_o=/*@__PURE__*/e(/*@__PURE__*/G((([t,e])=>0===e?NaN:t/e),/*@__PURE__*/pt([/*@__PURE__*/uo(),/*@__PURE__*/xo()]))),So=/*@__PURE__*/Q(/*@__PURE__*/_o()),vo=/*@__PURE__*/T(/*@__PURE__*/_o()),ho=/*@__PURE__*/U(/*@__PURE__*/_o()),go=/*@__PURE__*/new WeakSet,ko=t=>{if(go.has(t))return t;const e={j:t,O:t};return go.add(e),e},zo=t=>go.has(t)?{min:t.j,max:t.O}:{min:t,max:t},Po=t=>J(((e,o)=>t(e,o)<=0?e:o)),Eo=t=>J(((e,o)=>t(e,o)>=0?e:o)),jo=t=>G(zo,((e,o)=>{const r=ko(e);return t(o,r.j)<0?r.j=o:t(o,r.O)>0&&(r.O=o),r})),Oo=t=>J((async(e,o)=>await t(e,o)<=0?e:o)),Wo=t=>J((async(e,o)=>await t(e,o)>=0?e:o)),Mo=t=>{const e=Oo(t).add,o=Wo(t).add;return H(zo,(async(r,s)=>{const n=ko(r);return go.has(s)?[n.j,n.O]=await Promise.all([e(s.j,n.j),o(s.O,n.O)]):await t(s,n.j)<0?n.j=s:await t(s,n.O)>0&&(n.O=s),n}))},Ao=t=>e=>t(((t,o)=>e(t)-e(o))),No=/*@__PURE__*/Ao(Po),$o=/*@__PURE__*/Ao(Eo),Bo=/*@__PURE__*/Ao(jo),Do=t=>e=>t((async(t,o)=>{const[r,s]=await Promise.all([e(t),e(o)]);return r-s})),Io=/*@__PURE__*/Do(Oo),qo=/*@__PURE__*/Do(Wo),Co=/*@__PURE__*/Do(Mo),Fo=/*@__PURE__*/e(/*@__PURE__*/No(t)),Go=/*@__PURE__*/e(/*@__PURE__*/$o(t)),Ho=/*@__PURE__*/e(/*@__PURE__*/Bo(t)),Jo=(t,e)=>i(((o,r)=>t(e(o),r))),Ko=/*@__PURE__*/Jo(Q,Po),Lo=/*@__PURE__*/Jo(Q,Eo),Qo=/*@__PURE__*/Jo(Q,jo),Ro=/*@__PURE__*/Jo(T,Oo),To=/*@__PURE__*/Jo(T,Wo),Uo=/*@__PURE__*/Jo(T,Mo),Vo=/*@__PURE__*/Jo(U,Oo),Xo=/*@__PURE__*/Jo(U,Wo),Yo=/*@__PURE__*/Jo(U,Mo),Zo=/*@__PURE__*/Jo(Q,No),tr=/*@__PURE__*/Jo(Q,$o),er=/*@__PURE__*/Jo(Q,Bo),or=/*@__PURE__*/Jo(T,Io),rr=/*@__PURE__*/Jo(T,qo),sr=/*@__PURE__*/Jo(T,Co),nr=/*@__PURE__*/Jo(U,Io),ar=/*@__PURE__*/Jo(U,qo),ir=/*@__PURE__*/Jo(U,Co),cr=/*@__PURE__*/Zo(t),pr=/*@__PURE__*/tr(t),xr=/*@__PURE__*/er(t),fr=/*@__PURE__*/or(t),lr=/*@__PURE__*/rr(t),yr=/*@__PURE__*/sr(t),ur=/*@__PURE__*/nr(t),dr=/*@__PURE__*/ar(t),wr=/*@__PURE__*/ir(t);exports.NO_ENTRY=L,exports.all=se,exports.allAsync=ne,exports.allConcur=ae,exports.any=ie,exports.anyAsync=ce,exports.anyConcur=pe,exports.asAsync=g,exports.asConcur=k,exports.at=Ze,exports.atAsync=to,exports.atConcur=eo,exports.cache=t=>{const e=[],r=t[Symbol.iterator]();return o((function*(){let t=0;for(;;){if(t<e.length){yield e[t++];continue}const{value:o,done:s}=r.next();if(s)break;e.push(o),t++,yield o}}))},exports.cacheAsync=t=>{const e=[],o=t[Symbol.asyncIterator]();return r((async function*(){let t=0;for(;;){if(t<e.length){yield e[t++];continue}const{value:r,done:s}=await o.next();if(s)break;e.push(r),t++,yield r}}))},exports.cacheConcur=t=>{let e;const o=[],r=[];let s=!1;return async n=>{s||(r.push(n),e||(e=t((async t=>{o.push(t),await k(r)((e=>e(t)))})).then((()=>s=!0)))),await Promise.all([k(o)(n),e])}},exports.chunk=oo,exports.chunkAsync=ro,exports.chunkConcur=so,exports.compose=(...t)=>e=>h(e,...t),exports.concat=(...t)=>w(t),exports.concatAsync=(...t)=>m(g(t)),exports.concatConcur=(...t)=>b(k(t)),exports.consume=Pe,exports.consumeAsync=Ee,exports.consumeConcur=je,exports.count=fo,exports.countAsync=lo,exports.countConcur=yo,exports.curry=i,exports.cycle=t=>(Rt({iterable:{m:t,_:Symbol.iterator}}),o((function*(){const e=t[Symbol.iterator](),{value:r,done:s}=e.next();if(!s)for(yield r,yield*o((()=>e));;)yield*t}))),exports.cycleAsync=t=>(Rt({asyncIterable:{m:t,_:Symbol.asyncIterator}}),r((async function*(){const e=t[Symbol.asyncIterator](),{value:o,done:r}=await e.next();if(!r)for(yield o,yield*{[Symbol.asyncIterator]:()=>e};;)yield*t}))),exports.drop=De,exports.dropAsync=Ie,exports.dropConcur=qe,exports.dropWhile=Oe,exports.dropWhileAsync=We,exports.dropWhileConcur=Me,exports.each=be,exports.eachAsync=Se,exports.eachConcur=ve,exports.empty=j,exports.emptyAsync=O,exports.emptyConcur=W,exports.entries=Yt,exports.exclude=Et,exports.excludeAsync=jt,exports.excludeConcur=Ot,exports.filter=mt,exports.filterAsync=_t,exports.filterConcur=St,exports.filterMap=vt,exports.filterMapAsync=kt,exports.filterMapConcur=zt,exports.find=Dt,exports.findAsync=It,exports.findConcur=qt,exports.findLast=Ct,exports.findLastAsync=Ft,exports.findLastConcur=Gt,exports.first=He,exports.firstAsync=Je,exports.firstConcur=Ke,exports.flatMap=y,exports.flatMapAsync=u,exports.flatMapConcur=d,exports.flatten=w,exports.flattenAsync=m,exports.flattenConcur=b,exports.forEach=he,exports.forEachAsync=ge,exports.forEachConcur=ke,exports.generate=Zt,exports.generateAsync=te,exports.get=D,exports.getAsync=I,exports.getConcur=q,exports.includes=de,exports.includesAsync=we,exports.includesConcur=me,exports.index=_,exports.indexAsync=S,exports.indexConcur=v,exports.join=ut,exports.joinAsync=dt,exports.joinConcur=wt,exports.keys=Vt,exports.last=Le,exports.lastAsync=Qe,exports.lastConcur=Re,exports.map=x,exports.mapAsync=f,exports.mapAsyncReducer=H,exports.mapConcur=l,exports.mapReducer=G,exports.max=pr,exports.maxAsync=lr,exports.maxBy=Lo,exports.maxByAsync=To,exports.maxByConcur=Xo,exports.maxConcur=dr,exports.maxWith=tr,exports.maxWithAsync=rr,exports.maxWithConcur=ar,exports.mean=So,exports.meanAsync=vo,exports.meanConcur=ho,exports.min=cr,exports.minAsync=fr,exports.minBy=Ko,exports.minByAsync=Ro,exports.minByConcur=Vo,exports.minConcur=ur,exports.minMax=xr,exports.minMaxAsync=yr,exports.minMaxBy=Qo,exports.minMaxByAsync=Uo,exports.minMaxByConcur=Yo,exports.minMaxConcur=wr,exports.minMaxWith=er,exports.minMaxWithAsync=sr,exports.minMaxWithConcur=ir,exports.minWith=Zo,exports.minWithAsync=or,exports.minWithConcur=nr,exports.next=C,exports.nextAsync=F,exports.none=xe,exports.noneAsync=le,exports.noneConcur=ye,exports.normalizeReducer=J,exports.opaque=M,exports.opaqueAsync=t=>r((()=>t[Symbol.asyncIterator]())),exports.opaqueConcur=t=>e=>t(e),exports.or=A,exports.orAsync=N,exports.orConcur=$,exports.pipe=h,exports.rangeTo=re,exports.rangeUntil=oe,exports.reduce=Q,exports.reduceAsync=T,exports.reduceConcur=U,exports.repeat=t=>o((function*(){for(;;)yield t})),exports.slice=Ue,exports.sliceAsync=Ve,exports.sliceConcur=Xe,exports.sum=wo,exports.sumAsync=mo,exports.sumConcur=bo,exports.take=Ce,exports.takeAsync=Fe,exports.takeConcur=Ge,exports.takeWhile=Ae,exports.takeWhileAsync=Ne,exports.takeWhileConcur=$e,exports.toArray=Z,exports.toCount=xo,exports.toGrouped=ct,exports.toJoin=lt,exports.toMap=at,exports.toMax=Go,exports.toMaxBy=Eo,exports.toMaxByAsync=Wo,exports.toMaxWith=$o,exports.toMaxWithAsync=qo,exports.toMean=_o,exports.toMin=Fo,exports.toMinBy=Po,exports.toMinByAsync=Oo,exports.toMinMax=Ho,exports.toMinMaxBy=jo,exports.toMinMaxByAsync=Mo,exports.toMinMaxWith=Bo,exports.toMinMaxWithAsync=Co,exports.toMinWith=No,exports.toMinWithAsync=Io,exports.toMultiple=pt,exports.toObject=rt,exports.toSet=et,exports.toSum=uo,exports.toWeakMap=it,exports.toWeakSet=ot,exports.unique=Nt,exports.uniqueAsync=$t,exports.uniqueBy=Wt,exports.uniqueByAsync=Mt,exports.uniqueByConcur=At,exports.uniqueConcur=Bt,exports.values=Xt,exports.window=no,exports.windowAsync=ao,exports.windowConcur=io,exports.zip=(...t)=>o((function*(){if(0===t.length)return;const e=t.map((t=>t[Symbol.iterator]())),o=t.map((()=>{}));for(;e.every(((t,e)=>{const r=t.next();return o[e]=r.value,!r.done}));)yield[...o]})),exports.zipAsync=(...t)=>r((async function*(){if(0===t.length)return;const e=t.map((t=>g(t)[Symbol.asyncIterator]())),o=t.map((()=>{}));for(;await ae((async([t,e])=>{const r=await e.next();return o[t]=r.value,!r.done}),k(e.entries()));)yield[...o]})),exports.zipConcur=(...t)=>e=>s((async o=>{if(0===t.length)return;const r=t.map((()=>[])),s=[];let n=1/0,a=!1;await Promise.all(x((async([i,c])=>{const p=r[i];await k(c)((async i=>{if(a)return;const c=p.length;if(c>=n)return;p.push(i),c>=s.length&&s.push(t.length),s[c]--;if(!(0===c&&0===s[0]))return;s.shift();const x=r.map((t=>t.shift()));n--,await e(x),a||0!==n||(a=!0,o())})),p.length>0?n=Math.min(n,p.length):(a=!0,o())}),t.entries()))}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWluLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2ludGVybmFsL2hlbHBlcnMuanMiLCIuLi9zcmMvb3BlcmF0aW9ucy90cmFuc2Zvcm1zLmpzIiwiLi4vc3JjL29wZXJhdGlvbnMvY29yZS5qcyIsIi4uL3NyYy9vcGVyYXRpb25zL29wdGlvbmFscy5qcyIsIi4uL3NyYy9vcGVyYXRpb25zL3JlZHVjZXJzLmpzIiwiLi4vc3JjL29wZXJhdGlvbnMvY29sbGVjdGlvbnMuanMiLCIuLi9zcmMvb3BlcmF0aW9ucy9maWx0ZXJzLmpzIiwiLi4vc3JjL2ludGVybmFsL3ByZWNvbmRpdGlvbnMuanMiLCIuLi9zcmMvb3BlcmF0aW9ucy9nZW5lcmF0b3JzLmpzIiwiLi4vc3JjL29wZXJhdGlvbnMvcHJlZGljYXRlcy5qcyIsIi4uL3NyYy9vcGVyYXRpb25zL3NpZGUtZWZmZWN0cy5qcyIsIi4uL3NyYy9vcGVyYXRpb25zL3NwbGljZXMuanMiLCIuLi9zcmMvb3BlcmF0aW9ucy9zdGF0aXN0aWNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBpZGVudGl0eSA9IHZhbHVlID0+IHZhbHVlXG5cbmV4cG9ydCBjb25zdCB0aHVuayA9IHZhbHVlID0+ICgpID0+IHZhbHVlXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJdGVyYWJsZSA9IGZuID0+ICh7IFtTeW1ib2wuaXRlcmF0b3JdOiBmbiB9KVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQXN5bmNJdGVyYWJsZSA9IGZuID0+ICh7IFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IGZuIH0pXG5cbmV4cG9ydCBjb25zdCBwcm9taXNlV2l0aEVhcmx5UmVzb2x2ZSA9IGZuID0+IHtcbiAgY29uc3QgeyBfcHJvbWlzZTogcHJvbWlzZSwgX3Jlc29sdmU6IHJlc29sdmUgfSA9IGRlZmVycmVkKClcbiAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgZm4ocmVzb2x2ZSldKVxufVxuXG5leHBvcnQgY29uc3QgZGVmZXJyZWQgPSAoKSA9PiB7XG4gIGxldCByZXNvbHZlXG4gIHJldHVybiB7XG4gICAgX3Byb21pc2U6IG5ldyBQcm9taXNlKHIgPT4ge1xuICAgICAgcmVzb2x2ZSA9IHJcbiAgICB9KSxcbiAgICBfcmVzb2x2ZTogcmVzb2x2ZSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlID0gdmFsdWUgPT5cbiAgQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gYGZ1bmN0aW9uYClcblxuZXhwb3J0IGNvbnN0IGN1cnJ5ID0gZm4gPT4ge1xuICBpZiAoZm4ubGVuZ3RoIDw9IDEgfHwgY3VycmllZEZ1bmN0aW9ucy5oYXMoZm4pKSB7XG4gICAgcmV0dXJuIGZuXG4gIH1cblxuICBjb25zdCBjdXJyaWVkID0gd3JhcEZ1bmN0aW9uKGZuLCAoLi4uYXJncykgPT5cbiAgICBhcmdzLmxlbmd0aCA8IGZuLmxlbmd0aCA/IGN1cnJ5KGZuLmJpbmQobnVsbCwgLi4uYXJncykpIDogZm4oLi4uYXJncyksXG4gIClcbiAgY3VycmllZEZ1bmN0aW9ucy5hZGQoY3VycmllZClcblxuICByZXR1cm4gY3VycmllZFxufVxuXG5jb25zdCB3cmFwRnVuY3Rpb24gPSAocHJldmlvdXNGbiwgbmV3Rm4pID0+XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5ld0ZuLCB7XG4gICAgbGVuZ3RoOiB7IHZhbHVlOiBwcmV2aW91c0ZuLmxlbmd0aCB9LFxuICAgIG5hbWU6IHsgdmFsdWU6IHByZXZpb3VzRm4ubmFtZSB9LFxuICB9KVxuXG5jb25zdCBjdXJyaWVkRnVuY3Rpb25zID0gbmV3IFdlYWtTZXQoKVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlQXN5bmNJdGVyYWJsZSxcbiAgY3JlYXRlSXRlcmFibGUsXG4gIGN1cnJ5LFxuICBpZGVudGl0eSxcbn0gZnJvbSAnLi4vaW50ZXJuYWwvaGVscGVycy5qcydcbmltcG9ydCB7IGFzQ29uY3VyIH0gZnJvbSAnLi9jb3JlLmpzJ1xuXG5leHBvcnQgY29uc3QgbWFwID0gY3VycnkoKGZuLCBpdGVyYWJsZSkgPT5cbiAgY3JlYXRlSXRlcmFibGUoZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICB5aWVsZCBmbih2YWx1ZSlcbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgbWFwQXN5bmMgPSBjdXJyeSgoZm4sIGFzeW5jSXRlcmFibGUpID0+XG4gIGNyZWF0ZUFzeW5jSXRlcmFibGUoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGFzeW5jSXRlcmFibGUpIHtcbiAgICAgIHlpZWxkIGZuKHZhbHVlKVxuICAgIH1cbiAgfSksXG4pXG5cbmV4cG9ydCBjb25zdCBtYXBDb25jdXIgPSBjdXJyeShcbiAgKGZuLCBjb25jdXJJdGVyYWJsZSkgPT4gYXBwbHkgPT5cbiAgICBjb25jdXJJdGVyYWJsZShhc3luYyB2YWx1ZSA9PiBhcHBseShhd2FpdCBmbih2YWx1ZSkpKSxcbilcblxuZXhwb3J0IGNvbnN0IGZsYXRNYXAgPSBjdXJyeSgoZm4sIGl0ZXJhYmxlKSA9PlxuICBjcmVhdGVJdGVyYWJsZShmdW5jdGlvbiogKCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgIHlpZWxkKiBmbih2YWx1ZSlcbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgZmxhdE1hcEFzeW5jID0gY3VycnkoKGZuLCBhc3luY0l0ZXJhYmxlKSA9PlxuICBjcmVhdGVBc3luY0l0ZXJhYmxlKGFzeW5jIGZ1bmN0aW9uKiAoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBhc3luY0l0ZXJhYmxlKSB7XG4gICAgICB5aWVsZCogYXdhaXQgZm4odmFsdWUpXG4gICAgfVxuICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGZsYXRNYXBDb25jdXIgPSBjdXJyeShcbiAgKGZuLCBjb25jdXJJdGVyYWJsZSkgPT4gYXBwbHkgPT5cbiAgICBjb25jdXJJdGVyYWJsZShhc3luYyB2YWx1ZSA9PiBhc0NvbmN1cihhd2FpdCBmbih2YWx1ZSkpKGFwcGx5KSksXG4pXG5cbmV4cG9ydCBjb25zdCBmbGF0dGVuID0gZmxhdE1hcChpZGVudGl0eSlcbmV4cG9ydCBjb25zdCBmbGF0dGVuQXN5bmMgPSBmbGF0TWFwQXN5bmMoaWRlbnRpdHkpXG5leHBvcnQgY29uc3QgZmxhdHRlbkNvbmN1ciA9IGZsYXRNYXBDb25jdXIoaWRlbnRpdHkpXG5cbmV4cG9ydCBjb25zdCBpbmRleCA9IGN1cnJ5KGl0ZXJhYmxlID0+XG4gIGNyZWF0ZUl0ZXJhYmxlKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgIHlpZWxkIFtpbmRleCsrLCB2YWx1ZV1cbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgaW5kZXhBc3luYyA9IGN1cnJ5KGFzeW5jSXRlcmFibGUgPT5cbiAgY3JlYXRlQXN5bmNJdGVyYWJsZShhc3luYyBmdW5jdGlvbiogKCkge1xuICAgIGxldCBpbmRleCA9IDBcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGFzeW5jSXRlcmFibGUpIHtcbiAgICAgIHlpZWxkIFtpbmRleCsrLCB2YWx1ZV1cbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgaW5kZXhDb25jdXIgPSBjdXJyeShjb25jdXJJdGVyYWJsZSA9PiBhc3luYyBhcHBseSA9PiB7XG4gIGxldCBpbmRleCA9IDBcbiAgYXdhaXQgY29uY3VySXRlcmFibGUodmFsdWUgPT4gYXBwbHkoW2luZGV4KyssIHZhbHVlXSkpXG59KVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlQXN5bmNJdGVyYWJsZSxcbiAgY3JlYXRlSXRlcmFibGUsXG4gIGRlZmVycmVkLFxuICBpc1Byb21pc2UsXG59IGZyb20gJy4uL2ludGVybmFsL2hlbHBlcnMuanMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuL3RyYW5zZm9ybXMuanMnXG5cbmV4cG9ydCB7IGN1cnJ5IH0gZnJvbSAnLi4vaW50ZXJuYWwvaGVscGVycy5qcydcblxuZXhwb3J0IGNvbnN0IHBpcGUgPSAodmFsdWUsIC4uLmZucykgPT4gZm5zLnJlZHVjZSgoYWNjLCBmbikgPT4gZm4oYWNjKSwgdmFsdWUpXG5cbmV4cG9ydCBjb25zdCBjb21wb3NlID1cbiAgKC4uLmZucykgPT5cbiAgdmFsdWUgPT5cbiAgICBwaXBlKHZhbHVlLCAuLi5mbnMpXG5cbmV4cG9ydCBjb25zdCBhc0FzeW5jID0gaXRlcmFibGUgPT4ge1xuICBpZiAoaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKSB7XG4gICAgcmV0dXJuIGl0ZXJhYmxlXG4gIH1cblxuICByZXR1cm4gY3JlYXRlQXN5bmNJdGVyYWJsZShcbiAgICBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdXG4gICAgICA/ICgpID0+IGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKVxuICAgICAgOiBhc3luYyBmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGxldCBidWZmZXIgPSBbXVxuICAgICAgICAgIGxldCBkb25lID0gZmFsc2VcbiAgICAgICAgICBsZXQgbm9uRW1wdHlCdWZmZXJEZWZlcnJlZCA9IGRlZmVycmVkKClcbiAgICAgICAgICBsZXQgZGVmZXJyZWRFcnJvclxuXG4gICAgICAgICAgaXRlcmFibGUodmFsdWUgPT4ge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpXG4gICAgICAgICAgICBpZiAobm9uRW1wdHlCdWZmZXJEZWZlcnJlZCkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RGVmZXJyZWQgPSBub25FbXB0eUJ1ZmZlckRlZmVycmVkXG4gICAgICAgICAgICAgIG5vbkVtcHR5QnVmZmVyRGVmZXJyZWQgPSBudWxsXG4gICAgICAgICAgICAgIGN1cnJlbnREZWZlcnJlZC5fcmVzb2x2ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgZG9uZSA9IHRydWVcbiAgICAgICAgICAgICAgbm9uRW1wdHlCdWZmZXJEZWZlcnJlZD8uX3Jlc29sdmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGRlZmVycmVkRXJyb3IgPSBlcnJvclxuICAgICAgICAgICAgICBub25FbXB0eUJ1ZmZlckRlZmVycmVkPy5fcmVzb2x2ZSgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICBpZiAoZGVmZXJyZWRFcnJvcikge1xuICAgICAgICAgICAgICB5aWVsZCogYnVmZmVyXG4gICAgICAgICAgICAgIHRocm93IGRlZmVycmVkRXJyb3JcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG5vbkVtcHR5QnVmZmVyRGVmZXJyZWQuX3Byb21pc2VcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGJ1ZmZlclxuICAgICAgICAgICAgYnVmZmVyID0gW11cbiAgICAgICAgICAgIG5vbkVtcHR5QnVmZmVyRGVmZXJyZWQgPSBkZWZlcnJlZCgpXG4gICAgICAgICAgICB5aWVsZCogY3VycmVudEJ1ZmZlclxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgYXNDb25jdXIgPSBpdGVyYWJsZSA9PiB7XG4gIGlmICh0eXBlb2YgaXRlcmFibGUgPT09IGBmdW5jdGlvbmApIHtcbiAgICByZXR1cm4gaXRlcmFibGVcbiAgfVxuXG4gIGlmIChpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgcmV0dXJuIGFzeW5jIGFwcGx5ID0+IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG1hcChhcHBseSwgaXRlcmFibGUpKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhc3luYyBhcHBseSA9PiB7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXVxuXG4gICAgLy8gVE9ETzogU3dpdGNoIHRvIGZyb21Bc3luYyBvbmNlIHdlIG9ubHkgc3VwcG9ydCBOb2RlIHYyMlxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KHZhbHVlKVxuICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gocmVzdWx0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICB9XG59XG5cbmNvbnN0IHJlc3VsdCA9IHsgZG9uZTogdHJ1ZSB9XG5jb25zdCBpdGVyYXRvciA9IHsgbmV4dDogKCkgPT4gcmVzdWx0IH1cbmNvbnN0IGFzeW5jSXRlcmF0b3IgPSB7IG5leHQ6ICgpID0+IFByb21pc2UucmVzb2x2ZShyZXN1bHQpIH1cblxuZXhwb3J0IGNvbnN0IGVtcHR5ID0gY3JlYXRlSXRlcmFibGUoKCkgPT4gaXRlcmF0b3IpXG5leHBvcnQgY29uc3QgZW1wdHlBc3luYyA9IGNyZWF0ZUFzeW5jSXRlcmFibGUoKCkgPT4gYXN5bmNJdGVyYXRvcilcbmV4cG9ydCBjb25zdCBlbXB0eUNvbmN1ciA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpXG5cbmV4cG9ydCBjb25zdCBvcGFxdWUgPSBpdGVyYWJsZSA9PlxuICBjcmVhdGVJdGVyYWJsZSgoKSA9PiBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCkpXG5leHBvcnQgY29uc3Qgb3BhcXVlQXN5bmMgPSBhc3luY0l0ZXJhYmxlID0+XG4gIGNyZWF0ZUFzeW5jSXRlcmFibGUoKCkgPT4gYXN5bmNJdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSlcbmV4cG9ydCBjb25zdCBvcGFxdWVDb25jdXIgPSBjb25jdXJJdGVyYWJsZSA9PiBhcHBseSA9PiBjb25jdXJJdGVyYWJsZShhcHBseSlcbiIsImltcG9ydCB7XG4gIGNyZWF0ZUFzeW5jSXRlcmFibGUsXG4gIGNyZWF0ZUl0ZXJhYmxlLFxuICBjdXJyeSxcbiAgcHJvbWlzZVdpdGhFYXJseVJlc29sdmUsXG59IGZyb20gJy4uL2ludGVybmFsL2hlbHBlcnMuanMnXG5pbXBvcnQgeyBhc0FzeW5jLCBlbXB0eSwgZW1wdHlBc3luYywgb3BhcXVlIH0gZnJvbSAnLi9jb3JlLmpzJ1xuXG5leHBvcnQgY29uc3Qgb3IgPSBjdXJyeSgoZm4sIGl0ZXJhYmxlKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGl0ZXJhdG9yLm5leHQoKVxuICByZXR1cm4gZG9uZSB8fCAhaXRlcmF0b3IubmV4dCgpLmRvbmUgPyBmbigpIDogdmFsdWVcbn0pXG5cbmV4cG9ydCBjb25zdCBvckFzeW5jID0gY3VycnkoYXN5bmMgKGZuLCBhc3luY0l0ZXJhYmxlKSA9PiB7XG4gIGNvbnN0IGFzeW5jSXRlcmF0b3IgPSBhc3luY0l0ZXJhYmxlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpXG4gIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IGFzeW5jSXRlcmF0b3IubmV4dCgpXG5cbiAgcmV0dXJuIGRvbmUgfHwgIShhd2FpdCBhc3luY0l0ZXJhdG9yLm5leHQoKSkuZG9uZSA/IGZuKCkgOiB2YWx1ZVxufSlcblxuZXhwb3J0IGNvbnN0IG9yQ29uY3VyID0gY3VycnkoKGZuLCBjb25jdXJJdGVyYWJsZSkgPT5cbiAgcHJvbWlzZVdpdGhFYXJseVJlc29sdmUoYXN5bmMgcmVzb2x2ZSA9PiB7XG4gICAgbGV0IHJlc29sdmVkXG4gICAgbGV0IHJlc3VsdFxuXG4gICAgYXdhaXQgY29uY3VySXRlcmFibGUoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0ID0geyB2YWx1ZSB9XG4gICAgICB9IGVsc2UgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICByZXNvbHZlZCA9IHRydWVcbiAgICAgICAgcmVzb2x2ZShhd2FpdCBmbigpKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICByZXNvbHZlKHJlc3VsdCA/IHJlc3VsdC52YWx1ZSA6IGF3YWl0IGZuKCkpXG4gICAgfVxuICB9KSxcbilcblxuY29uc3QgZXJyb3IgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBjb250YWluIGV4YWN0bHkgb25lIHZhbHVlYClcbn1cblxuZXhwb3J0IGNvbnN0IGdldCA9IG9yKGVycm9yKVxuZXhwb3J0IGNvbnN0IGdldEFzeW5jID0gb3JBc3luYyhlcnJvcilcbmV4cG9ydCBjb25zdCBnZXRDb25jdXIgPSBvckNvbmN1cihlcnJvcilcblxuZXhwb3J0IGNvbnN0IG5leHQgPSBjdXJyeShpdGVyYWJsZSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpXG4gIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGl0ZXJhdG9yLm5leHQoKVxuXG4gIHJldHVybiBkb25lXG4gICAgPyBbZW1wdHksIGVtcHR5XVxuICAgIDogW29wYXF1ZShbdmFsdWVdKSwgY3JlYXRlSXRlcmFibGUoKCkgPT4gaXRlcmF0b3IpXVxufSlcblxuZXhwb3J0IGNvbnN0IG5leHRBc3luYyA9IGN1cnJ5KGFzeW5jIGFzeW5jSXRlcmFibGUgPT4ge1xuICBjb25zdCBhc3luY0l0ZXJhdG9yID0gYXN5bmNJdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBhc3luY0l0ZXJhdG9yLm5leHQoKVxuXG4gIHJldHVybiBkb25lXG4gICAgPyBbZW1wdHlBc3luYywgZW1wdHlBc3luY11cbiAgICA6IFthc0FzeW5jKFt2YWx1ZV0pLCBjcmVhdGVBc3luY0l0ZXJhYmxlKCgpID0+IGFzeW5jSXRlcmF0b3IpXVxufSlcbiIsImltcG9ydCB7XG4gIGNyZWF0ZUFzeW5jSXRlcmFibGUsXG4gIGNyZWF0ZUl0ZXJhYmxlLFxuICBjdXJyeSxcbiAgaWRlbnRpdHksXG59IGZyb20gJy4uL2ludGVybmFsL2hlbHBlcnMuanMnXG5pbXBvcnQgeyBhc0NvbmN1ciB9IGZyb20gJy4vY29yZS5qcydcbmltcG9ydCB7IG5leHQgfSBmcm9tICcuL29wdGlvbmFscy5qcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4vdHJhbnNmb3Jtcy5qcydcblxuZXhwb3J0IGNvbnN0IG1hcFJlZHVjZXIgPSBjdXJyeSgoZm4sIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgeyBmaW5pc2gsIC4uLnJlc3RSZWR1Y2VyIH0gPSBub3JtYWxpemVSZWR1Y2VyKHJlZHVjZXIpXG4gIHJldHVybiB7IC4uLnJlc3RSZWR1Y2VyLCBmaW5pc2g6IHZhbHVlID0+IGZuKGZpbmlzaCh2YWx1ZSkpIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBtYXBBc3luY1JlZHVjZXIgPSBjdXJyeSgoZm4sIGFzeW5jUmVkdWNlcikgPT4ge1xuICBjb25zdCB7IGZpbmlzaCwgLi4ucmVzdEFzeW5jUmVkdWNlciB9ID0gbm9ybWFsaXplUmVkdWNlcihhc3luY1JlZHVjZXIpXG4gIHJldHVybiB7IC4uLnJlc3RBc3luY1JlZHVjZXIsIGZpbmlzaDogYXN5bmMgdmFsdWUgPT4gZm4oYXdhaXQgZmluaXNoKHZhbHVlKSkgfVxufSlcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVJlZHVjZXIgPSByZWR1Y2VyID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlZHVjZXIgPSB7IGZpbmlzaDogaWRlbnRpdHkgfVxuICBpZiAodHlwZW9mIHJlZHVjZXIgPT09IGBmdW5jdGlvbmApIHtcbiAgICBub3JtYWxpemVkUmVkdWNlci5hZGQgPSByZWR1Y2VyXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRSZWR1Y2VyXG4gIH1cblxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgUkVEVUNFUl9NRVRIT0RfTkFNRVMpIHtcbiAgICBjb25zdCBtZXRob2QgPSByZWR1Y2VyW21ldGhvZE5hbWVdXG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgbm9ybWFsaXplZFJlZHVjZXJbbWV0aG9kTmFtZV0gPSBtZXRob2QuYmluZChyZWR1Y2VyKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkUmVkdWNlclxufVxuXG5jb25zdCBSRURVQ0VSX01FVEhPRF9OQU1FUyA9IFtgY3JlYXRlYCwgYGFkZGAsIGBnZXRgLCBgZmluaXNoYCwgYGNvbWJpbmVgXVxuXG5leHBvcnQgY29uc3QgTk9fRU5UUlkgPSB7fVxuXG5leHBvcnQgY29uc3QgcmVkdWNlID0gY3VycnkoKHJlZHVjZXIsIGl0ZXJhYmxlKSA9PiB7XG4gIGNvbnN0IHsgY3JlYXRlLCBhZGQsIGZpbmlzaCB9ID0gbm9ybWFsaXplUmVkdWNlcihyZWR1Y2VyKVxuICBpZiAoY3JlYXRlKSB7XG4gICAgcmV0dXJuIHJlZHVjZUludGVybmFsKGNyZWF0ZSgpLCBhZGQsIGZpbmlzaCwgaXRlcmFibGUpXG4gIH1cblxuICByZXR1cm4gY3JlYXRlSXRlcmFibGUoZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBbZmlyc3QsIHJlc3RdID0gbmV4dChpdGVyYWJsZSlcbiAgICB5aWVsZCogbWFwKHZhbHVlID0+IHJlZHVjZUludGVybmFsKHZhbHVlLCBhZGQsIGZpbmlzaCwgcmVzdCksIGZpcnN0KVxuICB9KVxufSlcblxuY29uc3QgcmVkdWNlSW50ZXJuYWwgPSAoYWNjLCBhZGQsIGZpbmlzaCwgaXRlcmFibGUpID0+IHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgIGFjYyA9IGFkZChhY2MsIHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIGZpbmlzaChhY2MpXG59XG5cbmV4cG9ydCBjb25zdCByZWR1Y2VBc3luYyA9IGN1cnJ5KChhc3luY1JlZHVjZXIsIGFzeW5jSXRlcmFibGUpID0+IHtcbiAgY29uc3QgeyBjcmVhdGUsIGFkZCwgY29tYmluZSwgZmluaXNoIH0gPSBub3JtYWxpemVSZWR1Y2VyKGFzeW5jUmVkdWNlcilcbiAgY29uc3QgY29uY3VySXRlcmFibGUgPSBhc0NvbmN1cihhc3luY0l0ZXJhYmxlKVxuICBpZiAoIWNyZWF0ZSkge1xuICAgIHJldHVybiBjcmVhdGVBc3luY0l0ZXJhYmxlKGFzeW5jIGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCogYXdhaXQgcmVkdWNlQ29uY3VyV2l0aG91dENyZWF0ZShhZGQsIGZpbmlzaCwgY29uY3VySXRlcmFibGUpXG4gICAgfSlcbiAgfVxuICBpZiAoIWNvbWJpbmUpIHtcbiAgICByZXR1cm4gcmVkdWNlQ29uY3VyV2l0aENyZWF0ZVdpdGhvdXRDb21iaW5lKFxuICAgICAgY3JlYXRlLFxuICAgICAgYWRkLFxuICAgICAgZmluaXNoLFxuICAgICAgY29uY3VySXRlcmFibGUsXG4gICAgKVxuICB9XG4gIHJldHVybiByZWR1Y2VDb25jdXJXaXRoQ3JlYXRlV2l0aENvbWJpbmUoXG4gICAgY3JlYXRlLFxuICAgIGFkZCxcbiAgICBjb21iaW5lLFxuICAgIGZpbmlzaCxcbiAgICBjb25jdXJJdGVyYWJsZSxcbiAgKVxufSlcblxuZXhwb3J0IGNvbnN0IHJlZHVjZUNvbmN1ciA9IGN1cnJ5KChhc3luY1JlZHVjZXIsIGNvbmN1ckl0ZXJhYmxlKSA9PiB7XG4gIGNvbnN0IHsgY3JlYXRlLCBhZGQsIGNvbWJpbmUsIGZpbmlzaCB9ID0gbm9ybWFsaXplUmVkdWNlcihhc3luY1JlZHVjZXIpXG4gIGlmICghY3JlYXRlKSB7XG4gICAgcmV0dXJuIGFzeW5jIGFwcGx5ID0+IHtcbiAgICAgIGNvbnN0IGFjY3MgPSBhd2FpdCByZWR1Y2VDb25jdXJXaXRob3V0Q3JlYXRlKGFkZCwgZmluaXNoLCBjb25jdXJJdGVyYWJsZSlcbiAgICAgIGlmIChhY2NzLmxlbmd0aCkge1xuICAgICAgICBhd2FpdCBhcHBseShhY2NzWzBdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWNvbWJpbmUpIHtcbiAgICByZXR1cm4gcmVkdWNlQ29uY3VyV2l0aENyZWF0ZVdpdGhvdXRDb21iaW5lKFxuICAgICAgY3JlYXRlLFxuICAgICAgYWRkLFxuICAgICAgZmluaXNoLFxuICAgICAgY29uY3VySXRlcmFibGUsXG4gICAgKVxuICB9XG4gIHJldHVybiByZWR1Y2VDb25jdXJXaXRoQ3JlYXRlV2l0aENvbWJpbmUoXG4gICAgY3JlYXRlLFxuICAgIGFkZCxcbiAgICBjb21iaW5lLFxuICAgIGZpbmlzaCxcbiAgICBjb25jdXJJdGVyYWJsZSxcbiAgKVxufSlcblxuY29uc3QgcmVkdWNlQ29uY3VyV2l0aG91dENyZWF0ZSA9IGFzeW5jIChhZGQsIGZpbmlzaCwgY29uY3VySXRlcmFibGUpID0+IHtcbiAgY29uc3QgYWNjcyA9IFtdXG5cbiAgYXdhaXQgY29uY3VySXRlcmFibGUoYXN5bmMgYWNjID0+IHtcbiAgICB3aGlsZSAoYWNjcy5sZW5ndGgpIHtcbiAgICAgIGFjYyA9IGF3YWl0IGFkZChhY2MsIGFjY3MucG9wKCkpXG4gICAgfVxuXG4gICAgYWNjcy5wdXNoKGFjYylcbiAgfSlcblxuICByZXR1cm4gYWNjcy5sZW5ndGggPyBbYXdhaXQgZmluaXNoKGFjY3NbMF0pXSA6IGFjY3Ncbn1cblxuY29uc3QgcmVkdWNlQ29uY3VyV2l0aENyZWF0ZVdpdGhDb21iaW5lID0gYXN5bmMgKFxuICBjcmVhdGUsXG4gIGFkZCxcbiAgY29tYmluZSxcbiAgZmluaXNoLFxuICBjb25jdXJJdGVyYWJsZSxcbikgPT4ge1xuICBjb25zdCBhY2NzID0gW2NyZWF0ZSgpXVxuXG4gIGF3YWl0IGNvbmN1ckl0ZXJhYmxlKGFzeW5jIHZhbHVlID0+IHtcbiAgICBsZXQgYWNjID0gYXdhaXQgYWRkKGF3YWl0IChhY2NzLmxlbmd0aCA/IGFjY3MucG9wKCkgOiBjcmVhdGUoKSksIHZhbHVlKVxuXG4gICAgd2hpbGUgKGFjY3MubGVuZ3RoKSB7XG4gICAgICBhY2MgPSBhd2FpdCBjb21iaW5lKGFjYywgYWNjcy5wb3AoKSlcbiAgICB9XG5cbiAgICBhY2NzLnB1c2goYWNjKVxuICB9KVxuXG4gIHJldHVybiBmaW5pc2goYXdhaXQgYWNjc1swXSlcbn1cblxuY29uc3QgcmVkdWNlQ29uY3VyV2l0aENyZWF0ZVdpdGhvdXRDb21iaW5lID0gYXN5bmMgKFxuICBjcmVhdGUsXG4gIGFkZCxcbiAgZmluaXNoLFxuICBjb25jdXJJdGVyYWJsZSxcbikgPT4ge1xuICBsZXQgYWNjUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShjcmVhdGUoKSlcbiAgYXdhaXQgY29uY3VySXRlcmFibGUodmFsdWUgPT4ge1xuICAgIGFjY1Byb21pc2UgPSBhY2NQcm9taXNlLnRoZW4oYWNjID0+IGFkZChhY2MsIHZhbHVlKSlcbiAgfSlcbiAgcmV0dXJuIGZpbmlzaChhd2FpdCBhY2NQcm9taXNlKVxufVxuIiwiaW1wb3J0IHsgY3VycnksIHRodW5rIH0gZnJvbSAnLi4vaW50ZXJuYWwvaGVscGVycy5qcydcbmltcG9ydCB7XG4gIE5PX0VOVFJZLFxuICBub3JtYWxpemVSZWR1Y2VyLFxuICByZWR1Y2UsXG4gIHJlZHVjZUFzeW5jLFxuICByZWR1Y2VDb25jdXIsXG59IGZyb20gJy4vcmVkdWNlcnMuanMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuL3RyYW5zZm9ybXMuanMnXG5cbmV4cG9ydCBjb25zdCB0b0FycmF5ID0gdGh1bmsoXG4gIG5vcm1hbGl6ZVJlZHVjZXIoe1xuICAgIGNyZWF0ZTogKCkgPT4gW10sXG4gICAgYWRkOiAoYWNjLCB2YWx1ZSkgPT4ge1xuICAgICAgYWNjLnB1c2godmFsdWUpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSxcbiAgfSksXG4pXG5cbmNvbnN0IHNldEFkZCA9IChhY2MsIHZhbHVlKSA9PiBhY2MuYWRkKHZhbHVlKVxuZXhwb3J0IGNvbnN0IHRvU2V0ID0gdGh1bmsoXG4gIG5vcm1hbGl6ZVJlZHVjZXIoeyBjcmVhdGU6ICgpID0+IG5ldyBTZXQoKSwgYWRkOiBzZXRBZGQgfSksXG4pXG5leHBvcnQgY29uc3QgdG9XZWFrU2V0ID0gdGh1bmsoXG4gIG5vcm1hbGl6ZVJlZHVjZXIoeyBjcmVhdGU6ICgpID0+IG5ldyBXZWFrU2V0KCksIGFkZDogc2V0QWRkIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgdG9PYmplY3QgPSB0aHVuayhcbiAgbm9ybWFsaXplUmVkdWNlcih7XG4gICAgY3JlYXRlOiAoKSA9PiAoe30pLFxuICAgIGFkZDogKGFjYywgW2tleSwgdmFsdWVdKSA9PlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFjYywga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSksXG4gICAgZ2V0OiAoYWNjLCBrZXkpID0+IChoYXNPd24uY2FsbChhY2MsIGtleSkgPyBhY2Nba2V5XSA6IE5PX0VOVFJZKSxcbiAgfSksXG4pXG5jb25zdCBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eVxuXG5jb25zdCBtYXBBZGRHZXQgPSB7XG4gIGFkZDogKGFjYywgW2tleSwgdmFsdWVdKSA9PiBhY2Muc2V0KGtleSwgdmFsdWUpLFxuICBnZXQ6IChhY2MsIGtleSkgPT4gKGFjYy5oYXMoa2V5KSA/IGFjYy5nZXQoa2V5KSA6IE5PX0VOVFJZKSxcbn1cbmV4cG9ydCBjb25zdCB0b01hcCA9IHRodW5rKFxuICBub3JtYWxpemVSZWR1Y2VyKHsgY3JlYXRlOiAoKSA9PiBuZXcgTWFwKCksIC4uLm1hcEFkZEdldCB9KSxcbilcbmV4cG9ydCBjb25zdCB0b1dlYWtNYXAgPSB0aHVuayhcbiAgbm9ybWFsaXplUmVkdWNlcih7IGNyZWF0ZTogKCkgPT4gbmV3IFdlYWtNYXAoKSwgLi4ubWFwQWRkR2V0IH0pLFxuKVxuXG5leHBvcnQgY29uc3QgdG9Hcm91cGVkID0gY3VycnkoKGlubmVyUmVkdWNlciwgb3V0ZXJSZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjcmVhdGU6IGNyZWF0ZUlubmVyLFxuICAgIGFkZDogYWRkSW5uZXIsXG4gICAgZmluaXNoOiBmaW5pc2hJbm5lcixcbiAgfSA9IG5vcm1hbGl6ZVJlZHVjZXIoaW5uZXJSZWR1Y2VyKVxuICBjb25zdCB7XG4gICAgY3JlYXRlOiBjcmVhdGVPdXRlcixcbiAgICBhZGQ6IGFkZE91dGVyLFxuICAgIGdldDogZ2V0T3V0ZXIsXG4gIH0gPSBub3JtYWxpemVSZWR1Y2VyKG91dGVyUmVkdWNlcilcblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogKCkgPT4gKHsgX2FjYzogY3JlYXRlT3V0ZXIoKSwgX2tleXM6IFtdIH0pLFxuICAgIGFkZDogKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBsZXQgZ3JvdXAgPSBnZXRPdXRlcihhY2MuX2FjYywga2V5KVxuICAgICAgaWYgKGdyb3VwID09PSBOT19FTlRSWSkge1xuICAgICAgICBncm91cCA9IGNyZWF0ZUlubmVyID8gYWRkSW5uZXIoY3JlYXRlSW5uZXIoKSwgdmFsdWUpIDogdmFsdWVcbiAgICAgICAgYWNjLl9rZXlzLnB1c2goa2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ3JvdXAgPSBhZGRJbm5lcihncm91cCwgdmFsdWUpXG4gICAgICB9XG5cbiAgICAgIGFjYy5fYWNjID0gYWRkT3V0ZXIoYWNjLl9hY2MsIFtrZXksIGdyb3VwXSlcbiAgICAgIHJldHVybiBhY2NcbiAgICB9LFxuICAgIGZpbmlzaDogKHsgX2FjYywgX2tleXMgfSkgPT5cbiAgICAgIF9rZXlzLnJlZHVjZShcbiAgICAgICAgKGFjYywga2V5KSA9PiBhZGRPdXRlcihhY2MsIFtrZXksIGZpbmlzaElubmVyKGdldE91dGVyKGFjYywga2V5KSldKSxcbiAgICAgICAgX2FjYyxcbiAgICAgICksXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCB0b011bHRpcGxlID0gcmVkdWNlcnMgPT4ge1xuICBjb25zdCBtYXBSZWR1Y2VycyA9IEFycmF5LmlzQXJyYXkocmVkdWNlcnMpXG4gICAgPyBmbiA9PlxuICAgICAgICByZWR1Y2UoXG4gICAgICAgICAgdG9BcnJheSgpLFxuICAgICAgICAgIG1hcCgoWywgcmVkdWNlcl0pID0+IGZuKHJlZHVjZXIpLCByZWR1Y2VycyksXG4gICAgICAgIClcbiAgICA6IGZuID0+XG4gICAgICAgIHJlZHVjZShcbiAgICAgICAgICB0b09iamVjdCgpLFxuICAgICAgICAgIG1hcCgoW2tleSwgcmVkdWNlcl0pID0+IFtrZXksIGZuKHJlZHVjZXIpXSwgcmVkdWNlcnMpLFxuICAgICAgICApXG4gIHJlZHVjZXJzID0gT2JqZWN0LmVudHJpZXMocmVkdWNlcnMpLm1hcCgoW2tleSwgcmVkdWNlcl0pID0+IFtcbiAgICBrZXksXG4gICAgbm9ybWFsaXplUmVkdWNlcihyZWR1Y2VyKSxcbiAgXSlcblxuICBjb25zdCBhcHBseVJlZHVjZXJzID0gKGFjYywgZm4pID0+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJlZHVjZXJdIG9mIHJlZHVjZXJzKSB7XG4gICAgICBhY2Nba2V5XSA9IGZuKGFjY1trZXldLCByZWR1Y2VyKVxuICAgIH1cbiAgICByZXR1cm4gYWNjXG4gIH1cblxuICBjb25zdCBhZGQgPSAoYWNjLCB2YWx1ZSkgPT5cbiAgICBhcHBseVJlZHVjZXJzKGFjYywgKGFjYywgeyBhZGQgfSkgPT4gYWRkKGFjYywgdmFsdWUpKVxuICBjb25zdCBmaW5pc2ggPSBhY2MgPT4gYXBwbHlSZWR1Y2VycyhhY2MsIChhY2MsIHsgZmluaXNoIH0pID0+IGZpbmlzaChhY2MpKVxuICBpZiAocmVkdWNlcnMuZXZlcnkoKFssIHsgY3JlYXRlIH1dKSA9PiBjcmVhdGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZTogKCkgPT4gbWFwUmVkdWNlcnMoKHsgY3JlYXRlIH0pID0+IGNyZWF0ZSgpKSxcbiAgICAgIGFkZCxcbiAgICAgIGZpbmlzaCxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFkZDogKGFjYywgdmFsdWUpID0+IGFkZChhc011bHRpcGxlKGFjYywgbWFwUmVkdWNlcnMpLCB2YWx1ZSksXG4gICAgZmluaXNoOiBhY2MgPT4ge1xuICAgICAgYWNjID0gZmluaXNoKGFzTXVsdGlwbGUoYWNjLCBtYXBSZWR1Y2VycykpXG4gICAgICBtdWx0aXBsZVNldC5kZWxldGUoYWNjKVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbXVsdGlwbGVTZXQgPSBuZXcgV2Vha1NldCgpXG5jb25zdCBhc011bHRpcGxlID0gKHZhbHVlLCBtYXBSZWR1Y2VycykgPT4ge1xuICBpZiAobXVsdGlwbGVTZXQuaGFzKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgbXVsdGlwbGUgPSBtYXBSZWR1Y2VycygoeyBjcmVhdGUsIGFkZCB9KSA9PlxuICAgIGNyZWF0ZSA/IGFkZChjcmVhdGUoKSwgdmFsdWUpIDogdmFsdWUsXG4gIClcbiAgbXVsdGlwbGVTZXQuYWRkKG11bHRpcGxlKVxuICByZXR1cm4gbXVsdGlwbGVcbn1cblxuZXhwb3J0IGNvbnN0IHRvSm9pbiA9IHNlcGFyYXRvciA9PiAoe1xuICBjcmVhdGU6ICgpID0+IHt9LFxuICBhZGQ6IChhY2MsIHZhbHVlKSA9PlxuICAgIGFjYyA9PT0gdW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6IFN0cmluZyhhY2MpICsgc2VwYXJhdG9yICsgU3RyaW5nKHZhbHVlKSxcbiAgZmluaXNoOiBhY2MgPT4gYWNjID8/IGBgLFxufSlcblxuY29uc3QgY3JlYXRlSm9pbiA9IHJlZHVjZSA9PlxuICBjdXJyeSgoc2VwYXJhdG9yLCBpdGVyYWJsZSkgPT4gcmVkdWNlKHRvSm9pbihzZXBhcmF0b3IpLCBpdGVyYWJsZSkpXG5cbmV4cG9ydCBjb25zdCBqb2luID0gY3JlYXRlSm9pbihyZWR1Y2UpXG5leHBvcnQgY29uc3Qgam9pbkFzeW5jID0gY3JlYXRlSm9pbihyZWR1Y2VBc3luYylcbmV4cG9ydCBjb25zdCBqb2luQ29uY3VyID0gY3JlYXRlSm9pbihyZWR1Y2VDb25jdXIpXG4iLCJpbXBvcnQge1xuICBjcmVhdGVBc3luY0l0ZXJhYmxlLFxuICBjcmVhdGVJdGVyYWJsZSxcbiAgY3VycnksXG4gIGlkZW50aXR5LFxuICBwcm9taXNlV2l0aEVhcmx5UmVzb2x2ZSxcbn0gZnJvbSAnLi4vaW50ZXJuYWwvaGVscGVycy5qcydcbmltcG9ydCB7IGZsYXRNYXAsIGZsYXRNYXBBc3luYywgZmxhdE1hcENvbmN1ciB9IGZyb20gJy4vdHJhbnNmb3Jtcy5qcydcblxuZXhwb3J0IGNvbnN0IGZpbHRlciA9IGN1cnJ5KChmbiwgaXRlcmFibGUpID0+XG4gIGZsYXRNYXAodmFsdWUgPT4gKGZuKHZhbHVlKSA/IFt2YWx1ZV0gOiBbXSksIGl0ZXJhYmxlKSxcbilcblxuY29uc3QgY3JlYXRlQXN5bmNGaWx0ZXIgPSBmbGF0TWFwID0+XG4gIGN1cnJ5KChmbiwgaXRlcmFibGUpID0+XG4gICAgZmxhdE1hcChhc3luYyB2YWx1ZSA9PiAoKGF3YWl0IGZuKHZhbHVlKSkgPyBbdmFsdWVdIDogW10pLCBpdGVyYWJsZSksXG4gIClcblxuZXhwb3J0IGNvbnN0IGZpbHRlckFzeW5jID0gY3JlYXRlQXN5bmNGaWx0ZXIoZmxhdE1hcEFzeW5jKVxuZXhwb3J0IGNvbnN0IGZpbHRlckNvbmN1ciA9IGNyZWF0ZUFzeW5jRmlsdGVyKGZsYXRNYXBDb25jdXIpXG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJNYXAgPSBjdXJyeSgoZm4sIGl0ZXJhYmxlKSA9PlxuICBmbGF0TWFwKHZhbHVlID0+IGZpbHRlck1hcElubmVyKGZuKHZhbHVlKSksIGl0ZXJhYmxlKSxcbilcblxuY29uc3QgY3JlYXRlQXN5bmNGaWx0ZXJNYXAgPSBmbGF0TWFwID0+XG4gIGN1cnJ5KChmbiwgaXRlcmFibGUpID0+XG4gICAgZmxhdE1hcChhc3luYyB2YWx1ZSA9PiBmaWx0ZXJNYXBJbm5lcihhd2FpdCBmbih2YWx1ZSkpLCBpdGVyYWJsZSksXG4gIClcblxuY29uc3QgZmlsdGVyTWFwSW5uZXIgPSB2YWx1ZSA9PiAodmFsdWUgPT0gbnVsbCA/IFtdIDogW3ZhbHVlXSlcblxuZXhwb3J0IGNvbnN0IGZpbHRlck1hcEFzeW5jID0gY3JlYXRlQXN5bmNGaWx0ZXJNYXAoZmxhdE1hcEFzeW5jKVxuZXhwb3J0IGNvbnN0IGZpbHRlck1hcENvbmN1ciA9IGNyZWF0ZUFzeW5jRmlsdGVyTWFwKGZsYXRNYXBDb25jdXIpXG5cbmNvbnN0IGNyZWF0ZUV4Y2x1ZGUgPSBmaWx0ZXIgPT5cbiAgY3VycnkoKGV4Y2x1ZGVkLCBpdGVyYWJsZSkgPT4ge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoZXhjbHVkZWQpXG4gICAgcmV0dXJuIGZpbHRlcih2YWx1ZSA9PiAhc2V0Lmhhcyh2YWx1ZSksIGl0ZXJhYmxlKVxuICB9KVxuXG5leHBvcnQgY29uc3QgZXhjbHVkZSA9IGNyZWF0ZUV4Y2x1ZGUoZmlsdGVyKVxuZXhwb3J0IGNvbnN0IGV4Y2x1ZGVBc3luYyA9IGNyZWF0ZUV4Y2x1ZGUoZmlsdGVyQXN5bmMpXG5leHBvcnQgY29uc3QgZXhjbHVkZUNvbmN1ciA9IGNyZWF0ZUV4Y2x1ZGUoZmlsdGVyQ29uY3VyKVxuXG5leHBvcnQgY29uc3QgdW5pcXVlQnkgPSBjdXJyeSgoZm4sIGl0ZXJhYmxlKSA9PlxuICBjcmVhdGVJdGVyYWJsZShmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgY29uc3QgYnkgPSBmbih2YWx1ZSlcbiAgICAgIGlmIChzZXQuaGFzKGJ5KSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzZXQuYWRkKGJ5KVxuICAgICAgeWllbGQgdmFsdWVcbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgdW5pcXVlQnlBc3luYyA9IGN1cnJ5KChmbiwgYXN5bmNJdGVyYWJsZSkgPT5cbiAgY3JlYXRlQXN5bmNJdGVyYWJsZShhc3luYyBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBhc3luY0l0ZXJhYmxlKSB7XG4gICAgICBjb25zdCBieSA9IGF3YWl0IGZuKHZhbHVlKVxuICAgICAgaWYgKHNldC5oYXMoYnkpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHNldC5hZGQoYnkpXG4gICAgICB5aWVsZCB2YWx1ZVxuICAgIH1cbiAgfSksXG4pXG5cbmV4cG9ydCBjb25zdCB1bmlxdWVCeUNvbmN1ciA9IGN1cnJ5KChmbiwgY29uY3VySXRlcmFibGUpID0+IGFwcGx5ID0+IHtcbiAgY29uc3Qgc2V0ID0gbmV3IFNldCgpXG5cbiAgcmV0dXJuIGNvbmN1ckl0ZXJhYmxlKGFzeW5jIHZhbHVlID0+IHtcbiAgICBjb25zdCBieSA9IGF3YWl0IGZuKHZhbHVlKVxuICAgIGlmIChzZXQuaGFzKGJ5KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0LmFkZChieSlcbiAgICBhd2FpdCBhcHBseSh2YWx1ZSlcbiAgfSlcbn0pXG5cbmV4cG9ydCBjb25zdCB1bmlxdWUgPSB1bmlxdWVCeShpZGVudGl0eSlcbmV4cG9ydCBjb25zdCB1bmlxdWVBc3luYyA9IHVuaXF1ZUJ5QXN5bmMoaWRlbnRpdHkpXG5leHBvcnQgY29uc3QgdW5pcXVlQ29uY3VyID0gdW5pcXVlQnlDb25jdXIoaWRlbnRpdHkpXG5cbmV4cG9ydCBjb25zdCBmaW5kID0gY3VycnkoKGZuLCBpdGVyYWJsZSkgPT5cbiAgY3JlYXRlSXRlcmFibGUoZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICBpZiAoZm4odmFsdWUpKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfSksXG4pXG5cbmV4cG9ydCBjb25zdCBmaW5kQXN5bmMgPSBjdXJyeSgoZm4sIGFzeW5jSXRlcmFibGUpID0+XG4gIGNyZWF0ZUFzeW5jSXRlcmFibGUoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGFzeW5jSXRlcmFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBmbih2YWx1ZSkpIHtcbiAgICAgICAgeWllbGQgdmFsdWVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGZpbmRDb25jdXIgPSBjdXJyeShcbiAgKGZuLCBjb25jdXJJdGVyYWJsZSkgPT4gYXBwbHkgPT5cbiAgICBwcm9taXNlV2l0aEVhcmx5UmVzb2x2ZShhc3luYyByZXNvbHZlID0+IHtcbiAgICAgIGxldCBmb3VuZCA9IGZhbHNlXG4gICAgICBhd2FpdCBjb25jdXJJdGVyYWJsZShhc3luYyB2YWx1ZSA9PiB7XG4gICAgICAgIGlmIChmb3VuZCB8fCAhKGF3YWl0IGZuKHZhbHVlKSkgfHwgZm91bmQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICBhd2FpdCBhcHBseSh2YWx1ZSlcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9KVxuICAgIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgZmluZExhc3QgPSBjdXJyeSgoZm4sIGl0ZXJhYmxlKSA9PlxuICBjcmVhdGVJdGVyYWJsZShmdW5jdGlvbiogKCkge1xuICAgIGxldCBsYXN0XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICBpZiAoZm4odmFsdWUpKSB7XG4gICAgICAgIGxhc3QgPSB7IHZhbHVlIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGFzdCkge1xuICAgICAgeWllbGQgbGFzdC52YWx1ZVxuICAgIH1cbiAgfSksXG4pXG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEFzeW5jID0gY3VycnkoKGZuLCBhc3luY0l0ZXJhYmxlKSA9PlxuICBjcmVhdGVBc3luY0l0ZXJhYmxlKGFzeW5jIGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IGxhc3RcblxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgYXN5bmNJdGVyYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGZuKHZhbHVlKSkge1xuICAgICAgICBsYXN0ID0geyB2YWx1ZSB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIHlpZWxkIGxhc3QudmFsdWVcbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgZmluZExhc3RDb25jdXIgPSBjdXJyeSgoZm4sIGNvbmN1ckl0ZXJhYmxlKSA9PiBhc3luYyBhcHBseSA9PiB7XG4gIGxldCBsYXN0XG5cbiAgYXdhaXQgY29uY3VySXRlcmFibGUoYXN5bmMgdmFsdWUgPT4ge1xuICAgIGlmIChhd2FpdCBmbih2YWx1ZSkpIHtcbiAgICAgIGxhc3QgPSB7IHZhbHVlIH1cbiAgICB9XG4gIH0pXG5cbiAgaWYgKGxhc3QpIHtcbiAgICBhd2FpdCBhcHBseShsYXN0LnZhbHVlKVxuICB9XG59KVxuIiwiY29uc3QgY3JlYXRlQXNzZXJ0ID1cbiAgKHsgX3ByZWRpY2F0ZSwgX21lc3NhZ2UgfSkgPT5cbiAgY29uZmlnID0+XG4gICAgT2JqZWN0LmVudHJpZXMoY29uZmlnKS5ldmVyeShcbiAgICAgIChbbmFtZSwgdmFsdWVdKSA9PlxuICAgICAgICBfcHJlZGljYXRlKG5hbWUsIHZhbHVlKSB8fFxuICAgICAgICBlcnJvcihgXFxgJHtuYW1lfVxcYCBtdXN0IGJlICR7X21lc3NhZ2V9OiAke3ZhbHVlfWApLFxuICAgIClcblxuZXhwb3J0IGNvbnN0IGVycm9yID0gbWVzc2FnZSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKVxufVxuXG5leHBvcnQgY29uc3QgYXNzZXJ0SW50ZWdlciA9IGNyZWF0ZUFzc2VydCh7XG4gIF9wcmVkaWNhdGU6IChfLCB2YWx1ZSkgPT4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpLFxuICBfbWVzc2FnZTogYGFuIGludGVnZXJgLFxufSlcblxuZXhwb3J0IGNvbnN0IGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlciA9IGNyZWF0ZUFzc2VydCh7XG4gIF9wcmVkaWNhdGU6IChuYW1lLCB2YWx1ZSkgPT4gYXNzZXJ0SW50ZWdlcih7IFtuYW1lXTogdmFsdWUgfSkgJiYgdmFsdWUgPj0gMCxcbiAgX21lc3NhZ2U6IGBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCxcbn0pXG5cbmV4cG9ydCBjb25zdCBhc3NlcnRQb3NpdGl2ZUludGVnZXIgPSBjcmVhdGVBc3NlcnQoe1xuICBfcHJlZGljYXRlOiAobmFtZSwgdmFsdWUpID0+IGFzc2VydEludGVnZXIoeyBbbmFtZV06IHZhbHVlIH0pICYmIHZhbHVlID4gMCxcbiAgX21lc3NhZ2U6IGBhIHBvc2l0aXZlIGludGVnZXJgLFxufSlcblxuZXhwb3J0IGNvbnN0IGFzc2VydFB1cmVJdGVyYWJsZSA9IGNyZWF0ZUFzc2VydCh7XG4gIF9wcmVkaWNhdGU6IChfLCB7IF92YWx1ZTogdmFsdWUsIF9zeW1ib2w6IHN5bWJvbCB9KSA9PlxuICAgIHZhbHVlW3N5bWJvbF0oKSAhPT0gdmFsdWVbc3ltYm9sXSgpLFxuICBfbWVzc2FnZTogYGEgcHVyZSBpdGVyYWJsZWAsXG59KVxuXG5leHBvcnQgY29uc3QgYXNzZXJ0UmFuZ2UgPSBjcmVhdGVBc3NlcnQoe1xuICBfcHJlZGljYXRlOiAoXywgW3N0YXJ0LCBlbmRdKSA9PiBzdGFydCA8PSBlbmQsXG4gIF9tZXNzYWdlOiBgYSByYW5nZWAsXG59KVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlQXN5bmNJdGVyYWJsZSxcbiAgY3JlYXRlSXRlcmFibGUsXG4gIGN1cnJ5LFxufSBmcm9tICcuLi9pbnRlcm5hbC9oZWxwZXJzLmpzJ1xuaW1wb3J0IHtcbiAgYXNzZXJ0SW50ZWdlcixcbiAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyLFxuICBhc3NlcnRQdXJlSXRlcmFibGUsXG59IGZyb20gJy4uL2ludGVybmFsL3ByZWNvbmRpdGlvbnMuanMnXG5cbmNvbnN0IGl0ZXJhYmxlID0gbmFtZSA9PiBvYmplY3QgPT5cbiAgY3JlYXRlSXRlcmFibGUoKCkgPT5cbiAgICAob2JqZWN0W25hbWVdPy4oKSA/PyBPYmplY3RbbmFtZV0ob2JqZWN0KSlbU3ltYm9sLml0ZXJhdG9yXSgpLFxuICApXG5leHBvcnQgY29uc3Qga2V5cyA9IGl0ZXJhYmxlKGBrZXlzYClcbmV4cG9ydCBjb25zdCB2YWx1ZXMgPSBpdGVyYWJsZShgdmFsdWVzYClcbmV4cG9ydCBjb25zdCBlbnRyaWVzID0gaXRlcmFibGUoYGVudHJpZXNgKVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGUgPSBjdXJyeSgoZm4sIHNlZWQpID0+XG4gIGNyZWF0ZUl0ZXJhYmxlKGZ1bmN0aW9uKiAoKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgPSBzZWVkOyB2YWx1ZSAhPSBudWxsOyB2YWx1ZSA9IGZuKHZhbHVlKSkge1xuICAgICAgeWllbGQgdmFsdWVcbiAgICB9XG4gIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVBc3luYyA9IGN1cnJ5KChmbiwgc2VlZCkgPT5cbiAgY3JlYXRlQXN5bmNJdGVyYWJsZShhc3luYyBmdW5jdGlvbiogKCkge1xuICAgIGZvciAobGV0IHZhbHVlID0gc2VlZDsgdmFsdWUgIT0gbnVsbDsgdmFsdWUgPSBhd2FpdCBmbih2Y